Cuprins:

Nivel de spirit digital bazat pe Arduino și MPU6050: 3 pași
Nivel de spirit digital bazat pe Arduino și MPU6050: 3 pași

Video: Nivel de spirit digital bazat pe Arduino și MPU6050: 3 pași

Video: Nivel de spirit digital bazat pe Arduino și MPU6050: 3 pași
Video: Control acces cu Arduino MEGA 2560 2024, Noiembrie
Anonim
Image
Image
Circuitul
Circuitul

Bine ați venit la primul meu instructabil! Sper că vi se pare informativ. Vă rugăm să nu ezitați să lăsați feedback pozitiv sau negativ.

Acest proiect este de a crea un nivel de spirit digital bazat pe arduino și MPU6050. Deși designul și codul sunt ale mele, conceptul original și o mare parte din codul din care am lucrat nu sunt. Nu sunt în plagiat, așa că sunt mai mult decât fericită să acord credit celor pe care le-am construit ideile. Cele două persoane principale pe care vreau să le strig sunt Paul McWhorter de la YouTuber și Atelierul DroneBot. Includ linkuri către ele în link-urile mele utile de pe YouTube PDF. Mulțumim și lui EEEnthusiast pentru videoclipul său informativ despre utilizarea MPU6050, inclusiv configurarea și citirea din modul fără o bibliotecă externă (linkul său se află în același PDF).

Proiectul pe care l-am produs, funcționează „așa cum este” și este corect de zână, cu siguranță până la 45% în ambele direcții. Îl puteți folosi exact așa cum l-am conceput eu, sau îl puteți adapta după propriile gusturi. Cei mai înțelepți dintre voi vor observa că proiectul meu arată aproape identic cu cel produs de atelierul DroneBot, dar fiți siguri, există diferențe semnificative, mai ales când vine vorba de codul de calcul al unghiurilor, plus facilitatea de a stoca valorile de calibrare în Eeprom!

Unele caracteristici care îți deschid apetitul:

Unghiurile de înclinare și rulare sunt disponibile până la 0,1 de grad.

Detectare automată a orientării unității giroscopice (orizontale sau verticale)

Calibrare completă cu rezultate stocate automat pe eeprom

Indicator LED de la -2 la +2 grade (modificabil în cod)

Indicație sonoră suplimentară a nivelului (poate fi activată / dezactivată din mers)

Curcuit compact care necesită componente minime

Să începem.

Provizii

Acest proiect (așa cum este) folosește următoarele elemente:

1 x Arduino nano (al meu este o clonă)

1 x modul giroscop / accelerometru MPU6050

1 x LCD - 16 x 2 + conexiune I2C

1 x Apăsați pentru a comuta

1 x buzzer piezo

1 x LED verde

2 x LED-uri galbene

2 x LED-uri roșii

Rezistențe de 5 x 220 ohmi

Diverse cabluri jumper

Pană de pâine

Sursa de alimentare (a mea a folosit o bancă de alimentare USB de 5v, atunci când nu este conectată la computerul meu, dar puteți utiliza o baterie conectată corespunzător)

Pasul 1: Circuitul

Circuitul
Circuitul
Circuitul
Circuitul

Presupunând că aveți toate componentele, va trebui să vă construiți panoul.

Îmi arăt configurarea ca ghid, dar conexiunile sunt după cum urmează:

Pinul Arduino D2 se conectează la o parte a comutatorului. Cealaltă parte a comutatorului se conectează la masă

Pinul Arduino D3 se conectează la o parte a rezistorului de 220 ohmi. Cealaltă parte a rezistorului se conectează la anodarea LED-ului roșu. LED-ul catodic roșu ajunge la sol.

Pinul Arduino D4 se conectează la o parte a rezistorului de 220 ohmi. Cealaltă parte a rezistorului se conectează la anodarea LED-ului galben. Catodul LED-ului galben se duce la sol.

Pinul Arduino D5 se conectează la o parte a rezistorului de 220 ohmi. Cealaltă parte a rezistorului se conectează la anodarea LED-ului verde. LED-ul catodic verde merge la sol.

Pinul Arduino D6 se conectează la o parte a rezistorului de 220 ohmi. Cealaltă parte a rezistorului se conectează la anodarea LED-ului galben. Catodul LED-ului galben se duce la sol.

Pinul Arduino D7 se conectează la o parte a rezistorului de 220 ohmi. Cealaltă parte a rezistorului se conectează la anodarea LED-ului roșu. LED-ul catodic roșu ajunge la sol.

Pinul Arduino D8 se conectează la o parte a sonorului Piezo. Cealaltă parte a soneriei se conectează la sol.

Pinul Arduino A4 se conectează la pinii SDA de pe MPU6050 ȘI LCD.

Pinul Arduino A5 se conectează la pinii SCL de pe MPU6050 ȘI LCD

Puterea 5v și Gnd pentru MPU6050 și LCD provin de la pinii Arduino Nano 5v și respectiv GND.

Odată finalizat, ar trebui să fie similar cu configurarea mea afișată. Am pus blu tak sub MPU6050 pentru a-l opri din mișcare și, de asemenea, pe ecranul LCD pentru a-l menține pe marginea panoului.

Pasul 2: Codul

Codul atașat este codul pe care l-am folosit pentru acest proiect. Singura bibliotecă cu care ați putea avea o problemă este

