Агуулгын хүснэгт:

Arduino & MPU6050 дээр суурилсан дижитал сүнсний түвшин: 3 алхам
Arduino & MPU6050 дээр суурилсан дижитал сүнсний түвшин: 3 алхам

Видео: Arduino & MPU6050 дээр суурилсан дижитал сүнсний түвшин: 3 алхам

Видео: Arduino & MPU6050 дээр суурилсан дижитал сүнсний түвшин: 3 алхам
Видео: #ArduBlock 2.0 - Гироскоп и акселерометр MPU6050 + Arduino 2024, Арваннэгдүгээр
Anonim
Image
Image
Хэлхээ
Хэлхээ

Миний анхны зааварчилгаанд тавтай морил! Та үүнийг мэдээлэл сайтай гэж найдаж байна. Эерэг эсвэл сөрөг эсэх талаар санал хүсэлтээ чөлөөтэй үлдээнэ үү.

Энэхүү төсөл нь arduino & MPU6050 дээр суурилсан дижитал спиртийн түвшинг бий болгох явдал юм. Дууссан загвар, код нь минийх боловч анхны ойлголт, миний ажиллаж байсан кодын ихэнх нь тийм биш юм. Би хулгай хийдэггүй, тиймээс миний бий болгосон санаануудыг үнэлдэгт баяртай байдаг. Миний хашгирахыг хүсч буй 2 гол хүн бол YouTuber -ийн Пол МакВортер ба DroneBot семинар юм. Би тэдний линкийг youtube -ийн хэрэгтэй холбоосууд болох PDF -т оруулсан болно. EEEnthusiast -т MPU6050 -ийг ашиглах талаар гадны номын сангүйгээр модулийг тохируулах, унших талаар мэдээлэл өгсөн видеог үзүүлсэнд баярлалаа (түүний холбоос ижил PDF дээр байна).

Миний үйлдвэрлэсэн төсөл нь "байгаагаараа" ажилладаг бөгөөд үнэхээр үнэн зөв бөгөөд аль ч чиглэлд 45% хүртэл байдаг. Та үүнийг яг миний зохион бүтээсэн байдлаар ашиглаж болно, эсвэл өөрийн хүссэнээр тохируулж болно. Миний төсөл DroneBot цехийн үйлдвэрлэсэнтэй бараг адилхан болохыг та илүү анзаарах болно, гэхдээ ялангуяа өнцөг тооцоолох код, тохируулгын утгыг хадгалах байгууламжийн хувьд мэдэгдэхүйц ялгаа байгаа гэдэгт итгэлтэй байгаарай. Эпром!

Хоолны дуршлыг нэмэгдүүлэх зарим онцлог шинж чанарууд:

Налуу ба өнхрөх өнцөг нь 0.1 градусын дотор боломжтой.

Жирогийн нэгжийн чиглэлийг автоматаар илрүүлэх (хэвтээ эсвэл босоо)

Үр дүн бүхий бүрэн шалгалт тохируулга нь eeprom -д автоматаар хадгалагдана

LED заагч -2 -аас +2 градус хүртэл (кодоор солигддог)

Түвшингийн нэмэлт дуут дохио (нисэх үед асаах/унтраах боломжтой)

Бага бүрэлдэхүүн хэсгүүдийг шаарддаг авсаархан боолт

Эхэлцгээе.

Хангамж

Энэ төсөл (байгаагаар нь) дараахь зүйлийг ашигладаг.

1 x Arduino нано (минийх бол клон)

1 x MPU6050 гиро/акселерометр модуль

1 x LCD - 16 x 2 + I2C холболт

1 x Товчлуурыг дарна уу

1 x Piezo дуугаруулагч

1 x Ногоон LED

2 x шар LED

2 x улаан LED

5 х 220 ом эсэргүүцэл

Төрөл бүрийн холбогч кабель

Талхны самбар

Цахилгаан хангамж (уурхай миний компьютерт холбогдоогүй үед 5в USB тэжээлийн банк ашигладаг байсан, гэхдээ та батерейг зохих ёсоор холбосон байж болно)

Алхам 1: Хэлхээ

Хэлхээ
Хэлхээ
Хэлхээ
Хэлхээ

Хэрэв танд бүх бүрэлдэхүүн хэсгүүд байгаа гэж үзвэл та талхны хавтангаа барих хэрэгтэй болно.

Би өөрийн тохиргоог гарын авлага болгон харуулдаг боловч холболтууд дараах байдалтай байна.

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 дуугаралтын нэг талд холбогддог. Дуу чимээний нөгөө тал нь газартай холбогддог.

Arduino pin A4 нь MPU6050 ба LCD дээрх SDA зүүтэй холбогддог.

Arduino pin A5 нь MPU6050 ба LCD дээрх SCL зүүтэй холбогддог

MPU6050 ба LCD -ийн 5v хүч ба Gnd нь Arduino Nano 5v ба GND зүүгээс ирдэг.

Дууссаны дараа энэ нь миний үзүүлсэн тохиргоотой төстэй байх ёстой. Би шилжүүлэхгүйн тулд MPU6050 -ийн доор blu tak хийж, мөн самбарын ирмэг дээр байлгахын тулд LCD дээр байрлуулсан.

Алхам 2: Код

Хавсаргасан код бол миний энэ төсөлд ашигласан код юм. Танд тулгарч болзошгүй цорын ганц номын сан бол

LiquidCrystal_I2C.h номын сан нь анх LCD дэлгэц дээр ажиллаж байхдаа үүнийг оруулж ирсэн. Харамсалтай нь ижил #include мэдэгдлийг ашигладаг боловч арай өөр номын сан байдаг. Хэрэв танд асуудал байгаа бол өөрт тохирсон LCD кодыг хайж олоод кодоо өөрчилнө үү. Энэ нь зөвхөн өөр өөр тохиргоо байх магадлалтай. Бүх 'хэвлэх' командууд ижил ажиллах ёстой.

Бүх кодыг тайлбарласан бөгөөд би үүнийг зөв хийсэн гэж үзвэл бүх зүйлийг тайлбарласан видео байх болно, гэхдээ энд анхаарах хэдэн зүйлийг энд оруулав.

LiquidCrystal_I2C lcd (0x27, 16, 2);

Дээрх код бол миний LCD дэлгэцийн тохиргоо юм. Хэрэв таны номын сан өөр бол та зөвхөн номын сангаа төдийгүй энэ мөрийг өөрчлөх хэрэгтэй болж магадгүй юм.

{lcd.setCursor (0, 1); lcd.print ("Хэвтээ!"); чиг баримжаа = ХЭВРЭЛ; // MPU-6050-ийн түүхий acc болон гиро өгөгдлийг 1000 удаа уншина уу (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // gyro x офсетийг gyro_x_cal хувьсагч руу нэмнэ gyro_x_cal += gyro_x; // gyro_y_cal хувьсагч руу gyro y офсет нэмнэ gyro_y_cal += gyro_y; // gyro zzset -ийг gyro_z_cal хувьсагч руу нэмнэ gyro_z_cal += gyro_z; // acc_x_cal хувьсагчид acc_x_cal += acc_x дээр acc x офсетыг нэмнэ үү; // acc_y_cal хувьсагчид acc_y_cal += acc_y; } // Бүх үр дүнг 1000 -д хувааж дундаж офсет авах 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; horizonalCalibration = 255; eeprom_address = 0; EEPROM.put (eeprom_address, horizonalCalibration); 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 -ийг 1000 удаа уншдаг. зохих утгуудыг нийлбэр байдлаар нэмж дараа нь 1000 -д хувааж "офсет" гэсэн дундаж утгыг өгнө. Эдгээр утгуудыг дараа нь нано eeprom -д хадгална. Бүх хэвтээ шалгалт тохируулгын утгыг eeprom 0 хаягаас эхлэн хадгална. Бүх босоо утгыг eeprom 24 хаягийн эхэнд хадгална. Шалгалт тохируулгыг бүрэн тэгш гадаргуу дээр хийх ёстой, эс тэгвээс энэ нь ямар ч утгагүй болно.

/ * * Дараагийн хэдэн мөр нь түүхий өгөгдлийг боловсруулж LCD болон LED -д гаргах өнцөг болгон өөрчилдөг. * Хурдатгалын өгөгдлийг хуваасан 4096 -ийн утгыг MPU6050 мэдээллийн хуудаснаас авсан бөгөөд түүврийн хурдыг үндэслэв. * 9.8-ийн утга нь таталцал юм * Атан2 функц нь математикийн модулийн тусламжтайгаар өгөгдсөн өгөгдлүүдийн өнцгийг тооцоолоход хэрэглэгддэг */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 = millis (); / * * Энэ хэсэг нь системийг илүү хариу үйлдэл үзүүлэхийн тулд гиро өгөгдлийг ашигладаг * 65.5 гэсэн утгатай бөгөөд гиро өгөгдлийг хуваахдаа MPU6050 өгөгдлийн хүснэгтээс авсан бөгөөд түүврийн хурдыг үндэслэсэн болно */ theta = (theta+(gyro_y/ 65.5)*dt)*. 96 + tetaM*.04; // Бага нэвтрүүлэх шүүлтүүр phi = (phi + (gyro_x/65.5)*dt)*. 96 + phiM*.04; // Бага нэвтрүүлэх шүүлтүүр

Дээрх код бол өнцгийг тооцоолох зүйл юм. Сэтгэгдлүүд нь энэ нь хэрхэн ажилладаг талаар бага зэрэг ойлголт өгөх болно гэж найдаж байна, гэхдээ гүнзгий тайлбарлахын тулд хавсаргасан PDF дээр хавсаргасан Пол МакВхерсийн видеог үзээрэй. Миний хэлэх зүйл бол та gyro болон Accelerometer -ийн дээжийн хурдыг өөрчилж болно (үүнийг миний кодын доод хэсэгт байрлах MPU6050 дэд програмд хийдэг). Хэрэв та түүвэрлэх хурдыг өөрчилвөл түүхий өгөгдлийг хэд хуваахыг бас өөрчлөх ёстой. Акселерометрийн өгөгдлийн хувьд одоогийн утга нь 4096. гиро хувьд одоогийн утга нь 65.5 байна.

Түүвэрлэлт ба офсет утгыг хэрхэн олох талаар илүү дэлгэрэнгүй мэдээллийг хавсаргасан мэдээллийн хуудас, EEEntusiast -ийн видеоноос (хавсаргасан PDF дээрх линк) үзнэ үү.

Алхам 3: Дараагийн алхамууд

Энэ хугацаанд энэ төслийг хийх болно гэж найдаж байна, гэхдээ одоо яах вэ?

Нэгдүгээрт, үүнийг ашиглаж болох сүнсний түвшинд бий болгож яагаад болохгүй гэж. Та дасан зохицох боломжтой хямд үнэтэй спиртийн түвшинг худалдаж авах боломжтой (хайрцгийн төрөл байгаа эсэхийг шалгаарай) эсвэл хэрэв танд иж бүрдэл байгаа бол өөрийн түвшин/хайрцгийг хэвлээрэй.

Магадгүй тэд нэг хурдаараа нөгөөгөөсөө илүү сайн ажиллаж байгаа эсэхийг шалгахын тулд гиро болон акселерометрийн дээжийн ханшийг тоглож үзээрэй.

Кодыг илүү боловсронгуй болгохыг хичээ. Жишээлбэл, одоогоор 45 хэмээс хэтрүүлсэн өнцгийг хамгийн бага гэж хэлэхэд хэцүү байна. Үүнийг тойрч гарах арга зам байна уу?

Хэрэв танд асуулт байгаа бол хичнээн энгийн байсан ч хамаагүй асуугаарай. Хэрэв би тусалж чадвал би туслах болно.

Хэрэв танд энэ зааварчилгаа таалагдсан бол лайк дарж өгөөрэй.

Хэрэв та үүнийг хийвэл надад үзүүлээрэй (ялангуяа энэ нь ажлын тохиолдолд байгаа бол).

БАЯРЛАЛАА

Зөвлөмж болгож буй: