From 539460f04b3a90608df6dd20457b2e3050d3574c Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Mon, 23 Apr 2018 13:42:37 +0200 Subject: [PATCH 1/7] Micropython materials in separated files per topic and/or HW --- lessons/micropython/micropython/ampy.md | 67 + lessons/micropython/micropython/flashing.md | 29 + lessons/micropython/micropython/index.md | 87 + lessons/micropython/micropython/info.yml | 26 + lessons/micropython/micropython/input.md | 33 + lessons/micropython/micropython/install.md | 126 + lessons/micropython/micropython/intro.md | 60 + lessons/micropython/micropython/output.md | 129 + lessons/micropython/micropython/piezo.md | 34 + lessons/micropython/micropython/pwm.md | 100 + lessons/micropython/micropython/rest.md | 104 + lessons/micropython/micropython/rgb%leds.md | 55 + lessons/micropython/micropython/servo.md | 93 + lessons/micropython/micropython/socket.md | 33 + .../micropython/static/circuits/led.fzz | Bin 0 -> 32066 bytes .../micropython/static/circuits/led_bb.svg | 4537 +++++++++++++++++ .../static/circuits/led_bb_off.svg | 4528 ++++++++++++++++ .../micropython/static/nodemcu-devkit.jpg | Bin 0 -> 39363 bytes .../micropython/static/nodemcu-popisky.svg | 2911 +++++++++++ .../micropython/micropython/static/noty.py | 8 + .../micropython/static/putty-config.jpg | Bin 0 -> 38324 bytes lessons/micropython/micropython/switch.md | 12 + .../micropython/micropython/thermometer.md | 49 + lessons/micropython/micropython/webrepl.md | 49 + 24 files changed, 13070 insertions(+) create mode 100644 lessons/micropython/micropython/ampy.md create mode 100644 lessons/micropython/micropython/flashing.md create mode 100644 lessons/micropython/micropython/index.md create mode 100644 lessons/micropython/micropython/info.yml create mode 100644 lessons/micropython/micropython/input.md create mode 100644 lessons/micropython/micropython/install.md create mode 100644 lessons/micropython/micropython/intro.md create mode 100644 lessons/micropython/micropython/output.md create mode 100644 lessons/micropython/micropython/piezo.md create mode 100644 lessons/micropython/micropython/pwm.md create mode 100644 lessons/micropython/micropython/rest.md create mode 100644 lessons/micropython/micropython/rgb%leds.md create mode 100644 lessons/micropython/micropython/servo.md create mode 100644 lessons/micropython/micropython/socket.md create mode 100644 lessons/micropython/micropython/static/circuits/led.fzz create mode 100644 lessons/micropython/micropython/static/circuits/led_bb.svg create mode 100644 lessons/micropython/micropython/static/circuits/led_bb_off.svg create mode 100644 lessons/micropython/micropython/static/nodemcu-devkit.jpg create mode 100644 lessons/micropython/micropython/static/nodemcu-popisky.svg create mode 100644 lessons/micropython/micropython/static/noty.py create mode 100644 lessons/micropython/micropython/static/putty-config.jpg create mode 100644 lessons/micropython/micropython/switch.md create mode 100644 lessons/micropython/micropython/thermometer.md create mode 100644 lessons/micropython/micropython/webrepl.md diff --git a/lessons/micropython/micropython/ampy.md b/lessons/micropython/micropython/ampy.md new file mode 100644 index 0000000000..c7d838bfe4 --- /dev/null +++ b/lessons/micropython/micropython/ampy.md @@ -0,0 +1,67 @@ +## Práce se soubory + +Jak začneš psát trochu složitější programy, +mohlo by se stát, že tě konzole MicroPythonu začne trochu štvát. +Špatně se v ní opravují chyby a automatické odsazování funguje jen většinou. +Pojďme se podívat, jak naštvání předejít. + +Nejdřív si do virtuálního prostředí nainstaluj program Ampy od Adafruitu. + +```console +(env)$ python -m pip install adafruit-ampy +``` + +Doporučuji si větší kousky kódu – a určitě takové, +ve kterých je nějaký cyklus, podmínka či funkce – +psát v textovém editoru a do modulu pak posílat celý soubor. + +Zkus si to. Do souboru `blikajici_led.py` dej následující kód: + +```python +from machine import Pin +from time import sleep +pin_diody = Pin(14, Pin.OUT) +while True: + pin_diody.value(0) + sleep(1/2) + pin_diody.value(1) + sleep(1/2) +``` + +Potom zavři konzoli (`picocom`, PuTTY nebo `screen`). + +Ke spuštění budeš potřebovat znát port: + +* Linux: port používáš v příkazu `picocom`, např. `/dev/ttyUSB0` +* Windows: port používáš v PuTTY, např. `COM13` +* macOS: port používáš v příkazu `screen`, např. `/dev/tty.usbmodem*` + +`ampy` spusť následujícím příkazem, jen za `PORT` doplň svůj port: + +```console +(venv)$ ampy -p PORT run blikajici_led.py +``` + +Program by měl blikat diodou. +Využívá k tomu funkci `time.sleep()`, která počká daný počet vteřin – +tedy `time.sleep(1/2)` zastaví program na půl sekundy. + +Podobně je možné na destičku soubory i nahrávat, jen je potřeba místo +`run` použít `put`. + +```console +(venv)$ ampy -p PORT put blikajici_led.py +``` + +Pokud navíc budeme chtít, aby se program na destičce automaticky spouštěl, musí +se soubor s programem na destičce jmenovat `main.py`. `ampy` umí soubor při +kopírování i přejmenovat, když mu při kopírování zadáme i druhé (nové) jméno. + +```console +(venv)$ ampy -p PORT put blikajici_led.py main.py +``` + +Po úspěšném kopírování máme na destičce nahraný náš program ze souboru +`blikajici_led.py` do souboru `main.py`. Teď už bude tvůj program fungovat +i bez počítače, takže stačí destičku připojit např. k powerbance +a dioda se rozbliká. diff --git a/lessons/micropython/micropython/flashing.md b/lessons/micropython/micropython/flashing.md new file mode 100644 index 0000000000..1af76c200d --- /dev/null +++ b/lessons/micropython/micropython/flashing.md @@ -0,0 +1,29 @@ +## Flashování + +Na našich destičkách je MicroPython už nahraný, ale kdyby sis koupil{{a}} +vlastní NodeMCU nebo chtěl{{a}} firmware aktualizovat, budeš ho potřebovat umět +nahrát. + +K tomu je potřeba nástroj `esptool`, který se dá nainstalovat pomocí: + +```console +(env)$ python -m pip install esptool +``` + +Po instalaci esptool si stáhni nejnovější stabilní firmware pro ESP8266 +z [micropython.org/download](http://micropython.org/download#esp8266) a zadej: + +```console +(env)$ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash 0 esp8266-20161110-v1.8.6.bin +``` + +Hodnotu pro `--port` opět doplň podle svého systému – např. `/dev/tty.wchusbserial1420` na Macu, `COM3` na Windows. + +> [note] +> Destiček s čipem ESP8266 se vyrábí celá řada různých typů a některé mohou +> potřebovat odlišné nastavení při flashování. +> Popis všech možností nastavení je k nalezení v [dokumentaci k esptool](https://github.com/espressif/esptool#usage). + +Je-li na desce nahraný MicroPython, tento příkaz by měl fungovat. U jiného +firmware, (případně u poškozeného MicroPythonu), je potřeba při zapojování +destičky do USB držet tlačítko FLASH. diff --git a/lessons/micropython/micropython/index.md b/lessons/micropython/micropython/index.md new file mode 100644 index 0000000000..5a706943f9 --- /dev/null +++ b/lessons/micropython/micropython/index.md @@ -0,0 +1,87 @@ +# MicroPython na malém zařízení + +> [note] Tahle sekce bohužel nejde jednoduše projít z domu. +> Využíváme speciální vybavení, které je potřeba nejdřív +> sehnat. Máš-li možnost se dostat na sraz, nebo +> aspoň kontaktovat organizátory, doporučujeme shánět +> spíš tímto způsobem. +> Případně jde daný hardware objednat přes Internet, +> typicky z čínských e-shopů. + +{{ figure( + img=static('nodemcu-devkit.jpg'), + alt='LoLin NodeMCU v3 – Vývojová deska s čipem ESP8266', + float='right', +) }} + +Dnes budeme programovat malé zařízení – +tak malé, že se ho pohodlně schováš v ruce. +Konkrétně budeme používat „chytrou destičku”, modul zvaný +*NodeMCU Devkit*, která by měla ležet před tebou. +Než ji vyndáš z obalu, měl{{a}} by ses *vybít*: +dotkni se něčeho kovového, co je spojeno se zemí, +třeba radiátoru nebo kovové části schránky nějakého +spotřebiče, který je zapojený do zásuvky. +Tím se zbavíš statické elektřiny, která by mohla +malinké zařízení poškodit. +Pak přístroj vyndej z obalu. Snaž se ho držet za +hrany a příliš se nedotýkat elektroniky a kovových +částí. + +> [note] +> Obal bude nejspíš roztržený, protože organizátoři +> na destičku před začátkem kurzu nainstalovali +> MicroPython. + +> [warning] +> Obal je vodivý a nesmí přijít do styku se zapojenou destičkou, +> protože by mohl zkratovat její vývody a tím ji zničit. +> Proto obal raději hned schovej a používej ho jen k transportu destičky. + +Teď, když destičku držíš v ruce, si +pojďme projít její základní součásti. + +
+ +{{ figure( + img=static("nodemcu-popisky.svg"), + alt='Obrázek desky NodeMCU DevKit', + float='left', +) }} + +Nejdůležitější část vývojové desky je v oplechované +krabičce s logem "Wi-Fi" a "FCC": +mikroprocesor ESP8266. +To je „mozek” celého zařízení, který – když je +správně naprogramován – umí provádět pythonní +příkazy a programy. +Procesor sedí na malé destičce, na které je ještě +anténa, kterou +přístroj může komunikovat s okolím. + +Tahle malá destička se dá použít i samostatně; +všechno ostatní, co kolem ní zabírá tolik místa, +nám jen ulehčí hraní a umožní se zařízením +jednoduše komunikovat a krmit ho elektřinou. + +Komunikace a „krmení” se děje přes +mikro-USB konektor, +do kterého zapojíš kabel ze svého počítače. +Když je modul naprogramovaný, stačí ho místo do +počítače zapojit do nabíječky či externího zdroje +(powerbanky) a bude fungovat samostatně. + +Kolem USB konektoru jsou dvě tlačítka: +RST, kterým se destička restartuje +(skoro jako kdybys ho odpojila a zase zapojila, což +se hodí, když něco uděláš špatně a modul „zamrzne”), +a FLASH, o kterém si povíme později. + +Po stranách modulu jsou dvě řady +„nožiček”, na které +se dá napojit celá řada nejrůznějších hraček. +Zkontroluj si, jestli jsou všechny nožičky rovné; +kdyby byla některá ohnutá, tak ji (nejlépe s pomocí +kouče) narovnej nebo si vezmi jinou destičku. + +
diff --git a/lessons/micropython/micropython/info.yml b/lessons/micropython/micropython/info.yml new file mode 100644 index 0000000000..903f9f3eb1 --- /dev/null +++ b/lessons/micropython/micropython/info.yml @@ -0,0 +1,26 @@ +title: MicroPython +style: md +attribution: +- Pro PyLadies Brno napsal Petr Viktorin, 2016-2017. +- Diagramy s LED vytvořeny pomocí [Fritzing](http://fritzing.org). +license: cc-by-sa-40 +css: | + .part-green { outline: 2px solid hsla(113, 100%, 50%, 1); + background-color: hsla(113, 100%, 50%, 0.25); } + .part-cyan { outline: 2px solid hsla(180, 100%, 50%, 1); + background-color: hsla(180, 100%, 50%, 0.25); } + .part-blue { outline: 2px solid hsla(236, 100%, 50%, 1); + background-color: hsla(236, 100%, 50%, 0.25); } + .part-yellow { outline: 2px solid hsla( 60, 100%, 50%, 1); + background-color: hsla( 60, 100%, 50%, 0.25); } + .part-orange { outline: 2px solid hsla( 42, 100%, 50%, 1); + background-color: hsla( 42, 100%, 50%, 0.25); } + .part-red { outline: 2px solid hsla( 0, 100%, 50%, 1); + background-color: hsla( 0, 100%, 50%, 0.25); } + .pull-right, .pull-left { margin: 1em; } + .highlight { background-color: hsla( 0, 100%, 50%, 0.1); } + .img-fluid { max-width: 100%; } + .highlight-nocolor{ background-color: hsla( 60, 100%, 50%, 0.75); } + .highlight-red { background-color: hsla( 0, 100%, 50%, 0.25); } + .highlight-green { background-color: hsla(113, 100%, 50%, 0.25); } + .highlight-blue { background-color: hsla(236, 100%, 50%, 0.25); } diff --git a/lessons/micropython/micropython/input.md b/lessons/micropython/micropython/input.md new file mode 100644 index 0000000000..307d5e4bda --- /dev/null +++ b/lessons/micropython/micropython/input.md @@ -0,0 +1,33 @@ +## Vstup + +MicroPython na malé destičce obsahuje některé +moduly, které jinde nenajdeš. Ten hlavní se jmenuje +`machine` a zpřístupňuje základní funkce zařízení. Zkus si: + +```python +from machine import Pin +pin = Pin(0, Pin.IN) +print(pin.value()) +``` + +Zmáčkni a drž tlačítko `FLASH` vedle USB konektoru. +Přitom pusť `print(pin.value())` znovu. +Jak se hodnota změní? + +Jak tomuhle kódu rozumět? +Třída `Pin` ti umožňuje ovládat jednotlivé +„nožičky”, kterými zařízení komunikuje s vnějším +světem: buď na nich nastavovat napětí, nebo zkoumat +jestli na nich nějaké napětí je. + +`Pin(0, Pin.IN)` vytvoří objekt třídy Pin, +který bude načítat data z „nožičky” číslo 0. +(`IN` znamená načítání – informace jdou *do* procesoru). +Funkce `pin.value()` změří napětí na dané +„nožičce” a vrátí buď 1 nebo 0 podle toho, jestli nějaké naměřila. + +No a „nožička” číslo 0 je připojená k tlačítku `FLASH`, +kterým se tak dá ono napětí ovládat. +Informace o tom, která nožička je kam připojená, +máš na [taháku](https://pyvec.github.io/cheatsheets/micropython/nodemcu-cs.pdf) – +můžeš si zkontrolovat, že Pin(0) u sebe má poznámku FLASH. diff --git a/lessons/micropython/micropython/install.md b/lessons/micropython/micropython/install.md new file mode 100644 index 0000000000..ed5a047b22 --- /dev/null +++ b/lessons/micropython/micropython/install.md @@ -0,0 +1,126 @@ +## Instalace + +Nejdříve propoj modul s počítačem přes USB kabel, +jako kdybys připojoval{{a}} třeba mobil. + +> [note] +> Je potřeba použít kvalitní datový kabel. +> Nekvalitní kabely (např. spousta kabelů k +> nabíječkám) jsou často nepoužitelné. + +Dál postupuj podle operačního systému na svém počítači. +Kdyby něco nefungovalo, poraď se s koučem. +Původní (anglický) návod k této části je na +stránkách MicroPythonu. + + +### Linux + +Na správně nastaveném počítači stačí zadat: + +```console +$ picocom -b 115200 --flow n /dev/ttyUSB0 +``` + +Pokud příkaz neskončí s chybou, stiskni tlačítko `RST` na modulu. +Měly by se nakonec objevit tři zobáčky, `>>>`. + +Většina počítačů ale na komunikaci s malými zařízeními nastavená není. +Skončí-li příkaz `picocom` s chybou, +oprav ji podle následujícího návodu a zkus to znova. +(Možná bude potřeba vyřešit víc než jednu chybu.) + +* Nemáš-li příkaz `picocom` nainstalovaný, + je potřeba ho nainstalovat (např. + `sudo dnf install picocom` nebo + `sudo apt-get install picocom`). +* Pokud `picocom` skončil s chybou + `No such file or directory`, pravděpodobně + je potřeba k zařízení přistupovat přes jiný soubor. + Použij příkaz `dmesg | tail`, který vypíše něco jako: + +
+  $ dmesg | tail
+  [703169.886296] ch341 1-1.1:1.0: device disconnected
+  [703176.972781] usb 1-1.1: new full-speed USB device number 45 using ehci-pci
+  [703177.059448] usb 1-1.1: New USB device found, idVendor=1a86, idProduct=7523
+  [703177.059454] usb 1-1.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
+  [703177.059457] usb 1-1.1: Product: USB2.0-Serial
+  [703177.060474] ch341 1-1.1:1.0: ch341-uart converter detected
+  [703177.062781] usb 1-1.1: ch341-uart converter now attached to ttyUSB0
+  
+ + Máš-li místo `ttyUSB0` něco jiného, v příkazu `picocom` to použij místo + `ttyUSB0`. + +* Pokud `picocom` skončil s chybou `Permission denied`, potřebuješ získat + přístup k souboru zařízení. + To znamená přidat se do příslušné skupiny: + + ```console + $ sudo usermod -a -G dialout $(whoami) + ``` + + Poté je potřeba se znovu přihlásit, třeba příkazem: + + ```console + $ su - $(whoami) + ``` + + Pro ověření spusť příkaz `groups`; v jeho výstupu by mělo být `dialout`. + Například: + + ```console + $ groups + kristyna lp wheel dialout mock + ``` + + Kdyby to nefungovalo, na srazu ti může pomoci nějaký kouč. + Jestli procházíš materiály z domu a nepovedlo + se ti přidat do skupiny, dá se to obejít tak, + že místo `picocom` použiješ `sudo picocom`. + +### Windows + +MicroPython se přihlásí jako COM port. Otevři +správce zařízení a zjisti, který COM port to je (kouč s tím pomůže). + +Nebylo-li zařízení nalezeno, je potřeba nainstalovat +*driver*, který je ke stažení třeba +[z tohoto blogu](https://iotta.cz/ovladace-pro-ch340g/). + +Pak si nainstaluj program +[PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html) +(`putty.exe`) a spusť ho. +V konfiguračním okýnku zaškrtni *Connection Type: Serial* a +do *Serial line:* zadej svůj COM port. +Pak přepni v seznamu vlevo na *Serial* (úplně dole) a nastav *Speed* na *115200* +a *Flow Control* na *None*: + +{{ figure( + img=static("putty-config.jpg"), + alt='Obrázek nastavení PuTTY', +) }} + +Potom zpátky v kategorii *Session* můžeš nastavení uložit pro příště: +do políčka *Saved Sessions* zadej *MicroPython* a klikni OK. + +Nakonec klikni *Open*. Mělo by se otevřít +okýnko podobné konzoli, kde se, když zmáčkneš +na modulu `RST`, objeví nakonec tři zobáčky: `>>>`. + + +### macOS + +V příkazové řádce zadej: + +```console +$ screen /dev/tty.usbmodem* 115200 +``` + +a stiskni Enter. +Pak na modulu zmáčkni `RST`. +Měly by se nakonec objevit tři zobáčky, `>>>`. + +Nejde-li to, je možná potřeba nainstalovat driver. Ten se dá stáhnout +z [tohoto blogu](https://iotta.cz/ovladace-pro-ch340g/). diff --git a/lessons/micropython/micropython/intro.md b/lessons/micropython/micropython/intro.md new file mode 100644 index 0000000000..68e3dba52b --- /dev/null +++ b/lessons/micropython/micropython/intro.md @@ -0,0 +1,60 @@ +## MicroPython – taky Python + +Tak jako máš na počítači nainstalovaný operační +systém, na vývojové desce je takzvaný *firmware*, +program, který ovládá všechny ty drátky, +čipy a světýlka, co v ní jsou. +My používáme firmware zvaný *MicroPython*, +který navíc rozumí jazyku Python a umí provádět pythonní příkazy. Zkus si to! +Tři zobáčky, které vyskočily v minulém kroku, přišly +ze zařízení, které teď netrpělivě čeká na příkaz. + +```pycon +>>> 1+1 +2 +>>> print('Hello World') +Hello World +``` + +Téměř vše, co používáš v Pythonu na počítači, +umí MicroPython taky: čísla, řetězce, seznamy, třídy, +výjimky, moduly a tak dál. +Některé detaily ale jsou trochu osekané, aby se všechno +vešlo do extrémně malého prostoru. +Zkus si, jak se liší efekt následujících příkazů +od „velkého” Pythonu: + +```pycon +>>> print +>>> import math +>>> math.pi +``` + +Nejdůležitější věc, která je osekaná, je *standardní +knihovna* – většina modulů, které na +počítači můžeš naimportovat, v MicroPythonu chybí. +U modulů jako `turtle` je to pochopitelné, +ale v rámci šetření místem chybí i moduly jako `random`. +Většinou to příliš nevadí – malá zařízení se používají +na jiné věci než ty velké – ale je potřeba si na to +dát pozor. + +Některé věci ze standardní knihovny se dají najít +ve zjednodušené formě na jiných místech. +Například ačkoliv modul `random` chybí, +náhodné číslo od 0 do 255 se dá získat pomocí: + +```pycon +>>> from os import urandom +>>> urandom(1)[0] +61 +``` + + +## Ovládání konzole + +Při psaní složitějšího kódu si všimneš, že konzole MicroPythonu automaticky odsazuje. +To je pro malé programy pohodlné, ale umí to i znepříjemnit život – hlavně když chceme kód do konzole vložit. + +Proto má konzole MicroPythonu speciální vkládací mód, který automatické odsazování vypíná. +Aktivuje se pomocí Ctrl+E a ukončuje se pomocí Ctrl+D. diff --git a/lessons/micropython/micropython/output.md b/lessons/micropython/micropython/output.md new file mode 100644 index 0000000000..2cb11fea3d --- /dev/null +++ b/lessons/micropython/micropython/output.md @@ -0,0 +1,129 @@ +## Obvod + +Teď na chvíli necháme programování a postavíme si elektrický obvod. +Vezmi si modrou svítivou diodu (LED, „světýlko”) a +nepájivé pole („hloupou destičku”). +Zkusíme světýlko rozsvítit. + +LED rozsvítíš tak, že ji připojíš ke *zdroji napětí*, například k baterce. + +Jako zdroj napětí můžeme použít i náš modul. +Ten bere elektřinu přes USB a dává nám ji k dispozici +na některých svých „nožičkách”: +konkrétně plus na nožičce označené `3V` +a mínus na nožičce označené `G`. +Na tyhle nožičky musíš zapojit diodu. + +Připojování diody má jeden háček: +musíš ji zapojit správným směrem – plus na plus, mínus na mínus. +Opačně dioda svítit nebude. Dobrá zpráva je, že +když diodu otočíš špatně, nic se jí nestane. + +> [note] +> Základní vlastnost *diody* je ta, že pustí +> elektrický proud jen jedním směrem. Svítící dioda +> – *angl. Light Emitting Diode, LED* – ještě k +> tomu navíc svítí. + +Je potřeba rozpoznat rozdíl mezi nožičkami diody. +*Katoda* (`-`) je ta kratší nožička. +Pouzdro diody je u katody trochu seříznuté +a vevnitř v pouzdře, když se pozorně podíváš, uvidíš +u katody větší plíšek. +Té druhé nožičce se říká anoda (`+`). + +Tak, teď víš, kam diodu zapojit: katodu (kratší nožičku) +na `G` a anodu na `3V`. + +Držení nožiček diody u nožiček modulu by ti nejspíš +zaměstnalo obě ruce. Aby sis je uvolnila, použij +*nepájivé pole* (angl. *breadboard*). +Je v něm spousta dírek, do kterých se dají strkat dráty. +V rámci každé poloviny destičky je každá řada dírek – +tedy každá pětice – spojená dohromady. +Když zapojíš drátky do stejné řady, spojíš je tím. + +Zasuň modul do nepájivého pole. Pak připoj katodu +do dírky ve stejné řadě, kde je nožička +`3V` modulu, a podobně anodu k `G`. +Mělo by to vypadat jako na tomto obrázku: + +{{ figure( + img=static("circuits/led_bb.svg"), + alt="diagram zapojení", +) }} + +Potom zapoj USB kabel. Dioda by se měla rozsvítit! + +Zkus si, co se stane, když obě nožičky diody zapojíš ke `G`. + +{{ figure( + img=static("circuits/led_bb_off.svg"), + alt="diagram zapojení", +) }} + +Aby dioda svítila, musí být připojená na dvě místa, +mezi kterými je takzvaný *potenciálový rozdíl* — napětí. +Na nožičce `G` je 0 voltů; na nožičce +`3V` jsou 3,3 volty – je tedy mezi nimi rozdíl 3,3 V, přesně tolik, +kolik modrá LED potřebuje ke svícení. + +> [note] +> Samotná hodnota napětí nedává smysl – například +> říct, že je na jednom místě 3,3 V je nepřesné. +> Hodnota ve voltech se vždycky musí k něčemu vztahovat; +> vyjadřuje rozdíl mezi dvěma místy. +> V elektronice používáme rozdíl oproti „zemi” – napětí +> na nožičce `G`. Stanovíme si, že tam je +> 0 voltů a ostatní napětí počítáme vzhledem k ní. +> Na nožičce `3V` je tedy napětí 3,3 V vzhledem k zemi. + + +## Výstup + +Proč jsme diodu na to, aby se rozsvítila, +připojili k modulu a ne jen k baterce? +Ten modul je trošku složitější zařízení než baterka a jedna důležitá věc, +kterou umí navíc, je nastavovat napětí na různých nožičkách. +Umí zařídit, aby se nožička chovala jednou jako `3V` a jindy jako `G`. +Když připojíš diodu mezi `G` a takovou +přepínatelnou nožičku, můžeš nastavit, kdy svítí a kdy ne. + +Přepoj anodu diody z `3V3` na `D5`. Katodu nech na `G`. + +Máš-li zapojeno, znovu se připoj k MicroPythonu a zadej následující kód: + +```python +from machine import Pin +pin = Pin(14, Pin.OUT) +pin.value(0) +pin.value(1) +``` + +Když objekt Pin vytvoříš s `Pin.OUT`, MicroPython na něm bude nastavovat +napětí – buď 3,3 V (`value(1)`) nebo 0 V (`value(0)`). +A tak se dá s diodou blikat. + +> [note] +> Číslování nožiček je bohužel dvojí – nožička +> označená jako `D5` má v procesoru přiřazené číslo 14. +> Třída `Pin` v MicroPythonu používá číslování procesoru. +> Naštěstí máš [tahák](https://pyvec.github.io/cheatsheets/micropython/nodemcu-cs.pdf), +> kde snadno dohledáš že `D5` a `Pin(14)` jsou dvě jména stejné nožičky. + +Zvládneš napsat program, který zařídí, aby dioda +svítila pouze když je zmáčknuté tlačítko `FLASH` a jinak ne? + +> [note] +> Nápověda: Můžeš pořád dokola zjišťovat stav tlačítka +> a nastavovat podle něj stav LED. + +{% filter solution %} +```python +from machine import Pin +pin_diody = Pin(14, Pin.OUT) +pin_tlacitka = Pin(0, Pin.IN) +while True: + pin_diody.value(1 - pin_tlacitka.value()) +``` +{% endfilter %} diff --git a/lessons/micropython/micropython/piezo.md b/lessons/micropython/micropython/piezo.md new file mode 100644 index 0000000000..b1a83ebaf3 --- /dev/null +++ b/lessons/micropython/micropython/piezo.md @@ -0,0 +1,34 @@ +## Tóny a melodie + +Vezmi si další součástku – piezobudič, neboli „bzučítko”. + +Tahle malá věc obsahuje speciální materiál, který se, +když ho připojíš ke zdroji napětí, trošku roztáhne. +Roztažením zatlačí na okolní vzduch a vytvoří tlakovou +vlnu, která může doputovat až k tvým uším. + +Zkus si to – když bzučítko připojíš na `3V` +a `G` (tentokrát je jedno kterým směrem), uslyšíš tiché lupnutí. +A podobné lupnutí uslyšíš když součástku zase odpojíš. + +Co se stane, když budeš napětí připojovat a odpojovat, řekněme, 32× za vteřinu? + +Nebo 65×? + +Nebo některou z těchto frekvencí? +Hz – [Hertz](https://en.wikipedia.org/wiki/Hertz) – je jednotka frekvence; +„49 Hz“ znamená „49× za sekundu“. + +| Nota | Frekvence | +|:-----|----------:| +| C1 | 32,70 Hz | +| D | 36,71 Hz | +| E | 41,20 Hz | +| F | 43,65 Hz | +| G | 49,00 Hz | +| A | 55,00 Hz | +| H | 61,74 Hz | +| C2 | 65,41 Hz | + +Naprogramuj písničku! Potřebuješ-li víc not, pusť si [program](static/noty.py), +který vypočítá další frekvence. diff --git a/lessons/micropython/micropython/pwm.md b/lessons/micropython/micropython/pwm.md new file mode 100644 index 0000000000..039168ce99 --- /dev/null +++ b/lessons/micropython/micropython/pwm.md @@ -0,0 +1,100 @@ +## Velice rychle blikat + +Jedna z nevýhod „našeho” čipu ESP8266 je, že na svých +nožičkách umí nastavovat jen dvě hodnoty – 3,3 V a zem, jedničku a nulu. +Dioda tak buď svítí, nebo nesvítí – nedá se +nastavit poloviční intenzita, nedá se plynule rozsvěcet nebo zhasínat. + +Tuhle nevýhodu ale můžeme obejít s využitím dvou faktů. +Ten první je, že diodám – na rozdíl od žárovek nebo +zářivek – nevadí časté vypínání a zapínání. +Opotřebovávají se spíš svícením a časem. +Druhý je, že lidské oko nestačí zaznamenat pohyby a +změny, které probíhají rychleji než zhruba za +setinu vteřiny. + +Pojďme tedy velice rychle blikat – a oblafnout tak naše oči a mozky! + +```python +from machine import Pin +from time import sleep + +pin_diody = Pin(14, Pin.OUT) +while True: + pin_diody.value(0) # vypnout LED + sleep(2/100) # počkat dvě setiny vteřiny + pin_diody.value(1) # zapnout LED + sleep(1/100) # počkat jednu setinu vteřiny +``` + +Zkus si pohrát s hodnotami pro `time.sleep`. + +> [note] +> Takhle fungují prakticky všechna stmívatelná LED +> světla – rychlé blikání je ekonomičtější a přesnější +> než např. nastavování nižšího napětí. + +Dokážeš napsat program, který diodu postupně, plynule rozsvítí? + +{% filter solution %} +```python +from machine import Pin +from time import sleep + +pin_diody = Pin(14, Pin.OUT) + +while True: + x = 0 + while True: + x = x + 1 + pin_diody.value(0) + sleep((100-x)/10000) + pin_diody.value(1) + sleep(x/10000) + + if x > 100: + break +``` + +Princip je úplně stejný, jen proměnná `x` se neustále mění a tím ovlivňuje +intenzitu svícení. +{% endfilter %} + + +Protože je takovéhle rychlé blikání užitečné ve spoustě +různých situací, obsahuje MicroPython speciální funkci: umí blikat samostatně. +Nastavíš, jak rychle má blikat a jak dlouho má trvat +každé bliknutí, a MicroPython pak bude blikat automaticky, +zatímco tvůj program se může věnovat něčemu jinému. + +Téhle funkci se říká *pulzně šířková modulace* – +angl. *Pulse Width Modulation*, neboli *PWM*. +Z MicroPythonu jde tahle funkce ovládat pomocí třídy +`machine.PWM`. +Každý objekt téhle třídy umí ovládat jednu nožičku +a dají se u něj nastavit dva parametry: + +* `freq` – frekvence, tedy kolikrát za sekundu se LED rozsvítí a zase zhasne a +* `duty` – anglicky *duty cycle*, česky *střída*, nastavuje „šířku pulzu”, + tedy jak dlouho bude dioda při každém bliknutí svítit. + Hodnota `duty` může být od 0, kdy LED + nesvítí vůbec, do 1023, kdy svítí celou dobu. + Nastavíš-li `duty=512`, bude dioda + svítit s poloviční intenzitou (512 = 1024/2). + +Nastavíš-li `PWM(freq=50, duty=512)`, dioda bude blikat 50× za sekundu. +Vždycky jednu setinu vteřiny bude svítit a na jednu +setinu vteřiny zhasne. + +```python +from machine import Pin, PWM + +pin_diody = Pin(14, Pin.OUT) +pwm = PWM(pin_diody, freq=50, duty=512) +``` + +Zkus nastavit i nižší frekvenci, třeba 3 nebo 1, ať blikání vidíš přímo! + +PWM se dá zrušit metodou `pwm.deinit()`. +Jako s otvíráním souborů, je dobré po sobě uklidit – +i když zatím můžeš jednoduše restartovat celé zařízení. diff --git a/lessons/micropython/micropython/rest.md b/lessons/micropython/micropython/rest.md new file mode 100644 index 0000000000..fba942b4b3 --- /dev/null +++ b/lessons/micropython/micropython/rest.md @@ -0,0 +1,104 @@ + +## WiFi + +Jak jsme zmínili na začátku, byl čip ESP8266 primárně určen pro práci s WiFi +a tato schopnost mu zůstala. Umí se buď připojit k existující síti, nebo +ze sebe udělat hotspot a vytvořit si tak vlastní WiFi síť. Obě tyto možnosti +nám umožní spojit se s destičkou bezdrátově a pracovat s ní skrze +webový prohlížeč pomocí tzv. WebREPL, nebo použít připojení k síti k odesílání +dat z destičky pro další zpracování. + +Používání WiFi je ovšem mimo možnosti tohoto workshopu. Vše potřebné k jejímu +zprovoznění je k dispozici [v této části dokumentace](https://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/repl.html#webrepl-a-prompt-over-wifi). + + + + + + + + +## WebREPL + +ESP8266 byl původně navržen i jako čip pro WiFi a i s MicroPythonem se umí připojit k síti. +Dokonce se přes WiFi dá i ovládat. + +Otevřete si stránku [micropython.org/webrepl](http://micropython.org/webrepl/), +přes kterou budete po připojení s destičkou komunikovat. + +Poté se buď připojte k existující WiFi síti (Eduroam fungovat nebude) nebo +použijte destičku jako samostatný *access point*: + +```python + +# Existující síť: + +ESSID = ... +PASSWORD = ... + +import network +wlan = network.WLAN(network.STA_IF) +wlan.active(True) +if not wlan.isconnected(): + print('connecting to network...') + wlan.connect(ESSID, PASSWORD) + while not wlan.isconnected(): + pass +print('network config:', wlan.ifconfig()) + +# AP: + +ESSID = ... +PASSWORD = ... +CHANNEL = 3 + +import network +ap_if = network.WLAN(network.AP_IF) +ap_if.active(True) +ap_if.config(essid=ESSID, password=PASSWORD, authmode=network.AUTH_WEP, channel=CHANNEL) +print('network config:', ap_if.ifconfig()) + +# Nastavení WebREPL: + +import webrepl_setup +``` + +S počítačem se připojte na stejnou síť a na stránce webrepl otevřené výše +se připojte k IP vypsané z `ifconfig()`. Měli byste dostat konzoli, jako přes +USB. Pomocí WebREPL lze nejen zadávat interaktivní příkazy, ale i nahrávat +soubory. + + +## Komunikace + +Pro komunikaci po síti můžete použít nízkoúrovňovou knihovnu `socket`, +nebo protokol pro „internet of things“ (jako MQTT), ale +MicroPython pro ESP8266 má zabudouvanou i knihovnu pro HTTP: +ořezanou verzi známých Requests. +Následující kód stáhne data ze stránky +[api.thingspeak.com/channels/1417/field/2/last.txt](http://api.thingspeak.com/channels/1417/field/2/last.txt), +kde se objevuje poslední barva tweetnutá s hashtagem `#cheerlights`. + +Výslednou hodnotu lze použít jako barvu modul v LED pásku. + +```python +import urequests + +url = 'http://api.thingspeak.com/channels/1417/field/2/last.txt' + +def download_color(): + response = urequests.get(url) + text = response.text + + if text and text[0] == '#': + color = text[1:7] + + red = int(color[0:2], 16) + green = int(color[2:4], 16) + blue = int(color[4:6], 16) + + return red, green, blue + return 0, 0, 0 +``` + +Opravdové projekty používají lehčí protokoly než HTTP, například MQTT. diff --git a/lessons/micropython/micropython/rgb%leds.md b/lessons/micropython/micropython/rgb%leds.md new file mode 100644 index 0000000000..28d34dfd9a --- /dev/null +++ b/lessons/micropython/micropython/rgb%leds.md @@ -0,0 +1,55 @@ + +## Barevná světýlka + +Je čas na novou hračku! +Tentokrát to bude LED pásek. + +Na pásku máš 8 malých čtverečků. +Každý z nich obsahuje docela hodně elektroniky: +tři barevné LED (červenou, zelenou a modrou) +a čip, který je umí ovládat pomocí informací, +které dostane přes jediný drátek z modulu. + +Takové pásky se prodávají po metrech a dají se +nastříhat – mezi jednotlivými světýlky si všimni čárky, +která naznačuje, kde máš střihnout. +Energie z USB stačí zhruba na osm světýlek, proto jsi jich dostal{{a}} tolik. + +Tenhle LED pásek je stavěný na pět voltů. Naštěstí ale potřebuje 5 V jen +na napájení; řídící signál s informacemi o barvičkách může mít 3,3 V. + +Pojďme pásek zapojit: + +* `GND` pásku (bílý drátek) připoj na `G` +* `DI` (*data in* – zelený drátek) připoj na `D4` +* `+5V` (červený drátek) připoj: + * na `VU`, má-li tvoje destička tuhle nožičku, + * jinak na `VIN`. + +Nožička `VU`/`VIN` poskytuje 5 voltů. +Pozor na ni: nepřipojuj na ni zařízení, které se s pěti volty nevyrovnají. + +Máš-li zapojeno, můžeš začít programovat. +„Jazyk”, kterým „mluví” tenhle LED pásek je trošku +složitější než signál PWM, ale MicroPython obsahuje +speciální knihovnu, která s páskem komunikovat umí. +Vypadá to nějak takhle: + + +
+from machine import Pin
+from neopixel import NeoPixel
+
+POCET_LED = 8
+pin = Pin(2, Pin.OUT)
+np = NeoPixel(pin, POCET_LED)
+np[0] = (255, 255, 255)
+np.write()
+
+ + +Co znamenají ta čísla (`0` a `255`), na to už jistě přijdeš sám/sama. +Jen při experimentování nezapomeň zavolat +`np.write()`, tím se informace pošlou do LED pásku. + +Zvládneš naprogramovat semafor? diff --git a/lessons/micropython/micropython/servo.md b/lessons/micropython/micropython/servo.md new file mode 100644 index 0000000000..d644c23764 --- /dev/null +++ b/lessons/micropython/micropython/servo.md @@ -0,0 +1,93 @@ +## Servomotor + +Čas na další součástku! Tentokrát to bude *servomotor*. + +Servomotor je součástka, která má v sobě zabudovaný +ovladač, se kterým si naše zařízení může povídat +jednoduchým „elektronickým jazykem” – *protokolem*. +Motorku můžeš posílat impulzy a podle délky impulzu +se servomotor natočí. +Při krátkých impulzech se natočí víc na jednu stranu, +při dlouhých na druhou. +Impulzy musíš posílat neustále, jinak se servomotor +vypne. + +Na rozdíl od bzučítka, kde o výšce tónu rozhodovala +frekvence (`freq`) – kolikrát za vteřinu +se ozve lupnutí – a LED, kde o intenzitě rozhodovala +střída (`duty`) – poměr mezi dobou kdy +dioda svítí a kdy nesvítí, u servomotoru rozhoduje +tzv. *šířka pulzu*: jak dlouho se napětí udrží +na 3,3 V, než se přepne zpátky na 0 V. + + + +V praxi to znamená, že můžeš nastavit `freq` +na 50 Hz, a `duty` měnit cca od 35 +(úplně vlevo) přes 77 (uprostřed) po 120 (úplně vpravo). + +Dost ale teorie, pojďme si to vyzkoušet! Napřed musíš motorek zapojit: + +* hnědý drát (zem) na `G`, +* červený drát (napájení) na `3V` a +* oranžový drát (data) na `D4`. + +Nožička `D4` odpovídá `Pin(2)`, takže kód k otáčení motorku je: + +```python +from machine import Pin, PWM +from time import sleep + +pin_motorku = Pin(2, Pin.OUT) +pwm = PWM(pin_motorku, freq=50, duty=77) +pwm.duty(35) +``` + +Zkus motorkem otáčet nastavováním `duty` na 35 do 120. +Kdyby se náhodou stalo, že se modul restartuje a +konzole přestane fungovat, zkus ho odpojit a znovu +připojit. Kdyby to nepomohlo, motorek ti dneska +nebude fungovat. Za chvíli si řekneme proč; zatím (jsi-li na kurzu) +se přidej do dvojice k někomu, komu to funguje. + +## Poznámka o napájení a napětí + +K tomu, aby se otočil motor, je potřeba mnohem víc +energie, než k rozsvícení světýlka. +Z USB z počítače té energie dostaneš docela málo, +proto můžou být s motorkem problémy. + +Jak to řešit, až si přestaneš hrát a budeš chtít motorkem otáčet „doopravdy”? + +Elektronika, která je na našem modulu mimo +malou destičku s „mozkem” má dva hlavní úkoly: + +* Převádět *komunikaci* z USB, která je + celkem složitě zakódovaná, na něco čemu + malé zařízení rozumí + (konkrétně protokol [UART](https://en.wikipedia.org/wiki/UART) přes nožičky `TX` a `RX`). +* Převádět napětí 5 V, které poskytuje USB, + na 3,3 V které potřebuje modul. + +Když energie z USB přestane stačit, dá se koupit +zařízení, které zvládne převádět komunikaci +a napájení vyřešit z jiného zdroje 5 V. +Kdybys to někdy zkoušela, příslušné zařízení +koupíš pod názvem *USB-TTL adapter* a vypadá +nejčastěji takhle: + +{{ figure( + img=static("usb-ttl.png"), + alt="USB-TTL adapter", +) }} + +K modulu pak tento převodník a zdroj napětí připojíš takto: + + +* `GND` na převodníku – `G` na desce +* `RX` na převodníku – `TX` (!) na desce +* `TX` na převodníku – `RX` (!) na desce +* `+5V` na zdroji napětí na `VIN` na desce +* Zem na zdroji napětí na `G` na desce + +Pozor, 5V nepřipojuj jinam než na `VIN`! diff --git a/lessons/micropython/micropython/socket.md b/lessons/micropython/micropython/socket.md new file mode 100644 index 0000000000..855dc085fe --- /dev/null +++ b/lessons/micropython/micropython/socket.md @@ -0,0 +1,33 @@ +## Komunikace + +Pro komunikaci po síti můžete použít nízkoúrovňovou knihovnu `socket`, +nebo protokol pro „internet of things“ (jako MQTT), ale +MicroPython pro ESP8266 má zabudouvanou i knihovnu pro HTTP: +ořezanou verzi známých Requests. +Následující kód stáhne data ze stránky +[api.thingspeak.com/channels/1417/field/2/last.txt](http://api.thingspeak.com/channels/1417/field/2/last.txt), +kde se objevuje poslední barva tweetnutá s hashtagem `#cheerlights`. + +Výslednou hodnotu lze použít jako barvu modul v LED pásku. + +```python +import urequests + +url = 'http://api.thingspeak.com/channels/1417/field/2/last.txt' + +def download_color(): + response = urequests.get(url) + text = response.text + + if text and text[0] == '#': + color = text[1:7] + + red = int(color[0:2], 16) + green = int(color[2:4], 16) + blue = int(color[4:6], 16) + + return red, green, blue + return 0, 0, 0 +``` + +Opravdové projekty používají lehčí protokoly než HTTP, například MQTT. diff --git a/lessons/micropython/micropython/static/circuits/led.fzz b/lessons/micropython/micropython/static/circuits/led.fzz new file mode 100644 index 0000000000000000000000000000000000000000..2bbd3e36cf19b71c6462dc0db3b29d6728add797 GIT binary patch literal 32066 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⪼*P2tV^X)-jyjnaO0h9u3lm^^o96F`F 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 literal 0 HcmV?d00001 diff --git a/lessons/micropython/micropython/static/circuits/led_bb.svg b/lessons/micropython/micropython/static/circuits/led_bb.svg new file mode 100644 index 0000000000..48d1d957d1 --- /dev/null +++ b/lessons/micropython/micropython/static/circuits/led_bb.svg @@ -0,0 +1,4537 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D0 + D1 + D2 + D3 + D4 + 3V + G + D5 + D6 + D7 + D8 + RX + TX + G + 3V + Vin + G + RST + EN + 3V + G + SK + S0 + SC + S1 + S2 + S3 + VU + G + A0 + + + + + + FLASH + RST + + + + + + + + + + + + + + + + + + + + NodeMCU + + . + + + + + + diff --git a/lessons/micropython/micropython/static/circuits/led_bb_off.svg b/lessons/micropython/micropython/static/circuits/led_bb_off.svg new file mode 100644 index 0000000000..b1f7ff6cf0 --- /dev/null +++ b/lessons/micropython/micropython/static/circuits/led_bb_off.svg @@ -0,0 +1,4528 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D0 + D1 + D2 + D3 + D4 + 3V + G + D5 + D6 + D7 + D8 + RX + TX + G + 3V + Vin + G + RST + EN + 3V + G + SK + S0 + SC + S1 + S2 + S3 + VU + G + A0 + + + + + + FLASH + RST + + + + + + + + + + + + + + + + + + + + NodeMCU + + . + + + + + diff --git a/lessons/micropython/micropython/static/nodemcu-devkit.jpg b/lessons/micropython/micropython/static/nodemcu-devkit.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d9342a91e73e9d46cacf40e065deb518e1291ec6 GIT binary patch literal 39363 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

?-a+vEV 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 X + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/lessons/micropython/micropython/static/noty.py b/lessons/micropython/micropython/static/noty.py new file mode 100644 index 0000000000..92fd30932c --- /dev/null +++ b/lessons/micropython/micropython/static/noty.py @@ -0,0 +1,8 @@ +nazvy = 'A', 'A#', 'H', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#' + +for i in range(88): + frekvence = 27.5 * 2.**(i/12.) + oktava = (i+9) // 12 + nota = '{:2} {}'.format(nazvy[i%12], oktava) + if __name__ == '__main__': + print("{}: {:7.2f}".format(nota, frekvence)) diff --git a/lessons/micropython/micropython/static/putty-config.jpg b/lessons/micropython/micropython/static/putty-config.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5dbf3f8fa241bdd70b25fc291209841f435dfa36 GIT binary patch literal 38324 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 literal 0 HcmV?d00001 diff --git a/lessons/micropython/micropython/switch.md b/lessons/micropython/micropython/switch.md new file mode 100644 index 0000000000..8a5232a196 --- /dev/null +++ b/lessons/micropython/micropython/switch.md @@ -0,0 +1,12 @@ +## Další tlačítko + +Teď si vezmi tlačítko a připoj ho k modulu: +`GND` vždycky na `G`, `VCC` vždycky na `3V` a +`OUT` na `D1`. + +Tlačítko funguje tak, že `OUT` spojí buď s `VCC` (`3V`) +nebo `GND`, podle toho, jestli je tlačítko stisknuté. +(A navíc to taky teda svítí, ale to je teď vedlejší.) + +Zkus si, jestli se zvládneš MicroPythonu zeptat, jestli je tlačítko zapnuté. +Mělo by to být podobné jako u příkladu s tlačítkem `FLASH`. diff --git a/lessons/micropython/micropython/thermometer.md b/lessons/micropython/micropython/thermometer.md new file mode 100644 index 0000000000..5f167237d4 --- /dev/null +++ b/lessons/micropython/micropython/thermometer.md @@ -0,0 +1,49 @@ +## Teploměr + +Poslední součástkou, kterou si dnes ukážeme, bude jednoduchý teploměr DS18B20. +Tento teploměr se vyrábí v několika provedeních a je velmi populární především +pro jednoduchost použití a velmi nízkou cenu. + +Stejně jako si MicroPython pomocí speciálního „jazyka” rozumí s LED páskem, ovládá +i „jazyk” pro komunikaci s teploměrem a řadou dalších zařízení. 1-wire sběrnice +má navíc tu výhodu, že se na jednu nožičku naší destičky dá připojit hned +několik teploměrů a číst teploty z každého z nich. + +Otoč teploměr tak, aby jeho „břicho” směřovalo směrem od tebe a takto jej zapoj +do nevyužité části nepájivého pole. Následně propoj nožičky teploměru +s destičkou takto: + +* Levou nožičku propoj s `G` +* Prostřední nožičku propoj s `D2` +* Pravou nožičku propoj s `3V` + +> [note] +> Po zapojení drž teploměr na chvíli mezi prsty. Pokud je zapojený špatně začne +> se velmi rychle zahřívat a v takovém případě jej okamžitě odpoj. + +Pokud je vše zapojeno správně, můžeme přistoupit k měření teploty. + +```python +from time import sleep +from machine import Pin +import onewire +from ds18x20 import DS18X20 + + +pin = machine.Pin(4, Pin.IN) +ow = DS18X20(onewire.OneWire(pin)) + +sensory = ow.scan() +ow.convert_temp() +sleep(1) +teplota = ow.read_temp(sensory[0]) +print("Teplota je", teplota) +``` + +Nejdříve si opět připravíme nožičku (pin) pro komunikaci a následně si na ní +připravíme komunikační protokol OneWire. Prvním krokem k teplotě je nalezení +všech dostupných teploměrů na dané sběrnici, což nám zajistí metoda `ow.scan()`, +která nám vrátí seznam identifikátorů nalezených teploměrů. +Metoda `ow.convert_temp()` pak pošle všem teploměrům příkaz, aby změřily +teplotu. Po tomhle rozkazu musíme alespoň vteřinu počkat a následně můžeme +teplotu z našeho čidla přečíst. diff --git a/lessons/micropython/micropython/webrepl.md b/lessons/micropython/micropython/webrepl.md new file mode 100644 index 0000000000..2e584169ea --- /dev/null +++ b/lessons/micropython/micropython/webrepl.md @@ -0,0 +1,49 @@ +## WebREPL + +ESP8266 byl původně navržen i jako čip pro WiFi a i s MicroPythonem se umí připojit k síti. +Dokonce se přes WiFi dá i ovládat. + +Otevřete si stránku [micropython.org/webrepl](http://micropython.org/webrepl/), +přes kterou budete po připojení s destičkou komunikovat. + +Poté se buď připojte k existující WiFi síti (Eduroam fungovat nebude) nebo +použijte destičku jako samostatný *access point*: + +```python + +# Existující síť: + +ESSID = ... +PASSWORD = ... + +import network +wlan = network.WLAN(network.STA_IF) +wlan.active(True) +if not wlan.isconnected(): + print('connecting to network...') + wlan.connect(ESSID, PASSWORD) + while not wlan.isconnected(): + pass +print('network config:', wlan.ifconfig()) + +# AP: + +ESSID = ... +PASSWORD = ... +CHANNEL = 3 + +import network +ap_if = network.WLAN(network.AP_IF) +ap_if.active(True) +ap_if.config(essid=ESSID, password=PASSWORD, authmode=network.AUTH_WEP, channel=CHANNEL) +print('network config:', ap_if.ifconfig()) + +# Nastavení WebREPL: + +import webrepl_setup +``` + +S počítačem se připojte na stejnou síť a na stránce webrepl otevřené výše +se připojte k IP vypsané z `ifconfig()`. Měli byste dostat konzoli, jako přes +USB. Pomocí WebREPL lze nejen zadávat interaktivní příkazy, ale i nahrávat +soubory. From 500e8b357e10b3255657839b8c7c0560e718a539 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 24 Apr 2018 09:21:53 +0200 Subject: [PATCH 2/7] fixup! Micropython materials in separated files per topic and/or HW --- lessons/micropython/micropython/rest.md | 104 ------------------------ 1 file changed, 104 deletions(-) delete mode 100644 lessons/micropython/micropython/rest.md diff --git a/lessons/micropython/micropython/rest.md b/lessons/micropython/micropython/rest.md deleted file mode 100644 index fba942b4b3..0000000000 --- a/lessons/micropython/micropython/rest.md +++ /dev/null @@ -1,104 +0,0 @@ - -## WiFi - -Jak jsme zmínili na začátku, byl čip ESP8266 primárně určen pro práci s WiFi -a tato schopnost mu zůstala. Umí se buď připojit k existující síti, nebo -ze sebe udělat hotspot a vytvořit si tak vlastní WiFi síť. Obě tyto možnosti -nám umožní spojit se s destičkou bezdrátově a pracovat s ní skrze -webový prohlížeč pomocí tzv. WebREPL, nebo použít připojení k síti k odesílání -dat z destičky pro další zpracování. - -Používání WiFi je ovšem mimo možnosti tohoto workshopu. Vše potřebné k jejímu -zprovoznění je k dispozici [v této části dokumentace](https://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/repl.html#webrepl-a-prompt-over-wifi). - - - - - - - - -## WebREPL - -ESP8266 byl původně navržen i jako čip pro WiFi a i s MicroPythonem se umí připojit k síti. -Dokonce se přes WiFi dá i ovládat. - -Otevřete si stránku [micropython.org/webrepl](http://micropython.org/webrepl/), -přes kterou budete po připojení s destičkou komunikovat. - -Poté se buď připojte k existující WiFi síti (Eduroam fungovat nebude) nebo -použijte destičku jako samostatný *access point*: - -```python - -# Existující síť: - -ESSID = ... -PASSWORD = ... - -import network -wlan = network.WLAN(network.STA_IF) -wlan.active(True) -if not wlan.isconnected(): - print('connecting to network...') - wlan.connect(ESSID, PASSWORD) - while not wlan.isconnected(): - pass -print('network config:', wlan.ifconfig()) - -# AP: - -ESSID = ... -PASSWORD = ... -CHANNEL = 3 - -import network -ap_if = network.WLAN(network.AP_IF) -ap_if.active(True) -ap_if.config(essid=ESSID, password=PASSWORD, authmode=network.AUTH_WEP, channel=CHANNEL) -print('network config:', ap_if.ifconfig()) - -# Nastavení WebREPL: - -import webrepl_setup -``` - -S počítačem se připojte na stejnou síť a na stránce webrepl otevřené výše -se připojte k IP vypsané z `ifconfig()`. Měli byste dostat konzoli, jako přes -USB. Pomocí WebREPL lze nejen zadávat interaktivní příkazy, ale i nahrávat -soubory. - - -## Komunikace - -Pro komunikaci po síti můžete použít nízkoúrovňovou knihovnu `socket`, -nebo protokol pro „internet of things“ (jako MQTT), ale -MicroPython pro ESP8266 má zabudouvanou i knihovnu pro HTTP: -ořezanou verzi známých Requests. -Následující kód stáhne data ze stránky -[api.thingspeak.com/channels/1417/field/2/last.txt](http://api.thingspeak.com/channels/1417/field/2/last.txt), -kde se objevuje poslední barva tweetnutá s hashtagem `#cheerlights`. - -Výslednou hodnotu lze použít jako barvu modul v LED pásku. - -```python -import urequests - -url = 'http://api.thingspeak.com/channels/1417/field/2/last.txt' - -def download_color(): - response = urequests.get(url) - text = response.text - - if text and text[0] == '#': - color = text[1:7] - - red = int(color[0:2], 16) - green = int(color[2:4], 16) - blue = int(color[4:6], 16) - - return red, green, blue - return 0, 0, 0 -``` - -Opravdové projekty používají lehčí protokoly než HTTP, například MQTT. From 4eeb0423adc79c9427cb3eecc33c9fe8318baa5e Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 5 Jun 2018 19:08:20 +0200 Subject: [PATCH 3/7] Fix bug - Pin imported from machine --- lessons/micropython/micropython/thermometer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lessons/micropython/micropython/thermometer.md b/lessons/micropython/micropython/thermometer.md index 5f167237d4..37165863fc 100644 --- a/lessons/micropython/micropython/thermometer.md +++ b/lessons/micropython/micropython/thermometer.md @@ -30,7 +30,7 @@ import onewire from ds18x20 import DS18X20 -pin = machine.Pin(4, Pin.IN) +pin = Pin(4, Pin.IN) ow = DS18X20(onewire.OneWire(pin)) sensory = ow.scan() From 2d575ae1a2b64fe008a697248177048f6e7a6d40 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 5 Jun 2018 19:36:21 +0200 Subject: [PATCH 4/7] Remove unneeded import --- lessons/micropython/micropython/servo.md | 1 - 1 file changed, 1 deletion(-) diff --git a/lessons/micropython/micropython/servo.md b/lessons/micropython/micropython/servo.md index d644c23764..8ea4bf0ac7 100644 --- a/lessons/micropython/micropython/servo.md +++ b/lessons/micropython/micropython/servo.md @@ -36,7 +36,6 @@ Nožička `D4` odpovídá `Pin(2)`, takže kód k otáčení motorku je: ```python from machine import Pin, PWM -from time import sleep pin_motorku = Pin(2, Pin.OUT) pwm = PWM(pin_motorku, freq=50, duty=77) From 9047d9e59b384dc95d8e09bd65851ea308b9e4b0 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 5 Jun 2018 19:37:29 +0200 Subject: [PATCH 5/7] Unify salutations --- lessons/micropython/micropython/ampy.md | 6 +++--- lessons/micropython/micropython/intro.md | 3 ++- lessons/micropython/micropython/servo.md | 2 +- lessons/micropython/micropython/webrepl.md | 12 ++++++------ 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/lessons/micropython/micropython/ampy.md b/lessons/micropython/micropython/ampy.md index c7d838bfe4..ca03472d7a 100644 --- a/lessons/micropython/micropython/ampy.md +++ b/lessons/micropython/micropython/ampy.md @@ -53,15 +53,15 @@ Podobně je možné na destičku soubory i nahrávat, jen je potřeba místo (venv)$ ampy -p PORT put blikajici_led.py ``` -Pokud navíc budeme chtít, aby se program na destičce automaticky spouštěl, musí +Pokud navíc budeš chtít, aby se program na destičce automaticky spouštěl, musí se soubor s programem na destičce jmenovat `main.py`. `ampy` umí soubor při -kopírování i přejmenovat, když mu při kopírování zadáme i druhé (nové) jméno. +kopírování i přejmenovat, když mu při kopírování zadáš i druhé (nové) jméno. ```console (venv)$ ampy -p PORT put blikajici_led.py main.py ``` -Po úspěšném kopírování máme na destičce nahraný náš program ze souboru +Po úspěšném kopírování máš na destičce nahraný náš program ze souboru `blikajici_led.py` do souboru `main.py`. Teď už bude tvůj program fungovat i bez počítače, takže stačí destičku připojit např. k powerbance a dioda se rozbliká. diff --git a/lessons/micropython/micropython/intro.md b/lessons/micropython/micropython/intro.md index 68e3dba52b..c45b23aef0 100644 --- a/lessons/micropython/micropython/intro.md +++ b/lessons/micropython/micropython/intro.md @@ -54,7 +54,8 @@ náhodné číslo od 0 do 255 se dá získat pomocí: ## Ovládání konzole Při psaní složitějšího kódu si všimneš, že konzole MicroPythonu automaticky odsazuje. -To je pro malé programy pohodlné, ale umí to i znepříjemnit život – hlavně když chceme kód do konzole vložit. +To je pro malé programy pohodlné, ale umí to i znepříjemnit život – hlavně když chceš +kód do konzole zkopírovat odjinud. Proto má konzole MicroPythonu speciální vkládací mód, který automatické odsazování vypíná. Aktivuje se pomocí Ctrl+E a ukončuje se pomocí Ctrl+D. diff --git a/lessons/micropython/micropython/servo.md b/lessons/micropython/micropython/servo.md index 8ea4bf0ac7..232331782d 100644 --- a/lessons/micropython/micropython/servo.md +++ b/lessons/micropython/micropython/servo.md @@ -71,7 +71,7 @@ malou destičku s „mozkem” má dva hlavní úkoly: Když energie z USB přestane stačit, dá se koupit zařízení, které zvládne převádět komunikaci a napájení vyřešit z jiného zdroje 5 V. -Kdybys to někdy zkoušela, příslušné zařízení +Kdybys to někdy zkoušel{{a}}, příslušné zařízení koupíš pod názvem *USB-TTL adapter* a vypadá nejčastěji takhle: diff --git a/lessons/micropython/micropython/webrepl.md b/lessons/micropython/micropython/webrepl.md index 2e584169ea..a6c1ffda16 100644 --- a/lessons/micropython/micropython/webrepl.md +++ b/lessons/micropython/micropython/webrepl.md @@ -3,11 +3,11 @@ ESP8266 byl původně navržen i jako čip pro WiFi a i s MicroPythonem se umí připojit k síti. Dokonce se přes WiFi dá i ovládat. -Otevřete si stránku [micropython.org/webrepl](http://micropython.org/webrepl/), -přes kterou budete po připojení s destičkou komunikovat. +Otevři si stránku [micropython.org/webrepl](http://micropython.org/webrepl/), +přes kterou budeš po připojení s destičkou komunikovat. -Poté se buď připojte k existující WiFi síti (Eduroam fungovat nebude) nebo -použijte destičku jako samostatný *access point*: +Poté se buď připoj k existující WiFi síti (Eduroam fungovat nebude) nebo +použij destičku jako samostatný *access point*: ```python @@ -43,7 +43,7 @@ print('network config:', ap_if.ifconfig()) import webrepl_setup ``` -S počítačem se připojte na stejnou síť a na stránce webrepl otevřené výše -se připojte k IP vypsané z `ifconfig()`. Měli byste dostat konzoli, jako přes +S počítačem se připoj na stejnou síť a na stránce webrepl otevřené výše +se připoj k IP vypsané z `ifconfig()`. Měl{{a}} bys dostat konzoli, jako přes USB. Pomocí WebREPL lze nejen zadávat interaktivní příkazy, ale i nahrávat soubory. From 077c4c05a7845ff0ff9eba3a0239c5082dac7531 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Fri, 15 Jun 2018 09:02:09 +0200 Subject: [PATCH 6/7] Fix typo in file name: rgb%leds.md -> rgb_leds.md --- lessons/micropython/micropython/{rgb%leds.md => rgb_leds.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lessons/micropython/micropython/{rgb%leds.md => rgb_leds.md} (100%) diff --git a/lessons/micropython/micropython/rgb%leds.md b/lessons/micropython/micropython/rgb_leds.md similarity index 100% rename from lessons/micropython/micropython/rgb%leds.md rename to lessons/micropython/micropython/rgb_leds.md From 05e7ed48faba3fbc1f9eb5ad99d4207dc6445a41 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Fri, 15 Jun 2018 09:02:54 +0200 Subject: [PATCH 7/7] Remove note about `sudo picocom` Fixes: https://github.com/pyvec/naucse.python.cz/issues/418 --- lessons/micropython/micropython/install.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lessons/micropython/micropython/install.md b/lessons/micropython/micropython/install.md index ed5a047b22..5cc1bb8308 100644 --- a/lessons/micropython/micropython/install.md +++ b/lessons/micropython/micropython/install.md @@ -75,10 +75,6 @@ oprav ji podle následujícího návodu a zkus to znova. kristyna lp wheel dialout mock ``` - Kdyby to nefungovalo, na srazu ti může pomoci nějaký kouč. - Jestli procházíš materiály z domu a nepovedlo - se ti přidat do skupiny, dá se to obejít tak, - že místo `picocom` použiješ `sudo picocom`. ### Windows