Programovanie Micro:bitu v jazyku Python – 2 časť

Obsluha hardvéru a súbory

V predchádzajúcej časti sme začali tému programovania mikropočítačovej dosky dosky Micro:bit v populárnom jazyku Python zameranú na implementačné detaily a obsluhu hardvéru. Môžete použiť webový nástroj na adrese, vtedy nebudete musieť na lokálny počítač nič inštalovať, alebo nástroj Mu-editor.

Väčšina príkladov z tohoto článku aj z predchádzajúcej časti je ukázaná vo videu.

Piny zbernice a PWM

Vstupno-výstupné piny zbernice, z ktorých mnohé majú aj alternatívne funkcie sa adresujú ako microbit.pin0 – microbit.pin20.

Piny 0,1 a 2 majú zapojené 10 Mega ohmové rezistory na + 3.3V aby fungovali ako dotykový senzor. Funguje to tak, že jednou rukou chytíte pin GND a prstom druhej ruky pin 0,1, alebo 2.  Na piny 5 a 11 sú pripojené rezistory 10 K, aby mohli fungovať tlačidlá A a B. Niektoré piny zbernice, konkrétne 3, 4, 6, 7, 9. a 10 sa využívajú aj pre displej. Ak ich chcete využiť na iný účel, je potrebné vypnúť displej príkazom microbit.display.off(). V tomto príklade využijeme dotyk kontaktných plôšok prstom. Či sa človek dotýka, alebo nedotýka pinu sa dá zistiť príkazom is_touched(), ktorý vracia hodnoty True, alebo False.

from microbit import *
while True:
    if pin0.is_touched():
        display.show(Image.HAPPY)
    else:
        display.show(Image.SAD)

Ak je pin nastavený ako digitálny vstupný, úroveň napätia a tým aj logická hodnota sa číta pomocou príkazu read_digital().Príkaz vracia hodnoty 0, alebo 1.

from microbit import *
while True:
    if pin0.read_digital():
        display.show(Image.HAPPY)
    else:
        display.show(Image.SAD)

Hodnotu na príslušnom pine nastavujete príkazom write_digital(parameter), kde parameter môže nadobudnúť hodnoty 0, alebo 1.

from microbit import *
while True:
    pin0.write_digital(1)
    sleep(500)
    pin0.write_digital(0)
    sleep(500)

Pokiaľ využívate piny v analógovom móde, tak na čítanie sa použije príkaz read_analog(), pričom napäťovému rozsahu na vstupe 0 – 3.3 V budú zodpovedať hodnoty od 0 do 1023.

Na pine síce môžete nastaviť aj analógovú hodnotu write_analog(parameter), avšak tá sa prejaví ako PWM signál, čiže priebeh signálu z pulzne ší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

from microbit import *
while True:
   pin0.write_analog(1023)
   sleep(2000)
   pin0.write_analog(767)
   sleep(2000)
   pin0.write_analog(511)
   sleep(2000)
   pin0.write_analog(255)
   sleep(2000)

Na obrázku sú tri priebehy signálu so šírkovou moduláciou:

  • Prvý by bol generovaný write_analog (511), pretože má presne 50% periódu – polovicu času každej periódy je na pine napätie 3.3 a polovicu času úroveň GND. Výsledkom toho je, že celková energia tohto signálu je rovnaká, ako keby bola nastavená na 1,65V namiesto 3,3V.
  • Druhý signál má 25% pracovný cyklus a môže byť generovaný pomocou write_analog (255). Má podobný účinok, ako keby bol na tomto pine trvale napätie 0,825V.
  • Tretí signál má 75% pracovný cyklus a je generovaný pomocou write_analog (767). Má trikrát toľko energie, ako druhý signál, a je ekvivalentný napätiu 2,475V.
  • 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ým príkladom sú LED diódy.

PWM s presnou šírkou impulzu sa často využíva na ovládanie uhla natočenia servomotorov alebo na riadenie výkonu jednosmerných motorov, napríklad v dronoch. Preto je potrebné 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). U mikrosekúnd je minimálna hodnota 256µs. Pre servomotory sa využíva frekvencia PWM signálu 50 Hz, čo je 20 milisekúnd.

Zapojenie servomotora

Servomotory a jednosmerné motory je možné pripojiť aj cez prídavnú dokku

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)
 

Zvuk

Ak pripojíte medzi piny 0 a GND malý reproduktor, môžete na ňom generovať tóny. Zdôrazňujem reproduktor a nie bzučiak, pretože bzučiak keď sa naň privedie napätie generuje len jeden tón. Prípadne môžete priebežne meniť frekvenciu tónu.

Na obrázku je reproduktor zo súpravy Grove.

from microbit import *
import music
while True:
    for freq in range(880, 1760, 16):
       music.pitch(freq, 6)
    for freq in range(1760, 880, -16):
       music.pitch(freq, 6)

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.

Alebo môžete pomocou tónov 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)

alebo zjednodušene:

from microbit import *
import music
tune = ["C4:4", "D", "E", "C", "C", "D", "E", "C", "E", "F", "G:8",
       "E:4", "F", "G:8"]
music.play(tune)

Meranie teploty

