Sadržaj:

Arduino i MPU6050 digitalni duhovni nivo: 3 koraka
Arduino i MPU6050 digitalni duhovni nivo: 3 koraka

Video: Arduino i MPU6050 digitalni duhovni nivo: 3 koraka

Video: Arduino i MPU6050 digitalni duhovni nivo: 3 koraka
Video: #ArduBlock 2.0 - Гироскоп и акселерометр MPU6050 + Arduino 2024, Juli
Anonim
Image
Image
The Circuit
The Circuit

Dobrodošli na 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, originalni koncept i veliki dio koda na kojem sam radio nisu. Nisam ljubitelj plagijata, pa sam više nego sretan što mogu odati priznanje onima na čijim sam idejama gradio. Dva glavna lica na koja želim da se obratim su YouTuber -ov Paul McWhorter i DroneBot Workshop. Uključujem veze do njih u svoj YouTube korisne veze PDF. Hvala i EEEnthusiastu na informativnom videu o korištenju MPU6050, uključujući postavljanje i čitanje iz modula bez vanjske biblioteke (njegova veza je u istom PDF -u).

Projekt koji sam producirao funkcionira "kako jeste" i bajkovito je precizan, svakako 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, ali budite uvjereni da postoje značajne razlike, posebno kada je u pitanju kôd za izračunavanje kutova, plus mogućnost pohranjivanja kalibracijskih vrijednosti u Eeprom!

Neke značajke koje vam podižu apetit:

Uglovi nagiba i nagiba dostupni su unutar 0,1 stepena.

Automatsko otkrivanje orijentacije žiroskopa (vodoravno ili okomito)

Potpuna kalibracija s rezultatima koji se automatski spremaju na eeprom

LED indikacija od -2 do +2 stepena (može se promijeniti u kodu)

Dodatna zvučna indikacija nivoa (može se uključiti/isključiti u letu)

Kompaktni okvir koji zahtijeva minimalne komponente

Hajde da počnemo.

Supplies

Ovaj projekt (takav kakav je) 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

5 x 220 ohm otpornici

Razni kratkospojni kablovi

Breadboard

Napajanje (moje je koristilo 5v USB bateriju za napajanje, kada nije spojeno na moj računar, ali mogli biste koristiti bateriju koja je pravilno spojena)

Korak 1: Krug

The Circuit
The Circuit
The Circuit
The Circuit

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 jednom stranom prekidača. Druga strana potisnog prekidača spaja se 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 povezuje 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 je povezana sa uzemljenjem.

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

Napajanje od 5 V i Gnd za MPU6050 i LCD dolaze s Arduino Nano 5v i GND pinova.

Kad završi, trebao bi biti sličan prikazanom postavu. Stavio sam blu tak ispod MPU6050 da ga zaustavim, a također i na LCD da ga držim na rubu matične ploče.

Korak 2: Kodeks

Priloženi kôd je kôd koji sam koristio za ovaj projekat. Jedina biblioteka s kojom možda imate problema je

Biblioteka LiquidCrystal_I2C.h jer sam je uvezao kad sam tek počeo raditi s LCD -ovima. Nažalost, postoji nekoliko biblioteka 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 'print' trebale bi raditi isto.

Sav kôd je komentiran i pod pretpostavkom da sam to dobro uradio, 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 biblioteka drugačija, možda ćete morati promijeniti ne samo svoju biblioteku, već i ovu liniju.

{lcd.setCursor (0, 1); lcd.print ("Horizontalno!"); orijentacija = HORIZONTALNA; // 1000 puta pročitajte neobrađene acc i giro 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 žiroskopa y u varijablu gyro_y_cal gyro_y_cal += gyro_y; // Dodavanje pomaka žiro z u varijabli gyro_z_cal gyro_z_cal += gyro_z; // Dodavanje acc x pomaka u acc_x_cal varijablu acc_x_cal += acc_x; // Dodavanje pomaka računa y varijabli acc_y_cal acc_y_cal += acc_y; } // Podijelite sve rezultate sa 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_address, horizonalCalibration); eeprom_address += sizeof (int); EEPROM.put (eeprom_address, gyro_x_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, gyro_y_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, gyro_z_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, acc_x_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, 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 kalibracionom rutinom. Ovaj kôd služi za horizontalnu kalibraciju. Postoji gotovo identičan kod za vertikalnu kalibraciju (imajte na umu da kôd zna je li vaš MPU6050 montiran vodoravno ili okomito!). MPU6050, čita se 1000 puta. odgovarajuće vrijednosti se kumulativno dodaju i zatim dijele sa 1000 kako bi se dobila prosječna vrijednost "pomaka". Ove vrijednosti se zatim spremaju u Nano eeprom. Sve vrijednosti vodoravne kalibracije pohranjuju se počevši od eeprom adrese 0. Sve okomite vrijednosti pohranjuju se 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 lista podataka 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 uglova iz datih 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 (); / * * U ovom odjeljku se koriste žiroskopski podaci kako bi sistem bio što osjetljiviji * vrijednost 65,5, na koju su podijeljeni žiroskopski podaci, uzeta je iz MPU6050 lista podataka i zasnovana je na stopi uzorkovanja */ theta = (theta+(gyro_y/ 65.5)*dt)*. 96 + thetaM*.04; // Niskopropusni filter phi = (phi + (gyro_x/65.5)*dt)*. 96 + phiM*.04; // Niskopropusni filter

Gornji kôd je stvar koja izračunava uglove. Nadamo se da će komentari dati mali uvid u to kako to funkcionira, ali za detaljnije 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 tehničke 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

Nadajmo 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 tip kutije) koju možete prilagoditi, ili ako imate komplet, odštampajte svoju razinu/kutiju.

Možda se poigrajte brzinama uzorkovanja žiroskopa i akcelerometra kako biste provjerili rade li bolje jednom brzinom od druge.

Pokušajte dodatno poboljšati kôd. Na primjer, trenutno je iznad 45 stepeni navedeni ugao 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, pomoći ću.

Ako vam se sviđa ovo uputstvo, lajkujte ga da znam.

Ako ovo napravite, pokažite mi (pogotovo ako je u radnoj torbi).

HVALA TI

Preporučuje se: