- Selectarea pieselor pentru robotul de auto-echilibrare
- Imprimare 3D și asamblarea robotului nostru de echilibrare
- Diagrama circuitului
- Codul robotului de echilibrare
- Funcționarea robotului de echilibrare Arduino
După ce m-am inspirat din motoarele RYNO și alte scutere de auto-echilibrare de la Segway, am vrut întotdeauna să construiesc ceva propriul meu robot Arduino Segway. Gândindu-mă pentru o vreme, am decis să construiesc un robot de auto-echilibrare folosind Arduino. Astfel aș putea înțelege conceptul care stă la baza acestor scutere și, de asemenea, să învăț cum funcționează algoritmul PID.
Odată ce am început să construiesc, mi-am dat seama că acest bot este o provocare de construit. Există atât de multe opțiuni din care să selectați și, prin urmare, confuziile încep din dreapta, selectând motoarele și rămân până la reglarea valorilor PID. Și sunt atât de multe lucruri de luat în considerare, cum ar fi tipul de baterie, poziția bateriei, prinderea roții, tipul șoferului motorului, menținerea CoG (Centrul de greutate) și multe altele.
Dar permiteți-mi să vi-l rup, odată ce îl construiți, veți fi de acord că nu este atât de greu pe cât pare. Să recunoaștem, în acest tutorial voi documenta experiența mea în construirea robotului de auto-echilibrare. S-ar putea să fiți un începător absolut care tocmai începe sau s-ar putea să fi aterizat aici, după o lungă frustrare de a nu-ți face robotul să funcționeze. Acest loc își propune să fie destinația finală. Deci sa începem……
Selectarea pieselor pentru robotul de auto-echilibrare
Înainte de a vă spune toate opțiunile pentru construirea botului, permiteți-mi să enumăr articolele pe care le-am folosit în acest proiect de robot de echilibrare
- Arduino UNO
- Motoare de curent continuu cu transmisie (de culoare galbenă) - 2Nos
- Modulul driverului de motor L298N
- MPU6050
- O pereche de roți
- Baterie Li-ion 7.4V
- Conectarea firelor
- Corp imprimat 3D
Puteți amesteca și alege pentru oricare dintre componentele de mai sus, în funcție de disponibilitate, pentru a vă crea propriul kit de robot de echilibrare, asigurați-vă că componentele corespund următoarelor criterii.
Controler: Controlerul pe care l-am folosit aici este Arduino UNO, de ce pentru că este pur și simplu ușor de utilizat. Puteți utiliza, de asemenea, un Arduino Nano sau Arduino mini, dar v-aș recomanda să rămâneți cu UNO, deoarece îl putem programa direct fără hardware extern.
Motoare: Cea mai bună alegere a motorului pe care o puteți utiliza pentru un robot de auto-echilibrare, fără îndoială, va fi motorul Stepper. Dar, pentru a simplifica lucrurile, am folosit un motor cu transmisie de curent continuu. Da, nu este obligatoriu să aveți un pas cu pas; robotul funcționează bine cu aceste motoare de curent continuu ieftine disponibile în mod obișnuit, de culoare galbenă.
Driver de motor: Dacă ați selectat motoarele de curent continuu ca ale mele, atunci puteți folosi modulul driverului L298N ca mine, sau chiar un L293D ar trebui să funcționeze foarte bine. Aflați mai multe despre controlul motorului de curent continuu folosind L293D și Arduino.
Roți: Nu-i subestimați pe acești tipi; Mi-a fost greu să-mi dau seama că problema era cu roțile mele. Deci, asigurați-vă că roțile dvs. au o aderență bună asupra podelei pe care o utilizați. Urmăriți cu atenție, aderența dvs. nu ar trebui să permită niciodată roților să skite pe podea.
Accelerometru și giroscop: Cea mai bună alegere a accelerometrului și giroscopului pentru robotul dvs. va fi MPU6050. Deci, nu încercați să construiți unul cu un accelerometru normal precum ADXL345 sau ceva de genul acesta, pur și simplu nu va funcționa. Veți ști de ce la sfârșitul acestui articol. Puteți consulta și articolul nostru dedicat despre utilizarea MPU6050 cu Arduino.
Baterie: Avem nevoie de o baterie cât mai ușoară posibil și tensiunea de funcționare ar trebui să fie mai mare de 5V, astfel încât să putem alimenta Arduino-ul nostru direct fără un modul boost. Deci alegerea ideală va fi o baterie Li-polimer de 7,4V. Aici, deoarece am avut o baterie Li-ion de 7.4V ușor disponibilă, am folosit-o. Dar amintiți-vă că un Li-po este avantajos decât Li-ion.
Șasiu: Un alt loc în care nu ar trebui să faceți compromisuri este cu șasiul roboților. Poți folosi carton, lemn, plastic orice ești bun cu tine. Dar, asigurați-vă că șasiul este robust și nu trebuie să se miște atunci când robotul încearcă să echilibreze. Am proiectat de șasiu propriu pe Solidworks deducând din ceilalți roboți și l-am imprimat 3D. Dacă aveți o imprimantă, puteți imprima și designul, fișierele de proiectare vor fi atașate în titlul următor.
Imprimare 3D și asamblarea robotului nostru de echilibrare
Dacă ați decis să imprimați 3D același șasiu pe care îl folosesc pentru a-mi construi botul, atunci fișierele STL pot fi descărcate de pe thingiverse. Am adăugat, de asemenea, fișierele de proiectare împreună cu acesta, astfel încât să le puteți modifica, conform preferințelor dvs. de personal.
Piesele nu au structuri care depășesc, astfel încât să le puteți imprima cu ușurință fără suporturi și o umplere de 25% va funcționa bine. Proiectele sunt destul de simple și orice imprimantă de bază ar trebui să fie capabilă să o manipuleze cu ușurință. Am folosit software-ul Cura pentru a tăia modelul și am tipărit folosind Tevo Tarantula, setările sunt prezentate mai jos.
Trebuie să imprimați partea corpului, precum și patru părți de montare a motorului. Asamblarea este destul de simplă; folosiți piulițe și șuruburi de 3 mm pentru a fixa motorul și plăcile în poziție. După asamblare ar trebui să arate așa cum se arată în imaginea de mai jos.
Designul propriu-zis a fost planificat cu modulul de acționare L298N în rackul inferior, Arduino și bateria deasupra acestuia, așa cum se arată mai sus. Dacă urmați aceeași ordine, puteți înșuruba direct placa prin găurile furnizate și puteți utiliza o etichetă de sârmă pentru bateria Li-po. Acest aranjament ar trebui să funcționeze, de asemenea, cu excepția roților super simple pe care a trebuit să le schimb mai târziu.
În botul meu am schimbat poziția bateriei și a plăcii Arduino UNO pentru o programare mai ușoară și, de asemenea, a trebuit să introduc o placă de perfecționare pentru completarea conexiunilor. Deci, botul meu nu arăta așa cum am planificat în etapa inițială. După finalizarea testării programării cablajelor și a tuturor celorlalte, robotul meu cu două roți arată în sfârșit așa
Diagrama circuitului
Realizarea conexiunilor pentru acest robot de auto-echilibrare bazat pe Arduino este destul de simplă. Acesta este un robot de auto-echilibrare care folosește Arduino și MPU6050, așa că trebuie să interfață MPU6050 cu Arduino și să conectăm motoarele prin intermediul modulului driverului motorului. Întreaga configurare este alimentată de bateria Li-ion de 7,4V. Schema circuitului pentru același lucru este prezentată mai jos.
Modulul driverului Arduino și L298N Motor este alimentat direct prin pinul Vin și respectiv prin terminalul de 12V. Regulatorul de pe placa Arduino va converti intrarea de 7,4 V la 5 V, iar ATmega IC și MPU6050 vor fi alimentate de acesta. Motoarele de curent continuu pot funcționa de la tensiunea de 5V la 12V. Dar vom conecta firul pozitiv de 7.4V de la baterie la terminalul de intrare de 12V al modulului driverului motorului. Acest lucru va face ca motoarele să funcționeze cu 7.4V. Tabelul următor va lista modul în care modulul driverului de motor MPU6050 și L298N este conectat la Arduino.
Pinul componentei |
Pinul Arduino |
MPU6050 |
|
Vcc |
+ 5V |
Sol |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
D2 |
L298N |
|
ÎN 1 |
D6 |
IN2 |
D9 |
IN3 |
D10 |
IN4 |
D11 |
MPU6050 comunică cu Arduino prin interfața I2C, așa că folosim pinii SPI A4 și A5 din Arduino. Motoarele de curent continuu sunt conectate la pinii PWM D6, respectiv D9 D10 și respectiv D11. Trebuie să le conectăm la pinii PWM, deoarece vom controla viteza motorului de curent continuu, variind ciclul de funcționare al semnalelor PWM. Dacă nu sunteți familiarizați cu aceste două componente, atunci se recomandă să citiți interfața MPU6050 Interfacing și tutorialul driverului L298N Motor.
Codul robotului de echilibrare
Acum trebuie să ne programăm placa Arduino UNO pentru a echilibra robotul. Aici se întâmplă toată magia; conceptul din spatele său este simplu. Trebuie să verificăm dacă robotul este înclinat spre față sau spre spate folosind MPU6050 și apoi dacă este înclinat spre față trebuie să rotim roțile în direcția înainte și dacă este înclinat spre spate trebuie să rotim roțile în sens invers.
În același timp , trebuie să controlăm și viteza cu care se rotesc roțile, dacă botul este ușor dezorientat din poziția centrală, roțile se rotesc încet și viteza crește pe măsură ce se îndepărtează mai mult de poziția centrală. Pentru a realiza această logică folosim algoritmul PID, care are poziția centrală ca set-point și nivelul de dezorientare ca ieșire.
Pentru a cunoaște poziția actuală a botului, folosim MPU6050, care este un accelerometru pe 6 axe și un senzor giroscop combinat. Pentru a obține o valoare fiabilă a poziției de la senzor, trebuie să folosim atât valoarea accelerometrului, cât și a giroscopului, deoarece valorile din accelerometru au probleme de zgomot, iar valorile din giroscop tind să derive în timp. Așadar, trebuie să le combinăm pe ambele și să obținem valoarea pitch-ului și rulării gălăgioase a robotului nostru, din care vom folosi doar valoarea ghemului.
Sună un pic de cap, nu? Dar nu vă faceți griji, mulțumită comunității Arduino, avem biblioteci ușor disponibile, care pot efectua calculul PID și, de asemenea, pot obține valoarea ghemului de la MPU6050. Biblioteca este dezvoltată de br3ttb și respectiv de jrowberg. Înainte de a continua descărcați bibliotecile lor, formați următorul link și adăugați-le în directorul Arduino lib.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Acum, că avem bibliotecile adăugate la IDE-ul nostru Arduino. Să începem programarea robotului nostru de echilibrare de sine. Ca întotdeauna, codul complet pentru robotul de echilibrare MPU6050 este dat la sfârșitul acestei pagini, aici explic doar cele mai importante fragmente din cod. A spus mai devreme că codul este construit pe partea de sus a exemplului de cod MPU6050, doar vom optimiza codul pentru scopul nostru și vom adăuga tehnica PID și de control pentru robotul nostru de auto-echilibrare.
Mai întâi includem bibliotecile necesare pentru ca acest program să funcționeze. Acestea includ biblioteca I2C încorporată, biblioteca PID și biblioteca MPU6050 pe care tocmai le-am descărcat.
#include "I2Cdev.h" #include
Apoi declarăm variabilele necesare pentru a obține datele de la senzorul MPU6050. Citim atât vectorul de gravitație, cât și valorile cuaternionului și apoi calculăm valoarea pasului de viraj și a rulării botului. Ypr float matrice va avea rezultatul final.
// MPU control / status vars bool dmpReady = false; // setați true dacă inițierea DMP a avut succes uint8_t mpuIntStatus; // deține octetul de stare de întrerupere efectiv din MPU uint8_t devStatus; // returnează starea după fiecare operație a dispozitivului (0 = succes,! 0 = eroare) uint16_t packetSize; // dimensiunea așteptată a pachetului DMP (implicit este de 42 de octeți) uint16_t fifoCount; // numărarea tuturor octeților aflați în prezent în FIFO uint8_t fifoBuffer; // Buffer de stocare FIFO // orientare / mișcare var Quaternion q; // container cuaternion gravitate VectorFloat; // gravitate vector float ypr; // container de yaw / pitch / roll și vector de gravitație
Urmează segmentul foarte important al codului și aici veți petrece mult timp în reglarea setului corect de valori. Dacă robotul dvs. este construit cu un centru de greutate foarte bun și componentele sunt aranjate simetric (ceea ce în cele mai multe cazuri nu este), atunci valoarea set-point-ului dvs. va fi 180. În caz contrar, conectați botul la monitorul serial Arduino și înclinați-l până găsiți o poziție bună de echilibrare, citiți valoarea afișată pe monitorul serial și aceasta este valoarea setată. Valoarea Kp, Kd și Ki trebuie reglată în funcție de botul dvs. Nici doi roboți identici nu vor avea aceleași valori de Kp, Kd și Ki, deci nu se poate scăpa de el. Urmăriți videoclipul de la sfârșitul acestei pagini pentru a vă face o idee despre modul de ajustare a acestor valori.
/ ********* Reglați aceste 4 valori pentru BOT ********* / setpoint dublu = 176; // setați valoarea atunci când botul este perpendicular pe sol folosind monitorul serial. // Citiți documentația proiectului pe circuitdigest.com pentru a afla cum să setați aceste valori duble Kp = 21; // Setați acest prim dublu Kd = 0,8; // Setați acest dublu secundar Ki = 140; // În cele din urmă, setați acest lucru / ****** Setarea valorilor la sfârșitul valorilor ********* /
În următoarea linie inițializăm algoritmul PID prin trecerea variabilelor de intrare intrare, ieșire, set point, Kp, Ki și Kd. Dintre acestea, am stabilit deja valorile set-point Kp, Ki și Kd în fragmentul de cod de mai sus. Valoarea de intrare va fi valoarea curentă a lacului care este citită de la senzorul MPU6050 și valoarea de ieșire va fi valoarea care este calculată de algoritmul PID. Deci, practic algoritmul PID ne va oferi o valoare de ieșire care ar trebui utilizată pentru a corecta valoarea de intrare, fiind apropiată de punctul stabilit.
PID pid (& input, & output, & setpoint, Kp, Ki, Kd, DIRECT);
În interiorul funcției de configurare nulă , inițializăm MPU6050 configurând DMP (Digital Motion Processor). Acest lucru ne va ajuta în combinarea datelor accelerometrului cu datele giroscopului și va oferi o valoare fiabilă a Yaw, Pitch and Roll. Nu vom aprofunda mult acest lucru, deoarece acesta va depăși cu mult subiectul. Oricum, un segment de cod pe care trebuie să-l căutați în funcția de configurare este valorile de compensare a giroscopului. Fiecare senzor MPU6050 are propriile sale valori de compensare. Puteți utiliza această schiță Arduino pentru a calcula valoarea de compensare a senzorului dvs. și pentru a actualiza următoarele linii în mod corespunzător în programul dvs.
// furnizați aici propriile dvs. compensări giroscopice, scalate pentru sensibilitate minimă mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
De asemenea, trebuie să inițializăm pinii PWM digitali pe care îi folosim pentru a ne conecta motoarele. În cazul nostru este D6, D9, D10 și D11. Așadar, inițializăm acești pini, deoarece acei pini de ieșire îi fac LOW în mod implicit.
// Inițializați pinii de ieșire a motorului pinMode (6, OUTPUT); pinMode (9, OUTPUT); pinMode (10, OUTPUT); pinMode (11, OUTPUT); // În mod implicit, opriți ambele motoare analogWrite (6, LOW); analogWrite (9, LOW); analogWrite (10, LOW); analogWrite (11, LOW);
În interiorul funcției de buclă principală verificăm dacă datele de pe MPU6050 sunt gata să fie citite . Dacă da, îl folosim pentru a calcula valoarea PID și apoi afișăm valoarea de intrare și ieșire a PID pe monitorul serial doar pentru a verifica modul în care PID răspunde. Apoi, pe baza valorii de ieșire, decidem dacă robotul trebuie să meargă înainte sau înapoi sau să stea nemișcat.
Deoarece presupunem că MPU6050 va reveni la 180 când botul este în poziție verticală. Vom obține valori de corecție pozitive atunci când botul cade în față și vom obține valori în negativ dacă botul cade în spate. Deci, verificăm această condiție și apelăm funcțiile corespunzătoare pentru a muta botul înainte sau înapoi.
while (! mpuInterrupt && fifoCount <packetSize) { // fără date mpu - efectuarea de calcule PID și ieșirea la motoare pid.Compute (); // Imprimați valoarea de intrare și ieșire pe monitorul serial pentru a verifica cum funcționează. Serial.print (intrare); Serial.print ("=>"); Serial.println (ieșire); if (intrare> 150 && intrare <200) {// Dacă botul cade dacă (ieșire> 0) // Se încadrează în față Înainte (); // Rotiți roțile înainte altfel dacă (ieșire <0) // Căzând spre spate Reverse (); // Rotiți roțile înapoi } altfel // Dacă Bot nu cade Stop (); // Țineți roțile nemișcate }
Variabila de ieșire PID decide, de asemenea, cât de repede motorul trebuie să fie rotit. Dacă botul este pe cale să cadă, atunci facem corecții minore rotind roata încet. Dacă aceste corecții minore funcționează și totuși, dacă robotul cade, creștem viteza motorului. Valoarea cât de repede se rotesc roțile va fi decisă de algoritmul PI. Rețineți că pentru funcția Reverse am înmulțit valoarea ieșirii cu -1, astfel încât să putem converti valoarea negativă în pozitiv.
void Forward () // Cod pentru rotirea roții înainte { analogWrite (6, ieșire); analogWrite (9,0); analogWrite (10, ieșire); analogWrite (11,0); Serial.print („F”); // Informații de depanare } void Reverse () // Cod pentru rotirea roții înapoi { analogWrite (6,0); analogWrite (9, ieșire * -1); analogWrite (10,0); analogWrite (11, ieșire * -1); Serial.print ("R"); } void Stop () // Cod pentru a opri ambele roți { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Serial.print („S”); }
Funcționarea robotului de echilibrare Arduino
Odată ce sunteți gata cu hardware-ul, puteți încărca codul pe placa Arduino. Asigurați-vă că conexiunile sunt corecte, deoarece utilizăm o baterie Li-ion, este necesară o precauție extremă. Așadar, verificați dacă există scurtcircuite și asigurați-vă că terminalele nu vor intra în contact chiar dacă robotul dvs. are unele impacturi mici. Porniți modulul și deschideți monitorul serial, dacă Arduino ar putea comunica cu MPU6050 cu succes și dacă totul funcționează conform așteptărilor, ar trebui să vedeți următorul ecran.
Aici vedem valorile de intrare și ieșire ale algoritmului PID în format input => output . Dacă robotul este perfect echilibrat, valoarea de ieșire va fi 0. Valoarea de intrare este valoarea curentă de la senzorul MPU6050. Alfabetul „F” reprezintă faptul că robotul se mișcă înainte și „R” reprezintă robotul invers.
În etapele inițiale ale PID vă recomand să lăsați cablul Arduino conectat la bot, astfel încât să puteți monitoriza cu ușurință valorile de intrare și ieșire și, de asemenea, va fi ușor să corectați și să încărcați programul pentru valorile Kp, Ki și Kd. Video de mai jos arată complet de lucru al bot și, de asemenea, arată modul în care pentru a corecta valorile PID.
Sper că acest lucru vă ajută să vă construiți propriul robot de auto-echilibrare dacă aveți vreo problemă în a-l face să funcționeze, apoi lăsați-vă întrebările în secțiunea de comentarii de mai jos sau utilizați forumurile pentru întrebări mai tehnice. Dacă doriți mai multă distracție, puteți folosi aceeași logică pentru a construi un robot de echilibrare a mingii.