สารบัญ:

ระดับ Digital Spirit จาก Arduino & MPU6050: 3 ขั้นตอน
ระดับ Digital Spirit จาก Arduino & MPU6050: 3 ขั้นตอน

วีดีโอ: ระดับ Digital Spirit จาก Arduino & MPU6050: 3 ขั้นตอน

วีดีโอ: ระดับ Digital Spirit จาก Arduino & MPU6050: 3 ขั้นตอน
วีดีโอ: Arduino MPU6050 Digital Spirit Level Measuring Device 2024, พฤศจิกายน
Anonim
Image
Image
The Circuit
The Circuit

ยินดีต้อนรับสู่การสอนครั้งแรกของฉัน! ฉันหวังว่าคุณจะพบว่ามันเป็นข้อมูล โปรดแสดงความคิดเห็นไม่ว่าจะบวกหรือลบ

โครงการนี้คือการสร้างระดับจิตวิญญาณดิจิตอลที่ใช้ Arduino & MPU6050 แม้ว่าการออกแบบและโค้ดที่เสร็จสิ้นแล้วจะเป็นของฉัน แต่แนวคิดดั้งเดิมและโค้ดส่วนใหญ่ที่ฉันใช้นั้นกลับไม่ใช่ ฉันไม่ได้เป็นผู้ลอกเลียนแบบ ดังนั้นฉันจึงยินดีเป็นอย่างยิ่งที่จะให้เครดิตกับผู้ที่มีแนวคิดที่ฉันสร้างขึ้น บุคคลสำคัญ 2 คนที่ฉันอยากพูดถึงคือ Paul McWhorter ของ YouTuber และ DroneBot Workshop ฉันรวมลิงก์ไปยังลิงก์เหล่านี้ใน PDF ลิงก์ที่มีประโยชน์ของ YouTube ขอขอบคุณ EEEnthusiast สำหรับวิดีโอที่ให้ข้อมูลเกี่ยวกับการใช้ MPU6050 รวมถึงการตั้งค่าและการอ่านจากโมดูลที่ไม่มีไลบรารีภายนอก (ลิงก์ของเขาอยู่ใน PDF เดียวกัน)

โปรเจ็กต์ที่ฉันสร้าง ทำงาน 'ตามสภาพ' และแม่นยำราวกับนางฟ้า มากถึง 45% ในทิศทางใดทิศทางหนึ่ง คุณสามารถใช้มันได้ตรงตามที่ฉันออกแบบไว้ หรือคุณสามารถปรับแต่งให้เข้ากับรสนิยมของคุณเองได้ ยิ่งคุณฉลาดขึ้นจะสังเกตเห็นว่าโปรเจ็กต์ของฉันเกือบจะเหมือนกับโปรเจ็กต์ที่สร้างโดยเวิร์กช็อป DroneBot แต่โปรดวางใจว่ามีความแตกต่างที่สำคัญ โดยเฉพาะอย่างยิ่งเมื่อพูดถึงโค้ดสำหรับการคำนวณมุม บวกกับความสะดวกในการจัดเก็บค่าการสอบเทียบใน อีพรอม!

คุณลักษณะบางอย่างที่กระตุ้นความอยากอาหารของคุณ:

มุมพิทช์และม้วนใช้ได้ภายใน 0.1 องศา

ตรวจจับทิศทางของหน่วยไจโรโดยอัตโนมัติ (แนวนอนหรือแนวตั้ง)

การสอบเทียบเต็มรูปแบบพร้อมผลลัพธ์ที่จัดเก็บโดยอัตโนมัติไปยัง eeprom

ไฟ LED แสดงสถานะตั้งแต่ -2 ถึง +2 องศา (เปลี่ยนรหัสได้)

ตัวบ่งชี้ระดับเสียงเพิ่มเติม (สามารถเปิด/ปิดได้ทันที)

เคอร์คิวขนาดกะทัดรัดที่ต้องการส่วนประกอบน้อยที่สุด

มาเริ่มกันเลย.

เสบียง

โครงการนี้ (ตามที่เป็น) ใช้รายการต่อไปนี้:

1 x Arduino nano (ของฉันเป็นโคลน)

1 x MPU6050 โมดูลไจโร/มาตรความเร่ง

1 x LCD - การเชื่อมต่อ 16 x 2 + I2C

1 x กดเพื่อทำสวิตช์

1 x Piezo buzzer

1 x LED สีเขียว

2 x ไฟ LED สีเหลือง

2 x ไฟ LED สีแดง

ตัวต้านทาน 5 x 220 โอห์ม

สายจัมเปอร์ต่างๆ

เขียงหั่นขนม

แหล่งจ่ายไฟ (ของฉันใช้ธนาคารพลังงาน USB 5v เมื่อไม่ได้เชื่อมต่อกับพีซีของฉัน แต่คุณสามารถใช้แบตเตอรี่ที่เชื่อมต่ออย่างเหมาะสม)

ขั้นตอนที่ 1: วงจร

The Circuit
The Circuit
The Circuit
The Circuit

สมมติว่าคุณมีส่วนประกอบทั้งหมด คุณจะต้องสร้างเขียงหั่นขนมของคุณ

ฉันแสดงการตั้งค่าของฉันเป็นแนวทาง แต่การเชื่อมต่อมีดังนี้:

Arduino pin D2 เชื่อมต่อกับสวิตช์กด 1 ด้าน อีกด้านของสวิตช์กดเชื่อมต่อกับกราวด์

Arduino pin D3 เชื่อมต่อกับตัวต้านทาน 220 โอห์ม 1 ด้าน ตัวต้านทานอีกด้านเชื่อมต่อกับขั้วบวกของ LED สีแดง แคโทดของ LED สีแดงลงไปที่พื้น

Arduino pin D4 เชื่อมต่อกับตัวต้านทาน 220 โอห์ม 1 ด้าน ตัวต้านทานอีกด้านเชื่อมต่อกับขั้วบวกของ LED สีเหลือง แคโทดของ LED สีเหลืองลงไปที่พื้น

Arduino pin D5 เชื่อมต่อกับตัวต้านทาน 220 โอห์ม 1 ด้าน ตัวต้านทานอีกด้านเชื่อมต่อกับขั้วบวกของ LED สีเขียว แคโทดของ LED สีเขียวลงไปที่พื้น

Arduino pin D6 เชื่อมต่อกับตัวต้านทาน 220 โอห์ม 1 ด้าน ตัวต้านทานอีกด้านเชื่อมต่อกับขั้วบวกของ LED สีเหลือง แคโทดของ LED สีเหลืองลงไปที่พื้น

Arduino pin D7 เชื่อมต่อกับตัวต้านทาน 220 โอห์ม 1 ด้าน ตัวต้านทานอีกด้านเชื่อมต่อกับขั้วบวกของ LED สีแดง แคโทดของ LED สีแดงลงไปที่พื้น

Arduino pin D8 เชื่อมต่อกับ Piezo buzzer ด้านใดด้านหนึ่ง อีกด้านของออดเชื่อมต่อกับกราวด์

Arduino pin A4 เชื่อมต่อกับพิน SDA บน MPU6050 และ LCD

Arduino pin A5 เชื่อมต่อกับพิน SCL บน MPU6050 และ LCD

กำลังไฟ 5v และ Gnd สำหรับ MPU6050 และ LCD มาจากพิน Arduino Nano 5v และ GND ตามลำดับ

เมื่อเสร็จแล้วควรจะคล้ายกับการตั้งค่าของฉันที่แสดง ฉันวาง Blu tak ไว้ใต้ MPU6050 เพื่อหยุดการเคลื่อนไหวและบน LCD เพื่อเก็บไว้ที่ขอบของเขียงหั่นขนม

ขั้นตอนที่ 2: รหัส

รหัสที่แนบมาคือรหัสที่ฉันใช้สำหรับโครงการนี้ ห้องสมุดเดียวที่คุณอาจมีปัญหาคือ

