[TH] ESP8266 and 3-Axis Digital Accelerometer

บทความนี้แนะนำการใช้เซ็นเซอร์การเคลื่อนที่ หรือการขยับใน 3 แกนแบบดิจิทัลที่ใช้ไอซี MMA7660FC ซึ่งทำให้เราทราบว่าโมดูลนี้ขยับไปทางซ้าย/ขวา หน้า/หลัง หรือบน/ล่าง หรือเกิดการหมุนซ้าย/ขวา หน้า/หลัง และบน/ล่าง โดยในบทความได้สร้างไลบรารีเพื่อเปิดการทำงานของเซ็นเซอร์ กำหนดอัตราการทำแซมปลิง (sample rate) และทำการแปลงค่าที่ได้จากโมดูลมาแสดงผล

ภาพที่ 1

อุปกรณ์

  1. ESP8266
  2. โมดูล MMA7660FC

เซ็นเซอร์ MMA7660FC

โมดูลเซ็นเซอร์ MMA7660FC ใช้สำหรับวัดการเคลื่อนที่ 3 แกน ที่สื่อสารกับอุปกรณ์ไมโครคอนโทรลเลอร์ผ่านบัสประเภท I2C มีขนาด 3x3x0.9 มม. และมีค่าตำแหน่ง ทำงานที่แรงดันแอนาล็อก 2.4V-3.6V และดิจิทัลที่ 1.71V-3.6V ใช้กระแสในโหมดไม่ทำงานที่ 0.4 ไมโครแอมป์ (uA) ใช้กระแสในโหมดพร้อมทำงาน (Standby) ที่ 2 ไมโครแอมป์และใช้กระแส 47 ไมโครแอมป์ เมื่อทำงานปกติ นอกจากนี้มีระบบประหยัดพลังงานด้วยการทำ Wake/Sleep แบบอัตโนมัติ

ภาพที่ 2 การเชื่อมต่อขาเข้ากับจั้วต่อของโมดูล
ภาพที่ 3 ด้านหลังของโมดูล

ขาเชื่อมต่อของโมดูลเซ็นเซอร์การเคลื่อนที่ ประกอบด้วย 4 ขา คือ

  1. GND สำหรับต่อเข้ากับกราวด์ของระบบ
  2. VCC สำหรับจ่ายแรงดันไฟฟ้ากระแสตรงให้กับโมดูล
  3. SDA สำหรับเป็นขารับ/ส่งข้อมูลบนบัส I2C
  4. SCL สำหรับเป็นขาสัญญาณนาฬิกาในการสื่อสารผ่านบัส I2C
ภาพที่ 4 ขาเชื่อมต่อของโมดูล

การสั่งเริ่มต้นทำงาน

การสั่งเริ่มทำงานให้แก่ไอซี MMA7660FC ที่ติดตั้งอยู่ตำแหน่ง 0x4C หรือ 76 ในเลขฐาน 10 มี 2 ขั้นตอน คือ สั่งให้เข้าสู่โหมด Active เพื่อเริ่มทำงาน หลังจากนั้นกำหนดอัตราการแซมปลิง (Sample Rate)

  1. การเปิดการทำงาน ต้องระบุค่าแก่เรจิสเตอร์ตำแหน่ง 7 ให้มีค่าเป็น 1
  2. การกำหนดอัตราการแซมปลิง ซึ่งเป็นการกำหนดระยะเวลาของการ Wake/Sleep อัตโนมติของเซ็นเซอร์ ซึ่งผู้เขียนโปรแกรม ต้องระบุค่าแก่เรจิสเตอร์ตำแหน่งที่ 8 ให้มีค่าเป็นค่าใดค่าหนึ่งตาม
    1. 7 สำหรับทำ 1 sample/Second
    2. 6 สำหรับทำ 2 samples/Second
    3. 5 สำหรับทำ 4 Samples/Second
    4. 4 สำหรับทำ 8 Sample/Second
    5. 3 สำหรับทำ 16 Samples/Second
    6. 2 สำหรับทำ 32 Samples/Second
    7. 1 สำหรับทำ 64 Samples/Second
    8. 0 สำหรับทำงานโหมดรอการแตะ (Tap) ซึ่งเป็นการทำงาน 128 Samples/Second

การอ่านค่า

