เรียนรู้เกี่ยวกับ L3GD20 Breakout Board: 16 ขั้นตอน

เรียนรู้เกี่ยวกับ L3GD20 Breakout Board: 16 ขั้นตอน

สารบัญ:

Anonim

เซ็นเซอร์ 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 #define CTRL_REG1 0x20 #define CTRL_REG2 0x21 #define CTRL_REG3 0x22 # กำหนด CTRL_REG4 0x23 #define CTRL_REG5 0x24 int L3GD20_Address = 106 int x; int y; int z;

ในส่วนนี้ของรหัสลวดห้องสมุดรวมอยู่ ไลบรารีนี้อนุญาตให้ 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 ถูกประกาศเป็นตัวแปรจำนวนเต็มเพื่อเก็บค่าที่วัดโดยไจโรสโคปในแต่ละแกน

ขั้นตอนที่ 6: คำอธิบายรหัส - ต่อ

การตั้งค่าเป็นโมฆะ () {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

ขั้นตอนที่ 7: คำอธิบายรหัส - ต่อ

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 ที่เกี่ยวข้องเพื่อให้มองเห็นสภาพที่ตรงตามเงื่อนไข

ขั้นตอนที่ 8: คำอธิบายรหัส - ต่อ

ถือเป็นโมฆะ getGyroValues ​​() ไบต์ xMSB = readRegister (L3GD20_ ที่อยู่, 0x29); ไบต์ xLSB = readRegister (L3GD20_ ที่อยู่, 0x28); x = ((xMSB << 8)

ในฟังก์ชั่น“ getGyroValues” เราอ่านข้อมูลดิบที่วัดโดยไจโรสโคป L3GD20 และเก็บไว้ในตัวแปรของ x, y และ z ตามลำดับ

ขั้นตอนที่ 9: คำอธิบายรหัส - ต่อ

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 เราจะตรวจสอบว่าสเกลใดที่ถูกเลือกเป็นอาร์กิวเมนต์ของฟังก์ชันเพื่อกำหนดค่าที่สอดคล้องกัน

ขั้นตอนที่ 10: คำอธิบายรหัส - ต่อ

ถือเป็นโมฆะ writeRegister (int deviceAddress, ที่อยู่ไบต์, ไบต์ val) {Wire.beginTransmission (deviceAddress); // เริ่มส่งไปยังอุปกรณ์ Wire.write (ที่อยู่); // ส่งที่อยู่การลงทะเบียน Wire.write (val); // ส่งค่าเพื่อเขียน Wire.endTransmission (); // end transmission

ฟังก์ชั่น“ writeRegister” ใช้เพื่อส่งค่าไปยังรีจิสเตอร์โดยใช้ฟังก์ชั่นบางส่วนของ Wire wire

ฟังก์ชั่นใช้เวลาสามข้อโต้แย้ง: ที่อยู่ของอุปกรณ์ของเราที่อยู่ของการลงทะเบียนที่เราต้องการที่จะส่งค่าและค่าที่เราต้องการที่จะส่ง

ขั้นตอนที่ 11: คำอธิบายรหัส - ต่อ

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 อีกครั้งเราใช้บางฟังก์ชั่นของห้องสมุดลวดเพื่อทำสิ่งนี้

ขั้นตอนที่ 12: การส่งออก - แบน

เมื่ออัปโหลดรหัสแล้วสามารถดูเอาต์พุตได้ในมอนิเตอร์อนุกรม เมื่อเซ็นเซอร์ถูกแบนโดยไม่มีการหมุนใด ๆ เราจะได้รับค่าต่อไปนี้ตามที่แสดงด้านบน

ขั้นตอนที่ 13: การส่งออก - แกน Z

เมื่อเซ็นเซอร์หมุนตามแกน z ในทิศทางเดียวค่าของ z จะเป็นค่าลบและสูงกว่าและไฟ LED สีแดงจะติดขึ้น เมื่อเซ็นเซอร์หมุนตามแกน z ในทิศทางตรงกันข้ามค่าของ z จะเป็นค่าบวกและสูงขึ้นและ LED สีเหลืองจะติดขึ้น

ค่าจะแสดงในภาพด้านบนและแสดงให้เห็นในวิดีโอสั้น ๆ

ขั้นตอนที่ 14: การส่งออก - แกน Y

เมื่อเซ็นเซอร์หมุนตามแกน y ในทิศทางเดียวค่าของ y จะเป็นค่าลบและสูงกว่าและไฟ LED สีเขียวจะติดขึ้น เมื่อเซ็นเซอร์หมุนตามแกน y ในทิศทางตรงกันข้ามค่าของ y จะเป็นค่าบวกและสูงขึ้นและ LED สีเหลืองจะติดขึ้น

ค่าจะแสดงในภาพด้านบนและแสดงให้เห็นในวิดีโอสั้น ๆ

ขั้นตอนที่ 15: ผลลัพธ์ - แกน X

เมื่อเซ็นเซอร์หมุนตามแกน x ในทิศทางค่าของ x จะเป็นค่าลบและสูงกว่าและ LED สีเขียวจะเปิด เมื่อเซ็นเซอร์หมุนตามแกน x ในทิศทางตรงกันข้ามค่าของ x จะเป็นค่าบวกและสูงกว่าและไฟ LED สีเหลืองจะเปิดขึ้น

ค่าจะแสดงในภาพด้านบนและแสดงให้เห็นในวิดีโอสั้น ๆ

ขั้นตอนที่ 16: ตอนนี้คุณรู้แล้ว!

ตอนนี้คุณรู้วิธีใช้เซ็นเซอร์ไจโรสโคปและวิธีการทำงานแล้วคุณสามารถสร้างโปรเจคของคุณเองได้เช่นแพลตฟอร์มที่มีความเสถียรในตัวเองหรือแม้กระทั่งหุ่นยนต์ที่ปรับสมดุลตัวเอง

หากคุณมีคำถามใด ๆ เกี่ยวกับบทช่วยสอนนี้อย่าลังเลที่จะโพสต์ความคิดเห็นยิงอีเมลถึงเราหรือโพสต์ไว้ในฟอรัมของเรา

เมื่อคุณพร้อมที่จะเริ่มโครงการนี้ลองดูร้านค้าออนไลน์ของ Jaycon Systems เพื่อรับชิ้นส่วนที่คุณต้องการ

ในขณะที่คุณอยู่บนเว็บไซต์ของเราลองดูบทแนะนำที่ยอดเยี่ยมอื่น ๆ ที่เราได้แจ้งไว้ นอกจากนี้หากคุณยังไม่ได้ตรวจสอบโปรไฟล์ของเราสำหรับโครงการทีละขั้นตอนเพิ่มเติม

บอกให้เรารู้ว่าคุณทำอะไรลงไป!

ขอบคุณที่อ่าน!