Os Arduinos geralmente aparecem como dispositivos seriais USB. As placas atuais usam o driver serial USB embutido no microprocessador principal, mas os Arduinos mais antigos (e clones) usavam chips USB-serial de terceiros separados.
Para simplesmente receber Serial.print
dados do Raspberry Pi do Arduino, eu uso o programa GNU Screen como um terminal básico: screen [serial-port] [baud-rate]
(por exemplo screen /dev/ttyACM0 9600
).
Eu testei três Arduinos diferentes e um clone bastante diferente. Todas as variantes mais recentes apareceram como /dev/ttyACM0
portas e as mais antigas /dev/ttyUSB0
. Foi o que eu encontrei no Raspbian:
O Raspberry Pi pode não fornecer energia suficiente para acionar um Arduino, portanto você pode precisar de energia externa. Para completar, também testei um Prolific PL2303 , mesmo que não esteja em nenhum Arduino que eu conheça. Pareceu muito feliz como /dev/ttyUSB0
.
Para comunicações mais complexas com sensores, considere o Firmata , "um protocolo genérico para comunicação com microcontroladores a partir de software em um computador host". Possui implementações para as bibliotecas Arduino e Python para execução no lado do Raspberry Pi.
Aqui está um pequeno exemplo usando pyFirmata para ler um LM35 e alterar o brilho de um 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()
Existem algumas advertências ao usar pyFirmata:
- As leituras analógicas e as gravações PWM são normalizadas para um intervalo de 0 .. 1, e não para o Arduino padrão 0 .. 255 e 0 .. 1023.
- Você realmente precisa iniciar um encadeamento de iterador separado para impedir que leituras antigas excedam o buffer serial
- Como o Arduino é lido de forma assíncrona, verifique se a conexão pyFirmata está totalmente inicializada antes de ler das portas. Caso contrário, os
None
valores se seguirão.