Arduinos обычно появляются как последовательные USB-устройства. В современных платах используется драйвер последовательного интерфейса USB, встроенный в основной микропроцессор, но в старых Arduinos (и клонах) использовались отдельные сторонние чипы последовательного интерфейса USB.
Чтобы просто получать Serial.print
данные о Raspberry Pi от Arduino, я использую программу GNU Screen в качестве основного терминала: screen [serial-port] [baud-rate]
(например screen /dev/ttyACM0 9600
).
Я проверил три разных Arduinos и один довольно другой клон. Все новые варианты появились как /dev/ttyACM0
порты, а старые /dev/ttyUSB0
. Вот что я нашел при Распбиане:
- Duemilanove - серийный чип: FTDI FT232RL ; Последовательный порт:
/dev/ttyUSB0
- Uno - последовательный чип: Atmel ATmega16U2 (или 8U2 на старых платах); Последовательный порт:
/dev/ttyACM0
- Леонардо - Серийный чип: Atmel ATmega32U4 (встроенный); Последовательный порт:
/dev/ttyACM0
- OMS Omega-328U - серийный чип: Silicon Labs CP210x ; Последовательный порт:
/dev/ttyUSB0
.
Raspberry Pi может не обеспечивать достаточную мощность для управления Arduino, поэтому вам может потребоваться внешнее питание. Для полноты картины я также протестировал Prolific PL2303 , хотя его нет ни на одном Arduino, о котором я знаю. Выглядело довольно счастливо /dev/ttyUSB0
.
Для более сложной связи с датчиками вы можете рассмотреть Firmata , «общий протокол для связи с микроконтроллерами из программного обеспечения на главном компьютере». Он имеет реализации для библиотек Arduino и Python для работы на стороне Raspberry Pi.
Вот небольшой пример использования pyFirmata для считывания LM35 и изменения яркости светодиода:
#!/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()
При использовании pyFirmata есть несколько предостережений:
- Аналоговые чтения и записи ШИМ нормированы на диапазон 0 .. 1, а не стандартные Arduino 0 ... 255 и 0 ... 1023.
- Вам действительно нужно запустить отдельный поток итератора, чтобы остановить старые чтения, переполняющие последовательный буфер
- Поскольку Arduino читается асинхронно, убедитесь, что соединение pyFirmata полностью инициализировано перед чтением из портов. В противном случае
None
значения следуют.