ตัวตรวจจับความเร่งบน POP-32i
เซ็นเซอร์ MC3479 เป็นตัวตรวจจับความเร่ง 3 แกนที่ติดตั้งในบอร์ด POP32i ซึ่งสามารถวัดความเร่งในแกน X, Y, และ Z ได้อย่างแม่นยำ โดยบอร์ด POP32i รองรับการสื่อสารผ่าน I2C และสามารถแสดงผลค่าความเร่งผ่านหน้าจอ OLED ที่ติดตั้งมาพร้อมกัน
คุณสมบัติของ MC3479
- วัดความเร่ง 3 แกน (X, Y, Z)
- ช่วงการวัด: ±2g, ±4g, ±8g, ±16g
- ความละเอียดสูงสุด: 16-bit
- ใช้พลังงานต่ำ (~2.4 µA ในโหมด Active)
- สื่อสารผ่าน I2C ความเร็วสูงสุด 400 kHz
วิธีการใช้งาน
- เตรียมอุปกรณ์
- บอร์ด POP32i
- สาย USB สำหรับเชื่อมต่อบอร์ดกับคอมพิวเตอร์
- ซอฟต์แวร์ Arduino IDE สำหรับเขียนและอัพโหลดโค้ด
- ไลบรารีที่เกี่ยวข้อง:
- Wire.h สำหรับการสื่อสาร I2C (มีมาให้สำหรับ Arduino อยู่แล้ว)
- POP32.h สำหรับสั่งงานบอร์ด POP32 (สามารถติดตั้งได้ที่ https://inex.co.th/store/manual/POP32i-Sheet230316-re.pdf )
เชื่อมต่อบอร์ดเข้ากับคอมพิวตอร์เพื่ออัปโหลดโปรแกรม
โปรแกรมตัวอย่างการอ่านค่า MC3479 และแสดงผลบน OLED
#include <Wire.h> // ไลบรารีสำหรับการสื่อสาร I2C
#include <POP32.h> // ไลบรารีสำหรับใช้งาน OLED กับบอร์ด POP32
#define I2C_ADDRESS 0x6C // ที่อยู่ I2C ของเซ็นเซอร์ MC34X9
#define REG_OUT_X_LSB 0x0D // เรจิสเตอร์สำหรับอ่านค่าแกน X (LSB)
#define REG_OUT_Y_LSB 0x0F // เรจิสเตอร์สำหรับอ่านค่าแกน Y (LSB)
#define REG_OUT_Z_LSB 0x11 // เรจิสเตอร์สำหรับอ่านค่าแกน Z (LSB)
#define LSB_TO_G 0.000061 // ค่าคงที่สำหรับแปลงจาก LSB เป็นหน่วย g (แรงโน้มถ่วง)
void setup() {
Wire.begin(); // เริ่มต้นการสื่อสาร I2C
oled.clear();
oled.text(0, 0, “MC34X9 Init…”);
writeRegister(0x07, 0x01); // Active mode
writeRegister(0x20, 0x01); // ±2g, 16-bit
oled.text(1, 0, “Ready!”);
oled.show();
delay(1000);
}
void loop() {
// อ่านค่าแกน X, Y, Z จากเซ็นเซอร์และแปลงเป็นหน่วย g
float accelX_g = readAccel(REG_OUT_X_LSB) * LSB_TO_G; // อ่านค่าแกน X
float accelY_g = readAccel(REG_OUT_Y_LSB) * LSB_TO_G; // อ่านค่าแกน Y
float accelZ_g = readAccel(REG_OUT_Z_LSB) * LSB_TO_G; // อ่านค่าแกน Z
oled.clear(); // ล้างหน้าจอ OLED ก่อนแสดงค่าข้อมูลใหม่
// แสดงค่าที่อ่านได้บนหน้าจอ OLED
oled.text(1, 0, “X: %f “, accelX_g); // แสดงค่าแกน X (หน่วย g)
oled.text(2, 0, “Y: %f “, accelY_g); // แสดงค่าแกน Y (หน่วย g)
oled.text(3, 0, “Z: %f “, accelZ_g); // แสดงค่าแกน Z (หน่วย g)
oled.show();
delay(100);
}
// ฟังก์ชันสำหรับอ่านค่าดิบจากเซ็นเซอร์ MC34X9
int16_t readAccel(uint8_t reg) {
Wire.beginTransmission(I2C_ADDRESS); // เริ่มต้นการสื่อสารกับเซ็นเซอร์ที่อยู่ 0x6C
Wire.write(reg); // เขียนค่าเรจิสเตอร์ที่ต้องการอ่าน
Wire.endTransmission(false); // จบการส่งข้อมูล
Wire.requestFrom(I2C_ADDRESS, 2); // ขอข้อมูล 2 ไบต์จากเซ็นเซอร์
return (int16_t)((Wire.read() | (Wire.read() << 8))); // รวมค่า LSB และ MSB เป็นค่า 16 บิต
}
void writeRegister(uint8_t reg, uint8_t value) {
Wire.beginTransmission(I2C_ADDRESS); //เริ่มต้นการส่งข้อมูลไปยังเซ็นเซอร์ที่อยู่ 0x6C
Wire.write(reg); //ส่งที่อยู่ของเรจิสเตอร์ที่ต้องการเขียนค่า
Wire.write(value); //ส่งค่าที่ต้องการเขียนลงในเรจิสเตอร์
Wire.endTransmission(); //จบการส่งข้อมูล
}
การทำงานของโปรแกรม
- การตั้งค่าล่วงหน้า
- เรียกใช้งานไลบลารี่สื่อสารแบบ I2C และกำหนดตำแหน่งขาของเซนเซอร์เชื่อมต่อ
- กำหนดขารีจิตเตอร์สำหรับอ่านค่าแกนต่างๆ
- กำหนดค่าคงที่สำหรับแปลงค่าเป็นหน่วย g (แรงโน้มถ่วง)
- การทำงานส่วนเริ่มต้น
-
- เรื่มต้นการสื่อสาร I2C
- ตั้งค่าช่วง ±2g และความละเอียด 16 บิต (writeRegister(0x20, 0x01))
- การทำงานวนซ้ำ
-
- อ่านค่าข้อมูลจากเซ็นเซอร์ที่เรจิสเตอร์ของแกน X, Y, และ Z จากนั้นแปลงค่าที่ได้จาก LSB เป็นหน่วย g ด้วยค่าคงที่ LSB_TO_G
- แสดงผลค่าข้อมูลเร่งความเร็วในแต่ละแกนบนหน้าจอ OLED
- ฟังก์ชันช่วย
-
- readAccel(): อ่านค่าดิบจากเซ็นเซอร์
- writeRegister(): ตั้งค่าเรจิสเตอร์ของเซ็นเซอร์
วิธีการทดสอบการทำงาน
ทดลองเอียงบอร์ดขึ้นลง ซ้ายขวา ค่าของแกน X และ Y จะเพิ่มขึ้นหรือลดลงตามระดับความเอียงของบอร์ด และตำแหน่งของแกน Z เมื่อหันด้านหน้าบอร์ดขึ้นค่าของแกน Z จะมีค่าเป็นลบ แต่เมื่อพลิกบอร์ดหันด้านหน้าบอร์ดลงพื้นค่าที่ได้จะค่อยๆเพิ่มขึ่นตามการพลิกจนมีค่าเป็นบวก
วิดีโอตัวอย่าง
Facebook Comments Box