Arduinoは通常、USBシリアルデバイスとして表示されます。現在のボードはメインマイクロプロセッサに組み込まれたUSBシリアルドライバーを使用しますが、古いArduino(およびクローン)は別個のサードパーティUSBシリアルチップを使用しました。
Serial.print
ArduinoからRaspberry Piのデータを簡単に受信するには、GNU Screenプログラムを基本的なターミナルとして使用screen [serial-port] [baud-rate]
します(たとえばscreen /dev/ttyACM0 9600
)。
3つの異なるArduinoと1つのかなり異なるクローンをテストしました。新しい亜種はすべてとして登場/dev/ttyACM0
ポート、および古いもの/dev/ttyUSB0
。これは、Raspbianで見つけたものです。
Raspberry PiはArduinoを駆動するのに十分な電力を提供しない可能性があるため、外部電源が必要になる場合があります。完全を期すために、私は知っているArduinoにはないものの、Prolific PL2303もテストしました。それはかなり幸せに見えた/dev/ttyUSB0
。
センサーとのより複雑な通信については、Firmata、「ホストコンピューター上のソフトウェアからマイクロコントローラーと通信するための汎用プロトコル」を検討できます。Arduinoの実装と、Raspberry Pi側で実行するPythonライブラリがあります。
pyFirmataを使用してLM35を読み取り、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()
pyFirmataを使用する場合、いくつかの注意事項があります。
- アナログ読み取りおよびPWM書き込みは、標準のArduino 0 .. 255および0 .. 1023ではなく、0 .. 1の範囲に正規化されます。
- シリアルバッファをオーバーフローする古い読み取り値を停止するには、個別のイテレータスレッドを開始する必要があります。
- Arduinoは非同期に読み取られるため、ポートから読み取る前に、pyFirmata接続が完全に初期化されていることを確認してください。それ以外の場合、
None
値が続きます。