9. diel - Raspberry Pi - Drôtová komunikácia s Arduino UNO
V minulej lekcii, Raspberry Pi - H-mostík a otáčanie motorkom , sme sa naučili otáčať motorom.
Dnešná lekcia bude málinko neobvyklá. Budeme v nej riešiť komunikáciu medzi dvoma zariadeniami. Komunikácia je veľmi dôležitá vec vo všetkých odvetviach života a rovnako tak aj v IOT. Zariadenia, o ktorých si dnes trochu porozprávame, bude Raspberry Pi a Arduino UNO. Preberieme si, ako ich komunikácia funguje a ako ju sprevádzkovať. Táto funkcia nám bude veľmi užitočná na posielanie rôznych dát na malé vzdialenosti, pretože celá komunikácia bude prebiehať po kábli.
Ako funguje sériová komunikácia?
Za sériovú komunikáciu je považovaná komunikácia posielajúcimi bit po bite pomocou istého sériového kanálu. Každý kanál má istú hodnotu baud. Baud udáva rýchlosť prenosu bitu za sekundu. Napríklad my budeme používať kanál s hodnotou 9600 baud teda 9600 bitov za sekundu. Pre komunikáciu všeobecne všetkých IT zariadenia sa používajú hlavne dva typy komunikácií "Paralelné" a "Sériové". Hlavný rozdiel je v tom, že paralelné komunikácie prenáša všetky bity súčasne, čo je priamy opak komunikácie sériovej. Nevýhodou sériovej komunikácie je teda rýchlosť. Paralelné komunikácia je oveľa rýchlejší, ale preto tiež vyžaduje viac výstupov a vstupov. Kým k sériovej komunikácii budete potrebovať iba dva vodiče. K paralelné by ste potrebovali minimálne osem, keď už by ste nepotrebovali špeciálne I / O porty.
Čo budeme dnes potrebovať?
budeme potrebovať
- Arduino UNO,
- Raspberry Pi a
- USB kábel (podľa typu vstupu Arduino)
Príprava na komunikáciu
Než naše zariadenie začnú komunikovať, musíme ich pripraviť. Stačí je prepojiť jednoducho pomocou USB kábla:
Ďalej už zariadenie Arduino samo o sebe pripravené je. Chýba mu len program. Tento program do neho však chceme zapísať z Raspberry Pi. Pre programovanie Arduino UNO sa používa jednoduché prostredie Arduino UNO. Toto prostredie síce nepoužíva Python, avšak snáď nebude vadiť, keď vám ukážem trochu toho Céčkového kódu.
Inštalácia Arduino IDE na RSP
Inštalácia Arduino IDE je jednoduchá. Na svojom Raspberry Pi zapneme terminál a napíšeme do neho jednoducho tento príkaz:
apt-get install arduino
Pred inštaláciou by sa nás terminál mal spýtať, či naozaj chceme balíky nainštalovať. To potvrdíme klávesom "y" (YES). Potom sa nám balíčky Arduino IDE nainštalujú a v Raspberry sa objaví nová záložka Electronics a v nej program Arduino IDE, s ktorým budeme ďalej pracovať.
Ak by ste sa chceli o Arduino IDE a programovanie v ňom dozvedieť viac, tak môžete tu.
Inštalácia pyserial
na
Raspberry
Ako vždy musíme začať tým, že si nainštalujeme knižnice. Dnes budeme
potrebovať predovšetkým jednu knižnicu a to knižnicu pyserial
.
Táto knižnica nám umožní sériovú komunikáciu medzi Arduino a Raspberry
Pi. Inštaláciu knižníc už máme nacvičenú, preto nám do terminálu
stačí napísať tento príkaz a môžeme pokračovať:
pip install pyserial
Program na ovládanie Arduino diódy
Teraz, keď máme všetko pripravené a vysvetlené, je čas si konečne aj niečo naprogramovať. Pre začiatok na ukážku nám bude stačiť jednoduchý program, pomocou ktorého budeme ovládať Arduino UNO komunikácií z Raspberry Pi. Tak čo tešíte sa na ich prvé komunikáciu?
Arduino program
V Arduino IDE musíme nastaviť, akú dosku chceme programovať. To však už tu ukázané bolo, preto vás odkáže na články o Arduino. Ďalej môžeme rovno začať s nasledujúcim kódom:
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 rozdiely C a Pythone v tomto programe sú hierarchie a
bodkočiarkami. Blok switch()
je v Pythone vlastne blok
match()
.
Metóda setup()
sa vykoná len raz pri štarte
programu. Do metódy setup()
vložíme len dve veci. Prvá
je, aby sa sériová komunikácia otvorila na kanále 9600
, a
druhá, aby sa dióda na pinu 13 nastavila na OUTPUT
(výstup)
rovnako tak, ako sme to robili s diódami v predošlých lekciách v
Pythone.
Do loop u potom vkladáme všetko ostatné. Všetko v
metóde loop()
, ako možno spoznať podľa názvu metódy, sa bude
dookola vykonávať v slučke. Keď je sériová komunikácia aktívny, tak
začne počúvať. To sme urobili pomocou podmienky
if (Serial.available())
. Ďalej vytvoríme ďalšiu podmienku. Keď
pošleme Arduino znak 1
, chceme, nech sa dióda na PINu 13
rozsvieti, v každom inom prípade bude dióda vypnutá. Hodnota
HIGH
vo funkcii digitalWrite()
teda znamená, že sa
dióda zapne, hodnota LOW
diódu vypne. Keďže loop()
sa vykonáva niekoľkokrát za sekundu, môžete vidieť rýchly záblesk
diódy. Ak to nestíhate, vložte na koniec podmienky if
alebo
case
príkaz delay(1000)
. Program sa zastaví na 1
sekundu a potom bude znovu pokračovať.
Python program
Náš program bude jednoduchý. Zapneme terminál, kde budeme vyberať, či chceme zapnúť či vypnúť diódu na Arduino. Výber bude fungovať pomocou uloženie čísla do premennej a tú pošleme pomocou sériovej komunikácie do Arduino:
import serial ser = serial.Serial('COM5', 9600) while 1: val = int(input("Vlož 1")) ser.write(val)
V riadku prvom importujeme ako vždy knižnice. Tentokrát nám bude stačiť
len jedna a to knižnica serial
na prácu so sériovú komunikáciu
as piny.
Na riadku druhom do premennej ser
ukladáme špecifikácie
sériovej komunikácie, ktoré budú prebiehať na kanáli 9600
a
použijeme COM5
. COM5
je označenie pre USB port, v
ktorom je zapojený kábel, ktorý vedie do Arduino. Takže si tam nastavíte
COM
, ktorý vám ukazuje Arduino IDE, keď na svojej Arduino
nahrávate kód. Každý môže mať iné číslo.
Pokračujeme nekonečnú slučkou while
. V informatike sa
číslo 1
rovná True
. Túto slučku máme v programe,
aby sa po každom zapnutí diódy program nevypol a komunikácia sa
neprerušila.
Predposledný riadok vytvára opäť premennú, do ktorej ukladáme vstup
používateľa ako číslo. Tento vstup musí byť vždy číslo, inak nastane
error
. Sám o sebe tiež kód vypíše vetu na konci, ktorú sme
zadali.
Nakoniec sa naučíme niečo nové. Použijeme sériovú komunikáciu
zapísanú do premennej ser
a cez ňu pomocou write
pošleme to, čo používateľ vložil.
Zhrnutie
Funkcia write
nám prakticky iba napíše do serial monitora to,
čo používateľ zadal. Arduino kontroluje neustále serial monitor, aj keď sa
v ňom zatiaľ nič nedeje. Po tom, čo Arduino pošleme nejaké číslo,
Arduino si potom uloží, čo mu Raspberry napísalo a zistí, či má zapnúť
diódu či nerobiť nič (vypnúť diódu).
Program na čítanie dát z Arduino
Skúsili sme si, ako to vyzerá, keď chceme, aby riadilo Raspberry Arduino. Ide to ale aj naopak. To sa hodí ak potrebujeme posielať nejaké dáta napríklad ohľadom senzora 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čiť iba definovať kanál sériovej komunikácie v
časti setup()
. Ďalej už v sekcii loop()
zadáme,
aby sa do serial monitora vypisovala hláška Hello World
.
Nakoniec rýchlosť programu obmedzíme na jedno spracovanie
loopu
za sekundu (1000 milisekúnd v metóde delay()
).
Keby sme tu delay()
nedali, počet riadkov na serial monitore by
sme mali za sekundu niekoľko stoviek.
Program python
import serial ser = serial.Serial('COM5', 9600, timeout=1) while 1: pre = ser.readline().decode('utf-8').rstrip() print(pre)
Začnime opäť rovnakým importom knižnice serial
.
Ďalej nastane trochu zmena v premennej ser
, kde pridáme
položku timeout
na hodnotu 1
, čo je rovnaký čas,
na ktorý na delay zastavuje program. Timeout robí to, že pred každou
komunikáciu sa chvíľu zastaví, a my máme čas na preloženie kódu
komunikácie a na vypísanie.
U slučky while
sa zmenil obsah. Do novej premenné
pre
načítame nastaveni ser
a pridáme príkaz
readline
, ktorý nám bude čítať z nastaveného kanála v
premennej ser
. Ďalej je nutné celý kód dekódovať, pretože
Arduino ho poslalo v 1
a 0
. Preto ďalší je príkaz
decode
a v ňom aj parameter, do akého kódovania znakov by sme
chceli text preložiť. U nás sa tradične používa utf-8
.
Nakoniec tu máme funkciu rstrip()
. Tento príkaz odstraňuje
prebytočné znaky, napríklad pri zapísaní zbytočných medzier je odstráni,
aby vznikol súvislý text.
Zhrnutie
Celý program funguje tak, že v Arduino sa neustále vypisuje jedna hláška do serial monitora. A tú hlášku si prečíta Raspberry, ktoré si ju preloží z binárneho kódu na text a vypíše ju.
V budúcej lekcii, Raspberry Pri pripojení RFID čítačky , si zapojíme a naprogramujeme RFID čítačku.