- Accelerometer และ Gyroscopic sensor คืออะไร?
- MPU6050 Accelerometer และ Gyroscopic Sensor Module
- ส่วนประกอบที่จำเป็น
- แผนภูมิวงจรรวม
- คำอธิบายการเขียนโปรแกรม
MPU6050 เป็น IC accelerometer 3 แกนและหมุน 3 แกนรวมกัน เป็นหนึ่งหน่วย นอกจากนี้ยังมีเซ็นเซอร์อุณหภูมิและ DCM สำหรับทำงานที่ซับซ้อน MPU6050 มักใช้ในการสร้าง Droneและหุ่นยนต์ระยะไกลอื่น ๆ เช่นหุ่นยนต์ปรับสมดุลในตัวเอง ในโครงการนี้เราจะสร้างDigital Protractor โดยใช้MPU6050 และ Arduino ที่นี่ใช้เซอร์โวมอเตอร์เพื่อแสดงมุมของภาพไม้โปรแทรกเตอร์ เพลาเซอร์โวมอเตอร์ถูกยึดด้วยเข็มซึ่งจะหมุนบนภาพไม้โปรแทรกเตอร์เพื่อระบุมุมที่แสดงบนจอแสดงผล 16xLCD ก่อนที่จะลงรายละเอียดเรามาเรียนรู้เกี่ยวกับเซ็นเซอร์ Gyroscope
Accelerometer และ Gyroscopic sensor คืออะไร?
accelerometerใช้ในการวัดความเร่ง มันรับรู้ทั้งการเร่งความเร็วแบบคงที่และแบบไดนามิก ตัวอย่างเช่นโทรศัพท์มือถือใช้เซ็นเซอร์วัดความเร่งเพื่อตรวจจับว่ามือถืออยู่ในโหมดแนวนอนหรือโหมดแนวตั้ง ก่อนหน้านี้เราใช้ Accelerometer กับ Arduino เพื่อสร้างโครงการมากมายเช่น:
ไจโรสโคปใช้เพื่อวัดความเร็วเชิงมุมที่ใช้แรงโน้มถ่วงของโลกเพื่อกำหนดแนวของวัตถุที่กำลังเคลื่อนที่ ความเร็วเชิงมุมคืออัตราการเปลี่ยนตำแหน่งเชิงมุมของตัวหมุน
ตัวอย่างเช่นโทรศัพท์มือถือในปัจจุบันใช้เซ็นเซอร์วัดการหมุนวนเพื่อเล่นเกมบนมือถือตามทิศทางของโทรศัพท์มือถือ นอกจากนี้ชุดหูฟัง VR ยังใช้เซ็นเซอร์ไจโรสโคปเพื่อให้มีมุมมองในแนว 360
ดังนั้นในขณะที่มาตรความเร่งสามารถวัดความเร่งเชิงเส้นไจโรสโคปสามารถช่วยค้นหาความเร่งในการหมุนได้ เมื่อใช้เซ็นเซอร์ทั้งสองตัวเป็นโมดูลแยกกันจะเป็นการยากที่จะหาทิศทางตำแหน่งและความเร็ว แต่การรวมเซ็นเซอร์ทั้งสองตัวจะทำงานเป็นหน่วยวัดเฉื่อย (IMU) ดังนั้นในโมดูล MPU6050จึงมีเครื่องวัดความเร่งและไจโรสโคปอยู่บนแผ่น PCB เดียวเพื่อค้นหาทิศทางตำแหน่งและความเร็ว
การใช้งาน:
- ใช้ในโดรนเพื่อควบคุมทิศทาง
- หุ่นยนต์ปรับสมดุลตัวเอง
- การควบคุมแขนหุ่นยนต์
- เซ็นเซอร์เอียง
- ใช้ในโทรศัพท์มือถือเครื่องเล่นวิดีโอเกม
- หุ่นยนต์ฮิวแมนนอยด์
- ใช้ในเครื่องบินยานยนต์ ฯลฯ
MPU6050 Accelerometer และ Gyroscopic Sensor Module
MPU6050 เป็น Micro Electro-Mechanical Systems (MEMS) ซึ่งประกอบด้วย Accelerometer 3 แกนและ Gyroscope 3 แกนอยู่ภายใน นอกจากนี้ยังมีเซ็นเซอร์วัดอุณหภูมิ
สามารถวัด:
- การเร่งความเร็ว
- ความเร็ว
- ปฐมนิเทศ
- การกำจัด
- อุณหภูมิ
โมดูลนี้ยังมีDigital Motion Processor (DMP) อยู่ภายในซึ่งมีประสิทธิภาพมากพอที่จะทำการคำนวณที่ซับซ้อนและทำให้งานไมโครคอนโทรลเลอร์เป็นอิสระ
โมดูลนี้ยังมีหมุดเสริมสองตัวซึ่งสามารถใช้เชื่อมต่อกับโมดูล IIC ภายนอกเช่นแมกนีโตมิเตอร์ เนื่องจากสามารถกำหนดค่าที่อยู่ IIC ของโมดูลได้จึง สามารถเชื่อมต่อเซ็นเซอร์ MPU6050มากกว่าหนึ่งตัว กับไมโครคอนโทรลเลอร์โดยใช้พิน AD0
คุณสมบัติและข้อมูลจำเพาะ:
- แหล่งจ่ายไฟ: 3-5V
- การสื่อสาร: โปรโตคอล I2C
- ADC 16 บิตในตัวให้ความแม่นยำสูง
- DMP ในตัวให้พลังในการคำนวณสูง
- สามารถใช้เพื่อเชื่อมต่อกับอุปกรณ์ IIC อื่น ๆ เช่น magnetometer
- ที่อยู่ IIC ที่กำหนดค่าได้
- เซ็นเซอร์อุณหภูมิในตัว
Pinout ของ MPU6050:
หมายเลขพิน | ชื่อพิน | ใช้ |
1 | Vcc | ให้พลังงานสำหรับโมดูลสามารถ + 3V ถึง + 5V โดยทั่วไปจะใช้ + 5V |
2 | พื้น | เชื่อมต่อกับกราวด์ของระบบ |
3 | นาฬิกาอนุกรม (SCL) | ใช้สำหรับจัดหานาฬิกาพัลส์สำหรับการสื่อสาร I2C |
4 | ข้อมูลอนุกรม (SDA) | ใช้สำหรับการถ่ายโอนข้อมูลผ่านการสื่อสาร I2C |
5 | ข้อมูลอนุกรมเสริม (XDA) | สามารถใช้เพื่อเชื่อมต่อโมดูล I2C อื่น ๆ กับ MPU6050 เป็นทางเลือก |
6 | นาฬิกาอนุกรมเสริม (XCL) | สามารถใช้เพื่อเชื่อมต่อโมดูล I2C อื่น ๆ กับ MPU6050 เป็นทางเลือก |
7 | AD0 | หากใช้ MPU6050 มากกว่าหนึ่งตัวใน MCU เดียวก็สามารถใช้พินนี้เพื่อเปลี่ยนที่อยู่ได้ |
8 | ขัดจังหวะ (INT) | ขัดจังหวะพินเพื่อระบุว่ามีข้อมูลให้ MCU อ่าน |
ก่อนหน้านี้เราใช้MPU6050 กับ Arduinoเพื่อสร้าง Self Balancing Robot และ Inclinometer
ส่วนประกอบที่จำเป็น
- Arduino UNO
- MPU6050 Gyroscope โมดูล
- จอ LCD 16x2
- โพเทนชิออมิเตอร์ 10k
- SG90- เซอร์โวมอเตอร์
- ภาพไม้โปรแทรกเตอร์
แผนภูมิวงจรรวม
แผนภาพวงจรสำหรับDIY Arduino Protractorมีดังต่อไปนี้:
การเชื่อมต่อวงจรระหว่าง Arduino UNO และ MPU6050:
MPU6050 |
Arduino UNO |
VCC |
+ 5V |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
การเชื่อมต่อวงจรระหว่าง Arduino UNO และเซอร์โวมอเตอร์:
เซอร์โวมอเตอร์ |
Arduino UNO |
สีแดง (VCC) |
+ 5V |
ส้ม (PWM) |
9 |
สีน้ำตาล (GND) |
GND |
การเชื่อมต่อวงจรระหว่าง Arduino UNO และ 16x2 LCD:
LCD |
Arduino นาโน |
VSS |
GND |
VDD |
+ 5V |
V0 |
ไปยัง PIN ของศูนย์โพเทนชิออมิเตอร์ สำหรับการควบคุม Contrast ของ LCD |
อาร์เอส |
2 |
RW |
GND |
จ |
3 |
D4 |
4 |
D5 |
5 |
D6 |
6 |
D7 |
7 |
ก |
+ 5V |
เค |
GND |
คำอธิบายการเขียนโปรแกรม
ตามปกติโปรแกรมที่สมบูรณ์พร้อมวิดีโอสาธิตจะได้รับในตอนท้ายของบทช่วยสอนนี้
ที่นี่เซอร์โวมอเตอร์เชื่อมต่อกับ Arduino และเพลาของมันจะถูกฉายบนภาพไม้โปรแทรกเตอร์ที่ระบุมุมของ MPU6050 ที่เอียง การเขียนโปรแกรมสำหรับบทช่วยสอนนี้ทำได้ง่าย เรามาดูรายละเอียดกัน
ขั้นแรกให้รวมไลบรารีที่จำเป็นทั้งหมด - ไลบรารีเซอร์โวมอเตอร์สำหรับการใช้เซอร์โวไลบรารี LCD สำหรับการใช้ไลบรารี LCD และ Wire สำหรับการใช้การสื่อสาร I2C
MPU6050 ใช้การสื่อสาร I2C ดังนั้นจึงต้องเชื่อมต่อกับพิน I2C ของ Arduino เท่านั้น ดังนั้นไลบรารี Wire.h จึงใช้เพื่อสร้างการสื่อสารระหว่าง Arduino UNO และ MPU6050 ก่อนหน้านี้เราได้เชื่อมต่อ MPU6050 กับ Arduino และแสดงค่าพิกัด x, y, z บนจอ LCD 16x2
# รวม
ถัดไปกำหนดพินจอแสดงผล LCD RS, E, D4, D5, D6, D7 ที่เชื่อมต่อกับ Arduino UNO
LiquidCrystal lcd (2,3,4,5,6,7);
ถัดไปมีการกำหนดที่อยู่ I2C ของ MPU6050
const int MPU_addr = 0x68;
จากนั้นเริ่มต้นวัตถุ myservo สำหรับการใช้คลาส Servo และตัวแปรสามตัวเพื่อเก็บค่าแกน X, Y และ Z
เซอร์โว myservo; int16_t axis_X, axis_Y, axis_Z;
ค่าต่ำสุดและสูงสุดถัดไปกำหนดเป็น 265 และ 402 สำหรับมุมการวัดตั้งแต่ 0 ถึง 360
int minVal = 265; int maxVal = 402;
การตั้งค่าเป็นโมฆะ ():
ในฟังก์ชัน การตั้งค่าเป็นโมฆะการ สื่อสาร I2C ครั้งแรกจะเริ่มต้นและการส่งเริ่มต้นด้วย MPU6050 พร้อมที่อยู่ 0x68
Wire.begin (); Wire.beginTransmission (MPU_addr);
ใส่ MPU6050 ในโหมดสลีปโดยเขียน 0x6B จากนั้นให้ปลุกโดยเขียน 0
Wire.write (0x6B); Wire.write (0);
หลังจากเปิดใช้งาน MPU6050 แล้วให้สิ้นสุดการส่งข้อมูล
Wire.endTransmission (จริง);
นี่คือพิน PWM ของเซอร์โวมอเตอร์เชื่อมต่อกับ Arduino UNO พิน 9
myservo.attach (9);
ทันทีที่เราเปิดวงจร LCD จะแสดงข้อความต้อนรับและล้างหลังจาก 3 วินาที
lcd.begin (16,2); // ตั้งค่า LCD ในโหมด 16X2 lcd.print ("CIRCUIT DIGEST"); ล่าช้า (1,000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Arduino"); lcd.setCursor (0,1); lcd.print ("MPU6050"); ล่าช้า (3000); lcd.clear ();
ห่วงเป็นโมฆะ ():
อีกครั้งการสื่อสาร I2C เริ่มต้นด้วย MPU6050
Wire.beginTransmission (MPU_addr);
จากนั้นเริ่มต้นด้วย register 0x3B (ACCEL_XOUT_H)
Wire.write (0x3B);
ตอนนี้กระบวนการเริ่มต้นใหม่โดยตั้งค่าการส่งปลายทางเป็นเท็จ แต่การเชื่อมต่อทำงานอยู่
Wire.endTransmission (เท็จ);
หลังจากนั้นตอนนี้ขอข้อมูลจาก 14 รีจิสเตอร์
Wire.requestFrom (MPU_addr, 14, จริง);
ตอนนี้ค่าการลงทะเบียนแกนที่เคารพ (x, y, z) จะได้รับและเก็บไว้ในตัวแปร axis_X, axis_Y, axis_Z
axis_X = Wire.read () << 8-Wire.read (); axis_Y = Wire.read () << 8-Wire.read (); axis_Z = Wire.read () << 8-Wire.read ();
จากนั้นแมปค่าเหล่านั้นจาก 265 ถึง 402 เป็น -90 ถึง 90 สิ่งนี้ทำได้สำหรับทั้งสามแกน
int xAng = แผนที่ (axis_X, minVal, maxVal, -90,90); int yAng = แผนที่ (axis_Y, minVal, maxVal, -90,90); int zAng = แผนที่ (axis_Z, minVal, maxVal, -90,90);
สูตรคำนวณค่า x ในองศา (0 ถึง 360) ได้รับด้านล่าง ที่นี่เราแปลงเฉพาะ x เนื่องจากการหมุนของเซอร์โวมอเตอร์ขึ้นอยู่กับการเคลื่อนที่ของค่า x
x = RAD_TO_DEG * (atan2 (-yAng, -zAng) + PI);
ค่ามุม X ตั้งแต่ 0 ถึง 360 องศาจะถูกแปลงเป็น 0 ถึง 180
int pos = แผนที่ (x, 0,180,0,180);
จากนั้นเขียนค่ามุมเพื่อหมุนเซอร์โวบนภาพไม้โปรแทรกเตอร์และพิมพ์ค่าเหล่านั้นบนจอ LCD 16x2
myservo.write (pos); lcd.setCursor (0,0); lcd.print ("มุม"); lcd.setCursor (0,1); lcd.print (x); ล่าช้า (500); lcd.clear ();
นี่คือวิธีที่สามารถใช้ MPU6050 กับ Arduino เพื่อวัดมุมได้ รหัสและวิดีโอที่สมบูรณ์สำหรับโครงการนี้มีให้ด้านล่าง