Pri stavbe mobilného autonómneho robota potrebujeme, aby sa robot samostatne pohyboval. Riešením je použiť malé motorčeky na jednosmerné el. napätie 6V so zabudovaným prevodovým mechanizmom ozubených kolies (DC 6V gear motor). Počet otáčok za minútu býva označený ako RPM (rotations per minute). Čím väčšie je RPM, tým sa rotor motora ktúti rýchlejšie, ale zato s menším momentom sily M [Nm] a môže sa stať, že sa robot ledva hýbe, ak vôbec. Čím menšie je RPM, tým je aj menší počet otáčok, ale zväčšuje sa moment sily a robot tak "unesie" väčšiu vlastnú hmotnosť. Ďalšou zaujímavou veličinou je prúdový odber motora. Ak je motor nezaťažený, je prúd prechádzajúci motorom najmenší a zväčšuje sa so zaťažením. Maximálny prúd prechádza motorom pri jeho násilnom zastavení a môže byť pri väčších motoroch aj niekoľko ampérov.
Na začiatok sú vhodné napríklad najlacnejšie čínske žlté motory 3-6V spolu so žlto-čiernymi kolesami s priemerom 65mm v cene okolo 10 USD spolu za 4 kusy. Pri napätí 6V je prúd pri nezaťaženom motore asi 50mA (240RMP), pri úplne zaťaženom asi 270mA (v bežných podmienkach môžeme počítať s asi 120mA a 180RPM). Na ebay vyhľadať napr. pomocou kľúčových slov: DC 6V gear motor 4pcs
Doteraz sme ako výstup z Arduina používali LED, bzučiak a LCD display. Všetkými týmito výstupnmými zariadeniami prechádzal malý elektrický prúd (do 20mA) a mohli tak byť pripojené priamo k výstupnému (OUTPUT) pinu Arduino dosky. Motorom prechádza oveľa väčší el. prúd a preto motor nemožno priamo pripojiť na pin Arduino dosky. Riešením by mohlo byť použitie zosilňovacieto tranzistora, napr. TIP120, kde báza je pripojená k PWM pinu Arduino dosky a v závislosti od hodnoty PWM (0-255) sa mení aj rýchlosť motora. Nevýhodou takéhoto riešenia je možnosť ovládať rýchlosť motora iba v jednom smere. My však potrebujeme ovládať až dve vlastnosti motora:
To dosiahneme použitím obvodu H-mostík (H-bridge). Písmeno H vyjadruje tvar schémy zapojenia. Podrobnejšie informácie možno nájsť napríklad tu. H-bridge môžeme získať buď už ako funkčný modul alebo si ho môžeme vyrobiť sami.
Ako prvý H-bridge sme vybrali Arduino motor shield, ktorý dokáže ovládať až 4 jednosmerné motory (+ naviac 2 servomotory a krokové motory). Výhodou použitia je jednoduchosť (cena asi 3 USD). Shield nasunieme opatrne na Arduino dosku (Uno a Mega). Pozor na správne nasadenie tak, aby piny shieldu súhlasili s pinmi Arduino dosky (pre Arduino Nano zrejme tento shield nepoužijeme). Následne stačí propojiť motory a prípadne externé napájanie motorov. Na doske shieldu sa nachádzajú piny PWR, ktoré ak jumperom prepojíme, tak pre napájanie motorov sa používa rovnaký zdroj ako pre napájanie Arduino dosky (Vin). Pri použití externého zdroja napájania motorov, tento priskrutkujeme na piny shieldu +M a GND a odstránime prepojovací jumper z pinov PWR. Úbytok na H-bridge je asi 1,5V, preto ak chceme, aby na motoroch pri plnom výkone (255) bolo 6V, pripojíme externé napájanie 7,5V. Otázke napájania motorov a všeobecne zdrojov napájania mobilných robotov sa budeme venovať v nasledujúcej sekcii. Podrobnejšie informácie o Arduino shielde (tejto staršej verzie) sú na stránkach learn.adafruit.com/adafruit-motor-shield. V súčasnosti (marec 2015) už existuje aj novšia verzia v2 (používa TB6612 namiesto L293), zatiaľ dosť drahá aj u čínskych súdruhov. Ak by však predsa niekto mal tento shield, tak informácie a knižnicu možno získať stadeto.
Arduino shield (v1) využíva softvérovú knižnicu AFMotor.h. Je potrebné najprv nainštalovať novú knižnicu AFMotor. Inštaláciu knižnice vykonáme z hlavného menu cez Sketch - Import Library - Add Library... Knižnicu AFMotor možno spolu so vzorovými príkladmi nájsť na stránke learn.adafruit.com/adafruit-motor-shield/library-install prípadne priamo stiahnuť stadeto: AFMotor.zip
V Arduino motor shielde sú použité obvody L293D. Z datasheetu obvodu L293D môžeme zistiť, že externé napätie motorov môže byť v rozsahu od 4,5V do 36V a maximálny prúd prechádzajúci motorom 0,6A (krátkodobo až 1,2A). Pre väčšie prúdové odbery motorov tento shield nie je vhodný (vhodnejší je napr. L298N).
Nasledujúci príklad ilustruje použitie kinžnice AFMotor pri ovládaní motora.
// Adafruit Motor shield library // copyright Adafruit Industries LLC, 2009 // this code is public domain, enjoy! #include <AFMotor.h> AF_DCMotor motor(1, MOTOR12_64KHZ); // motor je pripojeny na port M1 void setup() { // inicializacia motora motor.setSpeed(255); motor.run(RELEASE); } void loop() { uint8_t i; // motor ide dopredu a postupne zrychluje motor.run(FORWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } // a spomaluje for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } // motor ide dozadu a postupne zrychluje motor.run(BACKWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } // a spomaluje for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } }
V nasledujúcej časti použijeme samostatný modul s obvodom L293D (cena asi 2 USD). Týmto obvodom môžeme ovládať maximálne dva motory, čo zväčša na jednoduché vozidlo postačuje (motor vľavo a motor vpravo). Z datasheetu obvodu L293D zistíme, že externé napätie motorov môže byť v rozsahu od 4,5V do 36V a maximálny prúd prechádzajúci motorom 0,6A (krátkodobo až 1,2A).
Na ovládanie každého motora sú potrebné tri piny, dva digital output pre nastavenie smeru a jeden digital output PWM pre nastavenie rýchlosti motora. Nasledujúci príklad ilustruje ovládanie motorov pomocou obvodu L293D.
/* Motor driver L293D Arduino Mega 2560 */ // Lavy Motor A pripojeny medzi A+ a A- int PIN_EN1 = 44; // ovladanie rychlosti int PIN_IN1 = 41; // smer int PIN_IN2 = 39; // smer // PRAVY Motor B pripojeny medzi B+ a B- int PIN_EN2 = 46; // ovladanie rychlosti int PIN_IN3 = 45; // smer int PIN_IN4 = 47; // smer void setup(){ pinMode(PIN_EN1, OUTPUT); pinMode(PIN_IN1, OUTPUT); pinMode(PIN_IN2, OUTPUT); pinMode(PIN_EN2, OUTPUT); pinMode(PIN_IN3, OUTPUT); pinMode(PIN_IN4, OUTPUT); } void loop(){ uint8_t i; // motor ide dopredu a postupne zrychluje for (i=0; i<255; i++) { motor(0, i, 1); delay(10); } // a spomaluje for (i=255; i!=0; i--) { motor(0, i, 1); delay(10); } // motor ide dozadu a postupne zrychluje for (i=0; i<255; i++) { motor(0, i, 0); delay(10); } // a spomaluje for (i=255; i!=0; i--) { motor(0, i, 0); delay(10); } } // Funkcia pre chod motorov // motor: 0 pre lavy motor A, 1 pre pravy motor B // rychlost: 0 neide vobec, 255 ide plnou rychlostou // smer: 0 ide vzad, 1 ide vpred void motor(int motor, int rychlost, int smer){ boolean inPin1 = LOW; boolean inPin2 = HIGH; if(smer == 1){ inPin1 = HIGH; inPin2 = LOW; } if(motor == 0){ digitalWrite(PIN_IN1, inPin1); digitalWrite(PIN_IN2, inPin2); analogWrite(PIN_EN1, rychlost); } else{ digitalWrite(PIN_IN3, inPin1); digitalWrite(PIN_IN4, inPin2); analogWrite(PIN_EN2, rychlost); } }
Pri použití stabilizovaného externého napájacieho zdroja pre motor 6,5V je prúdový odber bez záťaže asi 50mA a pri maximálnej rýchlosti motora je na ňom el. napätie 5V. Úbytok napätia n amodule L293D je teda asi 1,5V. Pri väčšom prúdovom odbere, napr. paralelne po dva motory na oboch stranách je na motoroch už iba 4,6V (úbytok 1,9V) a prúdový odber už skoro 0,5A.
V prípade, že máme motory s väčším prúdovým odberom, môžeme použiť obvod L298N. Z datasheetu obvodu L298N zistíme, že maximálny prúd prechádzajúci motorom môže byť 2A (krátkodobo až 3A).
Zapojenie modulu L298N (v cene asi 3 USD) aj program sú rovnaké ako u modulu L293D, viď vyššie.
Ďalším H-bridge obvodom je TB6612FNG. Z datasheetu obvodu TB6612FNG zistíme, že maximálny prúd prechádzajúci motorom môže byť 1,2A (krátkodobo až 3,2A) a maximálne napätie 15V. Rozmery obvodu sú miniatúrne (v cene asi 2 USD).
Zapojenie modulu TB6612FNG aj program sú podobné ako u modulu L293D, trochu iné je značenie pinov. Ak chceme jeden pin ušetriť, môžeme pin STBY pripojiť priamo na VCC +5V (pre Arduino Mega to zrejme potrebné nie je). Na pin VM privedieme externé napájanie motorov (pozor, max. 15V a tiež aby boli spojené zeme GND zdroja pre motory a zdroja pre Arduino dosku).
/* Motor driver TB6612FNG Arduino Mega 2560 */ // LAVY Motor A pripojeny medzi A01 a A02 int PIN_PWMA = 44; // ovladanie rychlosti int PIN_AIN1 = 41; // smer int PIN_AIN2 = 39; // smer // PRAVY Motor B pripojeny medzi B01 a B02 int PIN_PWMB = 46; // ovladanie rychlosti int PIN_BIN1 = 45; // smer int PIN_BIN2 = 47; // smer // Standby motorov int PIN_STBY = 43; // standby void setup(){ pinMode(PIN_PWMA, OUTPUT); pinMode(PIN_AIN1, OUTPUT); pinMode(PIN_AIN2, OUTPUT); pinMode(PIN_PWMB, OUTPUT); pinMode(PIN_BIN1, OUTPUT); pinMode(PIN_BIN2, OUTPUT); pinMode(PIN_STBY, OUTPUT); } void loop(){ uint8_t i; // motor ide dopredu a postupne zrychluje for (i=0; i<255; i++) { motor(0, i, 1); delay(10); } // a spomaluje for (i=255; i!=0; i--) { motor(0, i, 1); delay(10); } // motor ide dozadu a postupne zrychluje for (i=0; i<255; i++) { motor(0, i, 0); delay(10); } // a spomaluje for (i=255; i!=0; i--) { motor(0, i, 0); delay(10); } } // Funkcia pre chod motorov // motor: 0 pre lavy motor A, 1 pre pravy motor B // rychlost: 0 neide vobec, 255 ide plnou rychlostou // smer: 0 ide vzad, 1 ide vpred void motor(int motor, int rychlost, int smer){ digitalWrite(PIN_STBY, HIGH); // nebude v standby mode boolean inPin1 = LOW; boolean inPin2 = HIGH; if(smer == 1){ inPin1 = HIGH; inPin2 = LOW; } if(motor == 0){ digitalWrite(PIN_AIN1, inPin1); digitalWrite(PIN_AIN2, inPin2); analogWrite(PIN_PWMA, rychlost); } else{ digitalWrite(PIN_BIN1, inPin1); digitalWrite(PIN_BIN2, inPin2); analogWrite(PIN_PWMB, rychlost); } } // Funkcia pre zastavenie motorov void motoryStop(){ digitalWrite(PIN_STBY, LOW); // bude v standby mode }
PaedDr. Karol Pauchly, ZŠ s MŠ Chlebnice, marec 2015