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:
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:
- Amplituda (maximální hodnota): 5V
- Doba signalizace: 2 sekundy
- Frekvence signálu: 1/2 = 0,5 Hz
- 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:
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“.
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?
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
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.
Pro první cvičení je nutné připojit diodu na pin 3. Sestavení obvodu by již nemělo být problémem:
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:
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ů:
- 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.
- 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?
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á).
- Zem (černá, tmavě hnědá)
- Napájení (červený)
- Řídicí signál (žlutý/oranžový)
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á:
Je čas na program, který krok za krokem posouvá servo. Na začátku hotového programu najdete vysvětlení níže:
#include //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
Pokud chceme ovládat servo, musíme pro něj vytvořit objekt:
Servo servomechanismus;
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.
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í
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 >>