Arduino – řízení DC motorů

Čas čtení: 7 min.

Aby se robot mohl pohybovat různými směry, musí být do jeho konstrukce implementována vhodná řídicí technologie.

Řízení stejnosměrných motorů pomocí Arduino - hardware a software

Tento článek představuje příklad implementace řízení stejnosměrného motoru (např. pro pohon robota) pomocí hardwarového regulátoru stejnosměrného motoru založeného na integrovaném obvodu L298N a desce Arduino UNO R3. Článek obsahuje způsob zapojení hardwaru a jeho vlastnosti a pojednává o příkladu zdrojového kódu implementujícího řízení směru a rychlosti stejnosměrných motorů.

Řízení otáček stejnosměrných motorů signálem PWM

Otáčky hřídele stejnosměrného motoru jsou závislé na hodnotě napájecího napětí. Jedním z nejběžnějších způsobů řízení otáček je řízení PWM (pulzně šířková modulace). Tato metoda zahrnuje cyklické zapínání a vypínání napájecího napětí ve velmi krátkých časových intervalech. Jeden cyklus PWM se skládá z následujících fází:

  1. zahrnutí napětí
  2. podržení napětí
  3. odpojení od napájení
  4. podpora vypnutého napětí

Průměrná hodnota napájecího napětí dodávaného do motoru se vypočítá z faktoru plnění PW (šířka pulzu). Tento parametr určuje, po jakou dobu trvání jednoho cyklu PWM je napájecí napětí (v tomto případě dodávané do motoru) zapnuté. Na základě faktoru plnění a maximální hodnoty napájecího napětí můžeme vypočítat průměrnou hodnotu napájecího napětí v průběhu alespoň jednoho cyklu PWM, jak je znázorněno na oscilogramech na obrázku 1:

Obr. 1 – Vliv regulace činitele plnění na střední hodnotu průběhu napájecího napětí

Z výše uvedených oscilogramů je patrné, že čím vyšší je hodnota činitele plnění, tím vyšší je průměrná hodnota napájecího napětí. Praktický důsledek v našich úvahách bude ten, že čím vyšší bude hodnota činitele plnění, tím vyšší budou otáčky motoru a pokles této hodnoty způsobí odpovídající zpomalení hřídele motoru.

Směrové řízení stejnosměrných motorů pomocí můstku "H"

U stejnosměrných motorů se změna směru otáčení obvykle provádí změnou polarity napájecího napětí. Jedním z nejběžnějších technických řešení v tomto ohledu je připojení motoru ke zdroji napájecího napětí pomocí “H” můstku, jak je znázorněno na obrázku 2:

Obr. 2 – stejnosměrný motor připojený ke zdroji napájecího napětí přes můstek typu “H”.

Můstek “H” je tvořen čtyřmi spínači (S1, S2, S3, S4), které jsou na schématu uspořádány společně s motorem M do tvaru připomínajícího písmeno “H”. V praxi jsou spínači tranzistorové klíče, obvykle BJT nebo MOSFET, na které lze přivést řídicí signál, například z výstupů mikrokontroléru. Uzavřením spínačů S1 a S4 a ponecháním spínačů S2 a S3 otevřených se na svorky motoru přivede napětí, které uvede motor do pravotočivého chodu, tj. kladný pól zdroje napětí na kladný pól motoru a záporný pól zdroje na záporný pól motoru. Změníme-li nyní stavy všech spínačů, dojde v důsledku přepólování napájecího napětí také k otáčivému pohybu hřídele motoru v opačném směru.

Řídicí modul stejnosměrného motoru založený na čipu L298N

Modul ovladače stejnosměrného motoru, který použijeme v našem projektu, je založen na integrovaném obvodu L298N, který obsahuje H-můstek. Aby byl regulátor chráněn před přehřátím, byl k pouzdru čipu přišroubován velký chladič, který zvětšuje plochu pro odvod tepla z integrovaného obvodu L298N. Řídicí jednotka může ovládat maximálně dva motory současně. Napájení regulátoru je zajištěno prostřednictvím třípinového šroubovacího konektoru typu ARK, který obsahuje vývody pro napájení motoru (VS), zem (GND) a napájení logické části (VSS). Rozsah přípustných napájecích napětí přivedených na pin VS je až 12 V. Naproti tomu přípustný rozsah napětí pro napájení logické části na kolíku VSS je 5 až 7 V.

Řídicí jednotka motoru L298N.

Modul má vestavěný 5V lineární stabilizátor napětí, který lze vypnout a obejít přesunutím jumperu – přiložením jumperu na piny se stabilizátor zapne – napájení jeho vstupu je přiváděno přímo z pinu VS. Maximální proudová kapacita vestavěného stabilizátoru napětí 5V je 0,5 A, což umožňuje napájení Arduino nebo jiných externích modulů. Po odstranění propojky však bude nutné napětí pro logickou část dodávat externě, přímo na pin VSS. Upozorňujeme, že v této situaci je zakázáno propojku vkládat, protože může dojít k poškození stabilizátoru napětí nebo dokonce celého regulátoru! Podle technických údajů je úbytek napětí na ovladači motoru L298N přibližně 2 V. Je to způsobeno vnitřním úbytkem napětí na přechodech spínacích tranzistorů, které tvoří “H” můstek. Připojíme-li tedy na napájecí svorky motoru 12V, budou motory dostávat maximální napětí kolem 10V. To znamená, že pokud k regulátoru připojíme motor se jmenovitým napětím 12V, nikdy se nebude otáčet maximálními otáčkami deklarovanými výrobcem. Aby bylo dosaženo maximálních otáček, mělo by být napájecí napětí motoru o něco vyšší než skutečné napětí, které motor vyžaduje k dosažení maximálních otáček. V jiném příkladu, při úbytku napětí 2V, pokud používáme motory vyžadující k dosažení plných otáček jmenovité napětí 5V, musíme mu na výstupních svorkách regulátoru dodat napájecí napětí 7V a pro motor s napětím 12V by napájecí napětí motoru bylo 14V.

Modul ovladače stejnosměrného motoru, který použijeme v našem projektu, je založen na integrovaném obvodu L298N, který obsahuje H-můstek. Aby byl regulátor chráněn před přehřátím, byl k pouzdru čipu přišroubován velký chladič, který zvětšuje plochu pro odvod tepla z integrovaného obvodu L298N. Řídicí jednotka může ovládat maximálně dva motory současně. Napájení regulátoru je zajištěno prostřednictvím třípinového šroubovacího konektoru typu ARK, který obsahuje vývody pro napájení motoru (VS), zem (GND) a napájení logické části (VSS). Rozsah přípustných napájecích napětí přivedených na kolík VS je 5 až 35 V. Rozsah přípustného napájecího napětí logické části přiváděného na kolík VSS je 5 až 7 V. Modul má vestavěný lineární stabilizátor napětí 5V, který lze vypnout a obejít přesunutím propojky – přiložením propojky na vývody se stabilizátor zapne – napájení jeho vstupu je přiváděno přímo z vývodu VS. Maximální proudová kapacita vestavěného stabilizátoru napětí 5V je 0,5 A, což umožňuje napájení Arduina nebo jiných externích modulů. Po odstranění propojky však bude nutné napětí pro logickou část dodávat externě, přímo na pin VSS. Upozorňujeme, že v této situaci je zakázáno propojku vkládat, protože by mohlo dojít k poškození stabilizátoru napětí nebo dokonce celého regulátoru! Podle technických údajů je úbytek napětí na ovladači motoru L298N přibližně 2 V. Je to způsobeno vnitřním úbytkem napětí na přechodech spínacích tranzistorů, které tvoří “H” můstek. Připojíme-li tedy na napájecí svorky motorů 12V, budou motory dostávat napětí maximálně kolem 10V. To znamená, že pokud k regulátoru připojíme motor se jmenovitým napětím 12V, nikdy se nebude otáčet maximálními otáčkami deklarovanými výrobcem. Aby bylo dosaženo maximálních otáček, mělo by být napájecí napětí motoru o něco vyšší než skutečné napětí, které motor vyžaduje k dosažení maximálních otáček. V jiném příkladu, při úbytku napětí 2V, pokud používáme motory vyžadující k dosažení plných otáček jmenovité napětí 5V, musíme mu na výstupních svorkách regulátoru dodat napájecí napětí 7V a pro motor s napětím 12V by napájecí napětí motoru bylo 14V.

Vnější svorky řídicí jednotky L298N

Výstupy napájení motoru na řídicí jednotce L298N pro motor A a motor B jsou vedeny na okraj modulu pomocí dvou šroubových svorek s mřížkou 3,5 mm. K těmto svorkám lze připojit dva stejnosměrné motory s napětím od 5 do 35 V. Každý kanál na modulu může stejnosměrný motor napájet proudem až 2 A. Velikost proudu dodávaného do motoru však závisí na napájecím napětí řídicí jednotky. Pro každý výstupní kanál regulátoru L298N jsou k dispozici dva typy řídicích vývodů, které nám umožňují řídit rychlost a směr stejnosměrných motorů současně, tj. vývody pro řízení směru a vývody pro řízení rychlosti. Pomocí vývodů pro řízení směru můžeme řídit, zda se má motor otáčet ve směru nebo proti směru hodinových ručiček. Tyto vývody ve skutečnosti ovládají tranzistory v můstkovém obvodu typu ,,H”, který se nachází uvnitř integrovaného obvodu L298N. Modul má pro každý kanál dva vývody pro řízení směru. Piny IN1 a IN2 ovládají směr otáčení motoru A, zatímco piny IN3 a IN4 ovládají směr otáčení motoru B. Směr otáčení motoru lze ovládat přivedením logického vysokého (+5 V) nebo logického nízkého (GND) stavu na tyto vstupy, jak je popsáno níže.

