Sériová komunikácia medzi Raspberry Pi a Arduino – všetko, čo potrebujete vedieť

Ako komunikovať medzi Raspberry Pi a doskou Arduino prostredníctvom sériovej komunikácie ?

Najprv vysvetlím, čo je sériová komunikácia. Potom uvidíte, ako nastaviť hardvér a softvér, a ponoríme sa do kódu Python (Cpp pre Arduino). Najprv základný príklad, ktorý vedie k úplnejšej aplikácii pomocou Raspberry Pi, Arduino a ďalších elektronických zariadení. Tento tutoriál bude fungovať s doskou Raspberry Pi 4 (a staršie: 3B, 3B+) a akoukoľvek doskou Arduino.

Sériová komunikácia je jednoducho spôsob prenosu dát. Dáta sa budú odosielať postupne, po jednom bite

  • (1 bajt = 8 bitov)

Na rozdiel od paralelnej komunikácie, kde sa súčasne posiela veľa bitov.

protokol UART

Konkrétnejšie, keď používate Serial s Arduino a Raspberry Pi, používate protokol UART. UART znamená „Univerzálny asynchrónny príjem a prenos“. V podstate ide o asynchrónny multi-master protokol založený na sériovej komunikácii, ktorý vám umožní komunikovať medzi 2 doskami.

Existujú knižnice, ktoré všetky nízke vrstvy zvládnu za vás. Multi-master znamená, že všetky pripojené zariadenia budú môcť voľne odosielať dáta, kedy budú chcieť. Toto je jeden z hlavných rozdielov medzi protokolmi master-slave, kde môže komunikáciu iniciovať iba hlavné zariadenie. Zvyčajne budete používať iné protokoly, ako sú I2C a SPI, keď potrebujete konfigurácie master-slave: napríklad keď máte jednu dosku Arduino a viacero senzorov alebo akčných členov.

Doska Arduino Uno má jeden UART, ktorý môžete použiť buď s káblom USB alebo z pinov RX/TX (nepoužívajte ho s oboma súčasne). Niektoré dosky majú viac dostupných UART. Napríklad Arduino Mega má rôzne sériové čísla (Serial, Serial1, Serial2, Serial3) a Arduino Zero má iba natívny USB port (použite SerialUSB namiesto Serial).

Na Raspberry Pi môžete pripojiť mnoho sériových zariadení na porty USB. Každé z nich bude mať iný názov zariadenia. Môžete tiež použiť GPIO (RX0/TX0) pre ďalší UART.

Sériovú komunikáciu ste už určite použili mnohokrát. Som si istý, že už poznáte sériovú knižnicu Arduino, ktorá vám umožňuje zaznamenať, čo sa deje vo vašom kóde, a získať vstup od používateľov. Keď používate sériový monitor, v podstate vaše Arduino IDE iniciuje sériovú komunikáciu s vaším Arduinom.

Údaje môžete prijímať a odosielať priamo zo sériového monitora. To, čo tu urobíme, je takmer to isté, až na to, že namiesto vášho Arduino IDE bude druhou stranou sériovej komunikácie doska Raspberry Pi. Budeme musieť urobiť nejaké nastavenie a napísať nejaký kód, aby to fungovalo. Potom si Raspberry Pi aj Arduino budú môcť navzájom posielať správy. Pozrime sa teraz, ako fyzicky spojiť 2 dosky dohromady.

Existujú 2 spôsoby, ako spojiť Raspberry Pi a Arduino pre sériovú komunikáciu.

Serial via USB

Najjednoduchším spôsobom je použiť USB kábel medzi oboma doskami. Na strane Raspberry Pi vám postačí jednoduchý USB konektor. Môžete si vybrať ktorýkoľvek zo 4 USB portov dostupných na doske. Pre Arduino budete používať USB port, ktorý používate na nahrávanie kódu z počítača (s Arduino IDE) na vašu dosku. Tu bude konektor USB závisieť od verzie, ktorú máte. Pre dosky ako Arduino Uno a Mega sa konektor bude líšiť od Arduino Nano a od Arduino Zero.

Poznámka: Najprv budete musieť pripojiť svoje Arduino k počítaču, aby ste mohli nahrať kód do dosky. Potom pripojte kábel USB k Raspberry Pi. Raspberry Pi bude napájať Arduino cez tento kábel.

Serial via GPIOs

V závislosti od vašej dosky Arduino možno budete musieť použiť menič úrovne napätia. Raspberry Pi pracuje pri 3,3 V. Pre dosky Arduino ako Due, 101 to bude v poriadku, pretože tiež používajú 3,3 V. Ale pre mnoho Arduino, ako je Uno, Mega, Leonardo, Nano a mnoho ďalších, doska pracuje pri 5V. Na ochranu Raspberry Pi pri pripájaní RX a TX teda potrebujete 3,3V/5V menič úrovne (viac informácií o kolíkoch Raspberry Pi a kolíkoch Arduino Uno).

