บทความนี้แนะนำการใช้เซ็นเซอร์การเคลื่อนที่ หรือการขยับใน 3 แกนแบบดิจิทัลที่ใช้ไอซี MMA7660FC ซึ่งทำให้เราทราบว่าโมดูลนี้ขยับไปทางซ้าย/ขวา หน้า/หลัง หรือบน/ล่าง หรือเกิดการหมุนซ้าย/ขวา หน้า/หลัง และบน/ล่าง โดยในบทความได้สร้างไลบรารีเพื่อเปิดการทำงานของเซ็นเซอร์ กำหนดอัตราการทำแซมปลิง (sample rate) และทำการแปลงค่าที่ได้จากโมดูลมาแสดงผล
อุปกรณ์
- ESP8266
- โมดูล MMA7660FC
เซ็นเซอร์ MMA7660FC
โมดูลเซ็นเซอร์ MMA7660FC ใช้สำหรับวัดการเคลื่อนที่ 3 แกน ที่สื่อสารกับอุปกรณ์ไมโครคอนโทรลเลอร์ผ่านบัสประเภท I2C มีขนาด 3x3x0.9 มม. และมีค่าตำแหน่ง ทำงานที่แรงดันแอนาล็อก 2.4V-3.6V และดิจิทัลที่ 1.71V-3.6V ใช้กระแสในโหมดไม่ทำงานที่ 0.4 ไมโครแอมป์ (uA) ใช้กระแสในโหมดพร้อมทำงาน (Standby) ที่ 2 ไมโครแอมป์และใช้กระแส 47 ไมโครแอมป์ เมื่อทำงานปกติ นอกจากนี้มีระบบประหยัดพลังงานด้วยการทำ Wake/Sleep แบบอัตโนมัติ
ขาเชื่อมต่อของโมดูลเซ็นเซอร์การเคลื่อนที่ ประกอบด้วย 4 ขา คือ
- GND สำหรับต่อเข้ากับกราวด์ของระบบ
- VCC สำหรับจ่ายแรงดันไฟฟ้ากระแสตรงให้กับโมดูล
- SDA สำหรับเป็นขารับ/ส่งข้อมูลบนบัส I2C
- SCL สำหรับเป็นขาสัญญาณนาฬิกาในการสื่อสารผ่านบัส I2C
การสั่งเริ่มต้นทำงาน
การสั่งเริ่มทำงานให้แก่ไอซี MMA7660FC ที่ติดตั้งอยู่ตำแหน่ง 0x4C หรือ 76 ในเลขฐาน 10 มี 2 ขั้นตอน คือ สั่งให้เข้าสู่โหมด Active เพื่อเริ่มทำงาน หลังจากนั้นกำหนดอัตราการแซมปลิง (Sample Rate)
- การเปิดการทำงาน ต้องระบุค่าแก่เรจิสเตอร์ตำแหน่ง 7 ให้มีค่าเป็น 1
- การกำหนดอัตราการแซมปลิง ซึ่งเป็นการกำหนดระยะเวลาของการ Wake/Sleep อัตโนมติของเซ็นเซอร์ ซึ่งผู้เขียนโปรแกรม ต้องระบุค่าแก่เรจิสเตอร์ตำแหน่งที่ 8 ให้มีค่าเป็นค่าใดค่าหนึ่งตาม
- 7 สำหรับทำ 1 sample/Second
- 6 สำหรับทำ 2 samples/Second
- 5 สำหรับทำ 4 Samples/Second
- 4 สำหรับทำ 8 Sample/Second
- 3 สำหรับทำ 16 Samples/Second
- 2 สำหรับทำ 32 Samples/Second
- 1 สำหรับทำ 64 Samples/Second
- 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 |
---|---|
3V3 | Vcc |
GND | GND |
GPIO5 (D1) | SCL |
GPIO4 (D2) | SDA |
ตัวอย่างโปรแกรม
ตัวอย่างโปรแกรม 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)
สรุป
จากบทความนี้ผู้อ่านได้เข้าใจวิธีการใช้งาน และการสั่งงานพื้นฐานแก่เซ็นเซอร์ MMA7660FC ที่สามารถนำไปประยุกต์ใช้กับการเกิดการเคลื่อนที่ในแกน X, Y และ Z ด้วยภาษาไพธอน ทางทีมงานหวังว่าบทความนี้คงมีประโยชน์แก่ผู้อ่านบ้างไม่มากก็น้อย และสุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับผม
(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อวันที่ 2020-10-28
ปรับปรุงเมื่อวันที่ 2021-05-19
เอกสารอ้างอิง