Doska micro:bit má integrovaný senzor teploty, takže urobiť z micro:bitu teplomer, ktorý bude ukazovať teplotu na displeji (pomocou vodorovného skrolovania) je hračka.

from microbit import *
while True:
   teplota = temperature()
  display.scroll(str(teplota) + 'C')
  sleep(500)

Akcelerometer 

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 hladnú, 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 kvôli jednoduchšej implementácie nie je 1/1000, ale 1/1024. Takže gravitačné zrýchlenie v osi Z má hodnotu 1024 mili-g.

Na zobrazenie hodnút zrýchlenia v jednotlivých osiach môžete použiť kód:

from microbit import *
while True:
    x = accelerometer.get_x()
    y = accelerometer.get_y()
    z = accelerometer.get_z()
   print("x, y, z:", x, y, z)
   sleep(500)

Ak držíte dosku micro:bit pokojne bez chvenia LED diódami nahor hodnoty zrýchlenia X a Y sú okolo nuly a zrýchlenie Z je priblične -1024. To vám povie, že gravitácia pôsobí smerom nadol voči doske. Ak dosku otočíte LED diódami nadol mela by sa hodnota zmeniť na +1024 mili-g. Ak budete triasť s doskou dosť silne, 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 naklonenia:

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 akcelerometer je pomerne citlivý, je v príklade v podmienke tolerancia. Ak je hodnota zrýchlenia medzi -20 a 20 mili-g, nepovažuje sa to ešte za pohyb, ale toleranciu merania.

Gestá

Doska BBC 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á 3g, 6g a 8g 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

Senzor magnetického poľa umožňuje zistiť polohu vzhľadom k svetovým stranám. Pred odčítaním musíte elektronický kompas kalibrovať, inak následné merania nebudú presné. Metóda compass.calibrate()spustí mini- hru 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])

Údaje v súboroch

Aj pre malý mikroprocesorový systém je užitočné mať možnosť ukladať údaje do trvalého úložného priestoru, čiže do takého typu pamäti, kde zostanú aj po vypnutí napájania. MicroPython na platforme micro:bit podporuje jednoduchý súborovým systém uložený v pamäti typu flash, teda tam, kde je aj programový kód. Na ukladanie je k dispozícii približne 30 kilobajtov. Na pripomenutie, Microbit má 256 kB flash pamäti a 16 kB pamäti RAM. Pri nahrávaní kódu v HEX súbore ste si určite všimli, že micro:bit pripojený cez USB sa voči počítaču tvári ako USB kľúč. Súbory ktoré vytvoríte a budete do nich zapisovať údaje však v tejto pripojiteľnej jednotke nebudú. Súborový systém na doske micro:bit je jednoduchý, takže nie je možné organizovať súbory do zložiek.

V prvom príklade uložíme do súboru nejaké údaje, pre jednoduchosť krátky text. Príkaz open() otvorí, alebo ak nie je zatiaľ vytvorený, tak vytvorí súbor súboru a priradí ho k objektu.  Všimnite si, že parameter ‚w‘ sa používa na nastavenie objektu subor do režimu zápisu. Na nastavenie režimu čítania sa používa parameter ‚r‘, toto je zároveň implicitné nastavenie.

V príklade funkcia otvorí (vytvorí) súbor s názvom udaje.txt a priradí ho k objektu subor. Následne sa v bloku kódu odsadenom pod príkazom with použije objekt subor na zápis.

from microbit import *
with open('udaje.txt', 'w') as subor:
    subor.write("Lorem ipsum")

V ďalšom príklade tieto údaje prečítame a zobrazíme. Do objektu text sa priradí obsah načítaný zo súboru. Všimnite si, že riadok obsahujúci príkaz print() nie je odsadený. Blok kódu priradený k príkazu with je len jeden riadok, ktorý číta súbor. Akonáhle je blok kódu zatvorený, Python automaticky zatvorí súbor.

from microbit import *
with open('udaje.txt') as subor:
    text = subor.read()
   display.scroll(text)

Podobne ako v klasických operačných systémoch aj Python na doske micro:bit dokáže so súbormi aj manipulovať, prípadne vypísať ich zoznam. Na to slúži modul os.

Na zobrazenie zoznamu súborov sa používa funkcia listdir().

from microbit import *
import os
with open('udaje.txt', 'w') as subor:
   subor.write("Lorem ipsum")
with open('pokus.bin', 'w') as subor:
   subor.write("Lorem ipsum")
subory = os.listdir()
display.scroll(str(subory))

príkazom print () vypíšete zoznam súborov do konzoly vývojového prostredia.

from microbit import *
import os
with open('udaje.txt', 'w') as subor:
   subor.write("Lorem ipsum")
with open('pokus.bin', 'w') as subor:
   subor.write("Lorem ipsum")
subory = os.listdir()
print(str(subory))

na vymazanie súboru je určený príkaz remove():

from microbit import *
import os
os.remove('pokus.bin')

veľkosť súboru zistíte príkazom:

from microbit import *
import os
with open('udaje.txt', 'w') as subor:
   subor.write("Lorem ipsum")
velkost = os.size('udaje.txt')
print(str(velkost))

V treťom pokračovaní sa budeme venovať komunikácii cez bluetooth a zabudovaný rádiový modem.