Arduinos erscheinen normalerweise als serielle USB-Geräte. Die aktuellen Karten verwenden den im Hauptmikroprozessor integrierten seriellen USB-Treiber, ältere Arduinos (und Klone) verwendeten jedoch separate serielle USB-Chips von Drittanbietern.
Um einfach Serial.print
Daten auf dem Raspberry Pi vom Arduino zu empfangen , verwende ich das GNU Screen- Programm als Basis-Terminal: screen [serial-port] [baud-rate]
(zum Beispiel screen /dev/ttyACM0 9600
).
Ich habe drei verschiedene Arduinos und einen ziemlich unterschiedlichen Klon getestet. Die neueren Varianten erschienen alle als /dev/ttyACM0
Ports und die älteren /dev/ttyUSB0
. Das habe ich unter Raspbian gefunden:
Der Raspberry Pi liefert möglicherweise nicht genügend Strom, um ein Arduino anzutreiben, sodass Sie möglicherweise externe Stromversorgung benötigen. Der Vollständigkeit halber habe ich auch einen Prolific PL2303 getestet , obwohl er auf keinem mir bekannten Arduino zu finden ist. Es wirkte ganz fröhlich wie /dev/ttyUSB0
.
Für eine komplexere Kommunikation mit Sensoren können Sie Firmata in Betracht ziehen , ein "generisches Protokoll für die Kommunikation mit Mikrocontrollern über Software auf einem Host-Computer". Es enthält Implementierungen für Arduino- und Python-Bibliotheken, die auf der Raspberry Pi-Seite ausgeführt werden können.
Hier ein kleines Beispiel mit pyFirmata zum Lesen eines LM35 und zum Ändern der Helligkeit einer LED:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# simple test of pyfirmata and Arduino; read from an LM35 on A0,
# brighten an LED on D3 using PWM
# scruss, 2012-08-14 - tested on Arduino Uno & Raspberry Pi (Raspbian)
import pyfirmata
# Create a new board, specifying serial port
board = pyfirmata.Arduino('/dev/ttyACM0')
# start an iterator thread so that serial buffer doesn't overflow
it = pyfirmata.util.Iterator(board)
it.start()
# set up pins
pin0=board.get_pin('a:0:i') # A0 Input (LM35)
pin3=board.get_pin('d:3:p') # D3 PWM Output (LED)
# IMPORTANT! discard first reads until A0 gets something valid
while pin0.read() is None:
pass
for i in range(10):
pin3.write(i/10.0) # set D3 to 0, 10%, 20%, ... brightness
print "PWM: %d %% Temperature %.1f °C" % (i * 10, pin0.read() * 5 * 100)
board.pass_time(1) # pause 1 second
pin3.write(0) # turn LED back off
board.exit()
Es gibt einige Einschränkungen bei der Verwendung von pyFirmata:
- Analoge Lesevorgänge und PWM-Schreibvorgänge werden auf einen Bereich von 0 bis 1 normalisiert und nicht auf die Standard-Arduino-Werte 0 bis 255 und 0 bis 1023.
- Sie müssen wirklich einen separaten Iterator-Thread starten, um zu verhindern, dass alte Messwerte über den seriellen Puffer laufen
- Da der Arduino asynchron gelesen wird, stellen Sie sicher, dass die pyFirmata-Verbindung vollständig initialisiert ist, bevor Sie von den Ports lesen. Ansonsten
None
ergeben sich Werte.