Përmbajtje:

Arduino & MPU6050 Niveli i Bazuar në Figurën Dixhitale: 3 Hapa
Arduino & MPU6050 Niveli i Bazuar në Figurën Dixhitale: 3 Hapa

Video: Arduino & MPU6050 Niveli i Bazuar në Figurën Dixhitale: 3 Hapa

Video: Arduino & MPU6050 Niveli i Bazuar në Figurën Dixhitale: 3 Hapa
Video: How to use MPU-6050 Accelerometer and Gyroscope with Arduino code 2024, Korrik
Anonim
Image
Image
Qarku
Qarku

Mirësevini në mësimin tim të parë ndonjëherë! Shpresoj që ta gjeni informative. Ju lutemi mos ngurroni të lini reagime pozitive apo negative.

Ky projekt do të krijojë një nivel shpirtëror dixhital të bazuar në arduino & MPU6050. Ndërsa dizajni dhe kodi i përfunduar është imi, koncepti origjinal dhe shumë prej kodit nga i cili kam punuar nuk janë. Unë nuk jam në plagjiaturë, kështu që jam më shumë se i lumtur t'u jap merita atyre ideve që kam ndërtuar mbi to. Dy personat kryesorë të cilëve dua t'u bëj thirrje janë Paul McWhorter i YouTuber dhe Workshop DroneBot. Unë përfshij lidhje me to në lidhjet e mia të dobishme në youtube PDF. Faleminderit gjithashtu për EEEnthusiast për videon e tij informative mbi përdorimin e MPU6050 duke përfshirë ngritjen dhe leximin nga moduli pa një bibliotekë të jashtme (lidhja e tij është në të njëjtën PDF).

Projekti që kam prodhuar, funksionon 'siç është' dhe është përrallë i saktë, sigurisht deri në 45% në të dy drejtimet. Mund ta përdorni pikërisht ashtu siç e kam projektuar, ose mund ta përshtatni sipas shijeve tuaja. Më i zgjuari prej jush do të vini re se projekti im duket pothuajse identik me atë të prodhuar nga punëtoria DroneBot, por të jeni të sigurt, ka dallime domethënëse, veçanërisht kur bëhet fjalë për kodin për llogaritjen e këndeve, plus lehtësinë për të ruajtur vlerat e kalibrimit në Eeprom!

Disa veçori për të hapur oreksin tuaj:

Këndet e ngritjes dhe rrotullimit në dispozicion brenda 0.1 gradë.

Zbulimi automatik i orientimit të njësisë xhiro (horizontale ose vertikale)

Kalibrim i plotë me rezultate të ruajtura automatikisht në eeprom

Treguesi LED nga -2 në +2 gradë (i ndryshueshëm në kod)

Tregues shtesë i dëgjueshëm i nivelit (mund të ndizet/fiket gjatë fluturimit)

Kornizë kompakte që kërkon përbërës minimalë

Le të fillojmë.

Furnizimet

Ky projekt (siç është) përdor artikujt e mëposhtëm:

1 x Arduino nano (imi është një klon)

1 x modul xhiro/përshpejtuesi MPU6050

1 x LCD - lidhje 16 x 2 + I2C

1 x Shtyjeni për të bërë kalimin

1 x Biezer Piezo

1 x LED e gjelbër

2 x LED të verdhë

2 x LED të kuq

Rezistenca 5 x 220 ohm

Kabllo të ndryshme kërcyese

Breadboard

Furnizimi me energji elektrike (imi përdorte një bankë 5v USB, kur nuk ishte e lidhur me kompjuterin tim, por ju mund të përdorni një bateri të lidhur siç duhet)

Hapi 1: Qarku

Qarku
Qarku
Qarku
Qarku

Duke supozuar se i keni të gjithë përbërësit, do t'ju duhet të ndërtoni tabelën tuaj të bukës.

Unë e tregoj konfigurimin tim si një udhëzues, por lidhjet janë si më poshtë:

Kodi Arduino D2 lidhet me 1 anën e ndërprerësit. Ana tjetër e çelësit të shtytjes lidhet me tokën

Kunja Arduino D3 lidhet me 1 anë të rezistencës 220 ohm. Ana tjetër e rezistencës lidhet me anodimin e LED të Kuq. Katoda e LED të Kuq shkon në tokë.

Kunja Arduino D4 lidhet me 1 anë të rezistencës 220 ohm. Ana tjetër e rezistencës lidhet me anodimin e LED të Verdhë. Katoda e LED të Verdhë shkon në tokë.

