V této části kurzu Arduino se podíváme na ovládání malých motorů. Ukážu vám, jak je připojit k mikrokontroléru a ovládat směr jejich otáčení a rychlost.
Tomuto tématu jsem věnoval samostatný článek, protože nesprávné zapojení tohoto zdánlivě jednoduchého prvku často poškodí Arduino.
Objednejte si sadu prvků a začněte se učit v praxi! Kliknutím sem přejdete do obchodu >>
Než se pustíme do různých aspektů práce s malými stejnosměrnými motory, musíte si osvojit dvě nejdůležitější pravidla: Za prvé – nikdy nepřipojujte motor přímo k Arduino. Za druhé – je lepší nic nezapojovat, dokud si nepřečtete následující informace!
V opačném případě se můžete připravit na koupi druhého Arduino!
Proč bychom měli k Arduino připojovat motory?
Řízením směru otáčení a otáček motoru se nabízí mnoho možností. Díky těmto novým dovednostem můžeme například sestrojit jednoduchého mobilního robota, který dokáže jezdit po domě a vyhýbat se překážkám. Stejně snadno můžeme vytvořit vozidlo, které se ovládá na dálku pomocí telefonu – možnosti jsou skutečně neomezené.
Které motory budeme konkrétně zkoumat?
V tomto článku se budeme zabývat principem řízení nejoblíbenějších stejnosměrných kartáčových motorů. Nejčastěji je používají kutilové k napájení svých staveb. Takové mechaniky lze poměrně snadno koupit nebo demontovat ze starých hraček.
Ještě je třeba definovat, co jsou to malé stejnosměrné motory. Nejde samozřejmě o jejich velikost, ale o jejich energetické nároky. Pro účely tohoto článku jsem předpokládal, že budu hovořit o motorech, které při napájení 5-9 V odebírají v průměru méně než 1 A. Tyto limity jsou do jisté míry určeny použitým regulátorem motoru, ale o tom až později.
Princip řízení motoru je univerzální. To znamená, že můžeme řídit větší motor, pokud zvolíme odpovídajícím způsobem výkonnější řídicí jednotku.
V této části se nebudeme zabývat servopohony, protože ty již byly probrány dříve. Nezapomeňte, že v nich je umístěn regulátor, který chrání Arduino před poškozením, takže principy popsané v tomto článku nejsou pro serva relevantní.
Proč nemůžeme připojit motor k Arduino?
Arduino, přesněji řečeno mikrokontrolér na desce, je určen k řízení signálů. Výstup každého výstupního vedení je poměrně malý, lze předpokládat asi 20 mA. Lze předpokládat, že 99,999 % motorů, se kterými se setkáte, vyžaduje podstatně vyšší výkon. Přesněji řečeno, řádově může jít o stokrát až tisíckrát větší hodnoty.
Průchod tak velkého proudu nepřizpůsobeným systémem způsobí okamžité a nevratné poškození!
Proč nejsou součástí naší sady žádné motory?
Stejně jako u všeho, co začíná řízením motorů, jsou důležité praktické zkoušky. Jak vidíte, naše sady obsahují Arduino, baterii, řídicí jednotku motoru (čip L293D), kondenzátory, ale něco chybí….. Není zde žádný motor (kromě serva).
Sada rozumných univerzálních motorů stojí nejméně 15 eur!
A proč? Vložení motorů do sady by bylo plýtváním penězi. Teprve se učíte, ještě nevíte, jaké projekty budete později stavět, a bez znalosti této skutečnosti není možné vybrat správné motory. Proč tedy investovat do zařízení, které nikdy nevyužijete?
V tomto díle motor nahradíme LED diodami. Budete moci pozorovat, jak se mění směr otáčení (která dioda se rozsvítí) a jak se mění jeho rychlost (jas diod). Pro lepší názornost jsem do cvičení zařadil také videa se zapojeným motorem.
Hotové sady pro kurzy Forbot
U našich prodejců si nyní můžete zakoupit sadu více než 70 elementů potřebných pro cvičení v kurzu!
Populární sada: Arduino Master – Robotics Master
Kombinované H-mosty - krátce a jednoduše
Mezi Arduinem a motory jsou nutné prostřední komponenty. Obvykle se označují jako H-mosty nebo anglicky h-bridges. Takové řídicí jednotky si můžete postavit sami s několika tranzistory nebo použít kombinovaný H-můstek (tj. obvod, který je můstkem). Jako začátečníci můžete začít s hotovými obvody.
Pro velmi vysoké proudy je nutná samotná konstrukce H-můstku. To je však obtížný úkol. Na začátku se tím nemusíte zabývat.
Hlavním úkolem H-mostů je takříkajíc číst signály dodávané mikrokontroléry a převádět je na proměnné vhodné pro řízení motorů. Například Arduino, jehož signálové linky mohou po použití H-můstku pracovat s maximálním napětím 5 V a proudem 20 mA, může snadno ovládat motor, který ke své činnosti vyžaduje 12 V a proud 1 A.
Váš první H-můstek
V tomto kurzu se budeme zabývat poměrně starým, ale levným a stále oblíbeným čipem L293D. Jeho hlavní výhodou v našem případě je, že se tento můstek dodává v průchozím krytu (THT) a můžeme jej instalovat do kontaktní desky: Důležité je, že v jednom obvodu najdeme dva můstky, takže je ideální pro ovládání pohonů robotů (levá/pravá strana) atd.
Tento obvod má 16 zapojení, jejichž popis najdete v datovém listu . Níže je uvedena nejdůležitější část. Doporučuji vám však, abyste se na celý dokument podívali. Vyplatí se zvyknout si číst pokyny.
Katalogový list – dokument poskytovaný výrobcem, ve kterém lze nalézt veškeré informace o konkrétním obvodu.
Jednou z nejdůležitějších informací, kterou je třeba u každého H-můstku ověřit, je jeho výkon. Konkrétně jde o to, jaký proud může připojený motor absorbovat. Pokud použijeme L293D, může být průměrný proud na kanál 0,6 A a maximální 1,2 A. Co to znamená?
V optimálním případě by naše motory měly během provozu odebírat maximálně 0,6 A, ale pokud proud na chvíli vzroste na 1,2 A, nic se nestane. Za předpokladu, že to trvá jen krátce!
Nezapomeňte, že motor běžící pod zátěží odebírá mnohem větší proud, než když běží volně! Vždy zkontrolujte maximální proud, který může motor odebírat!
Nejprve se budu věnovat všem těmto bodům. Dalším krokem je připojení obvodu ke kontaktní desce a jeho naprogramování. Nejprve vývody pro napájení:
- 4, 5, 12, 13 – jsou připojeny k zemi (GND)
- 16 – Napájení Vcc logické části (5V)
- 8 – Napájení motorů Vc (až 36 V)
Obvod může být napájen ze dvou samostatných zdrojů. Jeden pro logickou část a druhý pro motory.
Je však nutné propojit uzemnění obou zdrojů (baterií)!
Je třeba mít na paměti, že každý můstek má úbytek napětí. To znamená, že například při připojení 9 V k napájení motorů v L293D teče maximálně 7 V. Tento obvod je poměrně starý, a proto má velký úbytek napětí, novější (např. TB6612) mají úbytek nižší.
Vývody pro řídicí jednotku motoru:
- 2, 7 – Vstupy pro určení směru otáčení prvního motoru
- 10, 15 – Vstupy pro určení směru otáčení druhého motoru
- 1 – vstup ENABLE pro určení otáček prvního motoru
- 9 – Vstup ENABLE pro určení otáček druhého motoru
Pro zastavení motoru nebo změnu směru otáčení je třeba nastavit signály podle následujícího seznamu, tzv. pravdivostní tabulky:
Jak vidíte, existují dvě kombinace, při kterých se motor zastaví. Některé řídicí jednotky provádějí protiproudé brzdění, pokud je 1 zadána dvakrát. To může mít někdy škodlivý vliv na celý systém, ale způsobí okamžité zastavení motoru.
Zadání dvou nízkých stavů obvykle vede k volnému zastavení (dokud motor neztratí hybnost). Informace o tom naleznete v technických údajích mostu.
Piny pro motory:
- 3, 6 – Výstupy na první motor
11, 14 – Výstupy na druhý motor
Použití H-můstku v praxi
Je toho hodně, ale vše bude jasné za chvíli! Za prvé napájení, nevím proč, ale začátečníkům způsobuje spoustu problémů. Princip je však jednoduchý – obvod může pracovat s jedním nebo dvěma napětími.
Pokud zvolíte první možnost, budou logická část i motory napájeny ze stejného zdroje – tuto konfiguraci důrazně nedoporučuji. Zejména pokud chcete motory napájet napětím 5 V, které je k dispozici na desce Arduino. To je možné, ale vyžaduje to odpovídající účinný zdroj energie a dobrou filtraci.
Napájení motorů a Arduina ze stejného zdroje může vést k přerušení programu a častým resetům.
Nejlepší je však obě napájení oddělit, např. motory napájet přímo z baterie a mikrokontrolér napájet přes stabilizátor a vhodné kondenzátory.
Proto je rozhodně bezpečnější zvolit druhé řešení, kdy je Arduino dodáváno ze samostatného zdroje. V našem případě použijeme k přímému napájení motorů USB a 9V baterii (Arduino lze napájet i z tohoto zdroje, ale přes vestavěný stabilizátor, takže se nemusíme příliš obávat rušení).
Pozor!
Tento kurz je zaměřen na učení a předvádění určitých mechanismů. 9V baterie má příliš nízkou proudovou kapacitu pro provoz robota. Akumulátory LiPo jsou zde rozhodně vhodnější.
Obvod by měl vypadat jako níže uvedený. Všimněte si, že jsme na desku přivedli 9 V, nikoli 5 V! Dbejte na to, abyste nic nepoškodili!
Připojte „motor“ v místě, kde vycházejí oranžově zbarvené kabely. Než však něco zapojíte, přečtěte si zbytek článku!
Nezapomeňte na kondenzátory na kontaktní desce. Filtrují napětí dodávané přímo z baterie. Snižují možnost rušení Arduino!
Obvod je poměrně složitý. Za prvé, má smysl připojit uzemnění můstku L293D. To lze provést pomocí vypínacích nožiček rezistorů. Tím se ušetří místo:
A pak jeden po druhém:
Nyní je čas připojit motor (nejprve jeden). Jak jsem se zmínil v kurzu, budeme motory simulovat, abychom je nemuseli zbytečně kupovat. Jak to uděláme? Velmi jednoduše.
Simulace motoru
Jak víte, světelná dioda je polovodičový prvek, který se rozsvítí, když jím protéká proud správným směrem. Pokud tedy zapojíme dvě diody paralelně tak, aby byly zapojeny v opačných směrech, můžeme zkontrolovat, „kterým směrem“ proud teče – jedna dioda svítí a druhá svítí. Když se dioda rozsvítí, můžeme opět zkontrolovat otáčky motoru.
Místo motoru zapojíme následující obvod (rezistor 1k):
A celá věc:
Arduino - jednoduché ovládání motoru
Je čas na první program, ve kterém použijeme výše uvedený poměrně složitý obvod. Začneme řízením směru otáčení motoru. Kontrolu rychlosti si necháme na později. Jak již bylo zmíněno, za jeden z motorů jsou v současné době zodpovědné následující piny Arduino:
- 6 (PWM) – regulace otáček
- 7, 8 – Ovládání směru otáčení
Všimněte si, že se zde odkazuje na čísla pinů Arduino, nikoli na zapojení můstku L293D!
Pokud nechceme řídit otáčky motorů, musíme na pinu 6 (PWM) nastavit vysoký stav. Kabel bychom také mohli připojit přímo k 5V. Protože je však připojení již hotové, použijeme připojení Arduina:
void setup() {
pinMode(6, OUTPUT); //PWM signál motoru č. 1
digitalWrite(6, HIGH); //Nastavíme (trvale) vysoký stav na pinu 6
pinMode(7, OUTPUT); //Signály řídící směr otáčení motoru č. 1
pinMode(8, OUTPUT);
}
void loop() {
//Zde bude zbytek programu
}
Pokud byl obvod správně zapojen, nemělo by se po nahrání následujícího programu nic stát…. nic by se nemělo stát! Nyní je čas vložit do smyčky chybějící článek. Předpokládejme, že chceme otáčet motorem 3 sekundy jedním směrem a 3 sekundy druhým směrem (maximální rychlost). K tomu je třeba přidat jednoduchý programovací prvek:
void setup() {
pinMode(6, OUTPUT); //PWM signál motoru č. 1
digitalWrite(6, HIGH); //Nastavíme (trvale) vysoký stav na pinu 6
pinMode(7, OUTPUT); //Signály řídící směr otáčení motoru č. 1
pinMode(8, OUTPUT);
}
void loop() {
digitalWrite(7, LOW); //Motor č. 1 - otáčení doleva
digitalWrite(8, HIGH);
delay(3000);
digitalWrite(7, HIGH); //Motor č. 1 - otáčení doprava
digitalWrite(8, LOW);
delay(3000);
}
Podle dříve uvedené pravdivostní tabulky víme, že motor se otáčí, když jeden ze vstupů nabude nízkého stavu „0“ a druhý vysokého stavu „1“. Směr otáčení však závisí na tom, na který vstup je přiveden jaký signál.
Jakmile se program nahraje do Arduino, měly by začít blikat obě LED diody. Podívejte se však pozorně a pochopte, proč se tak děje. Nejedná se o stejné diodové blikání jako v prvních částech kurzu. Diody svítí střídavě, protože proud teče jednou z výstupu 1 do výstupu 2 a jednou opačným směrem. Blikání je možné, protože diody jsou vloženy obráceně. Pro lepší pochopení se podívejte na obrázky níže, kde jsem místo diod použil také voltmetr:
Jednou je výsledek pozitivní a jednou negativní. V tomto případě nám označení minus ukazuje, že proud teče opačným směrem než na začátku.
Nyní je čas na experiment, který budu provádět pouze já, a to připojení motoru. Použiji malý motor vybavený stejnosměrnou převodovkou a červeným kolečkem (aby bylo otáčení lépe viditelné).
Pokud máte malý motor a chcete ho připojit k obvodu, jako to dělám já, pak se ujistěte, že odebírá dostatečně malý proud (<1A) a může být provozován při napětí kolem 6-9V.
Nyní, když můžeme ovládat směr otáčení motoru, je čas na rychlost. Předem zkontrolujte, co se stane, když odpojíte kabel na pinu 6 Arduino a připojíte jej k zemi, zatímco běží výše uvedený program.
Motor se přestal otáčet (kontrolky LED přestaly svítit). To znamená, že pokud na tento vstup velmi rychle přivedeme 0 nebo 1, můžeme řídit rychlost motoru (jas LED diod). Vzpomínáte si, ve které části kurzu se toto přirovnání již objevilo?
Domácí úkol 8.1
Přidejte do obvodu další dvě diody, abyste simulovali druhý motor. Napište program, který provede následující sekvence: obě dopředu, obě opačným směrem, obě dozadu a tak dále dokola. Samozřejmě dodržujte interval např. 2 sekundy.
Verze PWM - řídíme rychlost
Pro další testy budete potřebovat znalosti z článku PWM a Arduino. Jak jste možná uhodli, k řízení otáček motoru stačí přivést PWM signál na pin ENABLE1 (čipu L293D)!
Zde už není co vysvětlovat. Je čas napsat jednoduchý program, který střídavě otáčí motory pomaleji nebo rychleji. Nezapomeňte, že dioda se rozsvítí pouze nad určitým prahem naplnění signálu PWM, a stejně tak tomu bude i u motorů. Každý se otáčí z trochu jiné hodnoty. K tomu se vrátíme později.
void setup() {
pinMode(6, OUTPUT); //PWM signál motoru č. 1
pinMode(7, OUTPUT); //Signály řídící směr otáčení motoru č. 1
pinMode(8, OUTPUT);
}
void loop() {
analogWrite(6, 100); //Malá rychlost otáček
digitalWrite(7, LOW); //Motor č.1 - otáčení doleva
digitalWrite(8, HIGH);
delay(3000); //Počkej 3 sekundy
analogWrite(6, 255); //Maximální rychlost otáček
digitalWrite(7, LOW); //Motor č.1 - otáčení doprava
digitalWrite(8, HIGH);
delay(3000); //Počkej 3 sekundy
}
Měli byste si všimnout, že dioda výrazně mění svůj jas! Nyní je čas plynule měnit rychlost motoru, ale než se k tomu dostaneme, je čas na malou prozatímní poznámku…..
Smyčka For v Arduino
Je čas probrat nesmírně užitečnou smyčku dostupnou v jazyce Arduino (a mnoha dalších). Mám na mysli smyčku FOR, která nám umožňuje provádět určité příkazy určitý početkrát.
Použijeme je, pokud chceme například zapsat 10 po sobě jdoucích přirozených čísel, nechat diodu pětkrát bliknout a podobně. Než však budeme pokračovat v příkladu, je třeba představit strukturu :
for (proměnná čítače; ukončovací podmínka; operace s čítačem) {
//Fragment, který má být proveden několikrát
}
Vypadá to zmateně, ale naštěstí je to velmi jednoduché. Za klíčovým slovem for otevřeme závorku a zadáme do ní tři velmi důležité věci. První z nich je proměnná čítače. Protože obsah smyčky má být proveden určitý početkrát, musí program odněkud vědět, kolik průchodů smyčkou již bylo provedeno.
Dále zadáme podmínku za středníkem. Smyčka se provádí tak dlouho, dokud je splněna podmínka. Za dalším středníkem musíme zadat operaci, která se má v každém cyklu aplikovat na proměnnou čítače. Nakonec uzavíráme kulatou závorku.
Smyčka for v praxi
Použijme smyčku for pro zápis pozdravu přes UART, například: 25krát.
void setup() {
Serial.begin(9600); //Start komunikace
for (int i = 0; i < 25; i++) { //Proveďte 25krát
Serial.println("Vítejte na Forbot.com"); //Vypiš text na nový řádek
delay(200); //Počkej chvíli
}
}
void loop() {
}
Efekt je vidět na terminálu:
Přesně to jsme očekávali. Za chvíli vysvětlím, co znamená následující položka:
for (int i = 0; i < 25; i++) { //Proveď 25krát
Počítací proměnná, zde přišel na řadu jednoduchý zápis int i = 0 , doufám, že ho chápete. Stručně řečeno, deklarujeme novou lokální proměnnou i, která je typu int, a její počáteční hodnota je 0. Pokud máte problémy s pochopením této části, vraťte se zpět k článku o proměnných.
V tomto případě je podmínkou smyčky zapsat i < 25, tj. smyčka se provádí tak dlouho, dokud je hodnota proměnné i menší než 25.
Poslední prvek, i++, je inkrementace počítací proměnné (tj. hodnota proměnné se v každém cyklu zvýší o jedničku). Pokud chcete, můžete tento zápis stejně dobře nahradit zápisem i = i + 1.
Pro lepší pochopení stavu můžete program spustit v upravené verzi:
void setup() {
Serial.begin(9600); //Start komunikace
for (int i = 0; i < 25; i++) { //Proveďte 25krát
Serial.print("Hodnota proměnné i: ");
Serial.print(i); //Zobrazte hodnotu čítače
Serial.print("\n"); //Přesun na nový řádek
delay(200); //Počkej chvíli
}
}
void loop() {
}
Nyní je snadné rozpoznat, jakých hodnot nabývá proměnná čítače (0-24). Smyčka se samozřejmě provede také 25krát, pokud místo:
for (int i = 0; i < 25; i++) { //Proveď 25krát
je napsáno:
for (int i = 0; i <= 24; i++) { //Proveď 25krát
nebo:
for (int i = 1; i <= 25; i++) { //Proveď 25krát
nebo:
for (int i = 1; i < 26; i++) { //Proveď 25krát
nebo:
for (int i = 0; i < 50; i = i + 2) { //Proveď 25krát
nebo také:
for (int i = 25; i > 0; i--) { //Proveď 25krát
Jak vidíte, možností je mnoho! Nejčastěji se samozřejmě používá první z nich. Přesto stojí za to si tyto zvláštní podmínky nacvičit, protože někdy mohou věci značně usnadnit! Nyní se můžeme věnovat motorům, zejména plynulé regulaci otáček.
Domácí úkol 8.2
Napište program, který pomocí smyčky for nechá LED diodu pětkrát bliknout. Zkuste také napsat totéž pomocí cyklu while.
Domácí úkol 8.3
Napište program, který přečte číslo zaslané přes UART v rozsahu 0-9 a poté zobrazí stejný počet hvězdiček * na obrazovce.
Plynulá akcelerace motoru
Nyní, když známe smyčku for, můžeme ji použít k jemnému zrychlení motoru. Stačí jen rovnoměrně měnit úroveň PWM signálu, například každých 25 ms.
Kód je jednoduchý a vypadá následovně, protože proměnná čítače i je zodpovědná za úroveň naplnění signálu PWM:
void setup() {
pinMode(6, OUTPUT); //PWM signál motoru č. 1
pinMode(7, OUTPUT); //Signály řídící směr otáčení motoru č. 1
pinMode(8, OUTPUT);
digitalWrite(7, LOW); //Motor č.1 - otáčení doleva
digitalWrite(8, HIGH);
}
void loop() {
for (int i = 0; i <= 255; i++) {
analogWrite(6, i); //Klidné zrychlování motoru
delay(25);
}
}
Je třeba mít na paměti, že motor se poměrně obtížně startuje. Nejprve se musí roztočit a překonat tření uvnitř. Než se začne otáčet, vydává také skřípavý zvuk. To si můžete poslechnout v následujícím videu:
Tuto skutečnost je třeba mít na paměti. Začátečníci mají často problémy, protože jejich robot nechce jezdit. Obvykle se ukáže, že buď je použité napájení příliš slabé, nebo je signál PWM stále příliš nízký.
Domácí úkol 8.4
Napište program, který pomocí 2 smyček for rovnoměrně zrychluje a zpomaluje motor.
Shrnutí
Tímto končí kapitola o řízení stejnosměrných motorů, která měla být původně poměrně krátká. Je toho však trochu víc, ale chtěl jsem vám poskytnout více informací, abyste neměli problémy s použitím motorů ve svých vlastních konstrukcích. Vzhledem k absenci motoru byla tato část pro vás trochu teoretická. K těmto tématům se však podle potřeby vrátíme v pokračování kurzu s příslušnými drivery!
Objednejte si sadu prvků a začněte se učit v praxi! Kliknutím sem přejdete do obchodu >>
V další části kurzu se budeme věnovat použití ultrazvukového snímače vzdálenosti a psaní vlastních funkcí (s argumenty i bez nich). Díky tomu budou naše programy vypadat ještě lépe!