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.printdati 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/ttyACM0porte 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,
Nonene conseguono valori.