- Odabir dijelova za samobalansirajućeg robota
- 3D ispis i sastavljanje našeg samobalansirajućeg robota
- Kružni dijagram
- Kôd robota za samobalansiranje
- Rad Arduino samobalansirajućeg robota
Nakon inspiracije RYNO motorima i drugim samo balansirajućim skuterima iz Segwaya, uvijek sam želio napraviti nešto svoje, Arduino Segway Robot. Razmišljajući neko vrijeme, odlučio sam izraditi samobalansirajući robot koristeći Arduino. Na taj bih način mogao shvatiti osnovni koncept koji stoji iza svih ovih skutera i također naučiti kako funkcionira PID algoritam.
Jednom kad sam počeo graditi, shvatio sam da je ovaj bot malo izazov za gradnju. Postoji toliko mnogo opcija za odabir, pa zabune počinju ispravno odabirom motora i ostaju do podešavanja PID vrijednosti. A ima toliko stvari koje treba uzeti u obzir poput vrste baterije, položaja baterije, držanja kotača, vrste vozača motora, održavanja CoG-a (Težišta) i još mnogo toga.
Ali dopustite mi da vam ga razbijem, kad ga jednom izgradite, složit ćete se da to nije tako teško kao što zvuči. Dakle, priznajmo, u ovom uputstvu dokumentirat ću svoje iskustvo u izradi samobalansirajućeg robota. Možda ste apsolutni početnik koji tek započinje ili je možda sletio ovdje nakon duge frustracije zbog toga što vaš bot ne radi. Ovo mjesto želi biti vaše konačno odredište. Pa krenimo……
Odabir dijelova za samobalansirajućeg robota
Prije nego što vam kažem sve mogućnosti za izgradnju bota, navedite stavke koje sam koristio u ovom projektu samobalansiranja robota
- Arduino UNO
- Istosmjerni motori s reduktorom (žute boje) - 2Br
- L298N Upravljački modul motora
- MPU6050
- Par kotača
- 7,4V Li-ion baterija
- Spajanje žica
- 3D tiskano tijelo
Možete kombinirati i odabrati bilo koju od gore navedenih komponenata na temelju dostupnosti da napravite vlastiti komplet za samobalansiranje robota, samo pazite da komponente odgovaraju sljedećim kriterijima.
Kontroler: Kontroler koji sam ovdje koristio je Arduino UNO, zašto, jer je jednostavan za upotrebu. Također možete koristiti Arduino Nano ili Arduino mini, ali preporučio bih vam da se pridržavate UNO-a jer ga možemo izravno programirati bez ikakvog vanjskog hardvera.
Motori: Najbolji izbor motora koji možete koristiti za samobalansirajućeg robota, bez sumnje će biti Stepper motor. Ali da bi stvari bile jednostavne, koristio sam motor s istosmjernom strujom. Da nije obavezno imati steper; bot dobro funkcionira i s ovim jeftinim, obično dostupnim, žutom bojom istosmjernih motora.
Motorni vozač: Ako ste odabrali motore s istosmjernim zupčanicima poput mojih, tada možete koristiti upravljački modul L298N poput mene ili bi čak i L293D trebao raditi sasvim u redu. Saznajte više o upravljanju istosmjernim motorom pomoću L293D i Arduino.
Kotači: Nemojte podcijeniti ove momke; Bilo mi je teško shvatiti da je problem u mojim kotačima. Pazite da vaši kotači dobro prianjaju preko poda koji koristite. Pažljivo pazite, vaš stisak nikada ne smije dopustiti da vam kotači klize po podu.
Akcelerometar i žiroskop: Najbolji izbor akcelerometra i žiroskopa za vašeg bota bit će MPU6050. Zato nemojte pokušavati izraditi jedan s normalnim akcelerometrom poput ADXL345 ili nečim sličnim, on jednostavno neće raditi. Na kraju ovog članka znat ćete zašto. Također možete provjeriti naš posvećeni članak o korištenju MPU6050 s Arduinom.
Baterija: Potrebna nam je što lakša baterija, a radni napon trebao bi biti veći od 5 V kako bismo mogli izravno napajati svoj Arduino bez pojačivačkog modula. Tako će idealan izbor biti Li-polimer baterija od 7,4 V. Evo, budući da sam imao 7,4V Li-ion bateriju koja je odmah dostupna, koristio sam je. Ali ne zaboravite da je Li-po povoljniji od Li-iona.
Šasija: Još jedno mjesto na kojem ne biste trebali praviti kompromise je šasija vaših botova. Možete koristiti karton, drvo, plastiku sve što vam odgovara. Ali, samo pripazite da je šasija čvrsta i da se ne smije micati kad bot pokušava uravnotežiti. Dizajnirao sam vlastitu šasiju na Solidworksu zaključujući od ostalih botova i 3D tiskao. Ako imate pisač, tada možete i ispisati dizajn, datoteke dizajna bit će priložene u sljedećem naslovu.
3D ispis i sastavljanje našeg samobalansirajućeg robota
Ako ste odlučili 3D ispisati istu šasiju koju koristim za izradu bota, tada se STL datoteke mogu preuzeti s thingiverse. Uz to sam dodao i datoteke dizajna, tako da ih možete i izmijeniti prema vlastitim željama.
Dijelovi nemaju previsuće strukture, tako da ih možete jednostavno ispisati bez bilo kakvih nosača, a ispuna od 25% će dobro funkcionirati. Dizajni su prilično jednostavni i bilo koji osnovni pisač trebao bi biti u stanju s lakoćom se nositi s tim. Koristio sam softver Cura za rezanje modela i ispisao pomoću svoje Tevo Tarantule, postavke su prikazane u nastavku.

