Den Arduino mit dem Raspberry Pi verbinden seriell

Den Arduino mit dem Raspberry Pi verbinden seriell Titelbild

Den Arduino mit dem Raspberry Pi verbinden seriell

Mit dem Raspberry Pi gibt es einen kleinen, aber starken Minicomputer, der ziemlich mächtig ist. Aber beim Anschließen von Sensoren und dem Steuern von Elektronik gibt es Limitierungen, die der Arduino nicht hat. Ganz konkret sind das die analogen Eingänge am Arduino, die PWM Pins und die zusätzlichen 19 IO Pins. Damit man sich nicht für eines der Geräte entscheiden muss, kann man einfach beide benutzen. Hier wollen wir dir zeigen, wie eine serielle Verbindung aufgebaut werden kann. Dafür wird ein funktionstüchtiger Raspberry Pi und ein Arduino mit USB-Kabel benötigt.

Im ersten Schritt muss du einfach nur den Arduino über den USB-Anschluss mit dem Raspberry Pi verbindnen. Wenn du die Arduino IDE auf dem Pi instatlliert hast, kannst du auch schon mit der Programmierung des Arduinos beginnen.

Also, Schritt 1: Arduino programmieren

void setup(){
    Serial.begin(9600);
}

void loop(){
    if( Serial.available() ){
        byte empfang = Serial.read();
        Serial.print("Empfangen: ");
        Serial.println(empfang, DEC);
    }
}

Schritt für Schritt

In Zeile zwei starten wir wie gewohnt die serielle Verbindung.

Das erste Neue kommt erst in Zeile 6. In der Zeile gibt es eine if Abfrage. Mit Serial.available() wird sichergestellt, dass mit dem Senden und Empfangen über den seriellen Anschluss nur dann angefangen wird, wenn es auch wirklich eine Verbindung gibt.

In Zeile 7 wird alles, was seriell empfangen wird, in der Variablen empfang gespeichert. Um die empfangenen Daten zu lesen, wird Serial.read() benutzt. In der nächsten Zeile wird dann nur zur Verdeutlichung zuerst der Text "Empfangen: " ausgegeben. Wichtig ist aber, dass dabei jedes Zeichen als Ascii Code empfangen wird.

In Zeile 9 wird dann der empfangene Inhalt wieder ausgegeben. Dabei steht dieser in der selben Zeile wie der Text.

Raspberry Pi

Bevor wir anfangen, den Raspberry Pi zu programmieren, müssen wir zuerst noch eine weitere Bibliothek herunterladen. Wir benutzen dafür das folgende Programm Python2. Wenn du dich noch nicht so sehr mit dem Raspberry Pi auskennst, würden wir das Jugend Programmiert Starterkit oder unsere anderen Inhalte auf unserer Online Plattform empfehlen.

sudo apt-get install minicom python-serial

Du kannst diese Datei: serial1.py nennen.

import serial
import time

verbindung = serial.Serial('/dev/ttyACM0', 9600)
verbindung.isOpen()
time.sleep(5)

verbindung.write('text')
try:
    while True:
        antwort = verbindung.readline()
        print(antwort)
except KeyboardInterrupt:
    verbindung.close()

Das Programm starten:

 python serial1.py

Und mit Strg/Ctrl+C beenden.

Schritt für Schritt

Der Python Code ist ein wenig komplizierter und fängt mit den beiden benötigten Bibliotheken in Zeile 1 und 2 an.

In Zeile 4 wird dann die serielle Verbindung geöffnet. Dafür wird der Funktion serial.Serial() als ersten Parameter der Pfad zum Arduino übergeben und als zweiter Parameter die Datenrate. Die ist dieselbe, welche beim Arduino Programm in Zeile 2 definiert wird. Diese ganze Verbindung wird dann in der Variablen verbindung gespeichert. Mit .isOpen() wird die Verbindung geöffnet.

Pro Tipp: Den Pfad des Arduinos für das Python Programm wird auch unten rechts in der Arduino IDE angezeigt und kann von da ganz einfach übernommen werden.

In der nächsten Zeile gibt es ein eine Pause von 5 Sekunden. Diese brauchen wir, weil der Arduino beim Starten der seriellen Verbindung etwas Zeit benötigt.

In Zeile 8 werden dann mit der Funktion .write() zum ersten Mal seriell Daten übertragen. Als Parameter kannst du dabei ein String übergeben.

In Zeile 9 bis 14 gibt es dann eine try:-Bedingung. Diese sagt aus, dass alles von Zeile 10 bis 12 ausgeführt wird, solange das Programm zum Beispiel nicht über Strg/Ctrl+C beendet wird. Wenn das Programm aber unterbrochen wird, wird in Zeile 14 die Funktion .close() ausgeführt. Diese solltest du immer einbauen, wenn du mit der seriellen Kommunikation arbeitest. Ansonsten kann es Probleme beim erneuten Verbindungsaufbau geben.

In Zeile 10 gibt es eine while-Schleife, die immer läuft. In Zeile 11 wird dann mit .readline() jede Zeile, die empfangen wird, in der Variablen antwort gespeichert. Das Wichtige ist dabei auch die Betonung auf .readline(). Diese Funktion liest immer nur ganze Zeilen. Heißt, wenn der Arduino nur ein Serial.print("test") ausgeben würde, könnte das mit dieser Funktion nicht ausgelesen werden. Da das alles in einer while-Schleife läuft, wird auch jede Zeile nacheinander wiedergegeben.

pi@raspberry:~ $ python serial1.py 
Empfangen: 116

Empfangen: 101

Empfangen: 120

Empfangen: 116

So sieht das ganze dann aus.

Beispiel LEDs steuern

Im nächsten Beispiel wollen wir die eingebaute LED 13 über ein Python Programm am Pi steuern. Natürlich kannst du auch andere LEDs dafür nehmen. Arduino

void setup(){
    Serial.begin(9600);
    pinMode(13, OUTPUT);
}

void loop(){
    if (Serial.available() ){
        byte empfangen = Serial.read();
        if(empfangen == 49){
          digitalWrite(13, HIGH);
          Serial.println("LED ist an");
        }else{
          digitalWrite(13, LOW);
          Serial.println("LED ist aus");
        }
    }
}

ledSerial.py

import serial
import time

verbindung = serial.Serial('/dev/ttyACM0', 9600)
verbindung.isOpen()

print('Verbindung wird aufgebaut...')
time.sleep(5)

try:
    while True:
        ledStatus = raw_input('Soll die LED an oder aus?\n')
        if(ledStatus == 'an'):
            verbindung.write('1')
        else:
            verbindung.write('0')
        antwort = verbindung.readline()
        print(antwort)
except KeyboardInterrupt:
    verbindung.close()

Häufige Fehlermeldungen

OSError: [Errno 11] Resource temporarily unavailable

Dieser Fehler taucht z.B. dann auf, wenn die Arduino IDE ein neues Programm auf den Arduino flasht.

serial.serialutil.SerialException: could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0'

Hier wird kein Gerät unter der angegebenen Adresse gefunden. Du hast entweder einen falschen Pfad zu deinem Arduino angegeben oder es gibt Probleme bei der Verbindungen. Die Arduino IDE kann dir dabei weiterhelfen.

Noch Fragen oder Feedback?

Bevor du eine Frage stellen kannst musst du dich zuerst Anmelden oder Regestrieren!