- Výber dielov pre samovyvažovací robot
- 3D tlač a montáž nášho samovyvažovacieho robota
- Schéma zapojenia
- Samobalančný robotický kód
- Pracuje na samovyvažovacom robote Arduino
Potom, čo som sa nechal inšpirovať motormi RYNO a inými samovyvažovacími skútrami od Segway, vždy som chcel postaviť niečo vlastného Arduino Segway Robot. Chvíľu som premýšľal a rozhodol som sa postaviť si Self Balancing Robot pomocou Arduina. Týmto spôsobom by som bol schopný pochopiť základný koncept všetkých týchto skútrov a tiež sa naučiť, ako funguje PID algoritmus.
Len čo som začal stavať, uvedomil som si, že postaviť tohto robota je trochu výzva. Existuje toľko možností na výber, a preto zmätky začínajú od výberu motorov správne a zostávajú do vyladenia hodnôt PID. A je treba brať do úvahy toľko vecí, ako je typ batérie, poloha batérie, priľnavosť kolies, typ vodiča motora, údržba CoG (ťažisko) a oveľa viac.
Ale dovoľte mi, aby som vám to rozbil, akonáhle ho postavíte, budete súhlasiť s tým, že to nie je také ťažké, ako to znie. Zmierte sa s tým, že v tomto tutoriále zdokumentujem svoje skúsenosti s budovaním samovyvažovacieho robota. Možno ste úplným začiatočníkom, ktorý ešte len začína alebo vám tu mohol pristáť po dlhej frustrácii z toho, že nedostal svojho robota do práce. Toto miesto má byť vaším konečným cieľom. Tak poďme na to……
Výber dielov pre samovyvažovací robot
Než vám poviem všetky možnosti pre zostavenie robota, dovoľte mi uviesť zoznam položiek, ktoré som použil v tomto projekte samovyvažovacieho robota
- Arduino UNO
- Prevodové jednosmerné motory (žlté) - 2č
- Modul ovládača motora L298N
- MPU6050
- Pár kolies
- 7.4V lítium-iónová batéria
- Pripojovacie vodiče
- 3D tlačené telo
Môžete kombinovať a vyberať ktorékoľvek z vyššie uvedených komponentov na základe dostupnosti a vytvoriť si tak svoju vlastnú samovyvažovaciu robotickú súpravu. Len sa uistite, či komponenty vyhovujú nasledujúcim kritériám.
Ovládač: Ovládač, ktorý som tu použil, je Arduino UNO, pretože preto je jeho použitie jednoduché. Môžete tiež použiť Arduino Nano alebo Arduino mini, ale odporučil by som vám držať sa UNO, pretože ho môžeme programovať priamo bez externého hardvéru.
Motory: Najlepšou voľbou motora, ktorý môžete použiť pre samovyvažovacieho robota, bude bezpochyby krokový motor. Ale pre zjednodušenie som použil jednosmerný prevodový motor. Áno, stepper nie je povinný; robot funguje dobre aj s týmito lacnými bežne dostupnými žlto sfarbenými jednosmernými prevodovými motormi.
Ovládač motora: Ak ste vybrali jednosmerné prevodové motory ako ja, môžete použiť buď budiaci modul L298N ako ja, alebo dokonca L293D by mal fungovať dobre. Dozviete sa viac o ovládaní jednosmerného motora pomocou L293D a Arduino.
Kolesá: Nepodceňujte týchto ľudí; Ťažko som zisťoval, že problém bol s mojimi kolesami. Uistite sa teda, že vaše kolesá majú dobrú priľnavosť k podlahe, ktorú používate. Pozorne sledujte, vaše zovretie by nikdy nemalo umožniť vašim kolesám kĺzať po podlahe.
Akcelerometer a gyroskop: Najlepšou voľbou akcelerometra a gyroskopu pre vášho robota bude MPU6050. Takže sa nepokúšajte vytvoriť taký, ktorý má normálny akcelerometer ako ADXL345 alebo niečo podobné, jednoducho to nebude fungovať. Na konci tohto článku sa dozviete prečo. Môžete si tiež prečítať náš špecializovaný článok o používaní MPU6050 s Arduino.
Batéria: Potrebujeme čo najľahšiu batériu a prevádzkové napätie by malo byť viac ako 5 V, aby sme mohli napájať naše Arduino priamo bez zosilňovacieho modulu. Ideálnou voľbou bude teda 7,4V lítium-polymérová batéria. Tu, pretože som mal ľahko dostupnú 7,4 V lítium-iónovú batériu, používal som ju. Pamätajte však, že Li-po je výhodný ako Li-ion.
Šasi: Ďalším miestom, kde by ste nemali robiť kompromisy, je šasi vášho robota. Môžete použiť lepenku, drevo, plast, všetko, čo vám vyhovuje. Len sa však uistite, že podvozok je pevný a nemal by sa krútiť, keď sa robot snaží vyvážiť. Navrhoval som vlastné šasi na Solidworks vyvodzujúce z ostatných robotov a 3D ich vytlačil. Ak máte tlačiareň, môžete návrh aj vytlačiť, súbory s návrhmi sa pripoja v nadchádzajúcej hlavičke.
3D tlač a montáž nášho samovyvažovacieho robota
Ak ste sa rozhodli 3D tlačiť na rovnakom šasi, ktoré používam na výrobu svojho robota, súbory STL si môžete stiahnuť z servera thingiverse. Spolu s ním som pridal aj návrhové súbory, aby ste ich mohli tiež upraviť podľa svojich osobných preferencií.
Diely nemajú žiadne previsnuté štruktúry, takže ich môžete ľahko vytlačiť bez akýchkoľvek podperiek a výplň 25% bude fungovať dobre. Vzory sú celkom jednoduché a každá základná tlačiareň by s nimi mala byť ľahká. Použil som softvér Cura na rozrezanie modelu a vytlačil som pomocou svojej Tevo Tarantula, nastavenie je uvedené nižšie.
Museli by ste vytlačiť časť tela a tiež štyri časti pripevňujúce motor. Montáž je celkom rovná; na upevnenie motora a dosiek na mieste použite 3 mm matice a skrutky. Po zložení by to malo vyzerať asi takto, ako je to znázornené na obrázku nižšie.
Skutočný dizajn bol naplánovaný tak, že pohonný modul L298N v dolnom stojane je Arduino a na ňom batéria, ako je to znázornené vyššie. Ak postupujete podľa rovnakého poradia, môžete dosku priamo zaskrutkovať cez poskytnuté otvory a použiť štítok s drôtom pre batériu Li-po. Toto usporiadanie by malo fungovať, až na superbežné kolesá, ktoré som musel neskôr vymeniť.
Vo svojom robote som vymenil pozíciu batérie a dosky Arduino UNO pre uľahčenie programovania a tiež som musel predstaviť dosku perf pre dokončenie pripojení. Takže môj robot nevyzeral v počiatočnej fáze tak, ako som plánoval. Po dokončení testovania programovania elektroinštalácie a všetkého možného môj dvojkolesový robot konečne vyzerá takto
Schéma zapojenia
Vytvorenie pripojení k tomuto samovyvažujúcemu robotovi založenému na Arduine je dosť jednoduché. Toto je samovyvažovací robot používajúci Arduino a MPU6050, takže ponúkame prepojenie MPU6050 s Arduinom a pripojenie motorov cez modul ovládača motora. Celé nastavenie napája 7,4 V lítium-iónová batéria. Schéma zapojenia rovnakých obvodov je uvedená nižšie.
Arduino a modul ovládača motora L298N sú napájané priamo cez pin Vin, respektíve cez svorku 12V. Palubný regulátor na doske Arduino prevedie vstupné 7,4V na 5V a bude ním napájaný ATmega IC a MPU6050. DC motory môžu pracovať od napätia 5V do 12V. Budeme však pripájať kladný vodič 7,4 V z batérie k vstupnej svorke 12V modulu modulu vodiča. To spôsobí, že motory budú pracovať s napätím 7,4 V. Nasledujúca tabuľka uvádza, ako je modul ovládača motora MPU6050 a L298N prepojený s Arduino.
Pin komponentu |
Pin Arduino |
MPU6050 |
|
Vcc |
+ 5V |
Uzemnenie |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
D2 |
L298N |
|
IN1 |
D6 |
IN2 |
D9 |
IN3 |
D10 |
IN4 |
D11 |
MPU6050 komunikuje s Arduinom cez I2C rozhranie, takže používame SPI piny A4 a A5 od Arduina. Jednosmerné motory sú pripojené k pinom PWM D6, D9 D10 a D11. Musíme ich pripojiť k pinom PWM, pretože budeme riadiť rýchlosť jednosmerného motora zmenou pracovného cyklu signálov PWM. Ak nie ste oboznámení s týmito dvoma komponentmi, odporúča sa prečítať si návod MPU6050 Interfacing a L298N Motor driver.
Samobalančný robotický kód
Teraz musíme naprogramovať našu dosku Arduino UNO na vyváženie robota. Tu sa deje všetko kúzlo; koncepcia za tým je jednoduchá. Musíme skontrolovať, či sa botka nakláňa dopredu alebo dozadu pomocou MPU6050, a potom, ak sa nakláňa smerom dopredu, musíme otáčať kolesá smerom dopredu a ak sa nakláňa dozadu, musíme otáčať kolesami v opačnom smere.
Zároveň musíme kontrolovať rýchlosť, ktorou sa kolesá otáčajú. Ak je robot mierne dezorientovaný zo stredovej polohy, kolesá sa otáčajú pomaly a rýchlosť sa zvyšuje, keď sa zo strednej polohy viac vzďaľuje. Na dosiahnutie tejto logiky používame algoritmus PID, ktorý má stredovú polohu ako nastavenú hodnotu a úroveň dezorientácie ako výstup.
Na poznanie aktuálnej polohy robota používame MPU6050, čo je kombinovaný 6-osový akcelerometer a gyroskop. Aby sme zo senzora získali spoľahlivú hodnotu polohy, musíme použiť hodnotu akcelerometra aj gyroskopu, pretože hodnoty z akcelerometra majú problémy so šumom a hodnoty z gyroskopu majú tendenciu sa časom driftovať. Musíme teda skombinovať obe a získať hodnotu uhla natočenia a natočenia nášho robota, z ktorých použijeme iba hodnotu natočenia.
Znie to trochu ako navíjanie hlavy, nie? Ale nebojte sa, vďaka komunite Arduino máme ľahko dostupné knižnice, ktoré môžu vykonávať výpočet PID a tiež získať hodnotu vybočenia z MPU6050. Knižnicu vyvinuli br3ttb a jrowberg. Predtým, ako budete pokračovať, stiahnite si ich knižnice z nasledujúceho odkazu a pridajte ich do svojho adresára lib Arduino.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Teraz, keď máme knižnice pridané do nášho Arduino IDE. Začnime programovať nášho Self balancing robota. Ako vždy je kompletný kód pre vyvažovací robot MPU6050 uvedený na konci tejto stránky, tu len vysvetľujem najdôležitejšie úryvky v kóde. Ako už bolo povedané, kód je postavený na ukážkovom kóde MPU6050, iba optimalizujeme kód pre náš účel a pridáme PID a riadiacu techniku pre nášho samovyvažovacieho robota.
Najskôr zahrnieme knižnice, ktoré sú potrebné na fungovanie tohto programu. Zahŕňajú zabudovanú knižnicu I2C, PID Library a MPU6050 Library, ktoré sme si práve stiahli.
#include "I2Cdev.h" #include
Potom deklarujeme premenné, ktoré sú potrebné na získanie údajov zo snímača MPU6050. Čítame hodnoty vektora gravitácie aj hodnoty štvorca a potom vypočítame hodnotu sklonu a natočenia robota robota. Na floatovom poli ypr bude konečný výsledok.
// MPU control / status vars bool dmpReady = false; // nastavenie true, ak bol DMP init úspešný uint8_t mpuIntStatus; // obsahuje aktuálny bajt stavu prerušenia z MPU uint8_t devStatus; // návratový stav po každej operácii zariadenia (0 = úspech ,! 0 = chyba) uint16_t packetSize; // očakávaná veľkosť paketu DMP (predvolená hodnota je 42 bajtov) uint16_t fifoCount; // počet všetkých bajtov, ktoré sú momentálne vo FIFO uint8_t fifoBuffer; // vyrovnávacia pamäť FIFO // orientácia / pohyb vars Quaternion q; // štvorec kontajner VectorFloat gravitácia; // vektor gravitácie float ypr; // kontajner vybočenia / stúpania / naklápania a vektor gravitácie
Ďalej prichádza na rad veľmi dôležitý segment kódu, a tu budete tráviť dlhý čas vyladením správnej množiny hodnôt. Ak je váš robot zostavený s veľmi dobrým ťažiskom a komponenty sú symetricky usporiadané (čo vo väčšine prípadov nie je), bude hodnota vašej nastavenej hodnoty 180. Inak pripojte svojho robota k sériovému monitoru Arduino a nakláňajte ho, až kým nájdete dobrú vyváženú pozíciu, prečítajte si hodnotu zobrazenú na sériovom monitore a toto je vaša nastavená hodnota. Hodnota Kp, Kd a Ki sa musí nastaviť podľa vášho robota. Žiadni dvaja rovnakí roboti nebudú mať rovnaké hodnoty Kp, Kd a Ki, takže z nich nemožno uniknúť. Pozrite si video na konci tejto stránky, aby ste získali predstavu o tom, ako tieto hodnoty upraviť.
/ ********* Nalaďte si tieto 4 hodnoty pre svoj BOT ********* / dvojnásobná požadovaná hodnota = 176; // nastaví hodnotu, keď je robot kolmý na zem pomocou sériového monitora. // V projektovej dokumentácii na circuitdigest.com sa dozviete, ako nastaviť tieto hodnoty double Kp = 21; // Nastaviť toto prvé dvojité Kd = 0,8; // Nastaviť tento dvojitý secound Ki = 140; // Nakoniec nastavíme toto / ****** Koniec nastavenia hodnôt ********* /
V ďalšom riadku inicializujeme PID algoritmus odovzdaním vstupných premenných vstup, výstup, nastavená hodnota, Kp, Ki a Kd. Z toho sme už nastavili hodnoty požadovanej hodnoty Kp, Ki a Kd vo vyššie uvedenom úryvku kódu. Hodnota vstupu bude aktuálna hodnota vybočenia načítaná zo snímača MPU6050 a hodnota výstupu bude hodnota vypočítaná algoritmom PID. Takže v zásade nám PID algoritmus dá výstupnú hodnotu, ktorá by sa mala použiť na korekciu vstupnej hodnoty tak, aby bola blízko nastavenej hodnoty.
PID pid (& vstup, & výstup, & požadovaná hodnota, Kp, Ki, Kd, DIRECT);
Vo vnútri funkcie nastavenia prázdnoty inicializujeme MPU6050 konfiguráciou DMP (Digital Motion Processor). Pomôže nám to skombinovať údaje akcelerometra s údajmi gyroskopu a poskytnúť spoľahlivú hodnotu vybočenia, vybočenia a natočenia. Nebudeme sa tým veľmi zaoberať, pretože to bude ďaleko za touto témou. Každopádne jeden segment kódu, ktorý musíte vyhľadať vo funkcii nastavenia, sú hodnoty posunu gyra. Každý snímač MPU6050 má svoje vlastné hodnoty posunov, pomocou ktorých môžete túto skicu Arduino vypočítať hodnotu posunu vášho snímača a podľa toho aktualizovať nasledujúce riadky vo svojom programe.
// tu poskytnite svoje vlastné posuny gyra , upravené pre minimálnu citlivosť mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Musíme tiež inicializovať piny Digital PWM, ktoré používame na pripojenie našich motorov. V našom prípade sú to D6, D9, D10 a D11. Takže tieto piny inicializujeme, pretože ich výstupné piny predvolene nastavujú na LOW.
// Inicializujte piny výstupu motora pinMode (6, OUTPUT); pinMode (9, VÝSTUP); pinMode (10, VÝSTUP); pinMode (11, VÝSTUP); // Štandardne vypnite oba motory analogWrite (6, LOW); analogWrite (9, LOW); analogWrite (10, LOW); analogWrite (11, LOW);
Vo vnútri funkcie hlavnej slučky kontrolujeme, či sú dáta z MPU6050 pripravené na čítanie. Ak áno, potom ho použijeme na výpočet hodnoty PID a potom zobrazíme vstupnú a výstupnú hodnotu PID na sériovom monitore, len aby sme skontrolovali, ako PID reaguje. Potom sa na základe hodnoty výstupu rozhodneme, či sa má robot pohybovať dopredu alebo dozadu alebo stáť na mieste.
Pretože predpokladáme, že MPU6050 vráti 180, keď je robot vo zvislej polohe. Korekčné hodnoty dostaneme kladné, keď robot klesá smerom dopredu, a hodnoty dostaneme záporné, ak robot klesá smerom dozadu. Takže skontrolujeme tento stav a zavoláme príslušné funkcie na presun robota dopredu alebo dozadu.
while (! mpuInterrupt && fifoCount <packetSize) { // žiadne údaje mpu - vykonávanie výpočtov PID a výstup do motorov pid.Compute (); // Vytlačte hodnotu vstupu a výstupu na sériový monitor a skontrolujte, ako to funguje. Serial.print (vstup); Serial.print ("=>"); Serial.println (výstup); if (vstup> 150 && vstup <200) {// Ak Bot klesá (if> output> 0) // Padá smerom dopredu Forward (); // Kolesá otočte dopredu, pokiaľ if (výstup <0) // Padajúce dozadu Reverse (); // Otočte kolesá dozadu } else // Ak Bot nespadá Stop (); // Držte kolesá stále }
Výstupná premenná PID tiež rozhodne, ako rýchlo sa má motor otáčať. Ak je robot práve na spadnutie, urobíme malú korekciu pomalým otáčaním kolesa. Ak tieto drobné korekcie nefungujú a ak robot stále klesá, zvyšujeme rýchlosť motora. O hodnote rýchlosti otáčania kolies rozhodne algoritmus PI. Všimnite si, že pre funkciu Reverse sme vynásobili hodnotu výstupu číslom -1, aby sme mohli konvertovať zápornú hodnotu na kladnú.
void Forward () // Kód na otočenie kolieska dopredu { analogWrite (6, výstup); analogWrite (9,0); analogWrite (10, výstup); analogWrite (11,0); Serial.print ("F"); // Informácie o ladení } void Reverse () // Kód na otočenie kolieska dozadu { analogWrite (6,0); analogWrite (9, výstup * -1); analogWrite (10,0); analogWrite (11, výstup * -1); Serial.print ("R"); } void Stop () // Kód na zastavenie oboch kolies { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Serial.print ("S"); }
Pracuje na samovyvažovacom robote Arduino
Keď budete pripravení na hardvér, môžete nahrať kód na svoju dosku Arduino. Skontrolujte, či sú pripojenia správne, pretože používame lítium-iónovú batériu, preto je potrebná mimoriadna opatrnosť. Preto dvakrát skontrolujte skraty a zabezpečte, aby terminály neprišli do kontaktu, aj keď má váš robot nejaké malé nárazy. Zapnite modul a otvorte sériový monitor, ak vaše Arduino dokáže úspešne komunikovať s MPU6050 a ak všetko funguje podľa očakávaní, mala by sa zobraziť nasledujúca obrazovka.
Tu vidíme vstupné a výstupné hodnoty PID algoritmu vo formáte vstup => výstup . Ak je robot dokonale vyvážený, hodnota výstupu bude 0. Vstupná hodnota je aktuálna hodnota zo snímača MPU6050. Abeceda „F“ znamená, že robot sa pohybuje vpred a „R“ znamená, že robot sa pohybuje v opačnom smere.
V počiatočných fázach PID odporúčam nechať váš kábel Arduino pripojený k robotu, aby ste mohli ľahko sledovať hodnoty vstupu a výstupu a taktiež bude ľahké program opraviť a nahrať na hodnoty Kp, Ki a Kd. Video nižšie ukazuje kompletné pracovné topánka a tiež ukazuje, ako opraviť svoje PID hodnoty.
Dúfam, že to pomôže zostaviť vášho vlastného vyvažovacieho robota, ak máte problém s jeho uvedením do prevádzky. Potom nechajte svoje otázky v sekcii komentárov nižšie alebo použite fóra na ďalšie technické otázky. Ak chcete viac zábavy, môžete použiť rovnakú logiku na zostavenie robota vyvažujúceho loptu.