====== MicroPython a IoT ======
===== Úvod =====
**Embedded system**, vestavěný systém (zabudovaný systém) je jednoúčelový systém, ve kterém je řídicí počítač zcela zabudován do zařízení, které ovládá. Jestliže zařízení mezí sebou komunikuji, může tvořit základ IoT.
**Internet věcí (anglicky Internet of Things, zkratka IoT)** je v informatice označení pro síť fyzických zařízení, vozidel, domácích spotřebičů a dalších zařízení, která jsou vybavena elektronikou, softwarem, senzory, pohyblivými částmi a síťovou konektivitou, která umožňuje těmto zařízením se propojit a vyměňovat si data. Každé z těchto zařízení je jasně identifikovatelné díky implementovanému výpočetnímu systému, ale přesto je schopno pracovat samostatně v existující infrastruktuře internetu.
==== BBC micro:bit ====
BBC micro:bit je mikropočítač, který vznikl v britském univerzitním prostředí jako výuková platforma. V roce 2016 byl tento kit rozdán zdarma všem žákům 7. tříd (11-12let) ve Velké Británii. Po doplnění vnějšími obvody může měřit fyzikální veličiny, sbírat data nebo ovládat rozličné akční členy (elektromotorky, serva atd.) a je tedy vhodným prvkem pro zapojení do internetu věcí (IoT).
Micro:bit je založen na obvodu SoC (system on a chip) firmy Nordic nRF51822 s 32‑bitovým procesorovým jádrem ARM Cortex‑M0 a komunikačním rozhraním Bluetooth. Obsahuje 256 kB paměti Flash a 16 kB paměti SRAM.
{{ :courses:pri-bootcamp:microbithardware.png?690 |}}
==== Programování BBC micro:bit ====
- Blocks - Javascript: https://makecode.microbit.org
- C: https://www.mbed.com/en/platform/
- **Python - on-line editor:** https://python.microbit.org, dokumentace: https://microbit-micropython.readthedocs.io
- Python - Mu IDE: Code With Mu https://codewith.mu
- Python - Thonny IDE: https://thonny.org
**MicroPython** je (re)implementace Python pro zabudované zařízení. Implementovaná s limitovanou množinou knihoven. Podporované platformy najdete např. zde: https://www.bc-robotics.com/product-tag/micropython/
Více informace o MicroPython: https://micropython.org.
----
==== Text a obrázky na matici LED ====
=== Úkol 1 ===
== Zobrazte na matici LED např. text "Ahoj lidi!" nebo smajlíka! ==
Názvy hotových ikon najdete zde: https://microbit-micropython.readthedocs.io/en/latest/tutorials/images.html
----
=== Úkol 2 ===
== Pomocí cyklu zobrazte odpočítání 9 až 0 v sekundových intervalech! ==
Inspiraci můžete čerpat z následujícího kódu:
from microbit import *
# Text...
display.scroll('Hello!')
# ...obrázek...
display.show(Image.HEART)
sleep(2000)
# ...znak...
display.show('Q')
sleep(2000)
# ...a číslo
a = 6
display.show(str(a))
----
=== Úkol 3 ===
== Rozsvěcujte a zhasínejte jednotlivé LED-y! ==
Co bude výsledek běhu následujícího programu?
from microbit import *
from random import *
display.clear()
while True:
display.set_pixel(randint(0, 4), randint(0, 4), 9)
sleep(700)
display.set_pixel(randint(0, 4), randint(0, 4), 0)
sleep(700)
Jak změníme kód aby se vždy rozsvítilo jen **jeden** náhodný bod?
----
=== Navrhujeme ikony ===
Zkuste odhadnout, co definuje znakový řetězec - parametr použitý při vytvoření instance Image
from microbit import *
okno = Image('99999:90909:99999:90909:99999')
display.show(okno)
----
=== Úkol 4 ===
== Vytvořte ikony - jednotlivé strany hrací kostky zobrazující 1 až 6 bodů! ==
----
==== Animace ====
from microbit import *
# hotový seznam obrázků
display.show(Image.ALL_CLOCKS, loop=True, delay=100)
from microbit import *
# seznam obrázků
smileys = [Image.HAPPY, Image.ANGRY, Image.SAD, Image.CONFUSED, Image.ASLEEP]
display.show(smileys, loop=True, delay=200)
----
=== Úkol ===
== Zobrazte na matici LED jednoduchou animaci! ==
----
==== Tlačítka - ovládání ====
Příklad kódu:
from microbit import *
while True:
if button_a.is_pressed():
display.show(Image.HAPPY)
elif button_b.is_pressed():
break
else:
display.show(Image.SAD)
display.clear()
----
=== Úkol 1 ===
== Na matici LED zobrazte světelný bod. Po stisknutí tlačítka A resp. B ho posuňte doleva resp. doprava! Po stisknutí obou tlačítek posuňte bod doprostřed. ==
----
=== Úkol 2 ===
== Naprogramujte hru kámen, nůžky a papír - nechť po stisknutí tlačítek A, B a současně A i B se zobrazí jedna ze třech ikon. ==
----
==== Zvuky ====
Samotná destička micro:bit není schopen vydávat zvuky. Budeme tedy potřebovat přídavnou desku s piezoměničem
Nejjednodušším způsobem je rychlé střídání logických úrovní na výstupu 0.
from microbit import *
while True:
pin0.write_digital(1)
sleep(10)
pin0.write_digital(0)
sleep(100)
Jednodušší je ovšem použít knihovnu ''music'' a nastavit přímo frekvenci...
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)
...nebo definovat melodii pomocí hudební notace:
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)
sleep(1000)
music.play(music.PRELUDE)
Názvy „hotových“ melodií najdete zde: https://microbit-micropython.readthedocs.io/en/latest/tutorials/music.html
----
==== Vstup - ovládání dotykem ====
from microbit import *
while True:
if pin0.is_touched():
display.show(Image.HAPPY)
else:
display.show(Image.SAD)
----
=== Úkol ===
== Reagujte na dotyk plošek 0, 1 a 2 přehráváním různých tónů! Dotýkáme se nejlépe kovovým předmětem, druhá ruka je spojena s GND. ==
----
==== Senzor sklonu ====
Zkuste odhadnout výsledek běhu následujících kódů.
from microbit import *
while True:
reading = accelerometer.get_x()
if reading > 20:
display.show("R")
elif reading < -20:
display.show("L")
else:
display.show("-")
from microbit import *
while True:
reading = accelerometer.get_x()
if reading > 20:
display.show("R")
elif reading < -20:
display.show("L")
else:
display.show("-")
from microbit import *
import music
while True:
acc = abs(accelerometer.get_y()) # pitch nechce zaporne hodnoty
music.pitch(acc, 10)
----
=== Úkol ===
== Dokážete vyrobit vodováhu? ==
----
==== Gesta ====
from microbit import *
while True:
gesture = accelerometer.current_gesture()
if gesture == "face up":
display.show(Image.HAPPY)
else:
display.show(Image.ANGRY)
Názvy gest najdete zde: https://microbit-micropython.readthedocs.io/en/latest/tutorials/gestures.html
----
=== Úkol ===
== Naprogramujte simulaci hrací kostky - po zatřesení ("shake") zobrazte náhodně ikonu bodů 1-6! ==
----
==== Senzor teploty ====
Neposkytuje úplně přesný údaj - měří teplotu čipu.
from microbit import *
while True:
temp = temperature()
display.scroll(str(temp) + 'C')
sleep(500)
----
=== Úkol ===
== Dokážete naprogramovat alarm hlídající překročení teploty? ==
----
==== Kompas ====
from microbit import *
compass.calibrate()
while True:
display.scroll(compass.heading())
----
==== Rádio ====
from microbit import *
import radio
radio.on()
radio.config(channel=19, power=7) # 0-100, 0-7
while True:
radio.send("Pingu vola zakladnu!")
incoming = radio.receive()
if incoming:
display.show(incoming)
sleep(500)
----
=== Úkol ===
== Naprogramujte vysílání (a příjem) zprávy v případě události jako otřes, změna osvětlení, teploty atd...! ==
----
==== Programováni pohybu robota ====
V dalších úkolech budeme ovládat motory robotického vozítka prostřednictvím desky moto:bit. Abychom vyhnuli složitosti ovládání (děje se přes rozhraní I2C) budeme používat hotovou knihovnu. Tuto knihovnu (můžeme ho stáhnout {{ :courses:pri-bootcamp:motobit.py | zde}} ) přidáme do seznamu souborů k zaslání do micro:bit podle následujícího obrázku:
{{ :courses:pri-bootcamp:microbitproject.png?690 |}}
Pomocí tlačítka ''Add file'' přidáme soubor ''motobit.py'' do seznamu, kde se už nachází soubor z editoru, označený jakou ''main.py'', tj. kód, který se bude přímo spouštět.
Pokud do robota nahráváte program, jež bude spouštět motory, tj. robot se bude pohybovat, nechte vypínač na desce moto:bit v levé, vypnuté poloze, a zapínejte ho, až je robot odpojen od kabelu USB a položen na místo, kde má dostatečný prostor pro pohyb.
V záhlaví, hned pod kódem moto:bit uvedeme následující příkazy:
from microbit import *
import motobit
moto = motobit.MotoBit()
moto.enable()
leftMotor = moto.left_motor()
rightMotor = moto.right_motor()
které nám inicializují ovládání motorů a poskytnou proměnné „leftMotor“ a „rightMotor“, které pak použijeme k nastavení jejich rychlosti a směru otáčení.
Na konci programu napíšeme:
moto.disable()
ke korektnímu ukončení práce s moto:bit.
Nyní se dostáváme k nejjednodušší části, tj. k vlastnímu ovládání motorů. Budeme používat funkce typu:
leftMotor.forward(25)
rightMotor.reverse(60)
Kde název funkce „forward“ nebo „reverse“ znamená směr otáčené motoru, parametr v závorkách pak rychlost otáčení (od -100 do 100, přičemž záporné hodnoty znamenají otáčení opačným směrem). Směry „forward“ nebo „reverse“ nejsou jasně definované, je třeba určit, kde má robot „předek“ (obvykle v místě třech senzorů odraženého světla - červených obdélníčků - na spodní straně vozíku).
----
==== Dálkové ovládání vozítka pomocí rádia ====
Jak už víme, micro:bit disponuje zabudovaným rádiem, pomocí kterého můžeme naprogramovat „autíčko“ na dálkově ovládání.
----
=== Úkol 1. ===
== Naprogramujme micro:bit (spojený s napájecí deskou mi:power) jako vysílač! ==
Abychom mohli použít rádio, v záhlaví kódu uvedeme:
from microbit import *
import radio
radio.on()
pak vytvoříme nekonečnou smyčku s krátkým čekáním, například takto:
while True:
# sem napiseme svuj kod
sleep(10)
a doplníme kód na vysílání příkazů, jako například „levý motor dopředu“ nebo „pravý motor dozadu“ apod. Prvním úkolem je tyto příkazy - včetně kódů, které se budou přenášet rádiem - vymyslet.
Příklad příkazů a jednotlivých kódů:
| Význam | Kód přenášený rádiem |
| pravý i levý motor dopředu | „F“ |
| pravý i levý motor dozadu | „B“ |
| pravý motor dopředu | „R“ |
| levý motor dopředu | „L“ |
| pravý motor dozadu | „Q“ |
| levý motor dozadu | „K“ |
Výše uvedený způsob ovládání slouží pouze jako inspirace. Vymyslete si vlastní příkazy, umožňující například ovládat i rychlost pohybu vozítka! Jinak hrozí, že jiné skupiny studentů začnou ovládat vaše vozítko!
K ovládání, tedy k vyvolání jednotlivých příkazů můžeme použít tlačítka micro:bit, například:
if button_a.is_pressed():
nebo gesta (up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, shake) např.:
if accelerometer.is_gesture("up"):
či přímo míru náklonu podle akcelerometru:
naklonDopreduDozadu = accelerometer.get_y()
řídit rychlost pohybu.
Mále-li rozmyšlené ovládání, kód sestavíme snadno: jako reakce na určitou událost (stisk tlačítka, naklonění destičky, atd.) vyšleme rádiem určený kód. Abychom usnadnili hledání chyb, můžeme kód ukázat i na displeji.
Fragment kódu, ilustrující výše uvedený přístup:
command = ' ' # nic nedelej
if button_a.is_pressed() and button_b.is_pressed():
command = 'F' # jdi dopredu
# dalsi kod...
display.show(command)
radio.send(command)
----
=== Úkol 2. ===
== Naprogramujme micro:bit (ovládající motory) jako přijímač! ==
Do hotového kódu na ovládání motorů přidáme řádek zapínající rádio a nekonečnou smyčku s krátkou prodlevou, přijímající vyslané signály. Máme zde opět řádku, zobrazující přijatý příkaz, ten poslouží při hledání chyb.
Fragment kódu, přijímače:
from microbit import *
import motobit
import radio
moto = motobit.MotoBit()
moto.enable()
l = moto.left_motor()
r = moto.right_motor()
radio.on()
while True:
command = radio.receive()
if command:
display.show(command)
else:
display.clear()
# zde budeme ovladat motory na zaklade prijateho kodu
sleep(10)
----
Možné řešení (jeho úplná funkčnost závisí na mechanickém uspořádání vozítka)
{{ :courses:pri-bootcamp:rcontrol.py | Kompletní kód vysílače dálkového ovládání }}
{{ :courses:pri-bootcamp:rreceiver.py | Kompletní kód přijímače dálkového ovládání }}
----
==== Robot - sledovač čáry ====
Roboti se můžou pohybovat i samostatně, na základě dat získaných ze senzorů.
----
=== Úkol ===
== Zkusme sestavit jednoduchý sledovač černé čáry! ==
Nápad je prostý: senzor odraženého světla je nasměrován na podložku. Je-li podložka světlá, odrazí se více světla, a tedy senzor naměří vyšší hodnoty, než když je podložka tmavá. K tomu, abychom sledovali levý okraj černé čáry na bíle podložce pak postačí následující:
Robot jede pomalu dopředu. Naměří-li vysokou hodnotu odrazu, otáčí se lehce doprava, naopak, je-li hodnota odrazu příliš nízká (senzor je nad černou čarou) robot se bude otáčet mírně doleva.
Co je vysoká a nízká hodnota odrazu? micro:bit nám poskytuje naměřenou hodnotu osvětlení od 0 do 1023. Hodnotu „hranice“ tj. prahovou hodnotu, nad kterou budeme považovat podložku za světlou a pod kterou za tmavou, si musíme určit experimentálně, například kódem:
from microbit import *
while True:
display.scroll(str(pin0.read_analog()))
sleep(10)
Levý senzor postupně umísťujeme nad černou plochu čáry a nad bílou podložku, následně spočítáme průměry různě naměřených hodnot „světlé“ a „tmavé“. Prahovou hodnotu pak určíme jako průměr „světlé“ a „tmavé“.
V následujícím kódu používáme prahovou hodnotu 700:
Fragment kódu přijímače:
# knihovni kod moto:bit
# ...
# ===========...
from microbit import *
THRESHOLD = 700
moto = motobit.MotoBit()
moto.enable()
l = moto.left_motor()
r = moto.right_motor()
while True:
# POUZE PRO LADENI: display.scroll(str(pin0.read_analog()))
if pin0.read_analog() > THRESHOLD:
display.show(Image.ARROW_W)
r.reverse(40)
l.forward(10)
else:
display.show(Image.ARROW_E)
r.forward(10)
l.reverse(40)
sleep(10)
Zkuste, jestli Vám tento kód zajistí spolehlivé sledování čáry. Dokážete vylepšit kód a zrychlit robota - sledovače čáry?
Všímejte si, že k řešení úkolu používáme pouze jeden senzor. Pro více senzorů musíme navrhnout jiný algoritmus. Dokázali byste vymyslet a naprogramovat kód pro sledování tenké černé čáry dvěma senzory?
----
Možné řešení (jeho úplná funkčnost závisí na mechanickém uspořádání vozítka)
{{ :courses:pri-bootcamp:motobitfollowersinglefile.py | Kompletní kód sledovače čáry }}
----