![เรียนรู้เกี่ยวกับ L3GD20 Breakout Board: 16 ขั้นตอน เรียนรู้เกี่ยวกับ L3GD20 Breakout Board: 16 ขั้นตอน](https://img.gwsigeps.com/img/circuits/learning-about-the-l3gd20-breakout-board-7.jpg)
สารบัญ:
- วัสดุ:
- ขั้นตอนที่ 1: วัสดุ
- ขั้นตอนที่ 2: การประกอบโครงการ
- ขั้นตอนที่ 3: การเชื่อมต่อ
- ขั้นตอนที่ 4: การเข้ารหัสซอฟต์แวร์
- ขั้นตอนที่ 5: คำอธิบายรหัส
- ขั้นตอนที่ 6: คำอธิบายรหัส - ต่อ
- ขั้นตอนที่ 7: คำอธิบายรหัส - ต่อ
- ขั้นตอนที่ 8: คำอธิบายรหัส - ต่อ
- ขั้นตอนที่ 9: คำอธิบายรหัส - ต่อ
- ขั้นตอนที่ 10: คำอธิบายรหัส - ต่อ
- ขั้นตอนที่ 11: คำอธิบายรหัส - ต่อ
- ขั้นตอนที่ 12: การส่งออก - แบน
- ขั้นตอนที่ 13: การส่งออก - แกน Z
- ขั้นตอนที่ 14: การส่งออก - แกน Y
- ขั้นตอนที่ 15: ผลลัพธ์ - แกน X
- ขั้นตอนที่ 16: ตอนนี้คุณรู้แล้ว!
เซ็นเซอร์ L3GD20 เป็นชิปพลังงานต่ำที่ใช้วัดความเร็วเชิงมุม มันเป็นส่วนประกอบที่รับรู้การเคลื่อนไหวและการเปลี่ยนแปลงในการวางแนว สามารถสื่อสารกับชิปอื่น ๆ โดยใช้โปรโตคอลการสื่อสาร SPI (Serial Peripheral Interface) หรือ I2C (Inter-Integrated Circuit) L3GD20 มีขนาดเต็ม± 250 / ± 500 / ± 2000 dps (องศาต่อวินาที) และสามารถวัดอัตราด้วยแบนด์วิดท์ที่ผู้ใช้เลือกได้
เนื่องจากนี่คือไจโรสโคปสามแกนจึงวัดการหมุนรอบสามแกน (x, y, z) ดังนั้นจึงให้คุณค่ากับเราสำหรับแต่ละแกน แอพพลิเคชั่นบางอย่างสำหรับกล้องหมุนวนนั้นใช้สำหรับเล่นเกม, เสมือนจริง, นำทาง GPS และหุ่นยนต์ปรับสมดุลในตัวเอง
ในบทช่วยสอนนี้เราจะเชื่อมต่อเซ็นเซอร์ไจโรกับไฟ LED หกดวงเพื่อแสดงว่าอัตราการเชิงมุมเกิดขึ้นในทิศทางใด
วัสดุ:
ขั้นตอนที่ 1: วัสดุ
สำหรับโครงการนี้คุณจะต้องใช้สื่อต่อไปนี้:
- Arduino Uno R3
- ไจโรเซ็นเซอร์ L3GD20
- 1X8 เข็มตรง
- เขียงหั่นขนม (x2)
- ตัวต้านทาน 330ohm (x6)
- สายจัมเปอร์
- ไฟ LED (3 สีเหลือง, 1 สีน้ำเงิน, 1 สีเขียว, 1 สีแดง)
ขั้นตอนที่ 2: การประกอบโครงการ
เซ็นเซอร์ Gyro L3GD20 นั้นถูกบัดกรีด้วยหมุดตรง 8 อัน
เซ็นเซอร์บัดกรีจะมีลักษณะเหมือนภาพสองภาพด้านบน
ขั้นตอนที่ 3: การเชื่อมต่อ
- VCC - 3.3V
- GND - GND
- SDO - GND
- CS - VCC
- SCL - A5
- SDA - A4
- LED สีแดง - A7
- LED สีเขียว - A5
- ไฟ LED สีฟ้า - A3
- ไฟ LED สีเหลือง - A2, A4, A6
- ใช้ตัวต้านทานเพื่อต่อขั้วแคโทดของ LED
การเชื่อมต่อที่สมบูรณ์ควรมีลักษณะเหมือนภาพด้านบน
ขั้นตอนที่ 4: การเข้ารหัสซอฟต์แวร์
นี่คือรหัสซอฟต์แวร์ที่สมบูรณ์:
#include #define CTRL_REG1 0x20 #define CTRL_REG2 0x21 #define CTRL_REG3 0x22 #define CTRL_REG4 0x23 #define CTRL_REG5 0x24 int L3GD20_Address = 106; // ที่อยู่ I2C ของ L3GD20 int x; int y; int z; การตั้งค่าเป็นโมฆะ () {Wire.begin (); Serial.begin (9600); Serial.println ("การเริ่มต้น L3GD20"); setupL3GD20 (2000); // กำหนดค่า L3GD20 - 250, 500 หรือ 2000 องศา / วินาที pinMode (2, OUTPUT); // X + Ve ค่า pinMode (3, OUTPUT); // X -Ve value pinMode (4, OUTPUT); // Y + ve ค่า pinMode (5, OUTPUT); // Y -Ve value pinMode (6, OUTPUT); // Z + Ve ค่า pinMode (7, OUTPUT); // Z -Ve value delay (100); // รอให้เซ็นเซอร์พร้อม} void loop () {getGyroValues (); // สิ่งนี้จะอัปเดต x, y และ z ด้วยค่าใหม่ Serial.print ("X:"); Serial.print (x); Serial.print ("Y:"); Serial.print (y); Serial.print ("Z:"); Serial.println (z); ล่าช้า (100); // เพียงแค่ที่นี่เพื่อชะลออนุกรมเพื่อให้อ่านได้ง่ายขึ้น // ********* ฟังก์ชั่นไฟ LED ************ // // ******* **** ตำแหน่ง X- ไฟ LED ********* // ถ้า (x> = 1,000) {digitalWrite (2, สูง); digitalWrite (3, ต่ำ); } อื่นถ้า (x <= -1000) {digitalWrite (3, สูง); digitalWrite (2, LOW); } else {digitalWrite (2, LOW); digitalWrite (3, ต่ำ); } // *********** หลอด LED ตำแหน่ง Y- ********* // ถ้า (y> = 1,000) {digitalWrite (4, สูง); digitalWrite (5, LOW); } อื่นถ้า (y <= -1000) {digitalWrite (5, สูง); digitalWrite (4, LOW); } else {digitalWrite (4, LOW); digitalWrite (5, ต่ำ); } // *********** Z- ตำแหน่ง LED ********* // ถ้า (z> = 1,000) {digitalWrite (6, สูง); digitalWrite (7, ต่ำ); } อื่นถ้า (z <= -1000) {digitalWrite (7, สูง); digitalWrite (6, ต่ำ); } else {digitalWrite (7, LOW); digitalWrite (6, ต่ำ); } // ************ LED funcitons สิ้นสุด **************** //} โมฆะ getGyroValues () zLSB); int setupL3GD20 (ระดับสเกล) {// จาก Jim Lindblom ของโค้ดของ Sparkfun // เปิดใช้งาน x, y, z และปิดไฟลง: writeRegister (L3GD20_Address, CTRL_REG1, 0b00001111); // หากคุณต้องการปรับ / ใช้ HPF คุณสามารถแก้ไขบรรทัดด้านล่างเพื่อกำหนดค่า CTRL_REG2: writeRegister (L3GD20_Address, CTRL_REG2, 0b00000000); // กำหนดค่า CTRL_REG3 เพื่อสร้างการขัดจังหวะข้อมูลใน INT2 // ไม่มีการขัดจังหวะที่ใช้บน INT1 หากคุณต้องการกำหนดค่า INT1 // หรือ INT2 มิฉะนั้นให้ดูที่แผ่นข้อมูล: writeRegister (L3GD20_Address, CTRL_REG3, 0b00001000); // CTRL_REG4 ควบคุมช่วงเต็มรูปแบบเหนือสิ่งอื่นใด: if (scale == 250) {writeRegister (L3GD20_Address, CTRL_REG4, 0b00000000); } ถ้า if (scale == 500) {writeRegister (L3GD20_ ที่อยู่, CTRL_REG4, 0b00010000); } else {writeRegister (L3GD20_Address, CTRL_REG4, 0b00110000); } // CTRL_REG5 ควบคุมการกรองความถี่สูงของเอาต์พุตใช้มัน // หากคุณต้องการ: writeRegister (L3GD20_Address, CTRL_REG5, 0b00000000); } เป็นโมฆะ writeRegister (int อุปกรณ์ที่อยู่, ที่อยู่ไบต์, ไบต์ val) {Wire.beginTransmission (deviceAddress); // เริ่มส่งไปยังอุปกรณ์ Wire.write (ที่อยู่); // ส่งที่อยู่การลงทะเบียน Wire.write (val); // ส่งค่าเพื่อเขียน Wire.endTransmission (); // end transmission} int readRegister (int deviceAddress, ที่อยู่ไบต์) {int v; Wire.beginTransmission (deviceAddress); Wire.write (ที่อยู่); // ลงทะเบียนเพื่ออ่าน Wire.endTransmission (); Wire.requestFrom (deviceAddress, 1); // อ่านไบต์ในขณะที่ (! Wire.available ()) {// Waiting} v = Wire.read (); กลับ v; }
ขั้นตอนที่ 5: คำอธิบายรหัส
#include ในส่วนนี้ของรหัสลวดห้องสมุดรวมอยู่ ไลบรารีนี้อนุญาตให้ Arduino Uno สื่อสารกับอุปกรณ์ I2C / TWI (การเชื่อมต่อสายไฟสองเส้น) นอกจากนี้ยังมีการกำหนดรีจิสเตอร์ควบคุมสำหรับเซ็นเซอร์ L3GD20 Gyro การลงทะเบียนแต่ละครั้งจะใช้ในการกำหนดค่าชิประหว่างการเริ่มต้น ตัวอย่างเช่น register 0x20 ใช้เพื่อเปิดใช้งานแกน x, y และ z การลงทะเบียน 0x21 ใช้เพื่อตั้งค่าตัวกรองความถี่สูง Register 0x22 ใช้สำหรับควบคุมการขัดจังหวะภายในของชิป การลงทะเบียน 0x23 ใช้เพื่อควบคุมช่วงเต็มสเกลรีจิสเตอร์ 0x24 ใช้สำหรับควบคุมการกรองรอบสูงของเอาท์พุท จากนั้นที่อยู่สลาฟสำหรับอุปกรณ์ของเราจะถูกประกาศ หากเราอ้างถึงแผ่นข้อมูล L3GD20 เราจะเห็นว่าที่อยู่ที่เกี่ยวข้องกับ L3GD20 นั้นคือ 110101xb SAO pin ในการวัดการหมุนวนของเราช่วยให้เราสามารถเลือกที่อยู่บิตสุดท้ายโดยการตั้งค่ามันสูงหรือต่ำ ดังนั้นเราจึงมีสองที่อยู่ที่เป็นไปได้: 1101010 หรือ 1101011 ในบทช่วยสอนนี้เราตัดสินใจต่อ SAO ดังนั้นที่อยู่ทาสของเราคือ 1101010 หรือ 106 ในรูปทศนิยม สุดท้าย x, y, และ z ถูกประกาศเป็นตัวแปรจำนวนเต็มเพื่อเก็บค่าที่วัดโดยไจโรสโคปในแต่ละแกน การตั้งค่าเป็นโมฆะ () {Wire.begin (); Serial.begin (9600); Serial.println ("การเริ่มต้น L3GD20"); setupL3GD20 (2000); // กำหนดค่า L3GD20 - 250, 500 หรือ 2000 องศา / วินาที pinMode (2, OUTPUT); // X + Ve ค่า pinMode (3, OUTPUT); // X -Ve value pinMode (4, OUTPUT); // Y + ve ค่า pinMode (5, OUTPUT); // Y -Ve value pinMode (6, OUTPUT); // Z + Ve ค่า pinMode (7, OUTPUT); // Z -Ve value delay (100); // รอให้เซ็นเซอร์พร้อม}
ในส่วนการตั้งค่าเราเริ่มต้นห้องสมุดลวดและตั้งค่าอัตราการรับส่งข้อมูลสำหรับการสื่อสารแบบอนุกรม จากนั้นเราเรียกฟังก์ชัน“ setupL3GD20” ที่มีสเกลองศาต่อวินาทีที่เราต้องการเป็นอาร์กิวเมนต์ สุดท้ายเราตั้งไฟ LED เป็นเอาท์พุทและสร้างความล่าช้า 100ms void loop () {getGyroValues (); // สิ่งนี้จะอัปเดต x, y และ z ด้วยค่าใหม่ Serial.print ("X:"); Serial.print (x); Serial.print ("Y:"); Serial.print (y); Serial.print ("Z:"); Serial.println (z); ล่าช้า (100); // เพียงแค่ที่นี่เพื่อชะลออนุกรมเพื่อให้อ่านได้ง่ายขึ้น // ********* ฟังก์ชั่นไฟ LED ************ // // ******* **** ตำแหน่ง X- ไฟ LED ********* // ถ้า (x> = 1,000) {digitalWrite (2, สูง); digitalWrite (3, ต่ำ); } อื่นถ้า (x <= -1000) {digitalWrite (3, สูง); digitalWrite (2, LOW); } else {digitalWrite (2, LOW); digitalWrite (3, ต่ำ); } // *********** หลอด LED ตำแหน่ง Y- ********* // ถ้า (y> = 1,000) {digitalWrite (4, สูง); digitalWrite (5, LOW); } อื่นถ้า (y <= -1000) {digitalWrite (5, สูง); digitalWrite (4, LOW); } else {digitalWrite (4, LOW); digitalWrite (5, ต่ำ); } // *********** Z- ตำแหน่ง LED ********* // ถ้า (z> = 1,000) {digitalWrite (6, สูง); digitalWrite (7, ต่ำ); } อื่นถ้า (z <= -1000) {digitalWrite (7, สูง); digitalWrite (6, ต่ำ); } else {digitalWrite (7, LOW); digitalWrite (6, ต่ำ); } // ************ LED funcitons สิ้นสุด **************** //}
ในวงเราเรียกฟังก์ชัน“ getGyroValues” เพื่อรับค่า x, y และ z ที่วัดโดยเครื่องวัดการหมุนวน จากนั้นเราจะพิมพ์ลงในมอนิเตอร์อนุกรมและสร้างความล่าช้า 100ms เพื่อชะลอการส่งข้อมูลและทำให้ค่าอ่านได้ ในที่สุดเราตรวจสอบว่า x, y และ z น้อยกว่าหรือมากกว่า 1,000 แต่ละกรณีจะเปิดหรือปิดไฟ LED ที่เกี่ยวข้องเพื่อให้มองเห็นสภาพที่ตรงตามเงื่อนไข ถือเป็นโมฆะ getGyroValues () ไบต์ xMSB = readRegister (L3GD20_ ที่อยู่, 0x29); ไบต์ xLSB = readRegister (L3GD20_ ที่อยู่, 0x28); x = ((xMSB << 8)
ในฟังก์ชั่น“ getGyroValues” เราอ่านข้อมูลดิบที่วัดโดยไจโรสโคป L3GD20 และเก็บไว้ในตัวแปรของ x, y และ z ตามลำดับ int setupL3GD20 (ระดับสเกล) {// จาก Jim Lindblom ของโค้ดของ Sparkfun // เปิดใช้งาน x, y, z และปิดไฟลง: writeRegister (L3GD20_Address, CTRL_REG1, 0b00001111); // หากคุณต้องการปรับ / ใช้ HPF คุณสามารถแก้ไขบรรทัดด้านล่างเพื่อกำหนดค่า CTRL_REG2: writeRegister (L3GD20_Address, CTRL_REG2, 0b00000000); // กำหนดค่า CTRL_REG3 เพื่อสร้างการขัดจังหวะข้อมูลใน INT2 // ไม่มีการขัดจังหวะที่ใช้บน INT1 หากคุณต้องการกำหนดค่า INT1 // หรือ INT2 มิฉะนั้นให้ดูที่แผ่นข้อมูล: writeRegister (L3GD20_Address, CTRL_REG3, 0b00001000); // CTRL_REG4 ควบคุมช่วงเต็มรูปแบบเหนือสิ่งอื่นใด: if (scale == 250) {writeRegister (L3GD20_Address, CTRL_REG4, 0b00000000); } ถ้า if (scale == 500) {writeRegister (L3GD20_ ที่อยู่, CTRL_REG4, 0b00010000); } else {writeRegister (L3GD20_Address, CTRL_REG4, 0b00110000); } // CTRL_REG5 ควบคุมการกรองความถี่สูงของเอาต์พุตใช้มัน // หากคุณต้องการ: writeRegister (L3GD20_Address, CTRL_REG5, 0b00000000); }
ฟังก์ชัน“ setupL3GD20” ใช้เพื่อกำหนดค่าไจโรสโคปของเราโดยการเขียนค่าลงทะเบียนที่กำหนดไว้ก่อนหน้าในรหัส อ้างถึงแผ่นข้อมูล (หน้า 31) เพื่อดูว่าแต่ละค่าใช้สำหรับอะไร สำหรับ Control Register 4 เราจะตรวจสอบว่าสเกลใดที่ถูกเลือกเป็นอาร์กิวเมนต์ของฟังก์ชันเพื่อกำหนดค่าที่สอดคล้องกัน ถือเป็นโมฆะ writeRegister (int deviceAddress, ที่อยู่ไบต์, ไบต์ val) {Wire.beginTransmission (deviceAddress); // เริ่มส่งไปยังอุปกรณ์ Wire.write (ที่อยู่); // ส่งที่อยู่การลงทะเบียน Wire.write (val); // ส่งค่าเพื่อเขียน Wire.endTransmission (); // end transmission
ฟังก์ชั่น“ writeRegister” ใช้เพื่อส่งค่าไปยังรีจิสเตอร์โดยใช้ฟังก์ชั่นบางส่วนของ Wire wire ฟังก์ชั่นใช้เวลาสามข้อโต้แย้ง: ที่อยู่ของอุปกรณ์ของเราที่อยู่ของการลงทะเบียนที่เราต้องการที่จะส่งค่าและค่าที่เราต้องการที่จะส่ง int readRegister (int อุปกรณ์ที่อยู่, ที่อยู่ไบต์) {int v; Wire.beginTransmission (deviceAddress); Wire.write (ที่อยู่); // ลงทะเบียนเพื่ออ่าน Wire.endTransmission (); Wire.requestFrom (deviceAddress, 1); // อ่านไบต์ในขณะที่ (! Wire.available ()) {// Waiting} v = Wire.read (); กลับ v; }
ฟังก์ชัน“ readRegister” ใช้เพื่ออ่านค่าจากรีจิสเตอร์ ในกรณีนี้เราใช้เพื่ออ่านค่าจากรีจิสเตอร์ที่เก็บข้อมูลดิบสำหรับ x, y และ z อีกครั้งเราใช้บางฟังก์ชั่นของห้องสมุดลวดเพื่อทำสิ่งนี้ เมื่ออัปโหลดรหัสแล้วสามารถดูเอาต์พุตได้ในมอนิเตอร์อนุกรม เมื่อเซ็นเซอร์ถูกแบนโดยไม่มีการหมุนใด ๆ เราจะได้รับค่าต่อไปนี้ตามที่แสดงด้านบน เมื่อเซ็นเซอร์หมุนตามแกน z ในทิศทางเดียวค่าของ z จะเป็นค่าลบและสูงกว่าและไฟ LED สีแดงจะติดขึ้น เมื่อเซ็นเซอร์หมุนตามแกน z ในทิศทางตรงกันข้ามค่าของ z จะเป็นค่าบวกและสูงขึ้นและ LED สีเหลืองจะติดขึ้น ค่าจะแสดงในภาพด้านบนและแสดงให้เห็นในวิดีโอสั้น ๆ เมื่อเซ็นเซอร์หมุนตามแกน y ในทิศทางเดียวค่าของ y จะเป็นค่าลบและสูงกว่าและไฟ LED สีเขียวจะติดขึ้น เมื่อเซ็นเซอร์หมุนตามแกน y ในทิศทางตรงกันข้ามค่าของ y จะเป็นค่าบวกและสูงขึ้นและ LED สีเหลืองจะติดขึ้น ค่าจะแสดงในภาพด้านบนและแสดงให้เห็นในวิดีโอสั้น ๆ เมื่อเซ็นเซอร์หมุนตามแกน x ในทิศทางค่าของ x จะเป็นค่าลบและสูงกว่าและ LED สีเขียวจะเปิด เมื่อเซ็นเซอร์หมุนตามแกน x ในทิศทางตรงกันข้ามค่าของ x จะเป็นค่าบวกและสูงกว่าและไฟ LED สีเหลืองจะเปิดขึ้น ค่าจะแสดงในภาพด้านบนและแสดงให้เห็นในวิดีโอสั้น ๆ ตอนนี้คุณรู้วิธีใช้เซ็นเซอร์ไจโรสโคปและวิธีการทำงานแล้วคุณสามารถสร้างโปรเจคของคุณเองได้เช่นแพลตฟอร์มที่มีความเสถียรในตัวเองหรือแม้กระทั่งหุ่นยนต์ที่ปรับสมดุลตัวเอง หากคุณมีคำถามใด ๆ เกี่ยวกับบทช่วยสอนนี้อย่าลังเลที่จะโพสต์ความคิดเห็นยิงอีเมลถึงเราหรือโพสต์ไว้ในฟอรัมของเรา เมื่อคุณพร้อมที่จะเริ่มโครงการนี้ลองดูร้านค้าออนไลน์ของ Jaycon Systems เพื่อรับชิ้นส่วนที่คุณต้องการ ในขณะที่คุณอยู่บนเว็บไซต์ของเราลองดูบทแนะนำที่ยอดเยี่ยมอื่น ๆ ที่เราได้แจ้งไว้ นอกจากนี้หากคุณยังไม่ได้ตรวจสอบโปรไฟล์ของเราสำหรับโครงการทีละขั้นตอนเพิ่มเติม บอกให้เรารู้ว่าคุณทำอะไรลงไป! ขอบคุณที่อ่าน!ขั้นตอนที่ 6: คำอธิบายรหัส - ต่อ
ขั้นตอนที่ 7: คำอธิบายรหัส - ต่อ
ขั้นตอนที่ 8: คำอธิบายรหัส - ต่อ
ขั้นตอนที่ 9: คำอธิบายรหัส - ต่อ
ขั้นตอนที่ 10: คำอธิบายรหัส - ต่อ
ขั้นตอนที่ 11: คำอธิบายรหัส - ต่อ
ขั้นตอนที่ 12: การส่งออก - แบน
ขั้นตอนที่ 13: การส่งออก - แกน Z
ขั้นตอนที่ 14: การส่งออก - แกน Y
ขั้นตอนที่ 15: ผลลัพธ์ - แกน X
ขั้นตอนที่ 16: ตอนนี้คุณรู้แล้ว!