{"id":5796,"date":"2021-08-12T11:21:58","date_gmt":"2021-08-12T09:21:58","guid":{"rendered":"https:\/\/www.picademie.nl\/?p=5796"},"modified":"2022-02-06T06:46:41","modified_gmt":"2022-02-06T05:46:41","slug":"seriele-communicatie-tussen-raspberry-pi-en-arduino","status":"publish","type":"post","link":"https:\/\/www.picademie.nl\/index.php\/2021\/08\/12\/seriele-communicatie-tussen-raspberry-pi-en-arduino\/","title":{"rendered":"Seri\u00eble communicatie met Arduino"},"content":{"rendered":"\n<p>In projecten kan het interessant zijn om een \u200b\u200bseri\u00eble communicatie tussen Raspberry Pi en een Arduino tot stand te brengen.&nbsp;Dit maakt het mogelijk om de rekenkracht en draadloze interfaces van de Raspberry Pi te koppelen met de in- &amp; outputs van de Arduino modules.&nbsp;<\/p>\n\n\n\n<p>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.).<\/p>\n\n\n\n<p>In deze tutorial zie je in twee voorbeelden hoe ik een seri\u00eble communicatie tussen Raspberry Pi en Arduino via de USB-poort opzet.&nbsp;Ik gebruik daarvoor een Arduino UNO-kaart, maar deze kan vervangen worden door andere microcontrollers met een seri\u00eble verbinding zoals de Nano, Mega, EPS32, ESP8266 of de Raspberry Pi Pico.<\/p>\n\n\n\n<p><strong>Schema<\/strong><br>Om seri\u00eble 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.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-4.png\" alt=\"\" class=\"wp-image-5797\" width=\"401\" height=\"296\" srcset=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-4.png 312w, https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-4-300x221.png 300w, https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-4-80x60.png 80w\" sizes=\"auto, (max-width: 401px) 100vw, 401px\" \/><figcaption>De Raspberry Pi en de Arduino worden via de USB porten met elkaar verbonden<\/figcaption><\/figure>\n\n\n\n<p>Het is ook mogelijk om seri\u00eble 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.<\/p>\n\n\n\n<p>&#8211; Tx GPIO14 (RPI) &lt;-&gt; Rx 0 (Arduino)<br>&#8211; Rx GPIO15 (RPI) &lt;-&gt; Tx 1 (Arduino)<br>&#8211; GND (RPI) &lt;-&gt; GND (Arduino)<\/p>\n\n\n\n<p><strong>Raspberry Pi-configuratie<\/strong><br>In principe ga ik ervan uit dat je rechtstreeks op de Raspberry Pi werkt. Dit project is niet geschikt om te werken met <span class=\"has-inline-color has-vivid-cyan-blue-color\">PuTTY<\/span>. 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 <span class=\"has-inline-color has-vivid-cyan-blue-color\">raspi-config<\/span>.<\/p>\n\n\n\n<p>Om de seri\u00eble interface van de Raspberry Pi te gebruiken, moet deze zijn ingeschakeld in het configuratiemenu. Voer hiervoor de volgende opdracht in een terminal in:<\/p>\n\n\n\n<p><code><span class=\"has-inline-color has-vivid-cyan-blue-color\">sudo raspi-config<\/span><\/code><\/p>\n\n\n\n<p>Selecteer in het menu &#8220;<strong>5 \u2013 Interfacing Options<\/strong>&#8221; en vervolgens &#8220;<strong>P6 Serial<\/strong>&#8221; en valideer met <strong>OK<\/strong>.<\/p>\n\n\n\n<p>Nadat de verbinding tot stand is gebracht, kun je de apparaten controleren die op de seri\u00eble poort zijn aangesloten door in de terminal de opdracht te typen:<\/p>\n\n\n\n<p><code><span class=\"has-inline-color has-vivid-cyan-blue-color\">lsusb<\/span><\/code><\/p>\n\n\n\n<p>De Raspberry Pi laat een overzicht met apparaten zien die op de USB-poorten zijn aangesloten. Mijn \u2018Arduino\u2019 heb ik in China gekocht\u2026. 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?<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"99\" src=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-5.png\" alt=\"\" class=\"wp-image-5800\" srcset=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-5.png 605w, https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-5-300x49.png 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><figcaption>Sorry voor de kleine letters&#8230; <\/figcaption><\/figure>\n\n\n\n<p>Om de naam te vinden van de poort waarop de Arduino is aangesloten, wordt het volgende commando geadviseerd:<\/p>\n\n\n\n<p><code><span class=\"has-inline-color has-vivid-cyan-blue-color\">dmesg | grep \"tty\"<\/span><\/code><\/p>\n\n\n\n<p>Deze opdracht retourneert de systeemberichten met betrekking tot de seri\u00eble (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 <strong><span class=\"has-inline-color has-vivid-cyan-blue-color\">ttyUSB0<\/span><\/strong> te zijn.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"589\" height=\"250\" src=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-6.png\" alt=\"\" class=\"wp-image-5802\" srcset=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-6.png 589w, https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-6-300x127.png 300w\" sizes=\"auto, (max-width: 589px) 100vw, 589px\" \/><\/figure>\n\n\n\n<p><strong>Note van de schrijver<\/strong>: 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.<\/p>\n\n\n\n<p><strong>Installatie van de Arduino IDE op Raspberry Pi<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-7.png\" alt=\"\" class=\"wp-image-5803\" width=\"349\" height=\"314\" srcset=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-7.png 323w, https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-7-300x270.png 300w\" sizes=\"auto, (max-width: 349px) 100vw, 349px\" \/><\/figure>\n\n\n\n<p>Om de Arduino IDE op Raspberry Pi te installeren kun je het beste de terminal gebruiken. Voer de volgende regels in:<\/p>\n\n\n\n<p><code><span class=\"has-inline-color has-vivid-cyan-blue-color\">mkdir ~\/ArduinoIDE<br>cd ~\/ArduinoIDE<br>wget https:\/\/downloads.arduino.cc\/arduino-1.8.9-linuxarm.tar.xz<br>tar xvJf arduino-1.8.9-linuxarm.tar.xz<br>cd arduino-1.8.9\/<br>.\/install.sh<br>rm ..\/arduino-1.8.9-linuxarm.tar.xz<\/span><\/code><\/p>\n\n\n\n<p>Het voordeel om de Arduino IDE op de Raspberry Pi ge\u00efnstalleerd te hebben, is dat je de Arduino er direct mee kunt programmeren.<\/p>\n\n\n\n<p><strong>Arduino verbinden met IDE<\/strong><br>Om de Arduino met de IDE te verbinden, moet je \u2018m in IDE de juiste poort selecteren. Hieronder laat ik zien hoe je dit doet.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Sluit de Arduino met de USB-kabel op de Raspberry Pi aan.<\/li><li>Start op de Raspberry Pi de Arduino IDE op. Ga naar <span class=\"has-inline-color has-vivid-cyan-blue-color\">Hulpmiddelen <\/span>en selecteer bij <span class=\"has-inline-color has-vivid-cyan-blue-color\">Board:<\/span> het bord dat je gebruikt.<\/li><li>Ga opnieuw naar <span class=\"has-inline-color has-vivid-cyan-blue-color\">Hulpmiddelen<\/span>, selecteer <span class=\"has-inline-color has-vivid-cyan-blue-color\">Poort <\/span>en kies willekeurig, of als je weet welke poort het betreft, een poort uit de aangeboden lijst.<\/li><\/ol>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-8.png\" alt=\"\" class=\"wp-image-5804\" width=\"503\" height=\"336\" srcset=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-8.png 471w, https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-8-300x200.png 300w\" sizes=\"auto, (max-width: 503px) 100vw, 503px\" \/><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\"><li>Ga naar <span class=\"has-inline-color has-vivid-cyan-blue-color\">Hulpmiddelen <\/span>en selecteer <span class=\"has-inline-color has-vivid-cyan-blue-color\">Haal Board info<\/span><br>Als je de juiste poort geselecteerd hebt opent zich direct een venster met de informatie van het aangesloten Arduino bord.<\/li><\/ol>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-9.png\" alt=\"\" class=\"wp-image-5805\" width=\"263\" height=\"136\"\/><\/figure>\n\n\n\n<p>Het mag duidelijk zijn dat in dit voorbeeld <strong>\/dev\/ttyUSB0<\/strong> de poort Raspberry Pi is waarop de Arduino aangesloten is.<\/p>\n\n\n\n<p>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\u2026\u2026 dan heb je beet!<\/p>\n\n\n\n<p><strong>De code<\/strong><br>Voor beide computers heb je softwarecode nodig. <\/p>\n\n\n\n<p><strong>Arduino code<\/strong><br>De bibliotheek die wordt gebruikt voor seri\u00eble communicatie aan de Arduino-kant is dezelfde als voor de communicatie met de seri\u00eble monitor, het betreft de <span class=\"has-inline-color has-vivid-cyan-blue-color\">Serial.h-bibliotheek<\/span>. Zorg ervoor dat de communicatiesnelheid voor beide apparaten gelijk is (<span class=\"has-inline-color has-vivid-cyan-blue-color\">baudrate=9600<\/span>), anders werkt de communicatie niet.<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/Arduino_code1.zip\">Download hier de Arduino_code1<\/a><a href=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/Arduino_code1.zip\" class=\"wp-block-file__button\" download>Download<\/a><\/div>\n\n\n\n<p>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.<\/p>\n\n\n\n<p><strong>Let op!<\/strong> 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.<\/p>\n\n\n\n<p><strong>Python code (picom.py)<\/strong><br>Voor de Raspberry Pi gebruiken we een Python code. De bibliotheek die gebruikt wordt om de seri\u00eble communicatie te beheren, is de seri\u00eble bibliotheek. Vergeet niet in het script de <strong>juiste poort<\/strong> te vermelden.<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/picom.zip\">Download hier picom.zip voor de Raspberry Pi<\/a><a href=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/picom.zip\" class=\"wp-block-file__button\" download>Download<\/a><\/div>\n\n\n\n<p>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.<\/p>\n\n\n\n<p><strong>Resultaat<\/strong><br>De Raspberry Pi stuurt het bericht &#8220;Hallo Arduino&#8221; via de seri\u00eble poort naar de Arduino en de Arduino antwoordt met zijn naam en het ontvangen bericht.<\/p>\n\n\n\n<p>Het python-script genaamd picom.py wordt gestart met: <code><span class=\"has-inline-color has-vivid-cyan-blue-color\">python3 picom.py<\/span><\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-10.png\" alt=\"\" class=\"wp-image-5815\" width=\"412\" height=\"167\" srcset=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-10.png 336w, https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-10-300x121.png 300w\" sizes=\"auto, (max-width: 412px) 100vw, 412px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Een ander voorbeeld<\/strong><\/h2>\n\n\n\n<p>In het volgende praktische voorbeeld koppelt de Arduino op verzoek van de Raspberry Pi een sensorwaarde terug.<\/p>\n\n\n\n<p><strong>Arduino code<\/strong><br>De Arduino geeft in dit voorbeeld de waarde van analoge pin <span class=\"has-inline-color has-vivid-cyan-blue-color\">A0<\/span> aan de Raspberry Pi door. Op <span class=\"has-inline-color has-vivid-cyan-blue-color\">A0 <\/span>wordt de analoge temperatuursensor <strong>TMP36 <\/strong>aangesloten. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"251\" src=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-11.png\" alt=\"\" class=\"wp-image-5817\"\/><figcaption>Arduino met de analoge temperatuursensor TMP36.<\/figcaption><\/figure>\n\n\n\n<p>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\u00ebren.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"112\" height=\"129\" src=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-12.png\" alt=\"\" class=\"wp-image-5819\"\/><figcaption>Voorbeeld van een potmeter<\/figcaption><\/figure>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/Arduino_leesA0.zip\">Download hier Arduino_leesA0.zip<\/a><a href=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/Arduino_leesA0.zip\" class=\"wp-block-file__button\" download>Download<\/a><\/div>\n\n\n\n<p>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.<\/p>\n\n\n\n<p>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.<\/p>\n\n\n\n<p><strong>Python code<\/strong><br>Geef de code de naam leesA0.py en start de code op met <span class=\"has-inline-color has-vivid-cyan-blue-color\">python3 leesA0.py<\/span><br>Let er ook hier op dat je de juiste seri\u00eble poort in de code hebt staan. Welke dit is heb ik hierboven beschreven bij &#8216;<strong>Arduino verbinden met IDE&#8217;<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/RPi_leesA0.zip\">Download hier RPi_leesA0.zip<\/a><a href=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/RPi_leesA0.zip\" class=\"wp-block-file__button\" download>Download<\/a><\/div>\n\n\n\n<p>Zodra het Python script gestart is met <code><span class=\"has-inline-color has-vivid-cyan-blue-color\">python3 leesA0.py<\/span><\/code> zie je de waarde die de Arduino op A0 meet.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-13.png\" alt=\"\" class=\"wp-image-5826\" width=\"473\" height=\"149\" srcset=\"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-13.png 391w, https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/image-13-300x94.png 300w\" sizes=\"auto, (max-width: 473px) 100vw, 473px\" \/><\/figure>\n\n\n\n<p>De beschreven codes zijn relatief eenvoudig. Je kunt ze daardoor makkelijk ombouwen naar jouw wensen.<\/p>\n\n\n\n<p><em>Have A Nice Day!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>In projecten kan het interessant zijn om een \u200b\u200bseri\u00eble communicatie tussen Raspberry Pi en een Arduino tot stand te brengen.&nbsp;Dit maakt het mogelijk om de <a class=\"mh-excerpt-more\" href=\"https:\/\/www.picademie.nl\/index.php\/2021\/08\/12\/seriele-communicatie-tussen-raspberry-pi-en-arduino\/\" title=\"Seri\u00eble communicatie met Arduino\">[&#8230;]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":5841,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[179,164,182,183,165,184,42,181,180,185],"class_list":["post-5796","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-arduino","tag-arnhem","tag-communicatie","tag-communication","tag-doornheim","tag-examples","tag-raspberry-pi","tag-serial","tag-serieel","tag-voorbeelden"],"jetpack_featured_media_url":"https:\/\/www.picademie.nl\/wp-content\/uploads\/2021\/08\/serieel2.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/posts\/5796","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/comments?post=5796"}],"version-history":[{"count":0,"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/posts\/5796\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/media\/5841"}],"wp:attachment":[{"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/media?parent=5796"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/categories?post=5796"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/tags?post=5796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}