Morali biste otisnuti dio tijela kao i četiri dijela za pričvršćivanje motora. Sastavljanje je prilično ravno naprijed; upotrijebite matice i vijke od 3 mm kako biste učvrstili motor i ploče na mjestu. Nakon sastavljanja trebao bi izgledati otprilike ovako prikazano na donjoj slici.

Stvarni dizajn planiran je s pogonskim modulom L298N u donjem nosaču Arduina i baterijom na njemu, kako je gore prikazano. Ako slijedite isti redoslijed, možete izravno uviti ploču kroz predviđene rupe i upotrijebiti žičanu pločicu za Li-po bateriju. Ovaj bi raspored također trebao funkcionirati, osim super običnih kotača koje sam kasnije morao promijeniti.
U svom botu zamijenio sam položaj baterije i Arduino UNO ploče radi jednostavnijeg programiranja, a također sam morao uvesti perf ploču za dovršavanje veza. Dakle, moj bot nije izgledao onako kako sam planirao u početnoj fazi. Nakon završetka ispitivanja programiranja ožičenja i svega, moj robot s dva kotača napokon izgleda ovako

Kružni dijagram
Uspostavljanje veza za ovaj samo balansirajući robot zasnovan na Arduinu prilično je jednostavan. Ovo je samobalansirajući robot koji koristi Arduino i MPU6050, tako da želimo MPU6050 povezati s Arduinom i povezati motore pomoću modula pogonskog motora. Cijelu postavku napaja 7,4V li-ionska baterija. Dijagram sklopa za isti prikazan je u nastavku.