Kunja Arduino D5 lidhet me 1 anë të rezistencës 220 ohm. Ana tjetër e rezistencës lidhet me anodimin e Green LED. Katoda e LED Green shkon në tokë.

Pin Arduino D6 lidhet me 1 anë të rezistencës 220 ohm. Ana tjetër e rezistencës lidhet me anodimin e LED të Verdhë. Katoda e LED të Verdhë shkon në tokë.

Kodi Arduino D7 lidhet me 1 anë të rezistencës 220 ohm. Ana tjetër e rezistencës lidhet me anodimin e LED të Kuq. Katoda e LED të Kuq shkon në tokë.

Kodi Arduino D8 lidhet me njërën anë të ziles së Piezo. Ana tjetër e ziles lidhet me tokën.

Kodi Arduino A4 lidhet me kunjat SDA në MPU6050 DHE LCD.

Arduino pin A5 lidhet me kunjat SCL në MPU6050 DHE LCD

Fuqia 5v dhe Gnd për MPU6050 dhe LCD vijnë nga kunjat Arduino Nano 5v dhe GND respektivisht.

Pasi të përfundojë, duhet të jetë e ngjashme me konfigurimin tim të treguar. E vendos blu tak nën MPU6050 për ta ndaluar atë të lëvizë dhe gjithashtu në LCD për ta mbajtur në buzë të pjatës.

Hapi 2: Kodi

Kodi i bashkangjitur është kodi që kam përdorur për këtë projekt. Biblioteka e vetme me të cilën mund të keni një problem është ajo

Biblioteka LiquidCrystal_I2C.h pasi e importova këtë kur fillova të punoja për herë të parë me LCD. Fatkeqësisht, ka disa biblioteka që përdorin të njëjtën deklaratë #Include, por janë paksa të ndryshme. Nëse keni probleme me tuajat, gjeni një kod tjetër LCD që funksionon për ju dhe ndryshoni kodin në përputhje me rrethanat. Ka të ngjarë të jetë konfigurimi që ndryshon. Të gjitha komandat 'print' duhet të punojnë njësoj.

I gjithë kodi është komentuar dhe duke supozuar se e kam bërë siç duhet, do të ketë gjithashtu një video që shpjegon gjithçka, por këtu janë disa pika për tu vënë në dukje:

LiquidCrystal_I2C LCD (0x27, 16, 2);

Kodi i mësipërm është konfigurimi për LCD -në time. Nëse biblioteka juaj është e ndryshme, mund t'ju duhet të ndryshoni jo vetëm bibliotekën tuaj, por edhe këtë linjë.

