NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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:

Raspberry Pi

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.


 

Předchozí článek
Raspberry Pi - H-můstek a otáčení motůrkem
Všechny články v sekci
Raspberry Pi
Přeskočit článek
(nedoporučujeme)
Raspberry Pi - Připojení RFID čtečky
Článek pro vás napsal Aleš Hlavín
Avatar
Uživatelské hodnocení:
14 hlasů
Raspberry
Aktivity