Ovládanie motorov (H-bridge)



Motory

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

Lacné čínske žlté motory s kolesami

Hore hájom chodník

H-bridge

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.

H-bridge

Hore hájom chodník

Arduino motor shield (L293D)

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

H-bridge

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);
 }
}
Hore hájom chodník

L293D

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).

H-bridge

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);
  }
}

H-bridge

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.

Hore hájom chodník


L298N

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.

H-bridge

Hore hájom chodník

TB6612FNG

Ď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).

H-bridge

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
}
Hore hájom chodník

PaedDr. Karol Pauchly, ZŠ s MŠ Chlebnice, marec 2015