RAPIROに近接センサを取り付ける

RAPIROには近接センサがすっぽり収まるエリアがあったのをご存知ですか?今回は「Arduinoをはじめようキット」にも入っているおなじみの近接センサ「GP2Y0A21YK」をRAPIROに付けて遊んでみます。

RAPIRO制御基板はArduino互換となっており、拡張用にI2Cの端子や、アナログ端子が引き出せるようになっています。RAPIROの制御基板で近接センサの値を読み出して、距離に応じて目の色を変化させてみようと思います。

用意するもの

はんだづけ

RAPIROの制御基板を取り出したら、ピンヘッダを取り付けます。写真の赤丸で囲った部分に、がんばってはんだづけしてください。制御基板のはんだ付けが終わったら、今度はケーブルのはんだ付けです。

ピンソケットを4ピン分用意して、ケーブルを取り付けます。端と端に赤色(5V)と黒色(GND)、真ん中のどちらかに黄色の信号線を取り付けます。僕は赤 色側のピンに信号線を付けました。どちらに付けたかは重要です。ピン番号が変わります。(赤色側なら6番、黒色側なら7番)

熱収縮チューブで整えました。

取り付け

RAPIRO基板を元に戻したら、そのまま蓋をせずに近接センサを取り付けます。RAPIROのちょうどあごの部分にぴったり収まるスペースがあるので、そこに取り付けます。取り付けるとこのようになります。

参考: 写真アルバム

頭を戻してあげたら、ハードウェアの準備は完了です。

ソフトウェア

ファームウェアの書き換え

まずは、アナログ値を読み込むことが出来るようにRAPIRO制御基板のファームウェアを書き換えます。RapiroのファームウェアはRapiro開発者の石渡さんのgithubリポジトリで公開されていますが、アナログ値も読み込むことが出来るようにしたバージョンをogaさんが公開されていらっしゃるので、今回はこのファームウェアを使用してみましょう。スケッチはogaさんのgithubリポジトリからZip形式でダウンロードできます。

Arduino を起動して入手したファームウェアを開いたら、RAPIRO制御基板とコンピュータをつないで、ファームウェアを書き込みます。RAPIROの制御基板は Arduino UNOのように振る舞うので、書き込み時のボードはArduino UNOを設定すればOKです。

書き込みが終わったら、シリアルモニタを開いてRAPIROと通信してみます。ボーレートを57600baudに合わせて正しく接続ができたら、#A6もしくは#A7と入力してみましょう。距離センサの値が帰ってくるはずです。#Aの後の数字は読みに行くピン番号を指していますから、先ほどどちらにセンサの信号線を取り付けたかで数字が変わります。

Raspberry Piで連携するには

Arduino 基板に書き込んだファームウェアには、モーションを選択する機能(#M01など)の他にも、「どれくらいの時間をかけて」「どの(モータ/LED)を」 「どれだけ(動かす/光らせる)か」を細かく指定できる機能も搭載されています。フォーマットはこのような感じです。

コマンド:

#P<サーボ、LEDへのコマンド>T<何msかけるか>

サーボへのコマンド:

S<サーボのID>A<度数>

LEDへのコマンド:

赤色:R<明るさ(255が最大)>
緑色:G<明るさ(255が最大)>
青色:B<明るさ(255が最大)>

ちょっとわかりにくいので、LEDへのコマンドを実際に打ち込んでみましょう。先ほど行ったようにシリアルモニタを開いて、RAPIROに接続し、#PR255G000B000T001と入力します。RAPIROの目は赤色になりましたか?次にRAPIROの目を緑にしてみます。#PR000G255B000T001 と入力すればOKなはずです。ではRAPIROの目を黄色にできますか?トライしてみてください。

ここまでくれば、Raspberry Piからいじる仕組みは理解できたと思います。お好きなスクリプト言語でRAPIROのシリアルポートへ接続すればRAPIROが操れるはずです。

以下にサンプルコードを用意しました。要PySerialなので、別途インストールしてください。

rapiro_led.py:

import sys
import time
import serial
import colorsys

# config
SENSOR_PIN = 6
RAPIRO_TTY = '/dev/ttyAMA0'
rapiro = serial.Serial(RAPIRO_TTY, 57600, timeout = 10)
value = 0

# version check
rapiro.write("#V")
time.sleep(0.05)
version = ""
while rapiro.inWaiting():
version += rapiro.read(1)
version = version.split("#Ver")[1]

if(version != "00"):
print "ERROR: Firmware of Rapiro is different."
sys.exit(1)

# main loop
while True:
rapiro.flush() # cleaning
rapiro.write("#A"+str(SENSOR_PIN)) # sensor request
time.sleep(0.05)
buf = ''
while rapiro.inWaiting():
buf += rapiro.read(1)
value = int(buf.split("#A"+str(SENSOR_PIN)+"V")[1])
rgb = colorsys.hsv_to_rgb(value%2048/2048.0, 1.0, 0.7)
cmd = "#PR" + str(int(rgb[0]*255)).zfill(3) + "G" + str(int(rgb[1]*255)).zfill(3) + "B" + str(int(rgb[2]*255)).zfill(3) + "T001"
print "Send: " + cmd
rapiro.write(cmd)
time.sleep(0.05)