Lekce 11 - Arduino - Druhy motorů a programování servo motoru
V minulé lekci, Arduino - Měření tlaku a teploty s OLED displejem, jsme si ukázali Arduino projekt na měření tlaku a teploty pomocí BMP280 modulu s OLED displejem.
V dnešní lekci HW Arduino tutoriálu si představíme další druh elektronických komponent. Povíme si základní informace o motorech, ukážeme si, jaké existují druhy motorů a k čemu je lze použít. Také si jeden z motorů společně zapojíme a naprogramujeme. Naučíme se tak pracovat se servo motorem.
Výběr motorů
Začneme tím, že si řekneme, co to vůbec motor je. Motor by se dal definovat jako elektrický točivý stroj, do této kategorie se mimo jiné také řadí například generátor. Opakem točivých strojů jsou netočivé stroje. Z této kategorie můžeme například uvést jako příklad transformátor.
Točivý elektrický stroj, v našem případě motor, mění elektrickou energii na mechanickou energii. Může fungovat i opačně a měnit mechanickou energii na elektrickou energii. Točivé elektrické stroje se poté dále dělí na další kategorie.
Pojďme se tedy podívat na konkrétní druhy motorů:
Na obrázku vidíme sedm různých motorů:
- servo motor,
- krokový motor,
- ss. motor s kódovačem,
- servo motor (jiný model),
- ss. motor,
- vibrační motor,
- převodový motor.
V dnešním dílu si naprogramuje pouze servo motor. Zbývající motory si představíme příště.
Projekt vytvoříme ve vývojovém prostředí Tinkercad, práce zde je velice jednoduchá a příjemná. Virtuální prostředí Tinkercad nabízí všech sedm druhů motorů uvedených na obrázku. Projdeme si vše od základů - vybrání motoru, zapojení dle schématu a nakonec naprogramování.
Pro ty, kteří by nechtěli pracovat v Tinkercadu nebo by si prostě chtěli zapojit projekt v reálu mám dobrou zprávu, lze to také. Stačí využít Arduino IDE a psát kód zde.
Servo motor
Začneme tedy servo motorem. Ten vypadá například takto:
Jak vidíme, jedná se o malé plastové mikroservo, které lze celkem levně zakoupit. Pro zájemce připojujeme odkaz na e-shop LaskaKit, kde je možné mikroservo pořídit. Konkrétně se jedná o model SG90, který má provozní napětí v rozsahu 3 V až 7,2 V. Model existuje ve dvou variantách, ve 180° a kontinuální verzi. Rozdíl mezi těmito servo motory je jak v kódu, tak v celém fungování motoru.
První motor, jak vyplývá z názvu, se může otáčet pouze v rozmezí 180°, jeho výhodou je, že je celkem přesný a zná své stupně otočení. Nevýhodou je, právě omezený rozsah otáčení. Druhé, kontinuální servo funguje trochu jinak, jeho značnou přednostní je to, že se dokáže otáčet v rozmezí 360°, avšak chybí zde senzor pro určování polohy otáčení. Motor tudíž není tak přesný a musíme se zde řídit časem otáčení. To u starších motorů může způsobovat potíže, když se motor například nevrátí na pozici, na kterou se původně vracel.
Zapojení servo motoru
Nyní, když jsme si řekli základní informace o servo motoru, tak nám nic nebrání vrhnout se rovnou na schéma zapojení. Zapojení bude velice jednoduché, postačí nám jakýkoliv model desky Arduino a servo motor. My budeme používat model Uno, ale ve výsledku na tom nezáleží. Naše zapojení vypadá takto:
Oranžový kabel (datový kabel) zapojíme do libovolného digitálního pinu, v našem případě se jedná o digitální pin číslo dva. Dále použijeme červený kabel (napájecí kabel), který zapojíme do pinu 5 V na desce Arduina a poslední černý kabel (uzemnění) se zapojí do pinu GND.
Pokud máme vše zapojeno, můžeme se pustit do programování motůrku. Dnes si naprogramujeme polohové servo.
Typ serva můžeme v Tinkercadu opět jednoduše přepnout v novém okně, které se otevře, pokud na model serva klikneme. V nabídce Typ pak pro první projekt zvolíme položku Polohové.
Programování polohového servo motoru
Naprogramujeme si jednoduchý program, abychom si ukázali funkčnost motůrku. V programu budeme chtít, aby se servo otočilo vždy o 45° až do maximálních 180°. Až bude servo otočeno na maximum, vrátíme ho zpět na začátek a celá smyčka začne znovu.
Nejprve do projektu přidáme knihovnu pro práci se servem a doplníme konstanty, resp. proměnné:
#include <Servo.h> // Knihovna pro servo #define SERVO_PIN 2 // Definování pinu, na kterém se nachází servo Servo servo_motor; // Vytvoření instance servo motoru byte uhel_otoceni; // Pomocná proměnná pro nastavování úhlů otočení
Knihovnu přidáme pomocí příkazu #include <Servo.h>
.
Díky ní budeme moci používat již naprogramované funkce pro servo motor.
Dále si příkazem #define SERVO_PIN 2
definujeme číslo pinu, na
kterém se nachází naše servo, v našem případě pin číslo dva.
Pak si vytvoříme instanci našeho motoru, důležité je klíčové slovo
Servo
, díky němuž vytvoříme danou instanci, poté je potřeba
zadat název serva, v našem případě deklarujeme servo_motor
.
Jako další jsme si vytvořili proměnnou typu byte
, kterou jsme
nazvali uhel_otoceni
, ta nám poslouží jako pomocná
proměnná.
Proměnné uhel_otoceni
jsme nepřiřadili žádnou
hodnotu, bude tedy defaultně nastavena na 0
.
Následuje krátká inicializace serva:
void setup() { servo_motor.attach(SERVO_PIN); // Propojení instance našeho serva }
Koukneme-li se do části setup()
, tak zde uvidíme příkaz, s
kterým jsme se doposud nesetkali. Jedná se o příkaz
servo_motor.attach(SERVO_PIN)
, díky tomuto příkazu přiřadíme
instanci serva našemu zapojenému servo motoru, který máme připojený na
pinu číslo dva.
Nyní se přesuneme na finální část programu a ukážeme si kód funkce
loop()
:
void loop() { if (uhel_otoceni == 180) { uhel_otoceni = 0; } else { uhel_otoceni += 45; } servo_motor.write(uhel_otoceni); // Otočení motoru na požadovaný úhel delay(1500); // Nastavení prodlevy na 1,5 sekundy }
K otočení servo motoru použijeme příkaz write()
, který
voláme na instanci našeho serva a jemuž v parametru nastavujeme požadovaný
úhel otočení. Příkaz servo_motor.write(45)
by tedy otočil
naše servo na 45°.
Jako první se ale v hlavní smyčce nachází podmínka, kterou
kontrolujeme, zda proměnná uhel_otoceni
nedosáhla již
maximální hodnoty, tedy 180°. Pokud ano, proměnnou vynulujeme. Díky tomu se
následně servo vrátí do původní polohy. V opačném případě hodnotu
proměnné navýšíme o požadovaných 45°.
Nakonec zavoláme příkaz servo_motor.write(uhel_otoceni)
, tím
docílíme toho, že se motor otočí o navýšenou hodnotu. Na závěr ještě
přidáme prodlevu jeden a půl sekundy, po které bude program pokračovat
znova v cyklu.
Díky pomocné proměnné jsme se vyhnuli opakovanému volání
příkazu write()
s konkrétním parametrem v argumentu.
Program nyní můžeme spustit a vyzkoušet. Pokud vše proběhlo bez problémů, máme nyní funkční servo motor! V případě dotazů nebo potíží se neváhejte obrátit do komentářové sekce.
V následující lekci, Arduino - Senzory a programování pohybového senzoru PIR, se budeme zabývat dalším typem elektronických komponent, a to senzory. V praktické části si pak ukážeme využití pohybového senzoru spolu s fotorezistorem.