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
. Це те, що я знайшов під Raspbian:
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
настають значення.