01 občasník pro uživatele micro:bitu 2018 Micro:bit a serva Serva (servomechanismy) byla původně určena pro použití v radiem řízených (RC) modelech. Jsou však také dobře použitelná pro řadu školních experimentů, řízení laboratorních zařízení, automatizaci domácnosti (například polohování žaluzií) a podobné použití. Základem serva je stejnosměrný elektromotorek, vícestupňová převodovka sestavená z ozubených kol, zpětnovazební snímač polohy výstupního hřídele (potenciometr nebo bezkontaktní snímač) a řídící elektronika. Požadovaná pozice výstupní osy serva je přenášena do řídící elektroniky z nadřazeného řídícího systému pomocí pulzně šířkově (PWM) modulovaného řídícího signálu. Napájení a připojení Do serva vedou tři vodiče; dva servo napájejí a po třetím jsou přenášeny povely. Jako připojovací konektor se obvykle používá plochý trojpinový typ s roztečí dutinek 2,54 mm. Tvar pouzdra konektoru je závislý na výrobci, ale kterýkoli z nich lze nasunout na pinovou lištu se správnou roztečí kolíků. Napájecí napětí běžných serv se pohybuje v rozmezí 4,8 až 6 V. Takzvaná mikroserva pracují většinou už od napájecího napětí 3 V, ovšem při tomto napětí jsou už nespolehlivá a točivý moment zcela zanedbatelný. Moderní serva mohou naopak pracovat i při vyšších napájecích napětích (7,2; 8,4 nebo i 12 V), jejich cena je ale vysoká a pro běžné aplikace jsou zbytečná. Aby servo mohlo správně pracovat, je třeba, aby napájecí zdroj dodal odpovídající proud; většina serv má špičkový odběr v řádu jednotek ampér. Význam Barevná kombinace (-) napájení (GND) černá černá hnědá (+) napájení rudá rudá rudá Řízení bílá žlutá oranžová Obr. 1: Barevné značení kabelů serv 01 / 2018 1
Řídící signál serva Poloha výstupního hřídele serva odpovídá proporcionálně šířce řídícího impulzu. Řídící impulz je pozitivní s amplitudou od 3 V do napájecího napětí, aktivní dobou trvání proměnnou od 1 do 2 ms a opakovací frekvencí obvykle 50 Hz (Evropa) nebo 60 Hz (USA a Japonsko). U takzvaných digitálních serv ale může být opakovací frekvence i mnohem vyšší. Době trvání řídícího pulzu odpovídá rozsah polohy výstupního hřídele serva ±45. Většina serv dovoluje zvětšit mechanický rozsah pohybu výstupní osy na ±90 zvětšením rozsahu řídících impulzů na 5 až 2,5 ms. Řídící impulzy mimo uvedený rozsah, mohou způsobit najíždění serva na mechanický doraz a tím jeho poškození. Obr. 2: Řídící signály Řídící impulz se obvykle opakuje 50x za sekundu (perioda 20 ms). Tato hodnota však není kritická, protože na ní závisí především dosažitelný točivý moment a klidový přídržný moment serva. Výstupní hřídel serva se do střední polohy nastavuje impulzem délky 1,5 ms. Bezpečné připojení serva k micro:bitu Obr. 3: Schéma zapojení 2 01 / 2018
Elektrické schéma z obrázku 3 se proti jiným doporučovaným zapojení zdá dost složité. Optický izolační člen PC817 ale spolehlivě oddělí napájení micro:bitu a napájení serva, protože k přenosu řídících pulzů mezi oběma elektrickými okruhy dochází uvnitř izolátoru prostřednictvím světla. Drobné zvýšení složitosti zapojení a zcela zanedbatelné zvýšení ceny je ovšem bohatě vyváženo tím, že při chybném připojení nebo při poruše serva zůstane váš micro:bit v bezpečí. Obr. 4: Praktické zapojení na nepájivém poli Servo samozřejmě můžete na vlastní nebezpečí připojit přímo k micro:bitu, ale je nutné dodržet jeho napájecí napětí v rozsahu 4,8 až 6 V, protože ačkoli různé návody tvrdí opak, je při nižším napětí funkce serv již dost nejistá a servo se často bez příčiny chvěje nebo škubá. Nejprve servo otestujte V programovacím jazyku JavaScript jsou funkce pro ovládání modelářského serva již připraveny a pro větší pohodlí se poloha páky serva udává přímo v úhlových stupních v rozsahu 0 až 180. Smyslem tohoto testu je především zjistit, zda jste servo správně zapojili a zda skutečně zvládá rozsah otáčení v rozsahu 180 stupňů. Pokud ne a v některé krajní poloze najíždí servo na mechanické dorazy, (to znamená, že na konci své dráhy cvaká a vrčí) pak je třeba experimenálně (změnou čísla, určujícího požadovaný úhel natočení serva) zjistit jeho konkrétní možnosti. 01 / 2018 3
basic.forever(() => { pins.servowritepin(analogpin.p1, 0) basic.pause(1000) pins.servowritepin(analogpin.p1, 90) basic.pause(1000) pins.servowritepin(analogpin.p1, 180) basic.pause(1000) pins.servowritepin(analogpin.p1, 90) basic.pause(1000) }) Blok forever je již připraven na pracovní ploše nebo ho najdete v kategorii basic, blok pause je v téže kategorii a blok servo write pin je v kategorii pins, kterou najdete po kliknutí na volbu advanced v panelu kategorií. Testovací program nastavuje periodicky servo, připojené na pin P1, do jedné krajní polohy, na střed dráhy, do druhé krajní polohy a zpět v opačném pořadí. V každé z těchto poloh setrvá 1 sekundu; to určuje příkaz pause. Můžete zkusit měnit parametr (v tomto případě číslo) příkazu servo write pin, abyste si vyzkoušeli možnosti vašeho serva. 4 01 / 2018
A nyní zkuste servo řídit Předchozí test byl jistě úspěšný a tak nyní zkuste řídit polohu serva pomocí vestavěných senzorů micro:bitu. akcelerometr kcelerometrem em Číslo v proměnné sklon nám udává, o kolik se micro:bit odchýlil od vodorovné polohy v ose X. Protože micro:bit můžete naklánět z vodorovné polohy doleva i doprava, může číslo nabývat hodnot od -1023 do 1023. Ovšem proměnná uhel, určující polohu serva, může mít rozsah jen 0 až 180. Abyste nemuseli složitě počítat, použijte funkci map z kategorie pins, která to udělá za vás. Zvolte, že aktuální rozsah proměnné sklon se má přepočíst na požadovaný rozsah a vložit do proměnné uhel. Servo se vám nyní bude natáčet zleva doprava a zpět v rozsahu 180 stupňů podle toho, jak micro:bit nakláníte a když ho budete držet přesně vodorovně, tak se servo zastaví uprostřed své dráhy. let uhel = 0 let sklon = 0 basic.forever(() => { sklon = input.acceleration(dimension.x) uhel = pins.map( sklon, -1023, 1023, 180 ) pins.servowritepin(analogpin.p1, uhel) }) 01 / 2018 5
kompas ompasem Jak vidíte, program je téměř stejný, jen mimo sklonu sleduje údaj kompasu. Ale pozor v prostředí, kde se vyskytuje mnoho kovových předmětů nebo rušivých magnetických polí asi tenhle pokus nebude příliš uspokojivý, protože údaj z kompasu bude značně zarušený a nepřesný. Pokud používáte kompas poprvé nebo v odlišném prostředí, budete asi při prvním spuštění programu požádáni o kalibraci a budete muset na displeji micro:bitu jeho otáčením a nakláněním nakreslit kroužek. let uhel = 0 let Azimuth = 0 basic.forever(() => { Azimuth = input.compassheading() uhel = pins.map( Azimuth, 36 180 ) pins.servowritepin(analogpin.p1, uhel) }) 6 01 / 2018
intenzi ntenzitou vnějšího osvětlení Displej micro:bitu má jednu zajímavou vlastnost: nejen, že umí zobrazovat, ale také umí změřit intenzitu světla, které na něj dopadá. Údaj o okamžité intenzitě dopadajícího světla je v interním registru light level, jehož hodnotu překopírujte do proměnné svetlo. Rozsah údaje light level je 0 až 255, takže opět pro přepočet na rozsah 0 až 180 využijte služeb funkce map. A když nyní na displej micro:bitu posvítíme, servo se bude natáčet v závislosti na intenzitě dopadajícího světla. let uhel = 0 let svetlo = 0 basic.forever(() => { svetlo = input.lightlevel() uhel = pins.map( svetlo, 255, 180 ) pins.servowritepin(analogpin.p1, uhel) }) 01 / 2018 7
Řízení serva externími ovladači Vyzkoušeli jste si ovládání serva vnitřními senzory micro:bitu a teď si ukážeme, že to jde i jinak. Potenciometr K napájení micro:bitu připojte podle obrázku 5 potenciometr (dělič napětí), na jehož běžci, připojeném k pinu 0 se objevuje proměnné napětí v závislosti na natočení jeho osičky. Obr. 5: Připojení potenciometru Obr. 6: Praktické zapojení na nepájivém poli 8 01 / 2018
Příkazem analog read pin lze toto napětí přečíst, přeměnit ho na číslo v rozsahu 0 až 1023 a pak ho uložit do proměnné pot. Pomocí funkce map přepočteme rozsah proměnné pot z 0 až 1023 na 0 až 180 a ten vložíme do proměnné uhel, která už přímo určuje okamžitou polohu serva. let uhel = 0 let pot = 0 basic.forever(() => { pot = pins.analogreadpin(analogpin.p0) uhel = pins.map( pot, 1023, 180 ) pins.servowritepin(analogpin.p1, uhel) }) Tímto programem jste si z micro:bitu vytvořili zařízení, kterému modeláři říkají servotester. Program je možno samozřejmě různě modifikovat a místo řízení polohy serva potenciometrem použít vnější napětí v rozsahu 0 až 3 V, které připojené na pin 0 micro:bitu. Pamatujete ale stále na to, že napětí vyšší než 3,6 V micro:bit spolehlivě zničí! 01 / 2018 9
Odrazový senzor Tohle si asi budeme muset vysvětlit podrobněji. Senzor TCRT5000 (a jemu podobné) pracuje na principu odrazu infračerveného světla, vysílaného LED, od překážky a jeho příjmem pomocí fototranzistoru. Fototranzistor v TCRT5000 je celkem běžný tranzistor, ale jeho vodivost řídí místo proudu, tekoucího do báze intenzita světla, dopadajícího na jeho polovodičový přechod. Proto je také umístěn v průsvitném pouzdře, připomínajícím LED. Jak je vidět ze schématu na obrázku 7, fototranzistor je zapojen jako emitorový sledovač s emitorovým rezistorem o hodnotě 1 megaohm, pracuje tedy jako aktivní rezistor, jehož odpor je nepřímo úměrný intenzitě dopodajícího světla a jeho citlivost na dopadající světlo je značná. Obr. 7: Zapojení odrazového senzoru Fototranzistor tvoří spolu s emitorovým rezistorem napěťový dělič, v jehož uzlu měří micro:bit napětí pomocí ADC převodníku, připojeného uvnitř micro:bitu na pin 0. Jakmile se před senzorem objeví odrazná plocha, tedy překážka, infračervený paprsek vysílaný LED se odrazí zpět k senzoru, dosud uzavřený fototranzistor v TCRT5000 se pootevře, napětí na děliči se zvýší, program tuto změnu vyhodnotí a servo se natočí do polohy, která přibližně odpovídá vzdálenosti odrazné plochy od senzoru. Obr. 8: Princip funkce Tento způsob vyhodnocení vzdálenosti samozřejmě není dokonalý, protože intenzita odrazu závisí nejen na vzdálenosti odrazné plochy, členitosti a odraznosti jejího povrchu, ale i na úhlu, pod kterým na ni paprsek infračerveného světla dopadá. Přesto ale takový senzor může dobře posloužit při konstrukci různých hříček nebo robotů. 10 01 / 2018
Obr. 9: Řízení odrazovým senzorem Obr. 10: Praktické zapojení na nepájivém poli 01 / 2018 11
let uhel = 0 let reflex = 0 basic.forever(() => { reflex = pins.analogreadpin(analogpin.p0) uhel = pins.map( reflex, -1023, 1023, 180 ) pins.servowritepin(analogpin.p1, uhel) }) 12 01 / 2018