MENU 

BONUS 2
Ovládání DC motorů

Když už jsme se rozhodli svou experimentální sadu Arduino MAXI Starter kit doplnit o sonarové čidlo (viz předchozí kapitola), měli bychom zvážit, zda bychom neměli sadu nadále rozšiřovat i o další komponenty. Má-li být sada Arduino MAXI Starter kit určitým odrazovým můstek pro ovládnutí modulu Arduino, bylo by jistě škoda se omezovat jen na její základní zapojení!

Úvod

Když vidíme schopnosti modulu Arduino, jistě nás časem napadne myšlenka vyrobit nějakého robota nebo do určité míry autonomní vozítko. Proč ne? Ale pro pohyb musíme zvládnout řízení motorů. Tak se pojďme na to podívat!

Vcelku zajímavým doplňkem modulu Arduino jsou různé modelářské motory na stejnosměrný proud. K dostání jich je sice mnoho, ale pro naše hrátky by byl asi nejlepší modul stejnosměrného motoru s převodovkou a s výstupní osou pro nasazení gumového kola. Někdy se to celé prodává jako komplet kola a motoru, jindy je to třeba koupit každé zvlášť. Cenově se pohybujeme v rozmezí asi 50–100 Kč (dle prodejce) za sadu kola a motoru. Pokud chceme vyrobit vozítko, budeme potřebovat minimálně dvojici motoru a kol.

DC motor a gumové kolo

V tomto textu si chceme jen ukázat princip ovládání stejnosměrných motorů, takže nám bude stačit dvojice motorů (koneckonců možná i bez kol). Kdybychom se ale skutečně rozhodli postavit si nějaké to robotické vozítko, asi by bylo dobré se již zamyslet nad případným nákupem již hotového podvozku osazeného motory. Pro modul Arduino jich rovněž existuje hned několik, pochopitelně v různých stupních vybavenosti, a tedy i ceny. Mezi takové dva základní a mezi začátečníky oblíbené patří dva následující (viz následující obrázek).

podvozky pro Arduino

První má tvar klasického autíčka, je osazen čtveřicí motorů a na svém plexisklovém těle má připravené otvoru pro montáž jak modulu Arduino, tak dalších možných modulů. Druhý je jednodušší. Jeho tvar je kruhový, poháněn je pomocí dvojice motorů, další dvě kola jsou řešena všesměrovými koly – buď jako odvalující se koule, nebo otočně jako jsou kola nákupního vozíku.

Ale vraťme se zpět k připojení stejnosměrného motoru k modulu Arduino! Námi použitý stejnosměrný motor s převodovkou a výstupní hřídelí pro gumové kolo pracuje v napěťovém rozsahu 3–6 V. Pochopitelně při nižším napětí má i menší výkon. Jeho spotřeba (při napájení 6 V) je dána zatížením, ale i tak lze počítat s tím, že se průměrně pohybuje někde pod hranicí asi 200 mA. Pokud si ještě pamatujeme, jaké je maximální zatížení výstupů modulu Arduino (max. 40 mA, ale raději 20 mA), je jasné, že motor nemůžeme jen tak k modulu Arduino připojit! Pro připojení stejnosměrných motorů k řídícím prvkům se tedy používají tzv. drivery (řadiče), které nejen řeší samotné řízení motorů, ale zároveň slouží jako napájecí silové prvky. Stejnou situaci jsme viděli i v případě krokového motoru, kterým jsme se zabývali v lekci Krokový motor.

K modulu Arduino existuje celá řada možných řadičů stejnosměrných motorů. Některé jsou řešeny jako samostatné moduly, jiné mají podobu rozšiřujícího shieldu, který se zasouvá do konektorů přímo na modul Arduino. Pro naše počáteční hrátky využijeme něco jednoduššího a levnějšího. Zapátráme-li po internetu, zjistíme, že jako levné a přesto spolehlivé řadiče stejnosměrných motorů se často používají moduly osazené výkonovým obvodem L298N. Často tyto moduly ve svém názvu přímo přejímají označení tohoto integrovaného obvodu, který dokáže ovládat rychlost a směr až dvou stejnosměrných motorů. Proud, který lze takovým řídicím modulem regulovat na jeden motor může dosahovat hodnoty až 2 A (!), což je pro naše účely více jak „luxusní“. Cenově se modul (opět dle prodejce) pohybuje kolem 60 Kč. Takže nákup dvojice motorů s převodovkou, příslušná gumová kola a řadič L298N se dá vyřešit kolem dvou set korun. To sice není úplně málo, ale uvážíme-li, kolik nám to udělá radosti… 😊

