Raspberry Pi mit Arduino Uno verbinden

In diesem Artikel soll es darum gehen, wie man einen Raspberry Pi mit einem Arduino verbinden kann, um den Arduino dann vom Raspi steuern zu lassen. Ich orientiere mich hierbei an diesem Artikel, möchte das ganze allerdings in kleineren Schritten zeigen und auf die im Arduino eingebaute LED zu Testzwecken zurückgreifen, damit man nicht noch extra eine Schaltung aufbauen muss.

Verkabelung

Der Raspberry Pi bekommt seine reguläre Stromversorgung. Wenn man ihn fernsteuern will (z.B. über TightVNC), dann muss er natürlich im Netzwerk sein, also entweder schließt man seine Ethernet-Buchse an oder man verbindet ihn mit dem WLAN. Der Arduino wird dann über ein ganz normales USB-Kabel mit dem Raspi verbunden. Im Bild steckt der Raspi in einem Gehäuse. Das Breadboard neben dem Arduino wird für diesen Aufbau nicht benötigt.

raspberrypi_arduino

Software-Installation

Auf dem Raspberry Pi habe ich bereits als Betriebssystem Raspbian installiert. Als Python-IDE installiere ich dann noch die Ninja-IDE, indem ich die folgenden Befehle in das Terminal eingebe:

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install ninja-ide

Die Ninja-IDE ist dann über die Menü-Taste in der Kategorie Entwicklung zu finden.

ninjaidemenu

Die Arduino-Entwicklungsumgebung für den Raspberry Pi installiert man mit:

sudo apt-get install arduino

Daraufhin erscheint ebenfalls der Eintrag Arduino IDE in der Kategorie Entwicklung im Menü. Der Raspberry Pi soll später mit dem Arduino über die serielle Schnittstelle kommunizieren. Falls das dafür vorhandene Paket python-serial noch nicht installiert sein sollte, bekommt man es mit:

sudo apt-get install python-serial

 

Den Arduino programmieren

Wir öffnen die Arduino IDE über den neuen Menüeintrag. Programme für den Arduino nennt man Sketch, man schreibt sie in einer vereinfachten Variante von C++.

Bevor man mit dem Programmieren loslegt, sollte man sicherstellen, dass unter Tools -> Board das richtige Arduino-Modell ausgewählt wurde, in meinem Fall ist das der Arduino Uno. Außerdem muss unter Tools -> Serieller Port der COM-Port des Arduinos ausgewählt werden. Vermutlich wird dort auch nur dieser angezeigt. Sollte der Menüpunkt Serieller Port ausgegraut sein, kann das daran liegen, dass ihr über einen Remote-Zugriff, z.B. über den TightVNCServer, auf den Raspberry Pi zugreift. Diesem fehlen dann die nötigen Root-Rechte.

Das Problem lässt sich lösen, indem man im Terminal über den Befehl

sudo vncserver

eine neue Instanz des Servers mit Root-Rechten startet. Verbindet man sich dann mit dieser, so sollte man die nötigen Rechte besitzen. Klappt es dennoch nicht, kann man im Terminal über

sudo arduino

die IDE auch mir Root-Rechten starten und es sollte funktionieren.

Ob die Kommunikation zwischen Raspi und Arduino funktioniert, lässt sich leicht überprüfen. Über Datei -> Beispiele -> 01. Basics -> Blink öffnet sich ein Sketch, das die auf dem Arduino verbaute LED zum Blinken bringt. Über den Upload-Button wird der Sketch kompiliert und zum Arduino geschickt. Nach einer kurzen Übertragungszeit sollte dort dann eine LED zu blinken beginnen.

arduino_upload

Da wir den Arduino allerdings selbst programmieren wollen, öffnen wir über Datei -> Neu einen leeren Sketch.

Der C++-Code für den Arduino

In den leeren Sketch geben wir folgendes Programm ein:

const int led = 13;

void setup() {
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  Serial.begin(9600);
}

void loop() {
  if(Serial.available() > 0) {
    int count = Serial.read() - '0';

    for(int i=0; i<count; i++) {
      digitalWrite(led, HIGH);
      delay(300);

      digitalWrite(led, LOW);
      delay(300);
    }
  }
}

Die setup-Methode wird einmalig beim Programmstart, also wenn der Arduino Stromzufuhr bekommt, ausgeführt. Dabei wird der Pin mit der Nummer 13 als Ausgangs-Pin festgelegt und seine Spannung wird auf LOW gesetzt, also auf Masse, sodass die LED nicht leuchtet. Dann wird noch die serielle Übertragung gestartet; 9600 gibt die Übertragungsrate in BAUD an.

In der loop-Methode steht Quelltext, der daraufhin immer wieder wiederholt ausgeführt wird. Die if-Bedingung überprüft, ob Nachrichten an der seriellen Schnittstelle eingetroffen sind. Wenn ja, wird das gesendete Byte gelesen. Die for-Schleife lässt dann die LED so oft blinken, wie es in der Übertragung verlangt wurde. Danach wiederholt sich das Programm.

Der Python-Code für den Raspi

Als nächstes wollen wir, dass der Raspi Zahlen über die serielle Schnittstelle an den Arduino schickt. Dafür öffnen wir die Ninja-IDE und legen über File -> New File eine leere Datei an. Hier geben wir folgenden Python-Quelltext ein:

import serial

#seriellen Port finden, an welchem der Arduino angeschlossen ist
for com in range(0, 4):
    try:
        PORT = '/dev/ttyACM' + str(com)
        BAUD = 9600
        board = serial.Serial(PORT, BAUD)
        print("Arduino gefunden an ", PORT)
        board.close()
        break
    except:
        print("Arduino nicht gefunden")

# gefundenen Port öffnen
DEVICE = '/dev/ttyACM' + str(com)
BAUD = 9600
ser = serial.Serial(DEVICE, BAUD)

# Hauptprogramm
while True:
    userInput = int(
                input("Geben Sie eine Zahl ein, negativ fuer Programmende: "))
    if userInput > 0 and userInput < 10:
        ser.write(str(userInput))
    elif userInput < 0:
        break
    else:
        print("Die Zahl muss zwischen 0 und 10 liegen!")

Zuerst sucht das Programm den Port, an welchem der Arduino angeschlossen ist. Dazu durchläuft es die Ports /dev/ttyACM0 bis /dev/ttyACM03. Wurde der Arduino gefunden, wird danach die serielle Schnittstelle zur Kommunikation geöffnet. Im Hauptprogramm wird solange eine Schleife durchlaufen, bis eine negative Zahl eingegeben wird. Wird jedoch eine Zahl im Bereich von 1 bis 9 eingegeben, so wird diese über die serielle Schnittstelle an den Arduino gesendet und dessen LED sollte anfangen zu blinken:

arduinoanim

Quellen

Ninja IDE on the Raspberry Pi

Raspberry Pi und Arduino Uno verbinden

 

4 Gedanken zu „Raspberry Pi mit Arduino Uno verbinden

  1. Hey,
    bei wem ein Fehler wie dieser
    „File „test.py“, line 15
    SyntaxError: Non-ASCII character ‚\xc3‘ in file test.py on line 15, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

    auftritt muss einfach das:
    # -*- coding: utf-8 -*-
    an den Anfang seines Skriptes setzen.
    Viel Spaß!

  2. Scheiße! Ich habe alles versucht, was ich hier gelesen habe, aber unter „Tools“ bleibt „Serieller Port“ stur und immer ausgegraut …. Was ist denn da los????
    Ist doch zum Weinen!!!

    1. Hallo,
      Als erstes würde ich das USB-Kabel in einen anderen USB-Stecker stecken 😉
      Vielleicht ist auch das Kabel defekt, sodass dein PC den Arduino nicht erkennt.
      Nächster Ansatz wären USB-Port Treiber. Vielleicht ist deiner alt oder nicht vorhanden. Werden andere Geräte erkannt? Das kannst du zB mit einem USB Stick überprüfen.
      Falls alles funktioniert, könnte es natürlich auch am Arduino selbst liegen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.