Seriële communicatie met Arduino

In projecten kan het interessant zijn om een ​​seriële communicatie tussen Raspberry Pi en een Arduino tot stand te brengen. Dit maakt het mogelijk om de rekenkracht en draadloze interfaces van de Raspberry Pi te koppelen met de in- & outputs van de Arduino modules. 

Het eerste voorbeeld dat in me opkomt is het gebruik van dit systeem voor domotica waarbij de Raspberry Pi de besturingsinterface en intelligentie host en de Arduino fungeert als een programmeerbare automaat die de waarden meet van de componenten aan het einde van de keten (licht, radiator, ventilator, sensoren, enz.).

In deze tutorial zie je in twee voorbeelden hoe ik een seriële communicatie tussen Raspberry Pi en Arduino via de USB-poort opzet. Ik gebruik daarvoor een Arduino UNO-kaart, maar deze kan vervangen worden door andere microcontrollers met een seriële verbinding zoals de Nano, Mega, EPS32, ESP8266 of de Raspberry Pi Pico.

Schema
Om seriële communicatie tussen Raspberry Pi en Arduino tot stand te brengen, sluit je ze aan met een geschikte USB-kabel. In dit voorbeeld gebruik ik een Raspberry Pi 3B+ en een Arduino UNO. Er is daarmee een USB-A Male naar USB-B Male-kabel nodig.

De Raspberry Pi en de Arduino worden via de USB porten met elkaar verbonden

Het is ook mogelijk om seriële communicatie tot stand te brengen door de Rx/Tx-pinnen van beide apparaten te gebruiken. In deze tutorial houd ik het op de USB-verbinding.

– Tx GPIO14 (RPI) <-> Rx 0 (Arduino)
– Rx GPIO15 (RPI) <-> Tx 1 (Arduino)
– GND (RPI) <-> GND (Arduino)

Raspberry Pi-configuratie
In principe ga ik ervan uit dat je rechtstreeks op de Raspberry Pi werkt. Dit project is niet geschikt om te werken met PuTTY. Wil je toch op een pc, op afstand werken wil ik je eraan herinneren dat je de VNC-verbinding op de Raspberry Pi moet configureren. Dit kan met raspi-config.

Om de seriële interface van de Raspberry Pi te gebruiken, moet deze zijn ingeschakeld in het configuratiemenu. Voer hiervoor de volgende opdracht in een terminal in:

sudo raspi-config

Selecteer in het menu “5 – Interfacing Options” en vervolgens “P6 Serial” en valideer met OK.

Nadat de verbinding tot stand is gebracht, kun je de apparaten controleren die op de seriële poort zijn aangesloten door in de terminal de opdracht te typen:

lsusb

De Raspberry Pi laat een overzicht met apparaten zien die op de USB-poorten zijn aangesloten. Mijn ‘Arduino’ heb ik in China gekocht…. Waarschijnlijk de reden dat de naam Arduino niet, maar QuinHeng in de lijst staat. Ik herkende het aan de HL-340 USB-Serieel adapter. Wat staat er bij jouw?

Sorry voor de kleine letters…

Om de naam te vinden van de poort waarop de Arduino is aangesloten, wordt het volgende commando geadviseerd:

dmesg | grep "tty"

Deze opdracht retourneert de systeemberichten met betrekking tot de seriële (tty) poorten. Als je de USB-kabel in de poort steekt of verwijdert wordt er een systeembericht aangemaakt, waarschijnlijk is dit het laatste bericht. In ons geval lijkt de gebruikte poortnaam ttyUSB0 te zijn.

Note van de schrijver: Eerlijk gezegd vind ik dit een vreemde manier om erachter te komen hoe de poort heet waarop de Arduino aangesloten is. Hieronder leg ik een andere manier uit om de poortnaam vast te stellen door de Arduino IDE te gebruiken.

Installatie van de Arduino IDE op Raspberry Pi

Om de Arduino IDE op Raspberry Pi te installeren kun je het beste de terminal gebruiken. Voer de volgende regels in:

mkdir ~/ArduinoIDE
cd ~/ArduinoIDE
wget https://downloads.arduino.cc/arduino-1.8.9-linuxarm.tar.xz
tar xvJf arduino-1.8.9-linuxarm.tar.xz
cd arduino-1.8.9/
./install.sh
rm ../arduino-1.8.9-linuxarm.tar.xz

Het voordeel om de Arduino IDE op de Raspberry Pi geïnstalleerd te hebben, is dat je de Arduino er direct mee kunt programmeren.

Arduino verbinden met IDE
Om de Arduino met de IDE te verbinden, moet je ‘m in IDE de juiste poort selecteren. Hieronder laat ik zien hoe je dit doet.

  1. Sluit de Arduino met de USB-kabel op de Raspberry Pi aan.
  2. Start op de Raspberry Pi de Arduino IDE op. Ga naar Hulpmiddelen en selecteer bij Board: het bord dat je gebruikt.
  3. Ga opnieuw naar Hulpmiddelen, selecteer Poort en kies willekeurig, of als je weet welke poort het betreft, een poort uit de aangeboden lijst.
  1. Ga naar Hulpmiddelen en selecteer Haal Board info
    Als je de juiste poort geselecteerd hebt opent zich direct een venster met de informatie van het aangesloten Arduino bord.

Het mag duidelijk zijn dat in dit voorbeeld /dev/ttyUSB0 de poort Raspberry Pi is waarop de Arduino aangesloten is.

Indien je een poort kiest waarop de Arduino NIET is aangesloten, wordt er geen informatie teruggekoppeld. Probeer het dus bij alle poorten die in het overzicht staan en kijk of er een venster opent met de informatie van het bord…… dan heb je beet!

De code
Voor beide computers heb je softwarecode nodig.

Arduino code
De bibliotheek die wordt gebruikt voor seriële communicatie aan de Arduino-kant is dezelfde als voor de communicatie met de seriële monitor, het betreft de Serial.h-bibliotheek. Zorg ervoor dat de communicatiesnelheid voor beide apparaten gelijk is (baudrate=9600), anders werkt de communicatie niet.

De code moet nog wel even ge-unzipt worden. Kopieer de codetekst en plak deze in de Arduino IDE. Klik vervolgens op upload (groen pijl naar rechts) en als het goed gegaan is staat de code nu in de Arduino.

Let op! Vergeet niet na het succesvol programmeren van de Arduino de USB kabel los te maken en deze even later er weer op aan te sluiten. De Arduino reset zich hierdoor en start het programma.

Python code (picom.py)
Voor de Raspberry Pi gebruiken we een Python code. De bibliotheek die gebruikt wordt om de seriële communicatie te beheren, is de seriële bibliotheek. Vergeet niet in het script de juiste poort te vermelden.

Het bestand moet nog wel even ge-unzipt worden. Kopieer de codetekst vervolgens in een editor zoals nano en sla het bestand op in een directory op de Raspberry Pi.

Resultaat
De Raspberry Pi stuurt het bericht “Hallo Arduino” via de seriële poort naar de Arduino en de Arduino antwoordt met zijn naam en het ontvangen bericht.

Het python-script genaamd picom.py wordt gestart met: python3 picom.py

Een ander voorbeeld

In het volgende praktische voorbeeld koppelt de Arduino op verzoek van de Raspberry Pi een sensorwaarde terug.

Arduino code
De Arduino geeft in dit voorbeeld de waarde van analoge pin A0 aan de Raspberry Pi door. Op A0 wordt de analoge temperatuursensor TMP36 aangesloten.

Arduino met de analoge temperatuursensor TMP36.

Heb je even geen analoge temperatuursensor bij de hand, een potmeter van 10kOhm werkt als voorbeeld ook prima. Sluit dan de +5V en de GND aan de uiteinden- en de A0 aan de loper van de potmeter. Als je na het starten van het Python script aan de loper draait, zie je in de software de waarde op A0 variëren.

Voorbeeld van een potmeter

Kopieer de codetekst en plak deze in de Arduino IDE. Klik vervolgens op upload (groen pijl naar rechts) en als het goed gegaan is staat de code nu in de Arduino.

Let erop dat je na het programmeren van de Arduino de USB kabel er even uithaalt en even later er weer insteekt. Zo reboot de Arduino en start het programma. Nu hoeft de Raspberry Pi alleen nog maar de waarde te lezen die de Arduino gemeten heeft. Daar hebben we de volgende (Python) code voor nodig.

Python code
Geef de code de naam leesA0.py en start de code op met python3 leesA0.py
Let er ook hier op dat je de juiste seriële poort in de code hebt staan. Welke dit is heb ik hierboven beschreven bij ‘Arduino verbinden met IDE’.

Zodra het Python script gestart is met python3 leesA0.py zie je de waarde die de Arduino op A0 meet.

De beschreven codes zijn relatief eenvoudig. Je kunt ze daardoor makkelijk ombouwen naar jouw wensen.

Have A Nice Day!