ไลบรารี LiquidCrystal_I2C.h ขณะที่ฉันนำเข้าสิ่งนี้เมื่อฉันเริ่มทำงานกับ LCD เป็นครั้งแรก น่าเสียดายที่มีไลบรารี่ไม่กี่แห่งที่ใช้คำสั่ง #include เหมือนกัน แต่ต่างกันเล็กน้อย หากคุณมีปัญหากับของคุณ ให้ค้นหารหัส LCD อื่นที่เหมาะกับคุณและแก้ไขรหัสตามนั้น มีแนวโน้มว่าจะเป็นการตั้งค่าที่แตกต่างกันเท่านั้น คำสั่ง 'print' ทั้งหมดควรทำงานเหมือนกัน

โค้ดทั้งหมดได้รับการแสดงความคิดเห็นแล้ว และสมมติว่าฉันทำถูกต้องแล้ว จะมีวิดีโออธิบายทุกอย่างด้วย แต่ต่อไปนี้คือประเด็นที่ควรทราบ:

LiquidCrystal_I2C จอแอลซีดี (0x27, 16, 2);

รหัสด้านบนคือการตั้งค่าสำหรับ LCD ของฉัน หากไลบรารีของคุณแตกต่างออกไป คุณอาจต้องเปลี่ยนไม่เพียงแต่ไลบรารีของคุณ แต่ยังรวมถึงบรรทัดนี้ด้วย

