Arduinos zwykle pojawiają się jako urządzenia szeregowe USB. Obecne płyty wykorzystują sterownik szeregowy USB wbudowany w główny mikroprocesor, ale starsze Arduinos (i klony) używały oddzielnych układów szeregowych USB innych firm.
Aby po prostu odbierać Serial.print
dane na Raspberry Pi z Arduino, używam programu GNU Screen jako podstawowego terminala: screen [serial-port] [baud-rate]
(na przykład screen /dev/ttyACM0 9600
).
Testowałem trzy różne Arduinos i jeden raczej inny klon. Wszystkie nowsze wersje pojawiły się jako /dev/ttyACM0
porty, a starsze /dev/ttyUSB0
. Oto, co znalazłem pod Raspbian:
Raspberry Pi może nie zapewniać wystarczającej mocy do prowadzenia Arduino, więc możesz potrzebować zasilania zewnętrznego. Dla kompletności przetestowałem również Prolific PL2303 , nawet jeśli nie ma go na żadnym Arduino, którego znam. Wyglądało to całkiem radośnie jako /dev/ttyUSB0
.
W przypadku bardziej skomplikowanej komunikacji z czujnikami można rozważyć Firmatę , „ogólny protokół do komunikacji z mikrokontrolerami z oprogramowania na komputerze hosta”. Ma implementacje dla Arduino i bibliotek Pythona do działania po stronie Raspberry Pi.
Oto mały przykład użycia pyFirmata do odczytu LM35 i zmiany jasności diody 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()
Podczas korzystania z pyFirmata istnieją pewne zastrzeżenia:
- Odczyty analogowe i zapisy PWM są znormalizowane do zakresu 0 .. 1, a nie standardowe Arduino 0 .. 255 i 0 .. 1023.
- Naprawdę musisz uruchomić oddzielny wątek iteratora, aby zatrzymać stare odczyty przepełnione buforem szeregowym
- Ponieważ Arduino jest odczytywane asynchronicznie, upewnij się, że połączenie pyFirmata zostało w pełni zainicjowane przed odczytem z portów. W przeciwnym razie
None
powstają wartości.