Modul řadiče DC motorů s obvodem L298N je zpravidla osazen třemi šroubovacími svorkovnicemi, které slouží pro připojení silových vodičů. Postranní svorkovnice (OUT1OUT4) slouží pro připojení dvojice motorů. Trojitá svorkovnice (12V, GND, +5V) na přední straně slouží pro připojení napájení jak pro motory, tak pro logiku samotného řídicího modulu.

řadic DC motorů s modulem L298N

Obvod L298N je tzv. dvoukanálový H-můstek, což znamená, že pro každý motor obsahuje čtyři spínače, mezi které je motor zapojen. Názorně je to zobrazeno na následujícím schéma, které zobrazuje princip ovládání motoru H-můstkem. Všimněme si, že schéma motoru a spínačů opravdu vypadají jako písmeno H (odtud ten název).

princip H-můstku

Vždy jsou sepnuté dva spínače současně, kombinace spínačů tak určuje polaritu napájení motoru, tedy směr jeho otáčení.

Vedle napájecí svorkovnice je šestipinová lišta, která slouží pro připojení řídících signálů. Čtyři piny (IN1IN4) určují směr dvojice připojených motorů. První dvojice pinů (IN1 a IN2) nastavuje směr motoru připojeného na první motorovou svorkovnici (OUT1, OUT2), piny IN3 a IN4 řídí obdobným způsobem motor zapojený mezi svorky OUT3 a OUT4. Na obou stranách pinů směrového ovládání jsou dva další kolíky (ENA a ENB). Jedná se o kolíky regulace otáček. Tyto kolíky mohou být připojeny zkratovací propojkou (jumperem) na napětí +5 V, pak je rychlost motorů nastavena na maximum. Na piny ENA a ENB ale lze též přivést PWM signál a tím regulovat otáčky daného motoru. Princip řízení výkonu spotřebiče pomocí PWM modulace jsme si vysvětlili v lekci Řízení LED pomocí PWM.

Na modulu řadiče DC motorů s obvodem L298N ještě stojí za zmínku jedna zkratovací propojka. Najdeme ji těsně za napájecí svorkovnicí. Pomocí této propojky lze spojit (nebo naopak oddělit) napájecí napětí motorů a řídicí logiky.

modul L298N - pinout

Pokud je jumper napájení zkratován (spojen), je potřebné napájecí napětí pro řídicí logiku modulu (5 V) vyráběno z napětí Vin (napětí pro motory) pomocí vestavěného napěťového regulátoru. To je vhodné pro „motorová“ napětí od asi 6 V do maximálních 35 V. V případě nižšího napětí Vin, např. motory provozované na 3 V, regulátor vyšší napětí prostě nevytvoří. Stejně tak při překročení 35 V je regulátor přetěžován a hrozí jeho poškození. V takových případech lze zkratovací spojku rozpojit a napájet řídicí logiku pomocí samostatného napájecího piny +5V napájecí svorkovnice. Rozpojení napájecího jumperu můžeme též využít, pokud chceme z nějakého způsobu oddělit napájecí napětí motorů a logiky. Kupříkladu by to mohlo být z důvodů bateriového napájení motorů, tedy zohlednění možného postupného vybíjení baterie. V případě, kdy na bateriích bude již napětí nižší než 5 V (například 4,5 V), bude logika řízení stále napájena napětím 5 V z modulu Arduino.

Dost bylo teorie, zkusme již něco zapojovat!

V našem ukázkovém zapojení budeme ovládat dva motory, jako bychom ovládali pohyb nějakého vozítka. Budeme chtít vyrazit vpřed, vzad a pomocí různých směrů otáčení kol případně zatočit vpravo a vlevo. Také si chceme ukázat, jak lze ovládat rychlost otáčení motorů. Tak pojďme na to!

Použité komponenty

  • modul Arduino
  • USB kabel
  • řadič DC motorů L298N
  • 2× motor 3–6 V s převodovkou
  • 2× gumové kolo ⌀67 mm
  • pouzdro pro 4 tužkové baterie + 4× baterie AA
  • vodiče pro nepájivé pole + vodiče typu „samec-samice“

Princip

Jak jsme naznačili, budeme chtít ovládat dvojici stejnosměrných motorů a budeme chtít ovládat nejen jejich směr, ale i rychlost otáčení. Motory budeme napájet čtveřicí tužkových baterií, tj. napětím 6 V. Díky úbytku napětí na výstupních tranzistorech modulu L298N to bude odpovídat napětí na motorech asi 4 V. To nám na ukázku stačí. Protože napájecí napětí použité baterie je v rozmezí 6–35 V, můžeme napětí 5 V pro řídicí logiku modulu L298N buď vytvářet vestavěným regulátorem (při spojené zkratovací spojce), nebo přivést z pinu 5V modulu Arduino (při rozpojené zkratovací spojce napájení). To je v tuto chvíli na našem rozhodnutí.

Směry jednotlivých motorů budeme řídit pomocí dvojic vstupů IN1 a IN2, resp. IN3 a IN4. Připojíme jen na výstupní digitální piny modulu Arduino. Kombinace hodnot LOW a HIGH bude určovat napětí, které bude na výstupech OUT1, OUT2 (resp. OUT3 a OUT4). Aby se motor otáčel, je třeba vždy jeden z výstupů, mezi které bude motor zapojen, nastavit na hodnotu napájecího napětí Vin a na druhý zemnění. Tedy vždy jeden z dvojice vstupů IN bude na LOW a druhý na HIGH. Piny IN1IN4 zapojíme na modulu Arduino (popořadě) k digitálním pinů 8, 7, 5 a 4.

Konfigurace vstupů IN1IN4 však určuje pouze směr otáčení motorů. Důležitým nastavením je ještě konfigurace pinů ENA a ENB. Pokud bychom chtěli, aby se motory otáčely pouze maximální rychlostí, stačilo by na tyto piny přivést napětí +5 V, nejlépe pomocí k tomu určených zkratovacích propojek. My však chceme kromě směru motorů nastavovat i rychlost otáčení, proto na piny ENA a ENB připojíme některé z výstupních pinů modulu Arduino, které umožňují PWM výstup. Použili jsme výstupy 9 a 3.

Kompletní propojení modulu Arduino a modulu řadiče DC motorů L298N zachycuje dále uvedené schéma a příslušná tabulka. Propojení pinů 5V je volitelné podle toho, zda využijeme zapojení, nebo rozpojení zkratovací spojky napájení.

V ovládacím programu bychom si chtěli ukázat, jak nastavit oba motory na stejný směr otáčení vpřed a vzad. Stejně tak bychom chtěli ukázat, jak motory postupně roztáčet a postupně zastavovat pomocí PWM. Jak tyto techniky využije daný vývojář ve svém skutečném projektu je již na něm samotném.


Postup experimentu

Krok 1: Sestavíme si obvod podle následujícího obrázku nebo schématu. Propojení modulu Arduino a řadiče stejnosměrných motorů L298N zachycuje tabulka (stejně tak připojení baterie a motorů). Propojení napětí 5  V obou modulů je nutné pouze v případě rozpojené napájecí spojky (případ napájecího napětí motorů menšího než 5 V nebo vyššího než 35 V).

Blokové schéma

Blokove schema

Elektronické schéma

Elektronicke schema
L298N
DC Motor Driver
modul Arduino
12V ---
GND GND
(5V) (5V)
ENA 9
IN1 8
IN2 7
IN3 5
IN4 4
ENB 3
L298N
DC Motor Driver
Motor 2
(levý)
Motor 1
(pravý)
OUT1 pin 1 ---
OUT2 pin 2 ---
OUT3 --- pin 1
OUT4 --- pin 2
L298N
DC Motor Driver
Baterie 6 V
(4× článek AA)
12V +
GND

Krok 2: V prostředí mBlock vytvoříme následující program. Nejdříve vytvoříme dílčí podprogramy pro nastavení směru otáčení motorů. První trojice podprogramů řeší zastavení motorů.

program v prostredi mBlock - podprogram 1L
program v prostredi mBlock - podprogram 1P
program v prostredi mBlock - podprogram 1

Následují podprogramy nastavení rychlosti otáčení pravého a levého motoru. Vstupní hodnota pwm je číslo v rozsahu 0–255 odpovídající výstupu na PWM výstupu (hodnota 0 odpovídá zastavení motoru, pro 255 je nastavena maximální rychlost).

program v prostredi mBlock - podprogram 2L
program v prostredi mBlock - podprogram 2P

Poslední skupinou podprogramů jsou podprogramy pro nastavení směru a rychlosti otáčení daného motoru. Vstupní hodnota rychlost opět odpovídá hodnotě PWM modulace (rozsah je tedy 0–255). Možná by z hlediska uživatelského zadávání zde bylo lepší požít nastavení rychlosti v rozsahu procent (0–100) a hodnotu proměnné pwm pro podprogramy definující rychlost tak přemapovat na rozsah 0–255.

program v prostredi mBlock - podprogram 3L
program v prostredi mBlock - podprogram 3P
program v prostredi mBlock - podprogram 4L
program v prostredi mBlock - podprogram 4P

Pokud máme definované jednotlivé podprogramy, můžeme z nich již složit hlavní ukázkový program.

ikona vysvetleni Vysvětlení kódu

Princip kódu nejlépe pochopíme, podíváme-li se na kódy jednotlivých podprogramů. Podprogramy pro zastavení nastavují digitální výstupy odpovídající ovládání směru motorů na stejnou hodnotu (zde LOW). H-můstek s obvodem L298N tak připojí oba dva piny motoru na zemnění. Kde není rozdíl potenciálů, není ani napětí a motor se nemůže rozběhnout. V podprogramech zastavení jsou ještě nastaveny PWM výstupy určující rychlost na 0. To je ve své podstatě asi již zbytečné, ale sluší se tak nějak vypnout řídící výstup, aby nemusel modul Arduino zbytečně generovat PWM signál, který se stejně nijak neprojevil.

Další kategorie podprogramů jsou podprogramy nastavení směru otáčení. Kombinace hodnot LOW/HIGH na výstupech tak určují, jaká bude polarita napětí na motorech. Jelikož normální stejnosměrný motor zpravidla nemá rozlišené kontakty, je dobré připojení motoru vyzkoušet, aby při povelu „vpřed“ se skutečně otáčel správným směrem.

Poslední kategorií podprogramů je nastavení rychlosti. Jedná se o nastavení výstupní PWM hodnoty pro vstupy ENA a ENB řadiče motorů. Tyto podprogramy nejsou použité pro přímé programování v  hlavním kódu, ale jde o pomocné podprogramy pro podprogramy určující směr a rychlost otáčení.

Hlavní program je ukázkou různých způsobů řízení motorů. Nejdříve se motory roztočí na dobu 2 vteřin na plný výkon vpřed. Pak se motory zastaví a po půlvteřinové prodlevě se motory opět na dvě vteřiny roztočí na plný výkon vzad. Další ukázky oddělené půlvteřinovou prodlevou jsou postupné roztočení motorů a zastavení motorů, což má demonstrovat regulaci otáček pomocí PWM výstupů. Poslední sekcí je natočení vlevo a vpravo. Motory jsou na jednu vteřinu zapnuty se vzájemně opačnými směry poloviční rychlostí. To má simulovat možnost natočení robota. Pak se celá ukázka cyklicky opakuje, neboť je vnořena do hlavní nekonečné smyčky.

Jednotlivé fáze ukázky jsou komentované v sériovém monitoru, kde po připojení modulu Arduino k sériovému motoru můžeme vidět, která část ukázky právě probíhá. Používání sériového monitoru jsme si ukázali v lekci Sériový monitor.

Krok 3: Zkompilujeme kód a nahrajeme do modulu Arduino tlačítkem tlacitko nahrat.

Krok 4: Po nahrání programu do modulu Arduino se okamžitě spustí ukázka motorů. Dbejme na to, že reakcí od otáčejících se kol se může modul motoru po stole pohybovat, je třeba motor s kolem na stole trochu zafixovat (např. viz následující obrázek.)

Pohled na experiment

Zdroj obrázku: https://projecthub.arduino.cc/lakshyajhalani56/l298n-motor-driver-arduino-motors-motor-driver-l298n-7e1b3b

Odpojíme-li modul Arduino od prostředí mBlock a připojíme k sériovému monitoru, můžeme v jeho okně sledovat popisy, která fáze ukázky právě probíhá.