- Výběr dílů pro samovyvažovací robot
- 3D tisk a montáž našeho samovyvažovacího robota
- Kruhový diagram
- Self Balancing Robot Code
- Práce se samovyvažovacím robotem Arduino
Poté, co jsem se nechal inspirovat motory RYNO a dalšími samovyvažovacími skútry od Segway, jsem vždy chtěl postavit něco svého vlastního Arduino Segway Robot. Když jsem chvíli přemýšlel, rozhodl jsem se postavit Self Balancing Robot pomocí Arduina. Tímto způsobem bych byl schopen pochopit základní koncept za všemi těmito skútry a také se naučit, jak funguje PID algoritmus.
Jakmile jsem začal stavět, uvědomil jsem si, že stavět tohoto robota je trochu výzva. Existuje tolik možností na výběr, a proto zmatky začínají správně od výběru motorů a zůstávají až do vyladění hodnot PID. A je třeba vzít v úvahu tolik věcí, jako je typ baterie, poloha baterie, přilnavost kol, typ řidiče motoru, údržba CoG (těžiště) a mnoho dalšího.
Ale dovolte mi, abych vám to prolomil, jakmile to postavíte, budete souhlasit, že to není tak těžké, jak to zní. Přiznejme si to, v tomto tutoriálu zdokumentuji své zkušenosti s budováním samovyvažovacího robota. Možná jste absolutní začátečník, který teprve začíná, nebo jste zde mohli přistát po dlouhé frustraci z toho, že nedostanete svého robota do práce. Toto místo si klade za cíl být vaším konečným cílem. Pojďme tedy začít……
Výběr dílů pro samovyvažovací robot
Než vám řeknu všechny možnosti pro sestavení robota, dovolte mi vyjmenovat položky, které jsem použil v tomto projektu self balancing robot
- Arduino UNO
- Převodové stejnosměrné motory (žlutě zbarvené) - 2 č
- Modul ovladače motoru L298N
- MPU6050
- Pár kol
- 7.4V Li-ion baterie
- Připojovací vodiče
- 3D tištěné tělo
Můžete libovolně kombinovat a vybrat kteroukoli z výše uvedených komponent na základě dostupnosti a vytvořit si svoji vlastní samovyvažovací sadu robotů, stačí se ujistit, že komponenty splňují následující kritéria.
Řadič: Řadič, který jsem zde použil, je Arduino UNO, proč, protože je jednoduše použitelný. Můžete také použít Arduino Nano nebo Arduino mini, ale doporučil bych vám držet se UNO, protože jej můžeme programovat přímo bez jakéhokoli externího hardwaru.
Motory: Nejlepší volbou motoru, který můžete použít pro samovyvažovacího robota, bude bezpochyby krokový motor. Ale pro zjednodušení jsem použil stejnosměrný převodový motor. Ano, není nutné mít stepper; robot funguje dobře i s těmito levnými běžně dostupnými žlutě zbarvenými stejnosměrnými převodovými motory.
Ovladač motoru: Pokud jste vybrali stejnosměrné převodové motory, jako je ten můj, můžete buď použít modul ovladače L298N jako já, nebo dokonce L293D by měl fungovat dobře. Zjistěte více o řízení stejnosměrného motoru pomocí L293D a Arduino.
Kola: Nepodceňujte tyto lidi; Těžko jsem zjistil, že problém byl s mými koly. Ujistěte se tedy, že vaše kola mají dobrou přilnavost k podlaze, kterou používáte. Sledujte pozorně, vaše přilnavost by nikdy neměla kolům povolit klouzat po podlaze.
Akcelerometr a gyroskop: Nejlepší volbou akcelerometru a gyroskopu pro vašeho robota bude MPU6050. Takže se nepokoušejte stavět jeden s běžným akcelerometrem, jako je ADXL345 nebo něco podobného, prostě to nebude fungovat. Na konci tohoto článku budete vědět proč. Můžete si také přečíst náš specializovaný článek o používání MPU6050 s Arduino.
Baterie: Potřebujeme co nejlehčí baterii a provozní napětí by mělo být více než 5 V, abychom mohli napájet naše Arduino přímo bez zesilovacího modulu. Ideální volbou bude tedy Li-polymerová baterie 7,4 V. Tady, protože jsem měl snadno k dispozici 7,4V Li-ion baterii, použil jsem ji. Ale pamatujte, že Li-po je výhodnější než Li-ion.
Šasi: Další místo, kde byste neměli dělat kompromisy, je vaše šasi robotů. Můžete použít lepenku, dřevo, plast, vše, co vám vyhovuje. Jen se však ujistěte, že podvozek je pevný a neměl by se kroutit, když se robot pokouší vyvážit. Navrhl jsem vlastní šasi na Solidworks vyvozující z ostatních robotů a 3D jej vytiskl. Pokud máte tiskárnu, můžete návrh také vytisknout, soubory návrhů budou připojeny v nadcházejícím nadpisu.
3D tisk a montáž našeho samovyvažovacího robota
Pokud jste se rozhodli pro 3D tisk stejného šasi, které používám k sestavení svého robota, můžete si soubory STL stáhnout z thingiverse. Spolu s ním jsem také přidal soubory návrhu, takže je můžete také upravit podle svých osobních preferencí.
Díly nemají žádné převislé struktury, takže je můžete snadno vytisknout bez podpěr a výplň 25% bude fungovat dobře. Designy jsou docela prosté a každá základní tiskárna by to měla zvládnout snadno. Pomocí softwaru Cura jsem model rozřezal a vytiskl pomocí mé Tevo Tarantula, nastavení je uvedeno níže.
Museli byste vytisknout část těla i čtyři části pro uchycení motoru. Sestavení je docela přímé; Pomocí 3mm matic a šroubů zajistěte motor a desky na místě. Po sestavení by to mělo vypadat asi takto, jak je znázorněno na obrázku níže.
Skutečný design byl plánován s modulem pohonu L298N ve spodním stojanu, Arduino a baterií nahoře, jak je uvedeno výše. Pokud postupujete podle stejného pořadí, můžete desku přímo přišroubovat přes dodané otvory a použít drátový štítek pro Li-po baterii. Toto uspořádání by také mělo fungovat, až na super hladká kola, která jsem později musel vyměnit.
V mém botu jsem vyměnil polohu baterie a desky Arduino UNO pro snadné programování a také jsem musel zavést desku perf pro dokončení připojení. Můj robot tedy v počáteční fázi nevypadal tak, jak jsem plánoval. Po dokončení testování programování elektroinstalace a všeho, můj robot na dvou kolech konečně vypadá takto
Kruhový diagram
Vytvoření připojení pro tento samoobslužný robot založený na Arduinu je docela jednoduché. Jedná se o samovyvažovací robot využívající Arduino a MPU6050, takže jsme schopni propojit MPU6050 s Arduino a připojit motory přes modul ovladače motoru. Celé nastavení je napájeno 7,4V li-ion baterií. Schéma zapojení stejného schématu je uvedeno níže.
Modul ovladače motoru Arduino a L298N je přímo napájen přes pin Vin, respektive 12V. Palubní regulátor na desce Arduino převede vstup 7,4 V na 5 V a budou z něj napájeny ATmega IC a MPU6050. Stejnosměrné motory mohou běžet od napětí 5V do 12V. Budeme však připojovat kladný vodič 7,4 V z baterie na vstupní svorku 12V modulu ovladače motoru. Díky tomu budou motory pracovat s napětím 7,4 V. Následující tabulka uvádí, jak je modul ovladače motoru MPU6050 a L298N připojen k Arduinu.
Pin součásti |
Pin Arduino |
MPU6050 |
|
Vcc |
+ 5V |
Přízemní |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
D2 |
L298N |
|
V 1 |
D6 |
IN2 |
D9 |
IN3 |
D10 |
IN4 |
D11 |
MPU6050 komunikuje s Arduino přes I2C rozhraní, takže používáme SPI piny A4 a A5 od Arduina. Stejnosměrné motory jsou připojeny k pinům PWM D6, D9 D10 a D11. Musíme je připojit k pinům PWM, protože budeme řídit rychlost stejnosměrného motoru změnou pracovního cyklu signálů PWM. Pokud nejste obeznámeni s těmito dvěma součástmi, doporučujeme vám přečíst si návod MPU6050 Interfacing a L298N Motor driver.
Self Balancing Robot Code
Nyní musíme naprogramovat naši desku Arduino UNO tak, aby vyvážila robota. Tady se děje veškerá magie; koncept za tím je jednoduchý. Musíme zkontrolovat, zda se bot naklání dopředu nebo dozadu pomocí MPU6050, a pokud se naklání dopředu, musíme otáčet koly dopředu a pokud se naklání dozadu, musíme otáčet koly v opačném směru.
Současně musíme také řídit rychlost otáčení kol, pokud je bot ze střední polohy mírně dezorientovaný, kola se otáčejí pomalu a rychlost se zvyšuje, jak se dostává více od středové polohy. K dosažení této logiky používáme algoritmus PID, který má středovou polohu jako nastavenou hodnotu a úroveň dezorientace jako výstup.
Ke zjištění aktuální polohy robota používáme MPU6050, což je kombinovaný 6osý akcelerometr a gyroskopický senzor. Abychom ze senzoru získali spolehlivou hodnotu polohy, musíme použít hodnotu akcelerometru i gyroskopu, protože hodnoty z akcelerometru mají problémy se šumem a hodnoty z gyroskopu mají tendenci se časem driftovat. Musíme tedy kombinovat obojí a získat hodnotu vybočení a náklonu robota, z nichž použijeme pouze hodnotu vybočení.
Zní to trochu navíjení hlavy, že? Ale nebojte se, díky komunitě Arduino máme snadno dostupné knihovny, které mohou provádět výpočet PID a také získat hodnotu vybočení z MPU6050. Knihovnu vyvinuli br3ttb a jrowberg. Než budete pokračovat, stáhněte si jejich knihovny z následujícího odkazu a přidejte je do svého adresáře lib Arduino.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Nyní máme knihovny přidané do našeho Arduino IDE. Začněme programovat našeho Vyvažovacího robota. Jako vždy je kompletní kód pro vyvažovací robot MPU6050 uveden na konci této stránky, zde jen vysvětluji nejdůležitější úryvky v kódu. Jak již bylo řečeno, kód je postaven na příkladu ukázkového kódu MPU6050, jen optimalizujeme kód pro náš účel a přidáme PID a řídicí techniku pro našeho samovyvažovacího robota.
Nejprve zahrneme knihovny, které jsou nutné pro fungování tohoto programu. Zahrnují vestavěnou knihovnu I2C, knihovnu PID a knihovnu MPU6050, kterou jsme si právě stáhli.
#include "I2Cdev.h" #include
Poté deklarujeme proměnné, které jsou potřebné k získání dat ze snímače MPU6050. Čteme jak gravitační vektor, tak hodnoty čtveřice a poté vypočítáme hodnotu rozteče a natočení robota. YPR float pole bude mít konečný výsledek.
// MPU control / status vars bool dmpReady = false; // nastavit true, pokud byl DMP init úspěšný uint8_t mpuIntStatus; // obsahuje aktuální stavový bajt přerušení z MPU uint8_t devStatus; // návratový stav po každé operaci zařízení (0 = úspěch ,! 0 = chyba) uint16_t packetSize; // očekávaná velikost paketu DMP (výchozí je 42 bytů) uint16_t fifoCount; // počet všech bytů aktuálně ve FIFO uint8_t fifoBuffer; // FIFO storage buffer // orientace / pohyb vars Quaternion q; // čtveřice kontejneru VectorFloat gravitace; // gravitační vektorový float ypr; // kontejner stáčení / stoupání / otáčení a vektor gravitace
Dále přichází velmi důležitý segment kódu, a to je místo, kde budete trávit dlouhou dobu laděním správné sady hodnot. Pokud je váš robot postaven s velmi dobrým těžištěm a komponenty jsou symetricky uspořádány (což ve většině případů není), bude hodnota vaší nastavené hodnoty 180. Jinak připojte robota k sériovému monitoru Arduino a nakloňte jej do najdete dobrou polohu vyvážení, přečtěte si hodnotu zobrazenou na sériovém monitoru a toto je vaše nastavená hodnota. Hodnota Kp, Kd a Ki musí být vyladěna podle vašeho robota. Žádní dva stejní roboti nebudou mít stejné hodnoty Kp, Kd a Ki, takže z nich nelze uniknout. Podívejte se na video na konci této stránky, abyste získali představu o tom, jak tyto hodnoty upravit.
/ ********* Nalaďte si tyto 4 hodnoty pro svůj BOT ********* / dvojitá požadovaná hodnota = 176; // nastaví hodnotu, když je robot kolmý na zem pomocí sériového monitoru. // Přečtěte si projektovou dokumentaci na circuitdigest.com, kde se dozvíte, jak nastavit tyto hodnoty double Kp = 21; // Nastavit tento první dvojitý Kd = 0,8; // Nastavit tento dvojitý secound Ki = 140; // Nakonec nastavíme toto / ****** Konec nastavení hodnot ********* /
V dalším řádku inicializujeme PID algoritmus předáním vstupních proměnných vstup, výstup, žádaná hodnota, Kp, Ki a Kd. Z toho jsme již nastavili hodnoty žádané hodnoty Kp, Ki a Kd ve výše uvedeném fragmentu kódu. Hodnota vstupu bude aktuální hodnota vybočení, která je čtena ze snímače MPU6050, a hodnota výstupu bude hodnota vypočítaná algoritmem PID. Takže v zásadě nám PID algoritmus dá výstupní hodnotu, která by měla být použita k opravě vstupní hodnoty tak, aby byla blízko nastavené hodnotě.
PID pid (& vstup, & výstup, & požadovaná hodnota, Kp, Ki, Kd, DIRECT);
Uvnitř funkce nastavení prázdnoty inicializujeme MPU6050 konfigurací DMP (Digital Motion Processor). To nám pomůže při kombinaci dat akcelerometru s daty gyroskopu a poskytne spolehlivou hodnotu vybočení, rozteče a náklonu. Nebudeme se tím moc zabývat, protože to bude daleko za rámec tématu. Každopádně jeden segment kódu, který musíte vyhledat ve funkci nastavení, jsou hodnoty offsetu gyra. Každý snímač MPU6050 má své vlastní hodnoty posunů, které můžete použít v tomto náčrtu Arduino k výpočtu hodnoty posunu vašeho snímače a odpovídajícím způsobem aktualizovat následující řádky ve vašem programu.
// zde zadejte své vlastní gyroskopické posuny, měřítko pro minimální citlivost mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Musíme také inicializovat piny Digital PWM, které používáme k připojení našich motorů. V našem případě jsou to D6, D9, D10 a D11. Inicializujeme tedy tyto piny, protože výstupní piny je standardně nastavují na LOW.
// Inicializujte motor outpu čepy pinMode (6, výstup); pinMode (9, VÝSTUP); pinMode (10, VÝSTUP); pinMode (11, VÝSTUP); // Standardně vypněte oba motory analogWrite (6, LOW); analogWrite (9, LOW); analogWrite (10, LOW); analogWrite (11, LOW);
Uvnitř funkce hlavní smyčky kontrolujeme, zda jsou data z MPU6050 připravena ke čtení. Pokud ano, použijeme jej k výpočtu hodnoty PID a následnému zobrazení vstupní a výstupní hodnoty PID na sériovém monitoru, abychom zkontrolovali, jak PID reaguje. Poté na základě hodnoty výstupu rozhodneme, zda se robot musí pohybovat dopředu nebo dozadu nebo stát na místě.
Protože předpokládáme, že MPU6050 vrátí 180, když je robot ve vzpřímené poloze. Korekční hodnoty dostaneme kladné, když robot klesá směrem dopředu, a dostaneme záporné hodnoty, pokud robot klesá směrem dozadu. Zkontrolujeme tedy tuto podmínku a zavoláme příslušné funkce pro přesun robota dopředu nebo dozadu.
while (! mpuInterrupt && fifoCount <packetSize) { // žádná data mpu - provádění výpočtů PID a výstup do motorů pid.Compute (); // Vytiskněte hodnotu vstupu a výstupu na sériovém monitoru a zkontrolujte, jak to funguje. Serial.print (vstup); Serial.print ("=>"); Serial.println (výstup); if (vstup> 150 && vstup <200) {// Pokud Bot padá if (output> 0) // Padá dopředu Forward (); // Otočit kola vpřed jinak if (výstup <0) // Padající směrem dozadu Reverse (); // Otočit kola dozadu } else // Pokud Bot neklesá Stop (); // Držte kola stále }
Výstupní proměnná PID také rozhodne, jak rychle se má motor otáčet. Pokud je robot právě na spadnutí, provedeme malou korekci pomalým otáčením kola. Pokud tyto drobné korekce fungují a stále, když bot padá dolů, zvyšujeme rychlost motoru. O hodnotě rychlosti otáčení kol rozhodne algoritmus PI. Všimněte si, že pro funkci Reverse jsme vynásobili hodnotu výstupu -1, abychom mohli převést zápornou hodnotu na kladnou.
void Forward () // Kód pro otočení kolečka dopředu { analogWrite (6, výstup); analogWrite (9,0); analogWrite (10, výstup); analogWrite (11,0); Serial.print ("F"); // Informace o ladění } void Reverse () // Kód pro otočení kola Zpět { analogWrite (6,0); analogWrite (9, výstup * -1); analogWrite (10,0); analogWrite (11, výstup * -1); Serial.print ("R"); } void Stop () // Kód pro zastavení obou kol { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Serial.print ("S"); }
Práce se samovyvažovacím robotem Arduino
Jakmile budete připraveni na hardware, můžete kód nahrát na svoji desku Arduino. Ujistěte se, že připojení je správné, protože používáme lithium-iontovou baterii, je nutná extrémní opatrnost. Zkontrolujte tedy, zda nedošlo ke zkratu, a zajistěte, aby se terminály nedostaly do kontaktu, i když váš robot zažije nějaké malé nárazy. Zapněte modul a otevřete sériový monitor, pokud vaše Arduino dokáže úspěšně komunikovat s MPU6050 a pokud vše funguje podle očekávání, měla by se zobrazit následující obrazovka.
Zde vidíme vstupní a výstupní hodnoty PID algoritmu ve formátu vstup => výstup . Pokud je robot dokonale vyvážený, bude hodnota výstupu 0. Vstupní hodnota je aktuální hodnota ze snímače MPU6050. Abeceda „F“ znamená, že se robot pohybuje vpřed a „R“ znamená, že se robot pohybuje vzad.
Během počátečních fází PID doporučuji nechat váš kabel Arduino připojený k robotu, abyste mohli snadno sledovat hodnoty vstupu a výstupu a také bude snadné opravit a nahrát váš program na hodnoty Kp, Ki a Kd. Video níže ukazuje kompletní pracovní bota a také ukazuje, jak opravit své PID hodnoty.
Doufám, že to pomůže vybudovat si vlastního vyvažovacího robota, pokud máte nějaký problém s jeho uvedením do provozu, pak nechte své dotazy v sekci komentářů níže nebo použijte fóra pro další technické otázky. Pokud chcete více zábavy, můžete použít stejnou logiku také k postavení robota pro vyvažování koulí.