Raspberry Pi から Arduino を制御する方法にはいくつかありあますが、今回は Arduino Firmata を使った制御方法を紹介します。
Firmata とは、Arduino のようなマイクロコントローラとホストマシン間での通信のための汎用プロトコルです。
Firmata を使うと Arduino に接続したホストマシンからシリアル経由で Arduino を制御するコマンドを送って Arduino を制御することができます。
Firmata を Arduino に書き込む
Arduino で Firmata を使うために Arduino に Firmata 用のスケッチを書き込む必要があります。
ここでは Arduino IDE のサンプルプログラムの Firmata 用のスケッチ「StandardFirmata」を利用します。
以下からサンプルを開いて、スケッチを Arduino に書き込みます。
Arduino IDE -> [File] -> [Examples] -> [Firmata] -> [StandardFirmata]
Raspberry Pi から Arduino を制御する
Raspberry Pi から Arduino に Firmata でコマンドを送るために、arduino_firmata という Ruby のライブラリを使います。
Arduino Firmata on Ruby
arduino_firmata のインストール
pi$ gem install arduino_firmata
(注) gem を使うために Ruby のインストールが必要です。以下のように apt-get で ruby と ruby-dev をインストールしてください。
pi$ sudo apt-get install ruby
pi$ sudo apt-get install ruby-dev
arduino_firmata の使い方
デジタル値の書き込み(GROVE – LED)
Raspberry Pi と Arduino を画像のように USB で接続しました。
GROVE のシールドを使って GROVE の LED を接続しています。
13番ピンに LED を接続して以下のコマンドを実行すると、13番ピンが “H” になり LED が点灯します。
pi$ arduino_firmata “digital_write 13, true” –arduino=/dev/ttyUSB0
アナログ値の読み取り(GROVE – 温度センサ)
GROVE のシールドを使って GROVE の温度センサを接続しています。
以下のコマンドで温度センサのアナログ値を取得できます。
pi$ arduino_firmata “analog_read 0” –arduino=/dev/ttyUSB0
取得した温度の値を補正するスクリプトを書いてみました。
以下のスクリプトを実行すると取得した温度のアナログ値から温度(摂氏)に変換します。
(小数の計算に bc コマンドを使っているので bc コマンドを apt-get install しておく)
#!/bin/sh
analog=`arduino_firmata “analog_read 0” –arduino=/dev/ttyUSB0`
resistance=`expr \( 1023 – $analog \) \* 10000 / $analog`
temperature=`echo 1 / \( l\( $resistance / 10000 \) / 3975 + 1 / 298.15 \) – 273.15 | bc -l`echo $temperature
参考URL
- RubyからArduinoを操作できるようにFirmataプロトコルを移植した | 橋本商会
- Arduino Firmata on Ruby
- firmata.org
- Arduino – Firmata