Vo zvyšku tohto tutoriálu budeme používať nastavenie pomocou kábla USB. Bude to jednoduchšie spravovať a pokiaľ na to nemáte dobrý dôvod, mali by ste na sériovú komunikáciu radšej použiť kábel USB namiesto obyčajného gpios.

Pre Arduino nepotrebujete žiadne špeciálne nastavenie. Len sa uistite, že ste si stiahli a nainštalovali Arduino IDE. Teraz je na vašom Raspberry Pi potrebných niekoľko vecí, aby komunikácia fungovala. Pripojte sa k svojmu Raspberry Pi, buď cez ssh, alebo pomocou pluginu obrazovka+myš+klávesnica a otvorte terminál. Ak ste na svojom Pi ešte nenainštalovali operačný systém, môžete Raspbian alebo Ubuntu veľmi jednoducho nainštalovať na SD kartu.

Zistite dosku Arduino

Keď pripájate Arduino pomocou USB kábla, mali by ste ho vidieť ako /dev/ttyACM0 alebo /dev/ttyUSB0 (niekedy môže byť číslo iné, napríklad /dev/ttyACM1). Jednoducho spustite ls /dev/tty* a mali by ste to vidieť. V tomto bode, ak si nie ste istí, ktoré zariadenie je doska Arduino, jednoducho dosku odpojte (odpojte kábel USB) a znova spustite ls /dev/tty*. Týmto spôsobom ľahko zistíte názov sériového zariadenia vášho Arduina.

Hardvérové ​​povolenia pre Serial

Môžete tiež pridať svojho používateľa do skupiny dialout, aby ste sa vyhli chybám, ako napríklad: serial.serialutil.SerialException: [Errno 13] nemohol otvoriť port /dev/ttyACM0: [Errno 13] Povolenie odmietnuté: ‘/dev/ ttyACM0’.

Tým sa zabezpečí, že budete mať prístup k sériovým zariadeniam (/dev/ttyACMx, /dev/ttyUSBx, …).

Potom, čo ste sa pridali do skupiny dialout, musíte reštartovať svoje Pi (alebo aspoň odhlásiť/prihlásiť), aby sa zmena uplatnila – prečítajte si viac o hardvérových povoleniach Raspberry Pi. Nainštalujte sériovú knižnicu Python na Raspberry Pi Aby ste mohli používať sériové rozhranie s Pythonom, musíte si nainštalovať knižnicu. Pre tento tutoriál použijeme knižnicu pySerial (dokumentácia pre Python 3). Postup inštalácie:

Táto knižnica Python je dobre známa a používa sa v mnohých aplikáciách. Ak sa pri inštalácii zobrazí chyba ako „/usr/bin/python3: Žiadny modul s názvom pip“, musíte najprv nainštalovať pip pomocou sudo apt install python3-pip.

Začnime veľmi jednoduchým programom.

Najprv inicializujeme sériovú komunikáciu a zvolíme prenosovú rýchlosť, 9600. 9600 je bežne používaná prenosová rýchlosť a tiež dosť nízka. Vo svojich budúcich aplikáciách môžete bez problémov použiť prenosovú rýchlosť 57600 alebo dokonca 115200. V tomto návode budeme pokračovať s 9600. Každú sekundu prinútime Arduino poslať reťazec pomocou Serial.println(). funkcia println() pridá na koniec reťazca znak nového riadku „\n“. Môžete otvoriť sériový monitor a zobraziť reťazec na vašom počítači.

Raspberry Pi Python kód

Takže, čo robí tento kód?

Najprv importujeme sériovú knižnicu, ktorú sme predtým nainštalovali.

Sériová komunikácia sa inicializuje volaním serial.Serial() spolu s niekoľkými parametrami:

  • Názov sériového zariadenia pre Arduino: zvyčajne „/dev/ttyACM0“, „/dev/ttyUSB0“ alebo podobne.
  • Prenosová rýchlosť: tento parameter je veľmi dôležitý. Musíte použiť rovnakú prenosovú rýchlosť, akú ste použili na Arduine, inak bude všetko, čo budete čítať a zapisovať, zle. Vyberieme si teda 9600, ako sme to urobili v náčrte Arduina.
  • Časový limit: toto je časový limit pre operácie čítania. Tu sme to nastavili na 1 sekundu. Znamená to, že keď čítame zo Serial, program nebude navždy zastavený , ak dáta neprichádzajú. Ak po 1 sekunde alebo čítaní nie sú prijaté všetky bajty, funkcia vráti už prijaté bajty.

Takže serial.Serial() vráti objekt, ktorý môžete použiť pre všetky vaše sériové operácie. Uložíme ho do premennej ‚ser‘.

Potom použijeme funkciu reset_input_buffer(). Tým sa vyprázdni každý bajt, ktorý by sa už mohol nachádzať vo vstupnej vyrovnávacej pamäti, takže sa vyhnete prijatiu zvláštnych/neužitočných/neúplných údajov na začiatku komunikácie.

(Myslite na funkciu loop() v náčrte Arduina) skontrolujeme, či sú nejaké údaje dostupné pomocou atribútu in_waiting (nedávajte zátvorky, toto nie je funkcia). Ak áno, môžeme údaje prečítať. Funkcia readline() bude čítať všetky bajty, kým sa nezistí znak nového riadku. Ak by sme len vytlačili, čo sme dostali, videli by sme