Biblioteca LiquidCrystal_I2C.h pe măsură ce am importat acest lucru când am început să lucrez cu LCD-uri. Din păcate, există câteva biblioteci care folosesc aceeași declarație #include, dar sunt ușor diferite. Dacă aveți probleme cu ale dvs., găsiți un alt cod LCD care funcționează pentru dvs. și modificați codul în consecință. Este posibil să fie doar configurarea care diferă. Toate comenzile de „tipărire” ar trebui să funcționeze la fel.

Tot codul a fost comentat și presupunând că am făcut-o bine, va exista și un videoclip care explică totul, dar iată câteva puncte de remarcat:

LiquidCrystal_I2C lcd (0x27, 16, 2);

Codul de mai sus este configurarea LCD-ului meu. Dacă biblioteca dvs. este diferită, poate fi necesar să vă schimbați nu numai biblioteca, ci și această linie.

{lcd.setCursor (0, 1); lcd.print ("Orizontal!"); orientare = ORIZONTALĂ; // Citiți datele brute acc și giroscopice de pe MPU-6050 de 1000 de ori pentru (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // Adăugați gyro x offset la variabila gyro_x_cal gyro_x_cal + = gyro_x; // Adăugați gyro y offset la variabila gyro_y_cal gyro_y_cal + = gyro_y; // Adăugați decalajul gyro z la variabila gyro_z_cal gyro_z_cal + = gyro_z; // Adăugați acc x offset la variabila acc_x_cal acc_x_cal + = acc_x; // Adăugați compensarea acc y la variabila acc_y_cal acc_y_cal + = acc_y; } // Împărțiți toate rezultatele la 1000 pentru a obține offset mediu 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 (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); // Rețineți că nu stocăm un offset pentru acc_z, din cauza gravitației! întârziere (500); }

Blocul de cod de mai sus se execută la rutina de calibrare. Acest cod este pentru calibrarea orizontală. Există un cod aproape identic pentru calibrarea verticală (rețineți, codul știe dacă MPU6050 este montat orizontal sau vertical!). MPU6050, este citit de 1000 de ori. valorile corespunzătoare sunt adăugate cumulativ, apoi împărțite la 1000 pentru a da o valoare medie „offset”. Aceste valori sunt apoi stocate în Nano eeprom. Toate valorile de calibrare orizontale sunt stocate începând cu adresa eeprom 0. Toate valorile verticale sunt stocate începând cu adresa eeprom 24. Calibrarea TREBUIE să se facă pe o suprafață complet nivelată, altfel nu înseamnă nimic.

/ * * Următoarele câteva linii procesează datele brute pentru a le schimba în unghiuri care pot fi transmise pe LCD și LED-uri. * Valoarea 4096, la care se împarte datele de accelerație, este preluată din foaia de date MPU6050 și se bazează pe rata de eșantionare. * Valoarea 9.8 este gravitațională * Funcția atan2 provine din modulul matematic și este utilizată pentru a calcula unghiurile din datele date * / thetaM = -atan2 ((acc_x / 4096.0) /9.8, (acc_z / 4096.0) /9.8) /2/3.141592656 * 360; // Date brute phiM = -atan2 ((acc_y / 4096.0) /9.8, (acc_z / 4096.0) /9.8) /2/3.141592656 * 360; // Date brute dt = (millis () - millisOld) / 1000.; millisOld = millis (); / * * Această secțiune folosește datele giroscopice pentru a face sistemul mai receptiv * valoarea de 65,5, divizată de datele giroscopice, este preluată din foaia de date MPU6050 și se bazează pe rata de eșantionare * / theta = (theta + (gyro_y / 65,5) * dt) *. 96 + thetaM *.04; // Filtru trece jos phi = (phi + (gyro_x / 65.5) * dt) *. 96 + phiM *.04; // Filtru trece jos

Codul de mai sus este elementul care calculează unghiurile. Sperăm că comentariile oferă o mică înțelegere a modului în care funcționează, dar pentru o explicație aprofundată, consultați videoclipul Paul McWhorters legat în PDF-ul atașat. Ceea ce voi spune totuși este că puteți modifica rata de eșantionare pentru giroscop și accelerometru (ceea ce se face în subrutina de configurare MPU6050 din partea de jos a codului meu). Dacă modificați rata de eșantionare, trebuie să modificați și cu cât sunt împărțite datele brute. Pentru datele accelerometrului, valoarea curentă este 4096. Pentru giroscop, valoarea curentă este 65,5.

Consultați fișele de date atașate și videoclipul de la EEEntusiast (link în fișierul PDF atașat) pentru informații mai detaliate despre modul în care sunt găsite valorile de eșantionare și de compensare.

Pasul 3: Pașii următori

În acest moment, sperăm că a făcut acest proiect, dar ce se întâmplă acum?

În primul rând, de ce să nu îl construiți într-un nivel spiritual pe care îl puteți folosi. Puteți cumpăra un nivel de spirit ieftin (asigurați-vă că este tipul cutiei) pe care îl puteți adapta sau, dacă aveți kitul, imprimați propriul nivel / cutie.

Poate să vă jucați cu ratele de eșantionare a giroscopului și accelerometrului pentru a vedea dacă funcționează mai bine la o rată decât la alta.

Încercați să rafinați mai departe codul. De exemplu, în prezent, dincolo de 45 de grade, unghiul menționat este dur ca să spunem cel puțin. Există o cale de a o înconjura?

Dacă aveți întrebări, oricât de simple ar părea, vă rugăm să întrebați. Dacă pot ajuta, o voi face.

Dacă vă place acest instructable, vă rog să-i dați un like, ca să știu.

Dacă faceți acest lucru, vă rog să-mi arătați (mai ales dacă este într-un caz de lucru).

MULȚUMESC

Recomandat: