Lekce 9 - Raspberry Pi - Drátová komunikace s Arduino UNO
V minulé lekci, Raspberry Pi - H-můstek a otáčení motůrkem, jsme se naučili otáčet motorem.
Dnešní lekce bude malinko neobvyklá. Budeme v ní řešit komunikaci mezi dvěma zařízeními. Komunikace je velmi důležitá věc ve všech odvětvích života a stejně tak i v IOT. Zařízení, o kterých si dnes trochu popovídáme, bude Raspberry Pi a Arduino UNO. Probereme si, jak jejich komunikace funguje a jak ji zprovoznit. Tato funkce nám bude velmi užitečná na posílání různých dat na malé vzdálenosti, protože celá komunikace bude probíhat po kabelu.
Jak funguje sériová komunikace?
Za sériovou komunikaci je považovaná komunikace posílající bit po bitu pomocí jistého sériového kanálu. Každý kanál má jistou hodnotu baud. Baud udává rychlost přenosu bitu za sekundu. Například my budeme používat kanál s hodnotou 9600 baud tedy 9600 bitů za sekundu. Pro komunikaci všeobecně všech IT zařízení se používají hlavně dva typy komunikací "Paralelní" a "Sériové". Hlavní rozdíl je v tom, že paralelní komunikace přenáší všechny bity současně, což je přímý opak komunikace sériové. Nevýhodou sériové komunikace je tedy rychlost. Paralelní komunikace je mnohem rychlejší, avšak proto také vyžaduje více výstupů a vstupů. Zatímco k sériové komunikaci budete potřebovat pouze dva vodiče. K paralelní byste potřebovali nejméně osm, když už byste nepotřebovali speciální I/O porty.
Co budeme dnes potřebovat?
Budeme potřebovat:
- Arduino UNO,
- Raspberry Pi a
- USB kabel (podle typu vstupu Arduina)
Příprava na komunikaci
Než naše zařízení začnou komunikovat, musíme je připravit. Stačí je propojit jednoduše pomocí USB kabelu:
Dále již zařízení Arduino samo o sobě připravené je. Chybí mu pouze program. Tento program do něj však chceme zapsat z Raspberry Pi. Pro programování Arduina UNO se používá jednoduché prostředí Arduino UNO. Toto prostředí sice nepoužívá Python, avšak snad nebude vadit, když vám ukážu trochu toho Céčkového kódu.
Instalace Arduino IDE na RSP
Instalace Arduina IDE je jednoduchá. Na svém Raspberry Pi zapneme terminál a napíšeme do něj jednoduše tento příkaz:
apt-get install arduino
Před instalací by se nás terminál měl zeptat, zda opravdu chceme balíčky nainstalovat. To potvrdíme klávesou "y" (YES). Poté se nám balíčky Arduino IDE nainstalují a v Raspberry se objeví nová záložka Electronics a v ní program Arduino IDE, se kterým budeme dále pracovat.
Pokud byste se chtěli o Arduinu IDE a programování v něm dozvědět více, máme na to samostatný kurz.
Instalace pyserial
na
Raspberry Pi
Jako vždy musíme začít tím, že si nainstalujeme knihovny. Dnes budeme
potřebovat především jednu knihovnu a to knihovnu pyserial
.
Tato knihovna nám umožní sériovou komunikaci mezi Arduinem a Raspberry Pi.
Instalaci knihoven již máme nacvičenou, proto nám do terminálu stačí
napsat tento příkaz a můžeme pokračovat:
pip install pyserial
Program na ovládaní Arduino diody
Nyní, když máme vše připraveno a vysvětleno, je čas si konečně také něco naprogramovat. Pro začátek na ukázku nám bude stačit jednoduchý program, pomocí kterého budeme ovládat Arduino UNO komunikací z Raspberry Pi. Tak co těšíte se na jejich první komunikaci?
Arduino program
V Arduino IDE musíme nastavit, jakou desku chceme programovat. To však už zde ukázáno bylo, proto vás odkáži na lekce o Arduinu. Dále můžeme rovnou začít s následujícím kódem:
void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { if (Serial.available()) { switch (Serial.read()) { case '1': digitalWrite(13, HIGH); break; default: digitalWrite(13, LOW); break; } } }
Hlavními rozdíly C a pythonu v tomto programu jsou
hierarchie a středníky. Blok switch()
je v pythonu vlastně blok
match()
.
Metoda setup()
se vykoná pouze jednou při startu
programu. Do metody setup()
vložíme jen dvě věci.
První je, aby se sériová komunikace otevřela na kanále 9600
, a
druhá, aby se dioda na pinu 13 nastavila na OUTPUT
(výstup)
stejně tak, jako jsme to dělali s diodami v předešlých lekcích v
Pythonu.
Do loopu pak vkládáme vše ostatní. Vše v metodě
loop()
, jak lze poznat podle názvu metody, se bude dokola
vykonávat ve smyčce. Když je sériová komunikace aktivní, tak začne
poslouchat. To jsme udělali pomocí podmínky
if (Serial.available())
. Dále vytvoříme další podmínku. Když
pošleme Arduinu znak 1
, chceme, ať se dioda na PINu 13
rozsvítí, v každém jiném případě bude dioda vypnuta. Hodnota
HIGH
ve funkci digitalWrite()
tedy znamená, že se
dioda zapne, hodnota LOW
diodu vypne. Jelikož loop()
se vykonává několikrát za sekundu, můžete vidět rychlý záblesk diody.
Pokud to nestíháte, vložte na konec podmínky if
nebo
case
příkaz delay(1000)
. Program se zastaví na 1
sekundu a poté bude znovu pokračovat.
Python program
Náš program bude jednoduchý. Zapneme terminál, kde budeme vybírat, zda chceme zapnout či vypnout diodu na Arduinu. Výběr bude fungovat pomocí uložení čísla do proměnné a tu pošleme pomocí sériové komunikace do Arduina:
import serial ser = serial.Serial('COM5', 9600) while 1: val = int(input("Vlož 1")) ser.write(val)
Na řádku prvním importujeme jako vždy knihovny. Tentokrát nám bude
stačit pouze jedna a to knihovna serial
na práci se sériovou
komunikaci a s piny.
Na řádku druhém do proměnné ser
ukládáme specifikace
sériové komunikace, které budou probíhat na kanálu 9600
a
použijeme COM5
. COM5
je označení pro USB port, ve
kterém je zapojen kabel, který vede do Arduina. Takže si tam nastavíte
COM
, který vám ukazuje Arduino IDE, když na své Arduino
nahráváte kód. Každý může mít jiné číslo.
Pokračujeme nekonečnou smyčkou while
. V informatice se
číslo 1
rovná True
. Tuto smyčku máme v programu,
aby se po každém zapnutí diody program nevypnul a komunikace se
nepřerušila.
Předposlední řádek vytváří opět proměnnou, do které ukládáme
vstup uživatele jako číslo. Tento vstup musí být vždy číslo, jinak
nastane error
. Sám o sobě také kód vypíše větu na konci,
kterou jsme zadali.
Nakonec se naučíme něco nového. Použijeme sériovou komunikaci zapsanou
do proměnné ser
a přes ní pomocí write
pošleme
to, co uživatel vložil.
Shrnutí
Funkce write
nám prakticky pouze napíše do serial monitoru
to, co uživatel zadal. Arduino kontroluje neustále serial monitor, i když se
v něm zatím nic neděje. Po tom, co Arduinu pošleme nějaké číslo, Arduino
si pak uloží, co mu Raspberry napsalo a zjistí, zda má zapnout diodu či
nedělat nic (vypnout diodu).
Program na čtení dat z Arduina
Zkusili jsme si, jak to vypadá, když chceme, aby řídilo Raspberry Arduino. Jde to ale i naopak. To se hodí potřebujeme-li posílat nějaká data, například ohledně senzoru vlhkosti do Raspberry Pi.
Program Arduino
void setup() { Serial.begin(9600); } void loop() { Serial.print("Hello World"); delay(1000); }
Tentokrát nám bude stačit pouze definovat kanál sériové komunikace v
části setup()
. Dále už v sekci loop()
zadáme, aby
se do serial monitoru vypisovala hláška Hello World
.
Nakonec rychlost programu omezíme na jedno zpracování loopu
za sekundu (1000 milisekund v metodě delay()
). Kdybychom zde
delay()
nedali, počet řádků na serial monitoru bychom měli za
sekundu několik stovek.
Program Python
import serial ser = serial.Serial('COM5', 9600, timeout=1) while 1: pre = ser.readline().decode('utf-8').rstrip() print(pre)
Začněme opět stejným importem knihovny serial
.
Dále nastane trochu změna v proměnné ser
, kde přidáme
položku timeout
na hodnotu 1
, což je stejný čas,
na který na delay zastavuje program. Timeout dělá to, že před každou
komunikaci se chvíli zastaví, a my máme čas na přeložení kódu komunikace
a na vypsaní.
U smyčky while
se změnil obsah. Do nové proměnné
pre
načteme nastaveni ser
a přidáme příkaz
readline
, který nám bude číst z nastaveného kanálu v
proměnné ser
. Dále je nutno celý kód dekódovat, protože
Arduino ho poslalo v 1
a 0
. Proto další je příkaz
decode
a v něm i parametr, do jakého kódovaní znaků bychom
chtěli text přeložit. U nás se tradičně používá utf-8
.
Nakonec tu máme funkci rstrip()
. Tento příkaz odstraňuje
přebytečné znaky, například při napsaní zbytečných mezer je odstraní,
aby vznikl souvislý text.
Shrnutí
Celý program funguje tak, že v Arduinu se neustále vypisuje jedna hláška do serial monitoru. A tu hlášku si přečte Raspberry, které si ji přeloží z binárního kódu na text a vypíše ji.
V příští lekci, Raspberry Pi - Připojení RFID čtečky, si zapojíme a naprogramujeme RFID čtečku.