Tento workshop nejde projít jen tak z domu – je potřeba speciální příprava. Pokyny pro organizátory najdeš na podstránce.

Vítej na workshopu MicroPythonu! Dnes si ukážeme, jak programovat – jak říkat počítači, co má dělat. Aktivita je určena lidem, kteří nikdy předtím neprogramovali.

K programování použijeme programovací jazyk. To je způsob, jak počítačům zadávat příkazy – jazyk, kterému rozumí jak počítače, tak lidé (programátoři).

Konkrétně dnes použijeme MicroPython – variantu jazyka Python přizpůsobenou na ovládání malých zařízení.

Laptop použijeme vlastně jen kvůli klávesnici a monitoru; všechno zajímavé se bude dít na té malé destičce, kterou vidíš vedle sebe a ze které vede spousta drátů. (Pro úplnost: je to deska NodeMCU s mikroprocesorem ESP8266.)

Dost povídání, pojďme na to!

Otevření příkazové řádky #

Klikni na Activities; potom vyber z levého panelu Terminal (ikonka černého okýnka).

Objeví se příkazová řádka – černé okýnko s bílým textem, kam můžeš zadávat příkazy.

Otevření komunikačního kanálu #

V příkazové řádce by měl být řádek končící dolarem. Za ten dolar napiš:

picocom -b 115200 /dev/ttyUSB0

Opisuj opatrně, každé písmenko má smysl! Pak zmáčkni Enter. Měl by se objevit následující výpis:

picocom v1.7

port is        : /dev/ttyUSB0
flowcontrol    : none
baudrate is    : 115200
parity is      : none
databits are   : 8
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : no
nolock is      : no
send_cmd is    : sz -vv
receive_cmd is : rz -vv
imap is        : 
omap is        : 
emap is        : crcrlf,delbs,

Terminal ready

Pak stiskni Enter. Měly by se objevit tři zobáčky, kterými MicroPython prosí o instrukce:

>>>

Kalkulačka #

