Gli Arduinos di solito appaiono come dispositivi seriali USB. Le schede attuali utilizzano il driver seriale USB integrato nel microprocessore principale, ma i vecchi Arduinos (e cloni) utilizzavano chip seriali USB di terze parti separati.
Per ricevere semplicemente Serial.print
dati su Raspberry Pi da Arduino, uso il programma GNU Screen come terminale di base: screen [serial-port] [baud-rate]
(ad esempio screen /dev/ttyACM0 9600
).
Ho testato tre diversi Arduinos e un clone piuttosto diverso. Le varianti più recenti sono apparse tutte come /dev/ttyACM0
porte e quelle più vecchie /dev/ttyUSB0
. Questo è quello che ho trovato, sotto Raspbian:
Il Raspberry Pi potrebbe non fornire energia sufficiente per pilotare un Arduino, quindi potresti aver bisogno di energia esterna. Per completezza, ho anche testato un Prolific PL2303 , anche se non è su alcun Arduino che conosco. Sembrava abbastanza felicemente /dev/ttyUSB0
.
Per comunicazioni più complesse con i sensori, è possibile considerare Firmata , "un protocollo generico per la comunicazione con microcontrollori da software su un computer host". Ha implementazioni per le librerie Arduino e Python da eseguire sul lato Raspberry Pi.
Ecco un piccolo esempio usando pyFirmata per leggere un LM35 e cambiare la luminosità di un 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()
Ci sono alcuni avvertimenti quando si usa pyFirmata:
- Le letture analogiche e le scritture PWM sono normalizzate su un intervallo 0 .. 1 e non su Arduino standard 0 .. 255 e 0 .. 1023.
- È davvero necessario avviare un thread iteratore separato per interrompere le letture precedenti che traboccano dal buffer seriale
- Poiché Arduino viene letto in modo asincrono, assicurarsi che la connessione pyFirmata sia completamente inizializzata prima di leggere dalle porte. Altrimenti,
None
ne conseguono valori.