ค่าที่ได้จากการอ่านจากบัส ณ ตำแหน่งของโมดูลเซ็นเซอร์การเคลื่อนที่จะได้ค่ากลับมา 3 ไบต์ เรียงกันเป็นค่าการเคลื่อนที่ในแกน X (X-Axis Accl), การเคลื่อนที่ในแกน Y (Y-Axis Accl) และการเคลื่อนที่ใน้แกน Z (Z-Axis Accl) หลังจากนั้นต้องแปลงค่าเป็นตัวเลขแบบ 6 บิต และจำแนกทิศทางกาเคลื่อนที่ดังนี้

        xAccl = data[0] & 0x3F
        if xAccl > 31 :
            xAccl -= 64
        yAccl = data[1] & 0x3F
        if yAccl > 31 :
            yAccl -= 64
        zAccl = data[2] & 0x3F
        if zAccl > 31 :
            zAccl -= 64

การเชื่อมต่อ

การเชื่อมต่อโมดูลเซ็นเซอร์การเคลื่อนที่เข้ากับ ESP8266 กระทำโดยใช้บัส I2C เป็นดังตารางต่อไปนี้

ESP8266โมดูลเซ็นเซอร์ MMA7660FC
3V3Vcc
GNDGND
GPIO5 (D1)SCL
GPIO4 (D2)SDA
ภาพที่ 5 ขาของ WeMos D1 mini ที่ใช้เชื่อมต่อกับโมดูลเซ็นเซอร์
ภาพที่ 6 ตัวอย่างภาพการเชื่อมต่อ

ตัวอย่างโปรแกรม

ตัวอย่างโปรแกรม code15-1 เป็นการสร้างคลาส MMA7660FC เพื่อทำการเปิดการทำงานและตั้งการทำงานแบบ 1 ครั้งต่อวินาที และสร้างเมธอด read() เพื่ออ่านค่าข้อมูลการเคลื่อนที่ที่เปลี่ยนแปลงไปในแกน X, Y และ Z พร้อมทั้งแปลงข้อมูลให้เป็น 6 บิต และแบ่งค่าข้อมูลเป็น – 0 + เพื่อให้ทราบทิศทางการเคลื่อนที่ไปในแต่ละแกน พร้อมตัวอย่างการอ่านค่าและแสดงผลทางการสื่อสารอนุกรม ดังตัวอย่างภาพที่ 7

# code15-1
import time
import gc
import machine as mc
from machine import I2C, Pin

gc.enable()
gc.collect()
sclPin = mc.Pin(5)
sdaPin = mc.Pin(4)
i2c = mc.I2C(scl=sclPin,sda=sdaPin,freq=2000000)
print("i2c device(s) address = {}".format(i2c.scan()))

class MMA7660FC:
    def __init__(self, i2c, addr=0x4c):
        self.i2c = i2c
        self.mma7660fcAddr = addr
        mma7660fcBuffer = bytearray(2)
        # Active mode
        mma7660fcBuffer[0] = 0x07
        mma7660fcBuffer[1] = 0x01
        self.i2c.writeto(self.mma7660fcAddr, mma7660fcBuffer)
        # 1 Sample/second active
        mma7660fcBuffer[0] = 0x08
        mma7660fcBuffer[1] = 0x07
        self.i2c.writeto(self.mma7660fcAddr, mma7660fcBuffer)
        time.sleep_ms(10)

    def read(self):
        data = self.i2c.readfrom(self.mma7660fcAddr,3) # 0x00, 3)
             
        # Convert the data to 6-bits
        xAccl = data[0] & 0x3F
        if xAccl > 31 :
            xAccl -= 64
        yAccl = data[1] & 0x3F
        if yAccl > 31 :
            yAccl -= 64
        zAccl = data[2] & 0x3F
        if zAccl > 31 :
            zAccl -= 64
        return (xAccl,  yAccl,  zAccl)

# Output data to screen
sensor = MMA7660FC(i2c)
while True:
    sensorData = sensor.read()
    print("Acceleration ({},{},{})".format(sensorData[0],sensorData[1],sensorData[2] ))
    time.sleep_ms(50)
ภาพที่ 7 ตัวอย่างผลลัพธ์จากโปรแกรม code15-1

สรุป

จากบทความนี้ผู้อ่านได้เข้าใจวิธีการใช้งาน และการสั่งงานพื้นฐานแก่เซ็นเซอร์ MMA7660FC ที่สามารถนำไปประยุกต์ใช้กับการเกิดการเคลื่อนที่ในแกน X, Y และ Z ด้วยภาษาไพธอน ทางทีมงานหวังว่าบทความนี้คงมีประโยชน์แก่ผู้อ่านบ้างไม่มากก็น้อย และสุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับผม

(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อวันที่ 2020-10-28
ปรับปรุงเมื่อวันที่ 2021-05-19

เอกสารอ้างอิง

  1. Datasheet of MMA7660FC