- Izbira delov za samoravnovesje robota
- 3D tiskanje in sestavljanje našega samoravnotežnega robota
- Shema vezja
- Koda samoizravnalnega robota
- Delovanje Arduino Robot-a
Po navdihu z RYNO motorji in drugimi skuterji s Segwaya, sem si vedno želel zgraditi nekaj svojega Arduino Segway Robota. Razmišljal sem nekaj časa, da sem se z Arduinom zgradil Robot za samo uravnoteženje. Tako bi lahko dojel osnovni koncept vseh teh skuterjev in se tudi naučil, kako deluje algoritem PID.
Ko sem začel graditi, sem ugotovil, da je ta bot nekoliko izziv za gradnjo. Obstaja toliko možnosti, med katerimi lahko izbirate, zato se zmede začnejo pravilno pri izbiri motorjev in ostanejo do nastavitve vrednosti PID. Upoštevati je treba toliko stvari, kot so vrsta akumulatorja, položaj akumulatorja, oprijem koles, vrsta voznika motorja, vzdrževanje CoG (Težišče) in še veliko več.
Ampak naj vam razkrijem, ko jo boste zgradili, se boste strinjali, da ni tako težko, kot se sliši. Torej, priznajmo si, v tej vadnici bom dokumentiral svoje izkušnje pri izdelavi samo uravnoteževalnega robota. Morda ste absolutni začetnik, ki šele začenja ali pa je pristal tukaj po dolgem frustraciji, ker svojega bota ni spustil v službo. Cilj tega kraja je biti vaš končni cilj. Začnimo torej……
Izbira delov za samoravnovesje robota
Preden vam povem vse možnosti za izdelavo bota, naj navedem elemente, ki sem jih uporabil v tem projektu samo uravnoteženja robota
- Arduino UNO
- Zobniški enosmerni motorji (rumeno obarvani) - 2 Št
- L298N motorni pogonski modul
- MPU6050
- Par koles
- 7,4V Li-ion baterija
- Priključne žice
- 3D tiskano telo
Glede na razpoložljivost lahko katero koli od zgoraj omenjenih komponent izberete in izberete svoj robot za samo uravnoteženje, samo poskrbite, da komponente ustrezajo naslednjim merilom.
Krmilnik: Krmilnik, ki sem ga tukaj uporabil, je Arduino UNO, zakaj, ker je preprosto enostaven za uporabo. Lahko uporabite tudi Arduino Nano ali Arduino mini, vendar vam priporočam, da se držite UNO, saj ga lahko programiramo neposredno brez zunanje strojne opreme.
Motorji: Najboljša izbira motorja, ki ga lahko uporabite za samoravnovesnega robota, brez dvoma bo Stepper motor. Da pa bi bilo vse preprosto, sem uporabil enosmerni motor z enosmernim tokom. Da, ni obvezno imeti steperja; bot se odlično obnese tudi s temi poceni splošno dostopnimi rumeno obarvanimi motorji z enosmernim tokom.
Motor Driver: Če ste izbrali enosmerne motorje, kot je moj, lahko uporabite gonilniški modul L298N, kot sem jaz, ali celo L293D bi moral delati v redu. Preberite več o upravljanju enosmernega motorja z uporabo L293D in Arduino.
Kolesa: Ne ocenjujte teh fantov; Težko sem ugotovil, da je težava v mojih kolesih. Zato poskrbite, da bodo vaša kolesa dobro oprijemala tla, ki jih uporabljate. Pazite pozorno, vaš oprijem nikoli ne sme dovoliti, da kolesa drsijo po tleh.
Merilec pospeška in žiroskop: Najboljša izbira pospeška in žiroskopa za vašega bota bo MPU6050. Zato ga ne poskušajte izdelati z običajnim merilnikom pospeška, kot je ADXL345 ali kaj podobnega, preprosto ne bo deloval. Zakaj boste vedeli na koncu tega članka. Ogledate si lahko tudi naš namenski članek o uporabi MPU6050 z Arduino.
Baterija: Potrebujemo čim lažjo baterijo, delovna napetost pa mora biti večja od 5 V, da lahko Arduino napajamo neposredno brez ojačevalnega modula. Idealna izbira bo torej 7,4V Li-polimerna baterija. Tukaj, ker sem imel 7,4V Li-ion baterijo, ki je takoj na voljo, jo uporabljam. Toda ne pozabite, da je Li-po ugodnejši od Li-iona.
Šasija: Še eno mesto, kjer ne smete popuščati, je šasija vaših botov. Uporabite lahko karton, les, plastiko, s čimer ste dobri. Vendar pazite, da je ohišje trdno in da se ne sme premikati, ko bot poskuša uravnotežiti. Na Solidworksu sem zasnoval lastno podvozje, sklepajoč od ostalih botov, in ga natisnil v 3D. Če imate tiskalnik, lahko dizajn tudi natisnete, datoteke oblikovanja bodo priložene v prihodnjem naslovu.
3D tiskanje in sestavljanje našega samoravnotežnega robota
Če ste se odločili za 3D tiskanje istega ohišja, ki ga uporabljam za izdelavo bota, potem lahko datoteke STL prenesete s spletnega mesta thingiverse. Skupaj sem dodal tudi oblikovalske datoteke, tako da jih lahko tudi spremenite glede na vaše osebne nastavitve.
Deli nimajo previsnih struktur, tako da jih lahko enostavno natisnete brez podpore, polnilo 25% pa bo delovalo v redu. Zasnove so precej navadne in vsak osnovni tiskalnik bi ga lahko z lahkoto obvladal. Za rezanje modela sem uporabil programsko opremo Cura in tiskal z uporabo Tevo Tarantula, nastavitve so prikazane spodaj.
Natisniti bi morali del telesa in štiri dele za pritrditev motorja. Sestavljanje je precej naravnost naprej; uporabite 3 mm matice in vijake, da pritrdite motor in plošče na svoje mesto. Po sestavljanju mora biti videti približno tako, kot je prikazano na spodnji sliki.
Dejanska zasnova je bila načrtovana s pogonskim modulom L298N v spodnjem nosilcu Arduino in baterijo na njem, kot je prikazano zgoraj. Če sledite istemu vrstnemu redu, lahko ploščo neposredno privijete skozi predvidene luknje in uporabite žično ploščico za Li-po baterijo. Tudi ta ureditev bi morala delovati, razen super navadnih koles, ki sem jih moral kasneje zamenjati.
V svojem botu sem zamenjal položaj baterije in plošče Arduino UNO zaradi lažjega programiranja, poleg tega pa sem moral uvesti perf ploščo za dokončanje povezav. Torej moj bot v začetni fazi ni izgledal tako, kot sem načrtoval. Po končanem preizkušanju ožičenja in vsega, je moj dvokolesni robot končno videti takole
Shema vezja
Vzpostavljanje povezav s tem samoizravnalnim robotom, ki temelji na Arduinu, je precej preprosto. To je samoravnotežni robot, ki uporablja Arduino in MPU6050, zato želimo MPU6050 povezati z Arduinom in povezati motorje prek modula Motor driver. Celotno postavitev napaja 7,4V li-ionska baterija. Shema vezja za isto je prikazana spodaj.
Modul gonilnika Arduino in L298N Motor se neposredno napajata preko Vin-pin-a in 12V-terminala. Vgrajeni regulator na plošči Arduino bo pretvoril vhod 7,4 V v 5 V, ATmega IC in MPU6050 pa ga bo napajal. Enosmerni motorji lahko delujejo od napetosti 5V do 12V. Vendar bomo 7,4V pozitivno žico od akumulatorja priključili na 12V vhodni terminal modula gonilnika motorja. Tako bodo motorji delovali s 7,4V. Naslednja tabela bo navedla, kako sta modul gonilnika motorja MPU6050 in L298N povezana z Arduino.
Komponentni pin |
Arduino Pin |
MPU6050 |
|
Vcc |
+ 5V |
Tla |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
D2 |
L298N |
|
IN1 |
D6 |
IN2 |
D9 |
IN3 |
D10 |
IN4 |
D11 |
MPU6050 komunicira z Arduinom prek vmesnika I2C, zato uporabljamo zatiča SPI A4 in A5 Arduina. Enosmerni motorji so povezani s PWM zatiči D6, D9 D10 in D11. Povezati jih moramo z zatiči PWM, ker bomo s spreminjanjem delovnega cikla signalov PWM nadzirali hitrost enosmernega motorja. Če teh dveh komponent ne poznate, je priporočljivo prebrati vadnico MPU6050 Interfacing in L298N Motor driver.
Koda samoizravnalnega robota
Zdaj moramo programirati našo Arduino UNO ploščo za uravnoteženje robota. Tu se zgodi vsa čarovnija; koncept tega je preprost. Z MPU6050 moramo preveriti, če se bot nagiba spredaj ali zadaj, nato pa, če je nagnjen spredaj, moramo kolesa zasukati naprej in če je nagnjen nazaj, moramo kolesa zasukati v obratni smeri.
Hkrati moramo nadzirati tudi hitrost vrtenja koles, če je bot nekoliko dezorientiran iz sredinskega položaja, se kolesa počasi vrtijo in hitrost narašča, ko se bolj oddaljeva od sredinskega položaja. Da bi dosegli to logiko, uporabimo algoritem PID, ki ima sredinski položaj kot nastavljeno točko in stopnjo dezorientacije kot izhod.
Za poznavanje trenutnega položaja bota uporabljamo MPU6050, ki je kombiniran 6-osni merilnik pospeška in senzor žiroskopa. Da bi s senzorja dobili zanesljivo vrednost položaja, moramo uporabiti vrednost merilnika pospeška in žiroskopa, saj imajo vrednosti merilnika pospeška težave s hrupom, vrednosti žiroskopa pa se sčasoma spreminjajo. Torej moramo združiti oboje in dobiti vrednost nagiba in zvijanja našega robota, od katerih bomo uporabili samo vrednost naklona.
Sliši se malo glave, kajne? Toda brez skrbi, zahvaljujoč skupnosti Arduino imamo na voljo knjižnice, ki lahko izvedejo izračun PID in dobijo vrednost nihanja iz MPU6050. Knjižnico razvijata br3ttb oziroma jrowberg. Preden nadaljujete, prenesite njihove knjižnice na naslednjo povezavo in jih dodajte v svoj imenik Arduino lib.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Zdaj, ko imamo knjižnice dodane v naš Arduino IDE. Začnimo s programiranjem za našega samo-uravnoteževalnega robota. Kot vedno je celotna koda za izravnalni robot MPU6050 podana na koncu te strani, tudi tukaj pojasnjujem najpomembnejše delčke kode. Kot smo že povedali, je koda zgrajena na primeru kode MPU6050, mi bomo le optimizirali kodo za naš namen in dodali PID in tehniko nadzora za našega ročno izravnavajočega robota.
Najprej vključimo knjižnice, ki so potrebne za delovanje tega programa. Vključujejo vgrajeno knjižnico I2C, knjižnico PID in knjižnico MPU6050, ki smo jo pravkar prenesli.
#include "I2Cdev.h" #include
Nato deklariramo spremenljivke, ki so potrebne za pridobitev podatkov iz senzorja MPU6050. Preberemo vrednosti gravitacijskega vektorja in kvaterniona, nato pa izračunamo nagib in vrednost vala bota. Float polje YPR bo imel končni rezultat.
// nadzor / status MPU se spreminja bool dmpReady = false; // nastavi true, če je bil DMP init uspešen uint8_t mpuIntStatus; // vsebuje dejanski bajt stanja prekinitve iz MPU uint8_t devStatus; // vrne stanje po vsaki operaciji naprave (0 = uspeh ,! 0 = napaka) uint16_t packetSize; // pričakovana velikost paketa DMP (privzeto je 42 bajtov) uint16_t fifoCount; // štetje vseh bajtov, ki so trenutno v FIFO uint8_t fifoBuffer; // pomnilnik FIFO za shranjevanje // orientacija / gibanje se spreminja Quaternion q; // kvaternijski vsebnik VectorFloat gravity; // gravitacijski vektor float ypr; // posoda z nihanjem / korakom / zvitkom in gravitacijski vektor
Nato pride zelo pomemben segment kode in tu boste dolgo časa porabili za uglaševanje pravega nabora vrednosti. Če je vaš robot zgrajen z zelo dobrim težiščem in so komponente simetrično razporejene (kar v večini primerov ni), bo vrednost vaše nastavitvene točke 180. V nasprotnem primeru bota povežite s serijskim monitorjem Arduino in ga nagnite do najdete dober položaj za uravnoteženje, preberite vrednost, prikazano na serijskem monitorju, in to je vaša nastavljena vrednost. Vrednost Kp, Kd in Ki je treba prilagoditi glede na vašega bota. Nobena dva enaka bota ne bosta imela enakih vrednosti Kp, Kd in Ki, tako da ji ni mogoče ubežati. Oglejte si video na koncu te strani, da dobite idejo, kako prilagoditi te vrednosti.
/ ********* Nastavite te 4 vrednosti za BOT ********* / dvojna nastavljena vrednost = 176; // nastavimo vrednost, ko je bot pravokoten na zemljo s pomočjo serijskega monitorja. // Preberite projektno dokumentacijo na circuitdigest.com, če želite izvedeti, kako nastaviti te vrednosti double Kp = 21; // nastavimo to prvo dvojno Kd = 0,8; // Set to secound dvojna Kj = 140; // Končno nastavite to / ****** Nastavitev konca vrednosti ********* /
V naslednji vrstici inicializiramo algoritem PID s prenosom vhodnih spremenljivk input, output, set point, Kp, Ki in Kd. Od teh smo že nastavili vrednosti nastavitvenih točk Kp, Ki in Kd v zgornjem delčku kode. Vrednost vnosa bo trenutna vrednost nihanja, ki se odčita s senzorja MPU6050, vrednost izhoda pa bo vrednost, ki jo izračuna algoritem PID. V bistvu nam bo algoritem PID dal izhodno vrednost, ki jo je treba uporabiti za popravljanje vhodne vrednosti tako, da je blizu nastavljene točke.
PID pid (& vhod, & izhod, & nastavljena vrednost, Kp, Ki, Kd, DIRECT);
Znotraj funkcije nastavitve praznine MPU6050 inicializiramo s konfiguracijo DMP (Digital Motion Processor). To nam bo pomagalo pri kombiniranju podatkov merilnika pospeška z giroskopskimi podatki in zagotovilo zanesljivo vrednost Yaw, Pitch and Roll. V to se ne bomo spuščali globoko, saj bo to daleč izven teme. Kakorkoli, en segment kode, ki ga morate poiskati v nastavitveni funkciji, so vrednosti odmika žiroskopov. Vsako tipalo MPU6050 ima svoje vrednosti odmikov, s pomočjo te skice Arduino lahko izračunate vrednost odmika vašega senzorja in ustrezno posodobite naslednje vrstice v svojem programu.
// tu vnesite lastne odmike žiroskopov, prilagojene na najmanjšo občutljivost mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Inicializirati moramo tudi zatiče Digital PWM, s katerimi povežemo naše motorje. V našem primeru so to D6, D9, D10 in D11. Torej te zatiče inicializiramo, saj jih izhodni zatiči privzeto naredijo LOW.
// inicializacija motorja outpu zatiči pinMode (6, izhod); pinMode (9, IZHOD); pinMode (10, IZHOD); pinMode (11, IZHOD); // privzeto izklopite oba motorja analogWrite (6, LOW); analogWrite (9, LOW); analogWrite (10, LOW); analogWrite (11, LOW);
Znotraj funkcije glavne zanke preverimo, ali so podatki iz MPU6050 pripravljeni za branje. Če je odgovor pritrdilen, ga uporabimo za izračun vrednosti PID in nato na serijskem monitorju prikažemo vhodno in izhodno vrednost PID, samo da preverimo, kako se PID odziva. Nato se na podlagi izhodne vrednosti odločimo, ali se bot mora premakniti naprej ali nazaj ali mirovati.
Ker predvidevamo, da bo MPU6050 vrnil 180, ko bo bot pokonci. Vrednosti popravkov bomo dobili pozitivne, ko bot pade naprej, negativne pa, če bot pade nazaj. Torej preverimo, ali je to stanje poklicano in pokličemo ustrezne funkcije za premikanje bota naprej ali nazaj.
while (! mpuInterrupt && fifoCount <packetSize) { // ni podatkov mpu - izvajanje PID izračunov in izhod na motorje pid.Compute (); // Natisnite vrednost vhoda in izhoda na serijski monitor, da preverite, kako deluje. Serial.print (vnos); Serial.print ("=>"); Serial.println (izhod); if (input> 150 && input <200) {// Če bot pade if (output> 0) // Pada proti naprej (); // Kolesa zavrtimo naprej, če je (izhod <0) // Padajoč nazaj Reverse (); // Zavrtite kolesa nazaj } else // Če Bot ne pade Stop (); // držite kolesa pri miru }
Izhodna spremenljivka PID odloči tudi, kako hitro je motor, ki se vrti. Če bot tik pred padcem, naredimo manjši popravek s počasnim vrtenjem kolesa. Če ti manjši popravljalni učinki delujejo in še vedno, če bot pada, povečamo hitrost motorja. Vrednost hitrosti vrtenja koles bo določil algoritem PI. Upoštevajte, da smo za funkcijo Reverse pomnožili vrednost izhoda z -1, tako da lahko negativno vrednost pretvorimo v pozitivno.
void Forward () // Koda za vrtenje kolesa naprej { analogWrite (6, izhod); analogWrite (9,0); analogWrite (10, izhod); analogWrite (11,0); Serial.print ("F"); // informacije o odpravljanju napak } void Reverse () // Koda za vrtenje kolesa nazaj { analogWrite (6,0); analogWrite (9, izhod * -1); analogWrite (10,0); analogWrite (11, izhod * -1); Serial.print ("R"); } void Stop () // Koda za zaustavitev obeh koles { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Serial.print ("S"); }
Delovanje Arduino Robot-a
Ko ste pripravljeni s strojno opremo, lahko kodo naložite na ploščo Arduino. Prepričajte se, da so povezave pravilne, saj uporabljamo Li-ion baterijo, zato je potrebna posebna previdnost. Torej dvakrat preverite, ali obstajajo kratki stiki in zagotovite, da terminali ne bodo prišli v stik, tudi če bot doživi manjše udarce. Vklopite modul in odprite serijski monitor, če lahko vaš Arduino uspešno komunicira z MPU6050 in če vse deluje po pričakovanjih, boste videli naslednji zaslon.
Tu vidimo vhodne in izhodne vrednosti algoritma PID v obliki input => output . Če je bot popolnoma uravnotežen, bo izhodna vrednost 0. Vhodna vrednost je trenutna vrednost senzorja MPU6050. Abeceda "F" pomeni, da se bot premika naprej, "R" pa, da se bot premika nazaj.
V začetnih fazah PID priporočam, da svoj kabel Arduino pustite povezan z botom, tako da boste lahko enostavno spremljali vrednosti vhoda in izhoda, prav tako pa boste lahko popravili in naložili svoj program za vrednosti Kp, Ki in Kd. Spodnji video prikazuje popolno delovanje bota in tudi popravek vrednosti PID.
Upam, da vam to pomaga zgraditi lastnega robota za uravnoteženje, če imate kakršne koli težave pri njegovem delovanju, nato svoja vprašanja pustite v spodnjem oddelku za komentarje ali uporabite forum za več tehničnih vprašanj. Če želite več zabave, lahko isto logiko uporabite tudi za izdelavo robota za uravnoteženje krogel.