{lcd.setCursor (0, 1); lcd.print ("Horizontal!"); orientimi = HORIZONTAL; // Lexoni të dhënat e papërpunuara acc dhe gyro nga MPU-6050 1000 herë për (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // Shtoni gyro x offset në ndryshoren gyro_x_cal gyro_x_cal += gyro_x; // Shtoni kompensimin gyro y në ndryshoren gyro_y_cal gyro_y_cal += gyro_y; // Shtoni gyro z offset në ndryshoren gyro_z_cal gyro_z_cal += gyro_z; // Shtoni acc x offset në ndryshoren acc_x_cal acc_x_cal += acc_x; // Shtoni kompensimin acc y në ndryshoren acc_y_cal acc_y_cal += acc_y; } // Ndani të gjitha rezultatet me 1000 për të marrë mesataren e kompensuar gyro_x_cal /= 1000.0; gyro_y_cal /= 1000.0; gjiro_z_cal /= 1000.0; acc_x_cal /= 1000.0; acc_y_cal /= 1000.0; horizontaleCalibration = 255; eeprom_adresa = 0; EEPROM.put (eeprom_adresa, horizontaleCalibration); eeprom_adresa += madhësia (int); EEPROM.put (eeprom_adresa, gyro_x_cal); eeprom_adresa += madhësia (noton); EEPROM.put (eeprom_adresa, gyro_y_cal); eeprom_adresa += madhësia (noton); EEPROM.put (eeprom_adresa, gyro_z_cal); eeprom_adresa += madhësia (noton); EEPROM.put (eeprom_adresa, acc_x_cal); eeprom_adresa += madhësia (noton); EEPROM.put (eeprom_adresa, acc_y_cal); eeprom_adresa += madhësia (noton); // Vini re ne nuk po ruajmë një kompensim për acc_z, për shkak të gravitetit! vonesë (500); }

Blloku i mësipërm i kodit ekzekuton në rutinën e kalibrimit. Ky kod është për kalibrimin horizontal. Ekziston pothuajse një kod identik për kalibrimin vertikal (vini re, kodi e di nëse MPU6050 juaj është montuar horizontalisht ose vertikalisht!). MPU6050, lexohet 1000 herë. vlerat e duhura shtohen në mënyrë kumulative pastaj ndahen me 1000 për të dhënë një vlerë mesatare 'të kompensuar'. Këto vlera më pas ruhen në Nano eeprom. Të gjitha vlerat e kalibrimit horizontal ruhen duke filluar në adresën eeprom 0. Të gjitha vlerat vertikale ruhen në fillim në adresën eeprom 24. Kalibrimi DUHET të bëhet në një sipërfaqe plotësisht të niveluar, përndryshe ato nuk nënkuptojnë asgjë.

/ * * Disa rreshta të ardhshëm përpunojnë të dhënat e papërpunuara për t'i ndryshuar ato në kënde që mund të dalin në LCD dhe LED. * Vlera 4096, me të cilën ndahen të dhënat e përshpejtimit është marrë nga fleta e të dhënave MPU6050 dhe bazohet në normën e mostrës. * Vlera e 9.8 është graviteti * Funksioni atan2 është nga moduli i matematikës dhe përdoret për të llogaritur këndet nga të dhënat e dhëna */thetaM = -atan2 ((acc_x/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Të dhëna të papërpunuara phiM = -atan2 ((acc_y/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Të dhëna të papërpunuara dt = (milis ()-milisOld)/1000.; milisOld = milis (); / * * Ky seksion përdor të dhënat xhiro për ta bërë sistemin më të përgjegjshëm * vlera prej 65.5, me të cilën të dhënat xhiro ndahen është marrë nga fleta e të dhënave MPU6050 dhe bazohet në normën e mostrës */ theta = (theta+(gyro_y/ 65.5)*dt)*. 96 + thetaM*.04; // Filtri me kalim të ulët phi = (phi + (gyro_x/65.5)*dt)*. 96 + phiM*.04; // Filtri me kalim të ulët

Kodi i mësipërm është materiali që llogarit këndet. Shpresojmë që komentet të japin një pasqyrë të vogël se si funksionon, por për një shpjegim më të thellë, shikoni videon e Paul McWhorters të lidhur me PDF bashkangjitur. Ajo që unë do të them megjithatë është se ju mund të ndryshoni normën e mostrës për xhiro dhe përshpejtuesin (i cili bëhet në nënrutinën e konfigurimit MPU6050 në fund të kodit tim). Nëse ndryshoni normën e mostrës, gjithashtu duhet të ndryshoni se sa ndahen të dhënat e papërpunuara. Për të dhënat e përshpejtuesit, vlera aktuale është 4096. Për xhiro, vlera aktuale është 65.5.

Referojuni fletëve të të dhënave të bashkangjitura dhe videos nga EEEntusiast (lidhja në PDF bashkangjitur) për informacion më të thelluar se si gjenden vlerat e kampionimit dhe kompensimit.

Hapi 3: Hapat e ardhshëm

Deri në këtë pikë me shpresë do të ketë bërë këtë projekt, por çfarë tani?

Së pari, pse të mos e ndërtoni në të vërtetë në një nivel shpirtëror që mund të përdorni. Ju mund të blini një nivel shpirtëror të lirë (sigurohuni që është lloji i kutisë) të cilin mund ta përshtatni, ose nëse keni kompletin, printoni nivelin/kutinë tuaj.

Ndoshta bëni një lojë me normat e mostrës së xhiros dhe akselerometrit për të parë nëse ato funksionojnë më mirë në një shkallë sesa në një tjetër.

Mundohuni të përmirësoni kodin më tej. Për shembull, aktualisht, përtej 45 gradë, këndi i deklaruar është i përafërt për të thënë të paktën. A ka ndonjë mënyrë përreth tij?

Nëse keni ndonjë pyetje, pavarësisht se sa e thjeshtë mund të duket, ju lutemi pyesni. Nëse mund të ndihmoj, do ta ndihmoj.

Nëse ju pëlqen kjo e udhëzueshme, ju lutemi jepni një pëlqim, në mënyrë që unë ta di.

Nëse e bëni këtë, ju lutem më tregoni (veçanërisht nëse është në një rast pune).

FALEMINDERIT

Recommended: