Kurz Arduino – #5 – PWM, servomotory, knihovny

Převodník ADC byl popsán v předchozí části. Tentokrát to vezmeme z druhé strany a podíváme se na generování konkrétního signálu.

Mluvíme o PWM – pulzně šířkové modulaci. Toto téma může znít složitě, ale několik praktických příkladů jistě rozptýlí veškeré pochybnosti!

Objednejte si sadu prvků a začněte se učit v praxi! Kliknutím sem přejdete do obchodu >>

Co je to signál PWM?

Předpokládejme, že k mikrokontroléru připojíme světelnou diodu a necháme ji blikat ve smyčce. Dioda se na jednu sekundu rozsvítí a na jednu sekundu zůstane vypnutá atd:

				
					void setup() {
  pinMode(3, OUTPUT); //Konfigurace pinu 3 jako výstupu
}
 
void loop() {
  digitalWrite(3, HIGH); //Zapnutí diody
  delay(1000); //Počkejte 1 sekundu
  digitalWrite(3, LOW); //Vypnutí diody
  delay(1000);
}
				
			

Kdybychom nakreslili graf změny napětí (v čase) na pinu 3 Arduino, dostali bychom obdélníkový průběh:

Obdélníkový průběh generovaný Arduino.

Hodnota označená x je čas, kdy se rozsvítí LED dioda. Naproti tomu T je doba, po kterou LED bliká. Reciproční hodnota 1/T zase znamená frekvenci. Poměr mezi dobou svícení a dobou nesvícení kontrolky je 1:1, tj. kontrolka svítí pouze 50 % programu. V technickém žargonu se tento parametr označuje jako signální náplň.

Shrnutí informací o našem signálu:

  1. Amplituda (maximální hodnota): 5V
  2. Doba signalizace: 2 sekundy
  3. Frekvence signálu: 1/2 = 0,5 Hz
  4. Signální náplň: 50%

Nyní je čas na podobný experiment. Avšak s jinou náplní, přičemž předchozí období je zachováno. Jak to udělat? Jednoduše prodloužíte dobu, po kterou je dioda zapnutá, a zkrátíte dobu, po kterou je vypnutá. Například:

				
					void setup() {
  pinMode(3, OUTPUT); //Konfigurace pinu 3 jako výstupu
}
 
void loop() {
  digitalWrite(3, HIGH); //Zapnutí diody
  delay(1667);
  digitalWrite(3, LOW); //Vypnutí diody
  delay(333);
}
				
			

Tentokrát je dioda sepnuta přibližně 5/6 času. To znamená, že plnění je přibližně 83 %. Pokud tuto situaci znázorníte analogicky k předchozímu diagramu, získáte:

Pokud zpoždění prohodíme, dostaneme opačnou situaci, tj. signál s úrovní naplnění 17 %. Poslední grafika:

Větší naplnění signálu.
Nízké zaplnění signálu.

Podívejte se znovu na výše uvedené příklady. Který parametr se pokaždé změnil? Odpověď je jednoduchá: náplň. Frekvence průběhů zůstala stejná.

Z praktického hlediska se změnilo pouze „procento času, kdy má signál vysoký potenciál“.

Nyní si představte, že zpoždění vložená do výše uvedených programů jsou mnohem nižší, takže frekvence signálu je mnohem vyšší…..

Gratulujeme! Právě jste pochopili princip PWM v praxi. To je metoda modulace čtvercového vlnového signálu nastavením šířky impulsu.

Pravděpodobně si říkáte: Skvělé, ale proč to potřebujete?

Představte si motor, který je ovládán spínačem. Dosáhne motor po zapnutí napájení okamžitě maximálních otáček? Ne, musí nejprve zrychlit. Totéž platí pro postupné zastavování. Co se stane, když budeme proud takového motoru neustále zapínat a vypínat? Pokud je operace dostatečně rychlá, měli bychom být schopni dosáhnout přechodných rychlostí mezi zastavením a plnou rotací. Dosažená rychlost závisí na tom, jak dlouho motor napájíme.

Pokud je toto zapínání a vypínání mnohem rychlejší, můžeme popsaný efekt využít i u zdánlivě velmi „rychlých“ součástek – světelných diod.

Signál PWM generovaný přes Arduino obvykle spíná 490/s.

K čemu slouží signál PWM?

Tento signál se v digitální technice používá velmi často. Lze jím ovládat jas LED diody, polohu serva a rychlost otáčení motoru! Jak jasně vidíte, existuje mnoho aplikací jak v amatérské robotice, tak v jakémkoli jiném kutilském oboru.

Řízení jasu LED diod

Je čas na první praktický příklad použití PWM. Tentokrát se podíváme na jednoduchý program pro pulzování diody.

Arduino je vybaveno 6 hardwarovými kanály PWM. Každý výstup, na kterém můžeme přijímat signál PWM, je na desce plošných spojů označen znakem „~“ a slovo PWM se vedle něj objevuje i na našem obrázku:

Hardwarově generovaná PWM znamená, že generování tohoto signálu neovlivňuje činnost programu (není zpožděno). Navíc nemusíme sami psát funkce pro generování takového signálu.

Každý PWM kanál dostupný na Arduino UNO je 8 – bitový. To znamená, že vyplnění signálu, který chceme na výstupu přijímat, lze zadat číslem od 0 do 255, kde 255 znamená 100% vyplnění.

Pro první cvičení je nutné připojit diodu na pin 3. Sestavení obvodu by již nemělo být problémem:
Pulzování diody přes Arduino - PWM.

Je čas vytvořit program. Naším cílem je napsat několik řádků, které způsobí pomalé blikání diody. Jinými slovy, budeme měnit náplň PWM signálu, který se používá k řízení diody ve smyčce.

				
					#define diodaPIN 3

int výplň = 0;
int změna = 5;

void setup() {
	pinMode(diodaPIN, OUTPUT);//Konfigurace pinu jako výstupu 
}

void loop() {
	analogWrite(diodaPIN, výplň); //Generujeme signál se zadanou náplní

	if (výplň < 255) { //Pokud je výplň menší než 100 %
		výplň = výplň + změna; //Zvyšujeme výplň
	} else {
		výplň = 0; //Pokud je výplň větší než 100 %, vrátíme se na začátek.
	}
 
	delay(50); //Malé zpoždění pro zviditelnění efektu
}
				
			

Doufejme, že je nyní vše jasné a můžeme přejít k diskusi o nové funkci. Jedná se samozřejmě o analogueWrite(pin, fill). Jejich úkolem je generovat PWM signál na vybraném pinu se zvolenou výplní.


Úkolem výše uvedeného programu je cyklicky zvyšovat náplň od nuly, dokud její hodnota nebude menší než 255 (100 %). Po dosažení maximální úrovně naplnění se dioda vypne (úroveň naplnění 0 %) a proces rozsvěcení diody pokračuje.

Domácí úkol 5.1

Pokuste se výše uvedený program zjednodušit tak, abyste nemuseli používat podmíněný příkaz if. Tip: Zamyslete se nad tím, jak typ vyplňování proměnné ovlivňuje program.

Domácí úkol 5.2

Napište program, který po zvýšení náplně na 255 začne postupně snižovat náplň na nulu (a tak dále dokola). Zkontrolujte, při jakém zpoždění v každém cyklu smyčky bude pozorovaný pulzující efekt nejzajímavější.

Je čas použít servo!

Nejeden čtenář asi čekal na okamžik, kdy si probereme servo a použijeme ho v praxi. Pokud ještě nevíte, o čem přesně mluvím, najděte ve své sadě součástku, která je totožná (nebo podobná) té na obrázku níže:

Servo typu Micro.

Jedná se o mikroservo, které je jedno z nejmenších dostupných na trhu. Jeho velikost však nemá vliv na způsob ovládání. Jakmile pochopíte princip fungování, budete moci ve svých projektech používat větší, silnější a rychlejší serva.

Co je to servomotor?

Servopohon se skládá z motoru, převodovky a speciální řídicí jednotky, které jsou umístěny v jedné skříni. Tyto pohony však nejsou určeny pro úplné otáčení. Většina serv může pohybovat namontovaným ramenem v úhlu 0-180º. Je důležité, aby znali svou aktuální polohu, abychom se nemuseli obávat například zvyšujících se chyb v poloze.

Dvě nejdůležitější pravidla pro používání servopohonů:

  1. Poloha hřídele se nesmí bez nutnosti otáčet rukou. To může poškodit poměrně citlivá plastová ozubená kola, z nichž jsou převodovky vyrobeny.
  2. Serva nenapájejte přímo stejným zdrojem energie jako zbytek systému. Každý motor odebírá poměrně velký proud. To platí zejména na začátku pohybu. To může narušit zbytek systému a v krajním případě jej i poškodit.

Jak funguje servo?

Jak servo pozná, do které polohy se má otočit? Je to díky vestavěnému ovladači. Ten řídí motor na základě přiváděného signálu PWM. Standardně je do servopohonů přiváděn signál s periodou 20 ms. Naproti tomu naplnění signálu je interpretováno jako poloha, do které se má servo rameno posunout.

Naplnění generovaného signálu by se mělo pohybovat v rozmezí 5-10 %. Tyto hodnoty se převedou na dvě koncové polohy serva (maximální levá a maximální pravá).
Od každého serva vedou 3 kabely:
  1. Zem (černá, tmavě hnědá)
  2. Napájení (červený)
  3. Řídicí signál (žlutý/oranžový)
Barvy kabelů se mohou lišit v závislosti na výrobci. Dva z nich však budou určitě blízko černé a červené (napájení). Zbývající třetinu tvoří signální kabel.

Napájení serva

Jak již bylo uvedeno, servomotor by neměl být napájen přímo ze stejného napětí, které napájí mikrokontrolér. Za druhé, protože motor může odebírat velké množství proudu, musíme do obvodu připojit vhodný, účinný zdroj.

Bohužel port USB, který jsme použili k napájení naší desky, se mohl ukázat jako příliš slabý!

Proto budeme Arduino poprvé napájet pomocí dodávané 9V baterie s vývodem, který je zakončen zástrčkou zapadající do napájecí zásuvky v Arduino. Přesné schéma zapojení naleznete níže.

Servomechanismus v praxi

Je čas na první program, který pohne ramenem serva. K tomu je třeba zapojit obvod podle níže uvedeného schématu zapojení. Nejprve je nutné připojit baterii. Za druhé, musíme použít stabilizátor LM7805.

Vstup stabilizátoru připojíme na pin Vin Arduino, zem na GND a červený kabel serva připojíme na výstup. Kondenzátory jsou samozřejmě nutné i pro filtraci. Zbývající spojení by již měla být jasná:

Připojení serva k Arduino.

Je čas na program, který krok za krokem posouvá servo. Na začátku hotového programu najdete vysvětlení níže:

				
					#include <Servo.h> //Knihovna odpovědná za serva
 
Servo servomechanismus;  //Vytvoříme objekt, abychom se mohli na servo odkazovat. 
int pozice = 0; //Aktuální pozice serva 0-180
int změna = 6; //Jak často se má měnit poloha serva?
 
void setup() 
{ 
  servomechanism.attach(9);  //Servo připojené k pinu 9
} 
 
void loop() 
{  
  if (pozice < 180) { //Pokud pozice leží v oblasti
    servomechanism.write(pozice); //Udělej krok
  } else { //Pokud ne, vraťte se na začátek
    pozice = 0;
  }    
  
  pozice = pozice + změna; //Zvýšení aktuální polohy serva
  delay(200); //Zpoždění pro lepší efekt                     
}
				
			

Tentokrát potřebujeme přidat novou knihovnu, která rozšíří možnosti našeho programu o naše funkce. To se provádí příkazem:

				
					#include Servo.h
				
			
V tomto případě jsme přidali soubor Servo.h, který obsahuje další pokyny pro serva. Díky tomuto souboru nemusíme sami řídit generovaný PWM signál. Musíme pouze zadat polohu (úhel), kolem které se má servo otáčet.

Pokud chceme ovládat servo, musíme pro něj vytvořit objekt:
				
					Servo servomechanismus;
				
			
Funkce attach(Pin) – pro objekt servo – funguje podobně jako pinMode – argumentem je pin, ke kterému je komponent připojen. Od této chvíle je na zadaném pinu (v tomto případě 9) generován PWM signál.

Po spuštění programu by se mělo servo plynule pohybovat z jedné koncové polohy do druhé a poté zpět na začátek. Klíčová věta zní:
				
					servomechanism.write(pozice);
				
			

Zde musíme jako polohu zadat úhel 0-180º.

Domácí úkol 5.3

Na základě výše uvedeného programu napište vlastní, který provede každý další skok na novou pozici po delší době (200 ms, 250 ms atd.).

Domácí úkol 5.4

Napište program, který otáčí servopohonem do polohy odesílané do zařízení Arduino přes UART. Odesílaná čísla musí být v rozsahu 0-180, jinak se zobrazí zpráva.

Domácí úkol 5.5

Připojte k obvodu potenciometr jako dělič napětí. Pak použijte ADC převodník změřte napětí nastavené na potenciometru. Čím je vyšší, tím blíže by mělo být servo ke své nejpravější poloze.

Pozor, nepřipojujte motor sami!

V této části kurzu jsme připojili servomotor přímo k Arduino. To bylo možné díky tomu, že tyto pohony mají vnitřní řídicí jednotky, které řídí provoz holého motoru.

Proto se z pinu Arduino, který ovládá pohyb serva, neodebírá mnoho proudu.

Pokud k Arduino připojíte „holý motor“, proud (>20mA) poškodí obvod! Nezapomeňte, že elektromotory (i ty malé) mohou ke své činnosti potřebovat desetinásobek nebo dokonce stonásobek výkonu vývodů mikrokontroléru!

Pro přímé připojení motoru je nutný meziobvod, bridge-h! Více informací o této problematice najdete dále v tomto kurzu.

Shrnutí

Doufám, že jste díky této části kurzu pochopili, co je to PWM signál a jak jej můžete použít ve svých projektech.

V příštím doplňkovém díle se budeme věnovat některým užitečným trikům v souvislosti s přenosem přes UART. Ukážu také, jak lze servo v praxi použít jako analogový ukazatel, a předvedu, jak pomocí Arduino a čipu L293D ovládat stejnosměrný motor!

Objednejte si sadu prvků a začněte se učit v praxi! Kliknutím sem přejdete do obchodu >>

Přejít nahoru