Za tři zobáčky můžeš zadat nějaký matematický příklad. MicroPython ho spočítá. Zkus třeba tyhle (zobáčky nepiš, ty vypíše sám MicroPython:

>>> 1 + 1

>>> 1 - 5

>>> 3 * 3

>>> 1 / 4

>>> (84 + 5) * 100

Poznáš co dělá hvězdička nebo lomítko? Tipneš si, proč programátoři používají tyhle symboly, a ne třeba 3 × 3 nebo ¼?

Věděl/a jsi, že v Americe používají desetinnou tečku místo čárky? Většina programovacích jazyků ji používá taky.

Světýlko #

MicroPython na našich destičkách má připravený objekt led, jehož metodou value jde ovládat svítící dioda. Stačí jen zadat správné příkazy:

>>> led.value(1)
>>> led.value(0)

Tlačítko #

K destičce je připojeno i tlačítko. Metodou btn.value() se zeptáš, jestli je právě zmáčknuté, nebo ne.

>>> btn.value()

Zkus tenhle příkaz zadat, zatímco tlačítko držíš.

Výrazy #

Informace o tom, jestli je tlačítko zmáčknuté – btn.value() – je číslo: buď 0, nebo 1. Výraz btn.value() můžeš použít kdekoliv, kde se objevuje číslo 0, nebo 1 – třeba pro rozsvícení nebo zhasnutí diody:

>>> led.value(btn.value())

Cyklus #

Existuje způsob, jak nechat MicroPython něco opakovat stále dokola: takzvaný nekonečný cyklus. Na jeden řádek napiš while True: (s velkým T a dvojtečkou na konci) a potom tělo cyklu – příkaz, který se má provést. MicroPython tělo cyklu automaticky odsadí – přidá na začátek řádku mezery. Ty mezery nemaž.

Nakonec několikrát stiskni Enter, dokud se program nespustí.

>>> while True:
...     led.value(btn.value())
...
...

Nekonečný cyklus se opakuje donekonečna. Je ale způsob jak ho přerušit, až tě omrzí: zmáčkni Ctrl+C.

Motorek #

Další objekt, který můžeš použít, je servo. Ten ovládá servomotor, který můžeš nastavit na konkrétní úhel. Třeba:

>>> servo.duty(120)
>>> servo.duty(40)

... nebo něco mezi tím.

Nepoužívej prosím čísla menší než 40 nebo větší než 120, motorek se tím může ničit.

Matematika #

Před chvílí jsme si ukázali tento kód:

>>> led.value(btn.value())

Hodnota btn.value() může být buď 1, nebo 0. Pojďme ji použít pro motorek: chceme, aby se natočil buď na 40 nebo na 120, podle toho, jestli je tlačítko zmáčknuté.

Na to, abys z 0 nebo 1 udělal/a 40 nebo 120, je potřeba znát trochu matematiky:

  • X + 0 × Y = 40
  • X + 1 × Y = 120

Jistě zvládneš vypočítat, že X = 40 a Y = 80. Tyhle hodnoty doplnit do kódu:

>>> servo.duty(40 + btn.value() * 80)

Změníš program tak, aby se natáčel na 50 nebo 90?

Dokážeš výsledek dát do cyklu, aby program na zmáčknutí či puštění tlačítka reagoval automaticky?

Barvy #

Poslední věc připojená k destičce je LED pásek s několika světýlky. Každé z nich se dá nastavit na nějakou barvu. Zkus si to:

>>> strip[0] = RED
>>> strip[1] = GREEN
>>> strip[2] = BLUE
>>> strip.write()

První tři příkazy připravují jednotlivé barvy a poslední všechno připravené pošle do LED pásku. Až budeš experimentovat, nezapomeň na strip.write() – bez toho se barvy neukážou.

Program #

Teď si přestaneme jen tak hrát a začneme psát program.

Spusť editor: Klikni na Activities; potom vyber z levého panelu Text Editor (ikonka zápisníku s tužkou).

Objeví se bílé okýnko, do kterého napiš:

strip[0] = WHITE
strip[1] = OFF
strip[2] = OFF
strip.write()

Soubor ulož (Save) pod jménem main.py.

Potom se vrať k příkazové řádce a ukonči picocom: stiskni Ctrl+A a pak Ctrl+Q. Měl by se objevit řádek končící dolarem.

Za dolar napiš:

ampy -p /dev/ttyUSB0 run main.py

... a stiskni Enter. Tento příkaz soubor s programem do zařízení nahraje a rovnou spustí.

Zkus v editoru nastavit jiné barvy a program znovu uložit (Ctrl+S).

Potom v příkazové řádce zmáčkni šipku nahoru . Tím se vrátíš k předchozímu příkazu (ampy) a můžeš znovu stisknout Enter a program spustit.

Blikání #

Tady je program, který rozbliká LED pásek. Ukazuje větší cyklus, a navíc funkci sleep, která MicroPython na chvíli zdrží: sleep(1/4) čeká čtvrtinu sekundy.

Při přepisování dávej pozor na odsazení – řádky vevnitř v cyklu musí být všechny odsazené o čtyři mezery.

strip[0] = OFF
strip[1] = OFF
strip[2] = OFF

while True:
    strip[0] = RED
    strip[1] = OFF
    strip.write()
    sleep(1/4)

    strip[0] = OFF
    strip[1] = RED
    strip.write()
    sleep(1/4)

Semafor #

Dokážeš naprogramovat semafor?

Se závorou?

Cyklus s podmínkou #

Cykly nemusí být jen nekonečné. Tady je cyklus, který čeká dokud není stisknuté tlačítko.

Potom se rozsvítí světlo – všimni si, že příkaz led.value(1) už není odsazený. Není součást cyklu.

led.value(0)

while btn.value():
    sleep(1/100)

led.value(1)

Alarm #

Polož na tlačítko nějaký těžší předmět (třeba myš) tak, aby bylo zmáčknuté. Když někdo předmět vezme, tlačítko přestane být zmáčknuté.

Napiš program, který na to bude čekat a jakmile někdo myš ukradne, LED pásek začne zuřivě blikat.

Konec? #

Tím dnešní krátká exkurze do světa MicroPythonu končí. Jestli tě programování zaujalo a chceš v něm pokračovat, dej nám vědět!

Nebo pak z klidu domova napiš Petrovi na pviktori@redhat.com.