
Micro:bit: Programovanie v Pythone / 2. časť
V prvej časti sme predstavili webové vývojové prostredie https://python.microbit.org, vývojové prostredie Mu-editor (https://codewith.mu), ktoré si môžete nainštalovať na svoj počítač, obsluhu displeja, tlačidiel a nastavovanie hodnôt na digitálnych vstupoch a výstupoch. V druhej časti sa budeme venovať programovaniu analógových vstupov a výstupov, ovládaniu servomotorov, generovaniu zvuku, meraniu teploty, načítaniu a spracovaniu údajov z akcelerometra či kompasu.
Analógové vstupy a emulácia výstupov
Na načítanie hodnoty napätia na pinoch v analógovom móde sa používa príkaz read_analog(), pričom napäťovému rozsahu na vstupe 0 – 3,3 V budú zodpovedať hodnoty od 0 do 1023. Na načítanie aktuálnej hodnoty napätia na analógovom joysticku, využívajúcom potenciometre zapojené ako delič napätia a zobrazenie šípky smerujúcej nahor alebo nadol, by ste použili fragment kódu:
from microbit import *
while True:
hodnota = pin0.read_analog()
if hodnota < 300:
display.show(Image. ARROW_N)
elif hodnota < 600:
display.show(Image. ARROW_S)
Ovládanie servomotora PWM signálu
Na vysvetlenie parametra typu ARROW_N, ARROW_NE, ARROW_E, ARROW_SE, ARROW_S, ARROW_SW, ARROW_W, ARROW_NW sa zobrazujú ikony šípok, pričom smer je určený skratkami svetových strán za podčiarkovníkom.
Na pinoch dosky Micro:bit síce môžete nastaviť aj analógovú hodnotu write_analog(parameter), tá sa však prejaví ako signál PWM, teda signál s impulzovou šírkovou moduláciou. Hodnoty parametra sú od 0, čo je 0 % podiel signálu v úrovni logická 1, až po 1023, čo je 100 % podiel signálu v úrovni logická 1. Príklad kódu na opakované nastavenie troch hodnôt v sekundových intervaloch:
from microbit import *
while True:
pin0.write_analog(511)
sleep(1000)
pin0.write_analog(255)
sleep(1000)
pin0.write_analog(767)
sleep(1000)
Na obrázku sú tri priebehy signálu s impulzovou šírkovou moduláciou.
Prvý – write_analog (511), pretože má presne 50 % periódu – polovicu času každej periódy je na pine napätie 3,3 V a polovicu času úroveň GND. Výsledok je taký, že celková energia tohto signálu je rovnaká, ako keby bola nastavená na 1,65 V namiesto 3,3 V.
Druhý – write_analog (255), signál má 25 % pracovný cyklus a má podobný účinok, akoby bolo na tomto pine trvalé napätie 0,825 V.
Tretí – write_analog (767), signál má 75 % pracovný cyklus, je ekvivalentný napätiu 2,475 V a poskytuje trikrát toľko energie ako druhý signál.
PWM dobre funguje dobre so zariadeniami, ako sú žiarovky alebo motory, ktoré majú zotrvačnosť, prípadne využívajú zotrvačnosť ľudského oka. Typický príklad sú LED diódy.
Zapojenie na pokusy so servomotorom
Ovládanie servomotorov pomocou signálu PWM
PWM s presnou šírkou impulzu sa často využíva na ovládanie uhla natočenia servomotorov. Preto treba mať možnosť presného nastavenia periódy impulzov. Na nastavovanie sa používa príkaz set_analog_period(pocet_milisekund) alebo set_analog_period_microseconds(pocet_mikrosekund). Pri mikrosekundách je minimálna hodnota 256 µs. Pre servomotory sa využíva frekvencia signálu PWM 50 Hz, čo je 20 milisekúnd. Takže program, ktorý bude hýbať servom z 0 na 180°a späť, bude:
from microbit import *
pin0.set_analog_period(20)
while True:
pin0.write_analog(180)
sleep(1000)
pin0.write_analog(1)
sleep(1000)
Generovanie zvuku
Ak medzi piny 0 a GND prvej verzie Micro:bitu pripojíte malý reproduktor, môžete na ňom generovať tóny, prípadne môžete priebežne meniť frekvenciu tónu. Micro:bit V2 má reproduktor už priamo zabudovaný.
from microbit import *
import music
while True:
for freq in range(880, 1760, 16):
music.pitch(freq, 6)
PWM signál s rôznou striedou signálu
Môžete nechať zahrať niektorú z preddefinovaných melódií, napríklad:
from microbit import *
import music
music.play(music.BIRTHDAY)
K dispozícii sú melódie
DADADADUM, ENTERTAINER, PRELUDE, ODE, NYAN, RINGTONE, FUNK, BLUES, BIRTHDAY, WEDDING, FUNERAL, PUNCHLINE, PYTHON, BADDY, CHASE, BA_DING, WAWAWAWAA, JUMP_UP, JUMP_DOWN, POWER_UP a POWER_DOWN.
Pomocou tónov môžete definovať vlastnú melódiu. Každá nota je definovaná textovým reťazcom v tvare NOTA[oktáva][:trvanie]
from microbit import *
import music
tune = ["C4:4", "D4:4", "E4:4", "C4:4", "C4:4", "D4:4", "E4:4", "C4:4",
"E4:4", "F4:4", "G4:8", "E4:4", "F4:4", "G4:8"]
music.play(tune)
Meranie teploty
Doska Micro:bit má integrovaný senzor teploty, takže môžete napríklad naprogramovať teplomer, ktorý bude ukazovať teplotu rolovaním znakov na displeji. Problém však bude v presnosti, pretože teplotný snímač je na čipe mikrokontroléra, takže nemeria teplotu okolia, ale teplotu čipu, ktorá je podľa skúseností o 4 až 5 °C vyššia než teplota okolia.
from microbit import *
while True:
teplota = temperature()
display.scroll(str(teplota) + 'C')
sleep(500)
Údaje z akcelerometra a pohybové gestá
Akcelerometer na doske BBC Micro:bit zachytáva pohyb v troch osiach:
- X – naklonenie doľava a doprava
- Y – naklonenie dopredu a dozadu
- Z – pohyb nahor a nadol
Funkcia accelerometer.get_x() vracia kladnú alebo zápornú hodnotu zrýchlenia v danom smere v jednotkách, ktoré by sa dali označiť ako mili g. Predpona mili v tomto prípade na jednoduchšiu implementáciu nie je 1/1000, ale 1/102,.tTakže gravitačné zrýchlenie v osi Z má hodnotu 1024 mili g. Ak držíte dosku Micro:bit pokojne bez chvenia a LED diódami nahor, hodnoty zrýchlenia X a Y sú okolo nuly a zrýchlenie Z je približne -1024. To vám prezradí, že gravitácia pôsobí smerom nadol oproti doske. Ak dosku otočíte LED diódami nadol, mala by sa hodnota zmeniť na +1024 mili g. Ak budete triasť s doskou dosť silno, uvidíte, že zrýchlenie dosiahne hodnoty až ± 2048 mili g. To preto, lebo tento akcelerometer je nastavený na meranie maximálne ± 2048 mil g. Skutočné zrýchlenie môže byť väčšie než namerané. Príklad na určenie smeru:
from microbit import *
while True:
reading = accelerometer.get_x()
if reading > 20:
display.show("R")
elif reading < -20:
display.show("L")
else:
display.show("-")
Pretože je akcelerometer pomerne citlivý, je v príklade podmienka tolerancie. Ak je hodnota zrýchlenia medzi -20 a 20 mili g, nepovažuje sa to ešte za pohyb, ale toleranciu merania.
Micro:bit dokáže pomocou akcelerometra zachytávať a analyzovať aj komplexnejšie gestá. V kóde sú zadávané ako textové reťazce. Ich zoznam je: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g a shake. Gestá 3 g, 6 g a 8 g sa indikujú vtedy, ak zrýchlenie dosky v ktoromkoľvek smere prekročí príslušnú hodnotu násobku gravitačného zrýchlenia. Nasledujúci príklad zobrazí ikonu šťastného smajlíka iba v prípade, ak je zariadenie v polohe displejom nahor.
from microbit import *
while True:
gesture = accelerometer.current_gesture()
if gesture == "face up":
display.show(Image.HAPPY)
else:
display.show(Image.ANGRY)
Kompas využívajúci magnetický senzor
Senzor magnetického poľa umožňuje zistiť polohu vzhľadom na svetové strany. Pred odčítaním musíte elektronický kompas kalibrovať, inak nebudú následné merania presné. Metóda compass.calibrate() spustí celkom zaujímavú minihru, pri ktorej budete podľa inštrukcií naklápať dosku Micro:bit dokola, kým sa celý displej nezaplní svietiacimi pixelmi. Metóda compass.heading() určuje uhol v rozsahu od 0 do 360 v stupňoch v smere hodinových ručičiek, pričom 0 je sever. Aby bolo možné zobraziť smer graficky, výpočet v nasledujúcom príklade určí index hodiny tak, aby malá ručička zobrazených hodín na maticovom displeji zobrazovala sever.
from microbit import *
compass.calibrate()
while True:
smer = ((15 - compass.heading()) // 30) % 12
display.show(Image.ALL_CLOCKS[smer])
Na vysvetlenie, na maticovom displeji môžete zobraziť čas v analógovej forme s presnosťou na hodiny pomocou parametra CLOCK1 - CLOCK12, prípadne pomocou poľa definícií objektov ALL_CLOCKS.
V budúcom pokračovaní ukážeme možnosti ukladania údajov do trvalého úložného priestoru, kde zostanú aj po vypnutí napájania, ako aj bezdrôtovej komunikácie cez bluetooth alebo medzi viacerými Micro:bitmi navzájom.
Zobrazit Galériu