{ lcd.setCursor(0, 1); lcd.print("แนวนอน!"); ปฐมนิเทศ = แนวนอน; // อ่านข้อมูลดิบและไจโรจาก MPU-6050 1,000 ครั้งสำหรับ (int cal_int = 0; cal_int < 1000; cal_int ++) { read_mpu_6050_data(); // เพิ่มออฟเซ็ต gyro x ให้กับตัวแปร gyro_x_cal gyro_x_cal += gyro_x; //เพิ่มค่าชดเชยไจโร y ให้กับตัวแปร gyro_y_cal gyro_y_cal += gyro_y; //เพิ่มออฟเซ็ต gyro z ให้กับตัวแปร gyro_z_cal gyro_z_cal += gyro_z; // เพิ่มออฟเซ็ต acc x ให้กับตัวแปร acc_x_cal acc_x_cal += acc_x; //เพิ่มออฟเซ็ต acc y ให้กับตัวแปร acc_y_cal acc_y_cal += acc_y; } // หารผลลัพธ์ทั้งหมดด้วย 1,000 เพื่อรับออฟเซ็ตเฉลี่ย gyro_x_cal /= 1000.0; gyro_y_cal /= 1000.0; gyro_z_cal /= 1000.0; acc_x_cal /= 1000.0; acc_y_cal /= 1000.0; การปรับเทียบขอบฟ้า = 255; eeprom_address = 0; EEPROM.put(eeprom_address, การปรับเทียบขอบฟ้า); eeprom_address += sizeof(int); EEPROM.put(eeprom_address, gyro_x_cal); eeprom_address += sizeof(ลอย); EEPROM.put(eeprom_address, gyro_y_cal); eeprom_address += sizeof(ลอย); EEPROM.put(eeprom_address, gyro_z_cal); eeprom_address += sizeof(ลอย); EEPROM.put(eeprom_address, acc_x_cal); eeprom_address += sizeof(ลอย); EEPROM.put(eeprom_address, acc_y_cal); eeprom_address += sizeof(ลอย); //โปรดทราบว่าเราไม่ได้จัดเก็บออฟเซ็ตสำหรับ acc_z เนื่องจากแรงโน้มถ่วง! ล่าช้า (500); }

บล็อกโค้ดด้านบนจะดำเนินการกับรูทีนการสอบเทียบ รหัสนี้ใช้สำหรับการสอบเทียบแนวนอน มีโค้ดใกล้เคียงกันสำหรับการสอบเทียบแนวตั้ง (โปรดทราบว่าโค้ดจะรู้ว่า MPU6050 ของคุณติดตั้งในแนวนอนหรือแนวตั้ง!) MPU6050 อ่าน 1,000 ครั้ง ค่าที่เหมาะสมจะถูกเพิ่มสะสมแล้วหารด้วย 1,000 เพื่อให้ค่า 'ออฟเซ็ต' เฉลี่ย ค่าเหล่านี้จะถูกเก็บไว้ใน Nano eeprom ค่าการสอบเทียบแนวนอนทั้งหมดจะถูกเก็บไว้โดยเริ่มต้นที่ที่อยู่ eeprom 0 ค่าแนวตั้งทั้งหมดจะถูกเก็บไว้ที่เริ่มต้นที่ที่อยู่ eeprom 24 การสอบเทียบจะต้องทำบนพื้นผิวที่เรียบเสมอกัน มิฉะนั้น จะไม่มีความหมายอะไรเลย

/* * สองสามบรรทัดถัดไปจะประมวลผลข้อมูลดิบเพื่อเปลี่ยนเป็นมุมที่สามารถส่งออกไปยัง LCD และ LED ได้ * ค่า 4096 ซึ่งข้อมูลการเร่งความเร็วหารด้วยนั้นนำมาจากแผ่นข้อมูล MPU6050 และอิงตามอัตราตัวอย่าง * ค่า 9.8 คือแรงโน้มถ่วง * ฟังก์ชัน atan2 มาจากโมดูลคณิตศาสตร์และใช้ในการคำนวณมุมจากข้อมูลที่กำหนด */ thetaM =-atan2((acc_x/4096.0)/9.8, (acc_z/4096.0)/9.8) /2/3.141592656 * 360; //ข้อมูลดิบ phiM =-atan2((acc_y/4096.0)/9.8, (acc_z/4096.0)/9.8)/2/3.141592656 * 360; //ข้อมูลดิบ dt=(millis()-millisOld)/1000.; millisOld=มิลลิวินาที(); /* * ส่วนนี้ใช้ข้อมูลไจโรเพื่อทำให้ระบบตอบสนองมากขึ้น * ค่า 65.5 ซึ่งข้อมูลไจโรหารด้วยนั้นนำมาจากแผ่นข้อมูล MPU6050 และอิงตามอัตราการสุ่มตัวอย่าง */ theta=(theta+(gyro_y/ 65.5)*dt)*.96 + thetaM*.04; //ตัวกรองความถี่ต่ำ phi=(phi+(gyro_x/65.5)*dt)*.96 + phiM*.04; //กรองผ่านต่ำ

รหัสด้านบนคือสิ่งที่คำนวณมุม หวังว่าความคิดเห็นจะให้ข้อมูลเชิงลึกเล็กน้อยเกี่ยวกับวิธีการทำงาน แต่สำหรับคำอธิบายเชิงลึก โปรดดูวิดีโอของ Paul McWhorters ที่ลิงก์อยู่ใน PDF ที่แนบมา สิ่งที่ฉันจะพูดคือคุณสามารถเปลี่ยนอัตราตัวอย่างสำหรับไจโรและมาตรความเร่ง (ซึ่งทำในรูทีนย่อยการตั้งค่า MPU6050 ที่ด้านล่างของโค้ดของฉัน) หากคุณเปลี่ยนอัตราตัวอย่าง คุณต้องเปลี่ยนจำนวนข้อมูลดิบที่หารด้วย สำหรับข้อมูลมาตรความเร่ง ค่าปัจจุบันคือ 4096 สำหรับไจโร ค่าปัจจุบันคือ 65.5

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

ขั้นตอนที่ 3: ขั้นตอนต่อไป

มาถึงจุดนี้ก็หวังว่าจะได้ทำโครงการนี้ แต่แล้วตอนนี้ล่ะ?

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

อาจลองใช้อัตราตัวอย่างไจโรและมาตรความเร่งเพื่อดูว่าพวกเขาทำงานได้ดีกว่าที่อัตราหนึ่งหรือไม่

ลองปรับแต่งโค้ดเพิ่มเติม ตัวอย่างเช่น ณ ปัจจุบันเกิน 45 องศา มุมที่ระบุนั้นค่อนข้างหยาบ มีวิธีรอบมันหรือไม่?

หากคุณมีคำถามใด ๆ แม้ว่าจะดูง่ายแค่ไหนก็ตามโปรดถาม ถ้าฉันสามารถช่วยได้ ฉันจะทำ

หากคุณชอบคำแนะนำนี้โปรดกดไลค์เพื่อที่ฉันจะได้รู้

หากคุณทำสิ่งนี้ โปรดแสดงให้ฉันทราบ (โดยเฉพาะในกรณีที่ใช้งานได้)

ขอบคุณ

แนะนำ: