2025 Autor: John Day | [email protected]. Zadnja promjena: 2025-01-13 06:57
Dobrodošli u moju prvu instrukciju! Nadam se da će vam biti informativan. Slobodno ostavite povratne informacije bilo pozitivne ili negativne.
Ovaj projekt ima za cilj izradu digitalnih libela zasnovanih na arduinu i MPU6050. Iako je gotov dizajn i kod moj, izvorni koncept i veliki dio koda na kojem sam radio nisu. Nisam ljubitelj plagijata pa sam sretan što mogu odati priznanje onima na čijim sam idejama gradio. Dvije glavne osobe na koje želim ukazati su YouTuber's Paul McWhorter i DroneBot Workshop. Uključujem veze do njih u svoj YouTube korisne veze PDF. Hvala i EEEnthusiastu na njegovom informativnom videu o korištenju MPU6050 uključujući postavljanje i čitanje iz modula bez vanjske knjižnice (njegova veza je u istom PDF -u).
Projekt koji sam producirao radi "kako jest" i precizan je, sigurno do 45% u oba smjera. Možete ga koristiti točno onako kako sam ga ja dizajnirao, ili ga možete prilagoditi vlastitom ukusu. Što ste pametniji od vas, primijetit ćete da moj projekt izgleda gotovo identično onom koji je izradila radionica DroneBot, no budite uvjereni da postoje značajne razlike, posebno kada je u pitanju kôd za izračunavanje kutova, plus mogućnost pohrane kalibracijskih vrijednosti u Eeprom!
Neke značajke koje povećavaju apetit:
Pitch and roll kutovi dostupni unutar 0,1 stupnja.
Automatsko otkrivanje orijentacije žiroskopske jedinice (vodoravno ili okomito)
Potpuna kalibracija s rezultatima koji se automatski spremaju na eeprom
LED indikacija od -2 do +2 stupnja (mijenja se u kodu)
Dodatna zvučna indikacija razine (može se uključiti/isključiti u letu)
Kompaktni curcuit koji zahtijeva minimalne komponente
Započnimo.
Pribor
Ovaj projekt (takav kakav jest) koristi sljedeće stavke:
1 x Arduino nano (moj je klon)
1 x modul žiroskopa/akcelerometra MPU6050
1 x LCD - 16 x 2 + I2C veza
1 x Pritisnite za uključivanje
1 x Piezo zujalica
1 x zelena LED dioda
2 x žute LED diode
2 x crvene LED diode
Otpornici 5 x 220 ohma
Razni kratkospojni kablovi
Oglasna ploča
Napajanje (moje je koristilo 5v USB bateriju za napajanje, kada nije spojeno na moje računalo, ali mogli biste koristiti bateriju koja je odgovarajuće spojena)
Korak 1: Krug
Pod pretpostavkom da imate sve komponente, morat ćete izgraditi svoju matičnu ploču.
Prikazujem svoje postavke kao vodič, ali veze su sljedeće:
Arduino pin D2 povezuje se s 1 stranom prekidača. Druga strana prekidača za spajanje spojena je na masu
Arduino pin D3 spaja se na jednu stranu 220 ohmskog otpornika. Druga strana otpornika spaja se na anodu crvene LED diode. Crvena LED katoda ide na masu.
Arduino pin D4 spaja se na jednu stranu 220 ohmskog otpornika. Druga strana otpornika spaja se na anodu žute LED diode. Katoda žute LED diode ide na masu.
Arduino pin D5 spaja se na jednu stranu 220 ohmskog otpornika. Druga strana otpornika spaja se na anodu zelene LED diode. Katoda zelene LED diode ide na masu.
Arduino pin D6 spaja se na jednu stranu 220 ohmskog otpornika. Druga strana otpornika spaja se na anodu žute LED diode. Katoda žute LED diode ide na masu.
Arduino pin D7 spaja se na jednu stranu 220 ohmskog otpornika. Druga strana otpornika spaja se na anodu crvene LED diode. Crvena LED katoda ide na masu.
Arduino pin D8 povezuje se s jedne strane Piezo zujalice. Druga strana zujalice spaja se na masu.
Arduino pin A4 povezuje se sa SDA pinovima na MPU6050 I LCD -u.
Arduino pin A5 povezuje se sa SCL pinovima na MPU6050 I LCD -u
Snaga 5V i Gnd za MPU6050 i LCD dolaze s Arduino Nano 5v i GND pinova.
Kad dovrši, trebao bi biti sličan prikazanom postavljanju. Stavio sam blu tak ispod MPU6050 da se zaustavi njegovo kretanje, a također i na LCD da ga držim na rubu matične ploče.
Korak 2: Kôd
Priloženi kôd je kôd koji sam koristio za ovaj projekt. Jedina knjižnica s kojom možda imate problema je
Knjižnica LiquidCrystal_I2C.h jer sam je uvezao kad sam tek počeo raditi s LCD -ovima. Nažalost, postoji nekoliko knjižnica koje koriste isti izraz #include, ali su malo drugačije. Ako imate problema sa svojim, pronađite drugi LCD kôd koji vam odgovara i promijenite kôd u skladu s tim. Vjerojatno će se samo postavke razlikovati. Sve naredbe 'ispisa' trebale bi raditi isto.
Sav kôd je komentiran i pod pretpostavkom da sam dobro postupio, bit će i video koji sve objašnjava, ali evo nekoliko napomena:
LiquidCrystal_I2C LCD (0x27, 16, 2);
Gornji kôd je postavka za moj LCD. Ako je vaša knjižnica drugačija, možda ćete morati promijeniti ne samo svoju knjižnicu, već i ovaj redak.
{lcd.setCursor (0, 1); lcd.print ("Vodoravno!"); orijentacija = HORIZONTALNA; // 1000 puta pročitajte neobrađene računske i žiro podatke iz MPU-6050 za (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // Dodavanje pomaka žiroskopa x promjenljivoj žiro_x_cal giro_x_cal += žiro_x; // Dodavanje pomaka žiro y -a u varijablu gyro_y_cal gyro_y_cal += gyro_y; // Dodavanje pomaka žiro z u varijabli gyro_z_cal gyro_z_cal += gyro_z; // Dodaj acc x pomak u acc_x_cal varijablu acc_x_cal += acc_x; // Dodavanje računa pomaka prema varijabli acc_y_cal acc_y_cal += acc_y; } // Podijelite sve rezultate s 1000 kako biste dobili prosječni pomak gyro_x_cal /= 1000,0; žiroskop_y_cal /= 1000,0; žiro_z_kal /= 1000,0; acc_x_cal /= 1000,0; acc_y_cal /= 1000,0; horizonalCalibration = 255; eeprom_address = 0; EEPROM.put (eeprom_adrress, horizonalCalibration); eeprom_adresa += sizeof (int); EEPROM.put (eeprom_adrress, gyro_x_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_adrress, gyro_y_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_adrress, gyro_z_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_adrress, acc_x_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_adrress, acc_y_cal); eeprom_address += sizeof (float); // Imajte na umu da zbog gravitacije ne spremamo pomak za acc_z! kašnjenje (500); }
Gornji blok koda izvršava se rutinom kalibracije. Ovaj kôd služi za horizontalnu kalibraciju. Postoji gotovo identičan kôd za vertikalnu kalibraciju (imajte na umu da kôd zna je li vaš MPU6050 postavljen vodoravno ili okomito!). MPU6050, čita se 1000 puta. odgovarajuće vrijednosti kumulativno se dodaju i dijele s 1000 kako bi se dobila prosječna vrijednost "pomaka". Te se vrijednosti zatim spremaju u Nano eeprom. Sve vrijednosti vodoravne kalibracije spremaju se počevši od eeprom adrese 0. Sve okomite vrijednosti pohranjuju se početkom na eeprom adresi 24. Kalibracija se MORA izvesti na potpuno ravnoj površini, inače ne znače ništa.
/ * * Sljedećih nekoliko redaka obrađuje neobrađene podatke kako bi ih promijenilo u kutove koji se mogu izlaziti na LCD i LED diode. * Vrijednost 4096, na koju su podijeljeni podaci o ubrzanju, preuzeta je iz podatkovnog lista MPU6050 i temelji se na stopi uzorkovanja. * Vrijednost 9,8 je gravitacija * Funkcija atan2 je iz matematičkog modula i koristi se za izračunavanje kutova iz danih podataka */thetaM = -atan2 ((acc_x/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Sirovi podaci phiM = -atan2 ((acc_y/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Sirovi podaci dt = (millis ()-millisOld)/1000.; millisOld = millis (); / * * Ovaj odjeljak koristi podatke o žiroskopu kako bi sustav učinio osjetljivijim * vrijednost 65,5, na koju su podijeljeni žiroskopski podaci, uzeta je iz podatkovne tablice MPU6050 i temelji se na stopi uzorkovanja */ theta = (theta+(gyro_y/ 65,5)*dt)*. 96 + tetaM*, 04; // Niskopropusni filtar phi = (phi + (gyro_x/65.5)*dt)*. 96 + phiM*.04; // Niskopropusni filter
Gornji kôd je stvar koja izračunava kutove. Nadamo se da će komentari dati mali uvid u to kako to funkcionira, ali za dublje objašnjenje pogledajte video Paul McWhorters povezan u priloženom PDF -u. Ono što ću reći je da možete promijeniti brzinu uzorkovanja za žiroskop i akcelerometar (što se radi u podprogramu za postavljanje MPU6050 na dnu mog koda). Ako promijenite brzinu uzorkovanja, morate promijeniti i na koliko su podijeljeni sirovi podaci. Za podatke akcelerometra trenutna vrijednost je 4096. Za žiroskop trenutna vrijednost je 65,5.
Pogledajte priložene podatkovne listove i video zapis EEEntusiast (veza u priloženom PDF -u) za detaljnije informacije o tome kako se nalaze uzorkovanje i pomak.
Korak 3: Sljedeći koraci
Nadamo se da su do ovog trenutka već napravili ovaj projekt, ali što sada?
Prvo, zašto ga zapravo ne ugradite u libelu koju možete koristiti. Možete kupiti jeftinu libelu (provjerite je li to vrsta kutije) koju možete prilagoditi ili ako imate komplet, ispišite vlastitu razinu/kutiju.
Možda se poigrajte brzinama uzorkovanja žiroskopa i akcelerometra da vidite rade li bolje jednom brzinom od druge.
Pokušajte dodatno poboljšati kôd. Na primjer, trenutno je iznad 45 stupnjeva navedeni kut u najmanju ruku grub. Postoji li način da se to zaobiđe?
Ako imate bilo kakvih pitanja, koliko god izgledala jednostavna, pitajte. Ako mogu pomoći, hoću.
Ako vam se sviđa ovo uputstvo, lajkujte ga da znam.
Ako ovo napravite, pokažite mi (pogotovo ako je u radnom kovčegu).
HVALA VAM