b’Ahoj z Arduina!.\r\n’.

Pri čítaní zo Serial dostávate bajty a tieto bajty musíte konvertovať (dekódovať) na príslušný typ údajov. Takže používame decode(‘utf-8’) – môžete použiť aj decode(‘ascii‘) – na dekódovanie prijatých údajov do reťazca.

Nakoniec, funkcia rstrip() je špecifická pre reťazce, umožňuje vám odstrániť akékoľvek koncové znaky (nový riadok, návrat vozíka). Týmto spôsobom môžeme odstrániť „\r“ a „\n“ a získať správny reťazec. Poznámka: tu vždy čítame celý riadok. Ak chcete prečítať určitý počet bajtov – jeden alebo viac – použite funkciu read(size=1).

Testovanie sériovej komunikácie

Teraz odpojte dosku Arduino od počítača a pripojte ju k doske Raspberry Pi. Kód Arduino už beží, hneď ako sa zapne. Na Raspberry Pi vytvorte spustiteľný súbor Python a spustite ho.

Funguje to! Reťazec odosielaný Arduinom každú sekundu sa zobrazí na termináli Raspberry Pi.

Urobme veci trochu zaujímavejšie. Videli ste, ako odosielať údaje z Arduina do Raspberry Pi. V tejto časti uvidíte, ako hovoriť z Raspberry Pi do Arduina. Budete tak mať obe strany komunikácie a budete môcť vytvárať programy, ktoré čakajú na vzájomný vstup.

Arduino kód :

Tu skontrolujeme, či Arduino prijalo dáta pomocou Serial.available(). Získate tak počet bajtov, ktoré už prišli a sú uložené v prijímacej vyrovnávacej pamäti. Ak prišli nejaké údaje, použijeme Serial.readStringUntil() so znakom nového riadku ‚\n‘ na získanie ďalšieho riadku. Je to podobné funkcii readline(). Všetky bajty prijaté do „\n“ sa automaticky skonvertujú a pridajú do objektu Arduino String. Potom už len vytlačíme prijaté údaje s dodatočným textom.

Poznámka: Ak chcete čítať bajty jeden po druhom, môžete tak urobiť pomocou funkcie Serial.read(). Potom budete musieť v prípade potreby previesť tento (tieto) bajty: int, String atď.

Raspberry Pi Python kód :

Na odoslanie údajov do Arduina použite funkciu pySerial write(). Tu môžete vidieť, že som pred reťazec na odoslanie pridal „b“. Toto zakóduje reťazec na bajty, pretože bajty môžete posielať iba cez seriál. Všetky údaje, ktoré nie sú bajtové alebo bajtové pole, musia byť pred odoslaním skonvertované. Ak sa len pokúsite odoslať reťazec takto, zobrazí sa táto chyba „TypeError: Unicode reťazce nie sú podporované, prosím zakódujte do bajtov: ‚Ahoj z Raspberry Pi!‘ “

Potom urobíme to isté ako predtým:

Prečítame riadok, dekódujeme ho na reťazec a odstránime akýkoľvek koncový znak. Nepoužívame tu ser.in_waiting, pretože pre túto konkrétnu aplikáciu vieme, že Arduino pošle späť nejaké dáta hneď po prijatí reťazca. Máme tiež 1 sekundový časový limit, aby sme sa vyhli uviaznutiu na tejto linke. Nakoniec vytlačíme prijatý reťazec a počkáme 1 sekundu s time.sleep() pred odoslaním ďalšieho reťazca cez Serial.

Na svojom Raspberry Pi vytvorte spustiteľný súbor Python a spustite ho.

Úspech! Arduino dostalo reťazec a poslalo ho späť s niekoľkými ďalšími slovami. Potom Raspberry Pi prijalo a vytlačilo posledný reťazec.

V tomto návode ste sa naučili, ako komunikovať medzi vašou Raspberry Pi a doskou Arduino cez Serial.

Bude to pre vás užitočné? Odpoveď je áno a dosť často. Raspberry Pi je skvelé na to, že má vo vašej aplikácii zabudovaný veľký výpočtový výkon. Môžete spustiť kompletný softvér v mnohých jazykoch, webové servery, robotické aplikácie atď. Raspberry Pi určite má nejaké GPIO, ktoré môžete použiť, ale nie sú také dobré ako tie Arduino. Okrem toho máte viac šancí na spálenie Pi, ak urobíte niečo zlé s hardvérom.

Arduino je vhodnejšie na priame ovládanie hardvérových senzorov a akčných členov: IMU, servomotory, krokové motory, čokoľvek, čo vyžaduje viac energie atď. Celkovo vzaté, 2 dosky môžu dokonale spolupracovať: Raspberry Pi ako „mozog“ aplikácie a Arduino ako „svaly“ so sériovou komunikáciou, vďaka ktorej sa navzájom rozprávajú.


Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *

Nemôžete kopírovať obsah tejto stránky