Los arduinos suelen aparecer como dispositivos serie USB. Las placas actuales usan el controlador serie USB integrado en el microprocesador principal, pero los Arduinos (y clones) más antiguos usaban chips serie USB de terceros.
Para recibir simplemente Serial.print
datos sobre la Raspberry Pi del Arduino, utilizo el programa GNU Screen como terminal básico: screen [serial-port] [baud-rate]
(por ejemplo screen /dev/ttyACM0 9600
).
Probé tres Arduinos diferentes y un clon bastante diferente. Todas las variantes más nuevas aparecieron como /dev/ttyACM0
puertos, y las más antiguas /dev/ttyUSB0
. Esto es lo que encontré, debajo de Raspbian:
Es posible que Raspberry Pi no proporcione suficiente energía para conducir un Arduino, por lo que es posible que necesite alimentación externa. Para completar, también probé un Prolific PL2303 , aunque no conozco ningún Arduino. Parecía bastante feliz como /dev/ttyUSB0
.
Para comunicaciones más complejas con sensores, puede considerar Firmata , "un protocolo genérico para comunicarse con microcontroladores desde software en una computadora host". Tiene implementaciones para las bibliotecas Arduino y Python para ejecutarse en el lado de Raspberry Pi.
Aquí hay un pequeño ejemplo usando pyFirmata para leer un LM35 y cambiar el brillo de 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()
Hay algunas advertencias al usar pyFirmata:
- Las lecturas analógicas y las escrituras PWM se normalizan a un rango de 0 .. 1, y no el Arduino estándar 0 .. 255 y 0 .. 1023.
- Realmente necesita comenzar un hilo iterador separado para detener las lecturas antiguas que desbordan el búfer en serie
- Dado que Arduino se lee de forma asincrónica, asegúrese de que la conexión pyFirmata esté completamente inicializada antes de leer desde los puertos. De lo contrario,
None
se producen valores.