Upravljački modul Arduino i L298N motora izravno se napajaju kroz Vin pin i 12V terminal. Ugrađeni regulator na Arduino ploči pretvorit će ulazni 7,4V u 5V, a ATmega IC i MPU6050 će se napajati iz njega. Istosmjerni motori mogu raditi od napona 5V do 12V. Ali spojit ćemo 7,4V pozitivnu žicu s baterije na ulazni terminal 12V modula pogonskog motora. To će učiniti da motori rade sa 7,4V. Sljedeća će tablica navesti na koji je način upravljački modul motora MPU6050 i L298N povezan s Arduinom.
|
Komponentni pin |
Arduino pin |
|
MPU6050 |
|
|
Vcc |
+ 5V |
|
Prizemlje |
Gnd |
|
SCL |
A5 |
|
SDA |
A4 |
|
INT |
D2 |
|
L298N |
|
|
IN1 |
D6 |
|
IN2 |
D9 |
|
IN3 |
D10 |
|
IN4 |
D11 |
MPU6050 komunicira s Arduinom putem I2C sučelja, pa koristimo SPI pinove A4 i A5 Arduina. Istosmjerni motori povezani su na PWM pinove D6, D9 D10 i D11. Moramo ih spojiti na PWM pinove jer ćemo kontrolirati brzinu istosmjernog motora mijenjajući radni ciklus PWM signala. Ako niste upoznati s ove dvije komponente, preporučuje se čitanje vodiča za MPU6050 Interfacing i L298N Motor driver.
Kôd robota za samobalansiranje
Sada moramo programirati našu Arduino UNO ploču da uravnoteži robota. Tu se događa sva čarolija; koncept koji stoji iza toga je jednostavan. Moramo provjeriti je li bot nagnut prema naprijed ili prema straga pomoću MPU6050, a zatim ako je nagnut prema naprijed moramo okretati kotače u smjeru prema naprijed, a ako je nagnut prema stražnjem dijelu, moramo okretati kotače u obrnutom smjeru.
Istodobno također moramo kontrolirati brzinu kojom se kotači okreću, ako je bot malo dezorijentiran iz središnjeg položaja, kotači se polako okreću i brzina se povećava kako se više udaljava od središnjeg položaja. Da bismo postigli ovu logiku koristimo PID algoritam koji ima središnji položaj kao zadanu točku i razinu dezorijentacije kao izlaza.
Da bismo znali trenutni položaj bota, koristimo MPU6050, koji je kombinirani 6-osni akcelerometar i senzor žiroskopa. Da bismo sa senzora dobili pouzdanu vrijednost položaja, moramo koristiti vrijednost i akcelerometra i žiroskopa, jer vrijednosti akcelerometra imaju problema s bukom, a vrijednosti giroskopa imaju tendenciju prema vremenu. Dakle, moramo kombinirati oboje i dobiti vrijednost nagiba i kotrljanja našeg robota, od kojih ćemo koristiti samo vrijednost nagiba.
Zvuči pomalo kao da se glava vrti? Ali ne brinite, zahvaljujući zajednici Arduino imamo lako dostupne knjižnice koje mogu izvršiti PID izračun i također dobiti vrijednost zanosa iz MPU6050. Knjižnicu su razvili br3ttb, odnosno jrowberg. Prije nastavka preuzimanja njihovih knjižnica formirajte sljedeću vezu i dodajte ih u svoj Arduino lib direktorij.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Sad, kad imamo knjižnice dodane u naš Arduino IDE. Počnimo s programiranjem za našeg samobalansirajućeg robota. Kao i uvijek kompletni kôd za MPU6050 robota za uravnoteženje dat je na kraju ove stranice, ovdje samo objašnjavam najvažnije isječke u kodu. Ranije rečeno da se kod gradi na primjeru koda MPU6050, mi ćemo samo optimizirati kôd za svoju svrhu i dodati PID i tehniku upravljanja za našeg samobalansirajućeg robota.
Prvo uključujemo knjižnice potrebne za rad ovog programa. Uključuju ugrađenu I2C knjižnicu, PID knjižnicu i MPU6050 knjižnicu koju smo upravo preuzeli.
#include "I2Cdev.h" #include
Zatim deklariramo varijable potrebne za dobivanje podataka iz MPU6050 senzora. Očitavamo i gravitacijske vektore i vrijednosti kvaterniona, a zatim izračunavamo visinu nagiba i vrijednost kotrljanja bota. Plovak niz YPR održat će konačni rezultat.
// MPU kontrola / status varira bool dmpReady = false; // postavi true ako je DMP init bio uspješan uint8_t mpuIntStatus; // sadrži stvarni bajt statusa prekida iz MPU-a uint8_t devStatus; // vraćanje statusa nakon svake operacije uređaja (0 = uspjeh ,! 0 = pogreška) uint16_t packetSize; // očekivana veličina DMP paketa (zadana je 42 bajta) uint16_t fifoCount; // brojanje svih bajtova trenutno u FIFO-u uint8_t fifoBuffer; // FIFO međuspremnik za pohranu // orijentacija / kretanje varira Quaternion q; // kvaternijski spremnik VectorFloat gravity; // gravitacijski vektor float ypr; // posuda za nagib / nagib / kotrljanje i vektor gravitacije
Slijedi vrlo važan segment koda, a ovdje ćete dugo vremena trošiti na podešavanje pravog skupa vrijednosti. Ako je vaš robot izrađen s vrlo dobrim težištem, a komponente su simetrično raspoređene (što u većini slučajeva nije), tada će vrijednost vaše zadane vrijednosti biti 180. Inače povežite svog bota s Arduino serijskim monitorom i naginjte ga dok nađete dobar položaj za uravnoteženje, pročitajte vrijednost prikazanu na serijskom monitoru i to je vaša zadana vrijednost. Vrijednost Kp, Kd i Ki mora se prilagoditi vašem botu. Nijedna dva identična bota neće imati iste vrijednosti Kp, Kd i Ki, tako da se od toga ne može pobjeći. Pogledajte videozapis na kraju ove stranice da biste dobili ideju kako prilagoditi ove vrijednosti.
/ ********* Podesite ove 4 vrijednosti za svoj BOT ********* / dvostruka zadana vrijednost = 176; // postavljamo vrijednost kada je bot okomit na zemlju pomoću serijskog monitora. // Pročitajte projektnu dokumentaciju na circuitdigest.com da biste saznali kako postaviti ove vrijednosti double Kp = 21; // Postavi ovaj prvi dvostruki Kd = 0,8; // Postavi ovaj sekundarni dvostruki Ki = 140; // Napokon postavite ovo / ****** Postavka kraja vrijednosti ********* /
U sljedećem retku inicijaliziramo PID algoritam prosljeđivanjem ulaznih varijabli input, output, set point, Kp, Ki i Kd. Od njih smo već postavili vrijednosti zadanih vrijednosti Kp, Ki i Kd u gornji isječak koda. Vrijednost ulaza bit će trenutna vrijednost skretanja koja se očitava s senzora MPU6050, a vrijednost izlaza vrijednost koja se izračunava PID algoritmom. Dakle, u osnovi će nam PID algoritam dati izlaznu vrijednost koja bi se trebala koristiti za ispravljanje ulazne vrijednosti tako da bude blizu postavljene točke.
PID pid (& input, & output, & setpoint, Kp, Ki, Kd, DIRECT);
Unutar funkcije postavljanja praznine inicijaliziramo MPU6050 konfiguriranjem DMP-a (digitalni procesor pokreta). To će nam pomoći u kombiniranju podataka akcelerometra s podacima žiroskopa i pružiti pouzdanu vrijednost Yaw, Pitch and Roll. Nećemo ulaziti duboko u ovo jer će to biti daleko izvan teme. U svakom slučaju jedan segment koda koji morate potražiti u funkciji podešavanja su vrijednosti pomaka žiro-giga. Svaki MPU6050 senzor ima svoje vrijednosti pomaka. Pomoću ove Arduino skice možete izračunati vrijednost pomaka vašeg senzora i u skladu s tim ažurirati sljedeće redove u svom programu.
// ovdje nabavljamo vlastite pomake žiroskopa, prilagođene minimalnoj osjetljivosti mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Također moramo inicijalizirati digitalne PWM pinove koje koristimo za spajanje naših motora. U našem slučaju to su D6, D9, D10 i D11. Dakle, inicijaliziramo ove igle jer ih izlazni pinovi prema zadanim postavkama čine NISKIM.
// inicijalizacija Motor outpu igle pinMode (6, OUTPUT); pinMode (9, IZLAZ); pinMode (10, IZLAZ); pinMode (11, IZLAZ); // Po defaultu isključite oba motora analogWrite (6, LOW); analogWrite (9, LOW); analogWrite (10, LOW); analogWrite (11, LOW);
Unutar funkcije glavne petlje provjeravamo jesu li podaci s MPU6050 spremni za čitanje. Ako je odgovor da, tada ga koristimo za izračunavanje PID vrijednosti, a zatim prikazujemo ulaznu i izlaznu vrijednost PID na serijskom monitoru samo da provjerimo kako PID reagira. Zatim na temelju vrijednosti izlaza odlučujemo mora li se bot pomicati naprijed ili unatrag ili stajati mirno.
Budući da pretpostavljamo da će MPU6050 vratiti 180 kada bot bude uspravan. Vrijednosti korekcije dobit ćemo pozitivne kada bot pada prema naprijed, a negativne ćemo dobiti ako bot pada prema natrag. Stoga provjeravamo postoji li ovo stanje i pozivamo odgovarajuće funkcije za pomicanje bota prema naprijed ili natrag.
while (! mpuInterrupt && fifoCount <packetSize) { // nema mpu podataka - izvođenje PID izračuna i izlaz na motore pid.Compute (); // Ispišite vrijednost ulaza i izlaza na serijski monitor kako biste provjerili kako radi. Serial.print (ulaz); Serial.print ("=>"); Serial.println (izlaz); if (input> 150 && input <200) {// Ako bot pada if (output> 0) // Pada prema naprijed Naprijed (); // Zarotirajte kotače naprijed inače ako (izlaz <0) // Pad prema natrag Reverse (); // Rotiraj kotačiće unatrag } else // Ako Bot ne pada Stop (); // Držite kotače mirno }
PID izlaz varijabla također odlučuje o tome kako brzo se motor mora se zakrenuti. Ako bot samo što neće pasti, napravimo manju korekciju polaganim okretanjem kotača. Ako ove manje korekcije djeluju i ako i dalje pada bot, povećavamo brzinu motora. Vrijednost brzine okretanja kotača odlučit će algoritam PI. Imajte na umu da smo za funkciju Reverse pomnožili vrijednost izlaza s -1 tako da negativnu vrijednost možemo pretvoriti u pozitivnu.
void Forward () // Kôd za okretanje kotača prema naprijed { analogWrite (6, izlaz); analogWrite (9,0); analogWrite (10, izlaz); analogWrite (11,0); Serial.print ("F"); // Informacije o otklanjanju pogrešaka } void Reverse () // Kôd za okretanje kotača unazad { analogWrite (6,0); analogWrite (9, izlaz * -1); analogWrite (10,0); analogWrite (11, izlaz * -1); Serial.print ("R"); } void Stop () // Kôd za zaustavljanje oba kotača { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Serial.print ("S"); }
Rad Arduino samobalansirajućeg robota

Kada budete spremni s hardverom, kôd možete prenijeti na svoju Arduino ploču. Provjerite jesu li veze ispravne jer koristimo Li-ion bateriju potreban je krajnji oprez. Stoga dvostruko provjerite ima li kratkih spojeva i osigurajte da terminali neće doći u kontakt čak i ako vaš bot doživi neke male udare. Uključite svoj modul i otvorite serijski monitor, ako vaš Arduino može uspješno komunicirati s MPU6050 i ako sve funkcionira kako se očekuje, trebali biste vidjeti sljedeći zaslon.

Ovdje vidimo ulazne i izlazne vrijednosti PID algoritma u formatu input => output . Ako je bot savršeno uravnotežen, vrijednost izlaza bit će 0. Ulazna vrijednost je trenutna vrijednost senzora MPU6050. Abeceda "F" predstavlja da se bot kreće prema naprijed, a "R" da bot obrnuto.
Tijekom početnih faza PID-a preporučujem da svoj Arduino kabel ostavite spojenim na bota kako biste lako mogli pratiti vrijednosti ulaza i izlaza, a također će biti lako ispraviti i učitati svoj program za vrijednosti Kp, Ki i Kd. Video u nastavku prikazuje kompletan rada bota i također pokazuje kako ispraviti PID vrijednosti.
Nadam se da vam ovo pomaže u izradi vlastitog samobalansirajućeg robota ako imate bilo kakvih problema s radom, a zatim svoja pitanja ostavite u odjeljku za komentare u nastavku ili koristite forume za više tehničkih pitanja. Ako želite više zabave, također možete koristiti istu logiku za izradu robota za uravnoteženje kuglica.