IN1

IN2

Směr otáčení

GND

GND

vypnutí motoru

+5V

GND

kompatibilní s hodinami

GND

+5V

proti směru hodinových ručiček

+5V

+5V

vypnutí motoru

Na desce jsou také vývody ENA a ENB, které slouží k zapínání a vypínání motorů a k řízení jejich rychlosti. Přepnutím těchto pinů do vysokého stavu se motory roztočí, zatímco jejich přepnutím do nízkého stavu se motory zastaví. Pomocí pulzně šířkové modulace (PWM) můžeme skutečně řídit rychlost motorů. Modul se obvykle dodává s propojkou na těchto pinech. Když je tato propojka na místě, motor je zapnutý a otáčí se maximální rychlostí. Pokud chceme řídit otáčky motorů programově, musíme propojky odstranit a připojit je k pinům se zapnutým generováním PWM na Arduinu. Napájení motoru zajišťuje pin VCC. To se může pohybovat v rozmezí 5 až 35 V. Pokud je na místě propojka 5V-EN, dodávejte napětí o 2V vyšší, než je skutečný požadavek na jmenovité napětí motoru pro dosažení maximální rychlosti motoru. GND je společný zemnicí kolík. Vývod 5V poskytuje napájení pro spínací logické obvody uvnitř integrovaného obvodu L298N. Pokud je na místě propojka 5V-EN, funguje tento pin jako výstup a lze jej použít k napájení Arduina. Pokud je propojka 5V-EN odstraněna, musí být připojen k pinu 5V na Arduinu. Vývod ENA slouží k ovládání rychlosti motoru A. Nastavením tohoto vývodu na vysokou hodnotu (při zachování jumperu na místě) se motor A roztočí a nastavením stejného vývodu na nízkou hodnotu se motor zastaví. Odstranění propojky a připojení tohoto pinu ke vstupu PWM nám umožní řídit rychlost motoru A. Piny IN1 a IN2 se používají k řízení směru otáčení motoru A. Když je jeden z nich ve vysokém stavu a druhý v nízkém, motor A se začne otáčet. Pokud jsou oba vstupy ve vysokém nebo nízkém stavu, motor A se zastaví. Piny IN3 a IN4 se používají k řízení směru otáčení motoru B. Pokud je jeden z nich ve vysokém stavu a druhý v nízkém stavu, motor B se bude otáčet. Pokud jsou oba vstupy ve vysokém nebo nízkém stavu, motor B se zastaví. Vývod ENB se používá k řízení otáček motoru B. Přesunutím tohoto kolíku do vysokého stavu (při zachování jumperu na místě) se motor B roztočí, zatímco přesunutím tohoto kolíku do nízkého stavu se motor zastaví. Odstraněním propojky a připojením tohoto pinu k výstupu PWM budeme moci řídit rychlost motoru B. Vývody OUT1 a OUT2 jsou připojeny k motoru A, zatímco vývody OUT3 a OUT4 jsou připojeny k motoru B. 

Připojení řídicí jednotky L298N k Arduino UNO R3

Modul Arduino UNO R3.

Nyní, když víme vše o řídicím modulu L298N, můžeme začít s jeho připojováním k Arduinu! Začneme připojením napájení k motorům. V našem projektu použijeme stejnosměrné motory s redukčním převodem, které se obvykle používají v robotech s pohonem dvou kol. Rozsah jejich pracovního napětí je od 3 V do 12 V. Připojíme tedy externí zdroj 12V ke svorce VCC. S ohledem na vnitřní úbytek napětí na můstkových tranzistorech ,,H” v obvodu L298N budou motory dostávat 10 V a budou se otáčet o něco nižšími otáčkami.Ale to nevadí.  Dále musíme napájet 5V pro logickou část ovladače L298N.  

Použijeme vestavěný 5V regulátor a budeme odebírat 5V z napájení motoru, takže propojka 5 V-EN zůstane na svém místě. Nyní jsou vstupní a povolovací piny (ENA, IN1, IN2, IN3, IN4 a ENB) modulu L298N připojeny k šesti digitálním výstupním pinům Arduina (9, 8, 7, 5, 4 a 3). Všimněte si, že oba výstupní piny Arduina, tj. č. 9 a č. 3, podporují PWM. Nakonec připojíme jeden motor ke svorce A (OUT1 a OUT2) a druhý motor ke svorce B (OUT3 a OUT4). Připojení motorů můžeme prohodit, technicky neexistuje žádný správný nebo špatný způsob.

Kód programu

Následující náčrt kódu poskytuje představu o řízení rychlosti a směru stejnosměrného motoru pomocí řídicí jednotky L298N a může sloužit jako základ pro další praktické experimenty a projekty:

				
					// Podlaczanie silnika A ze sterownikiem L298N

int enA = 9;

int in1 = 8;

int in2 = 7;

// Podlaczanie silnika B ze sterownikiem L298N

int enB = 3;

int in3 = 5;

int in4 = 4;



void setup() {

  // Piny sterowania silnikiem ustawione jako wejscia

  pinMode(enA, OUTPUT);

  pinMode(enB, OUTPUT);

  pinMode(in1, OUTPUT);

  pinMode(in2, OUTPUT);

  pinMode(in3, OUTPUT);

  pinMode(in4, OUTPUT);

  // Stan poczatkowy - wylaczenie silnikow

  digitalWrite(in1, LOW);

  digitalWrite(in2, LOW);

  digitalWrite(in3, LOW);

  digitalWrite(in4, LOW);

}



void loop() {

  directionControl();

  delay(1000);

  speedControl();

  delay(1000);

}



// Sterowanie kierunkiem obrotow silnikow

void directionControl() {

  // Ustawienie maksymalnej predkosci obrotowej

  // Zakres predkosci dla PWM od 0 do 255

  analogWrite(enA, 255);

  analogWrite(enB, 255);



  // Wlaczenie silnikow A i B

  digitalWrite(in1, HIGH);

  digitalWrite(in2, LOW);

  digitalWrite(in3, HIGH);

  digitalWrite(in4, LOW);

  delay(2000);

  // Zmiana kierunku wirowania

  digitalWrite(in1, LOW);

  digitalWrite(in2, HIGH);

  digitalWrite(in3, LOW);

  digitalWrite(in4, HIGH);

  delay(2000);

  // Wylaczenie silnikow

  digitalWrite(in1, LOW);

  digitalWrite(in2, LOW);

  digitalWrite(in3, LOW);

  digitalWrite(in4, LOW);

}



// Funkcja pozwalajaca na regulacje predkosci obrotowej

void speedControl() {

  // Wlaczenie silnikow

  digitalWrite(in1, LOW);

  digitalWrite(in2, HIGH);

  digitalWrite(in3, LOW);

  digitalWrite(in4, HIGH);

  // Rozpedzanie silnikow

  for (int i = 0; i < 256; i++) {

    analogWrite(enA, i);

    analogWrite(enB, i);

    delay(20);

  }

  // Hamowanie silnikow

  for (int i = 255; i >= 0; --i) {

    analogWrite(enA, i);

    analogWrite(enB, i);

    delay(20);

  }

  // Wylaczenie silnikow

  digitalWrite(in1, LOW);

  digitalWrite(in2, LOW);

  digitalWrite(in3, LOW);

  digitalWrite(in4, LOW);

}
				
			

Výše uvedený kód používá dvě speciální funkce, a to:

directionControl() – Tato funkce způsobí, že se oba motory budou po dobu dvou sekund otáčet dopředu maximální rychlostí. Poté změní směr motorů a způsobí, že se budou otáčet další dvě sekundy. Nakonec motory vypne.

speedControl() – Tato funkce zrychluje oba motory z nulových na maximální otáčky a vytváří signály PWM pomocí funkce analogWrite() a poté motory zpomaluje zpět na nulu. Nakonec motory vypne.

Jak hodnotíte tento článek na blogu?

Klikněte na hvězdičku a ohodnoťte!

Průměrné hodnocení 4.6 / 5. Počet hlasů 15

Zatím nejsou žádné hlasy! Buďte první, kdo ohodnotí tento článek.

Sdílet:

Picture of Mateusz Mróz

Mateusz Mróz

Snílek, milovník cestování a technologických inovací. Své nápady s Raspberry Pi a Arduinem by rád proměnil ve skutečnost. Je tvrdohlavý samouk - o pomoc požádá, až když mu dojdou pozice ve vyhledávačích. Věří, že se správným přístupem lze dosáhnout jakéhokoli cíle.

Viz více:

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Z důvodu bezpečnosti je nutné používat službu reCAPTCHA společnosti Google, která podléhá zásadám ochrany osobních údajů a podmínkám používání společnosti Google. S těmito podmínkami souhlasím..