IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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:

Raspberry Pi

Ď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.


 

Predchádzajúci článok
Raspberry Pi - H-mostík a otáčanie motorkom
Všetky články v sekcii
Raspberry Pi
Preskočiť článok
(neodporúčame)
Raspberry Pri pripojení RFID čítačky
Článok pre vás napísal Aleš Hlavín
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Raspberry
Aktivity