1.Raspberry PiにBrickPiを搭載する
Raspberry Piの特徴の一つは、外部の周辺機器との接続が簡単なことである。モータをつけることで動くものを作成できるし、さらに、センサをつければ検知も行えるようになる。一方、Lego Mindstormsには、Legoのブロックを組み合わせておもちゃを作成できる機能だけではなく、モータやセンサを利用できるようになっている。これらを利用することで、サッカーロボや自動操縦カーなどを作成できる。ここでは、RaspberryPiとLego Mindstormsを接続することで、これまでには見られなかった、新しい世界を切り拓く。
Raspberry Piには、周辺機器との入出力のために、外部端子が備わっている。この外部端子はGPIO,UART,SPIやI2Cなどのプロトコルでの信号のやり取りを許している。
一方、Lego Mindstormsは、それ自身、マイコンを搭載しており、モーターやセンサーを用いて、ライントレースカーやショベルカーなどを組み立てて遊べるようになっている。このマイコンの上でHaskellが動けば申し分ないのだが、それは相当に難しそうである。そこで、このマイコンを使わず、代わりにRaspberry Piを用いて、Lego Mindstormsに備わっているモーターやセンサーを動かして、ロボットを作成してみる(嘗て、Ultra Sonic Sensorを使用したとき、I2Oのプロトコルが一般的なものと異なっていて解決に時間がかかったが、万一の場合に備えて、メモを残しておく。もし、トラブルに遭遇したら、ここを参照すること)。
Lego Mindstormsに備わっているモーターやセンサーはSPIやI2Cのプロトコルを用い、8極8芯の電話線で繋がる。従って、Lego MindstormsのモーターやセンサーをRaspberry Piにつなぐ場合には、8極8芯の電話線のコネクタを用意すればよい。しかし、たくさんのモーターやセンサーを繋ごうとすると、必要なコネクタがかなり多くなる。
自作するのが面倒な時は、BrickPiを購入し、それをRaspberry Piの上にのせると便利である(Brick Piは、もともと、Raspberry Pi Bodel B 512MB用に作られたが、後継機のRaspberry Pi Model B+ 1GBでも使用できる。ただし、後継機はGPIOのピン数が8から17に増えた。従って、Brick Piを搭載するときは、そのコネクタを、Paspberry Piの外側にあるピン26本にさす。内側にあるピンはそのままにしておく)。
(Brick Piのアクリル板では、コネクタの部分が隠れてしまうので、全てのコネクタを使うときは、アクリル板をとりはらう。なお、後継機用に新しいアクリル板が販売されているが、自身で輸入する場合を除いて、国内ではまだ販売されていない)
BrickPiの組み立てなどを含む詳細は販売元のホームページにある。
2.BrickPi用ソフトウェアの実装
BrickPiの組み立てが終了したら、BrickPiを利用しやすくするため、販売元から提供されているソフトウェアを実装する。ソフトウェアの実装については、製造元のDexter Industriesのホームページに説明がある。方法には、1)Dexter IndustriesからBrickPiを実装済みのSDカードを購入する、2)Dexter Industriesが提供するBrickPiの部分を含むOSのイメージをダウンロードし、SDカードに書き込む、3)利用しているSDカードに、BrickPiのソフトウェアを自身で実装する。
ここまで積み上げてきたSDカードの中身が消えてしまうのは残念だが、時間もかからず、値段もかからない2)の方法でSDカードにOSを実装した。2)の方法で得たSDカードは、SSHサーバーなどの設定がすべて済んでいる。ただ、ファイルシステムを大きくする必要があるので、次の処理を行う。
sudo raspi-config
設定用の画面が出てくるので、一番上のExpand Filesystemを選択して、SDの空き領域をハードディスクとして利用できるように設定する。
さらに、最新のシステムにするために、次の処理を行う。
sudo apt-get update sudo apt-get upgrade
3.ソフトウェアの確認
OSが動き出したら、Lego Mindstormsを本当に操作できるかを確認する。Haskellでいきなりというのはハードルが高すぎるので、とりあえず、Pythonを用いてテストする。
Brick_Pi_Pythonには、テスト用のプログラムがたくさん用意されているので、これらを使うとよい。なお、テスト用のプログラムでは、BrickPiのコネクタに名前を付けている。
簡単なプログラムを用いてテストする。タッチセンサをS1に接続し、モータをMAに接続する。
タッチセンサに触れたときモータが回転するプログラム(motor-sensor.py)は次のようになる。
from BrickPi import * BrickPiSetup() BrickPi.SensorType[PORT_1] = TYPE_SENSOR_TOUCH BrickPi.MotorEnable[PORT_A] = 1 BrickPiSetupSensors() while True: result = BrickPiUpdateValues() if not result: if BrickPi.Sensor[PORT_1]: BrickPi.MotorSpeed[PORT_A] = 200 else: BrickPi.MotorSpeed[PORT_A] = 0 time.sleep(0.01)
これを実行するには
python motor-sensor.py
とする。システムが機能していれば、タッチセンサに触れたときモータが回転する。
次のプログラムは、BrickPi_Python-Masterの中からである。モータをMB,MCに接続する。
このプログラム(simplebot_simple.py)では、wのキーがが押されたら前に、aでは左に、dでは右に、sでは後ろに進み、また、xでは停止する。
#!/usr/bin/env python ''' ######################################################################## # Program Name: simplebot_simple.py # ================================ # This code is for moving the simplebot # http://www.dexterindustries.com/ # History # ------------------------------------------------ # Author Date Comments # Karan 04/11/13 Initial Authoring # # These files have been made available online through a Creative Commons Attribution-ShareAlike 3.0 license. # (http://creativecommons.org/licenses/by-sa/3.0/) # ######################################################################## ''' #Commands: # w-Move forward # a-Move left # d-Move right # s-Move back # x-Stop from BrickPi import * #import BrickPi.py file to use BrickPi operations #Move Forward def fwd(): BrickPi.MotorSpeed[motor1] = speed BrickPi.MotorSpeed[motor2] = speed #Move Left def left(): BrickPi.MotorSpeed[motor1] = speed BrickPi.MotorSpeed[motor2] = -speed #Move Right def right(): BrickPi.MotorSpeed[motor1] = -speed BrickPi.MotorSpeed[motor2] = speed #Move backward def back(): BrickPi.MotorSpeed[motor1] = -speed BrickPi.MotorSpeed[motor2] = -speed #Stop def stop(): BrickPi.MotorSpeed[motor1] = 0 BrickPi.MotorSpeed[motor2] = 0 BrickPiSetup() # setup the serial port for communication motor1=PORT_B motor2=PORT_C BrickPi.MotorEnable[motor1] = 1 #Enable the Motor A BrickPi.MotorEnable[motor2] = 1 #Enable the Motor B BrickPiSetupSensors() #Send the properties of sensors to BrickPi BrickPi.Timeout=10000 #Set timeout value for the time till which to run the motors after the last command is pressed BrickPiSetTimeout() #Set the timeout speed=200 #Set the speed while True: inp=str(raw_input()) #Take input from the terminal #Move the bot if inp=='w': fwd() elif inp=='a' : left() elif inp=='d': right() elif inp=='s': back() elif inp=='x': stop() BrickPiUpdateValues() #Update the motor values time.sleep(.01) # sleep for 10 ms
他にもいくつかのテストプログラムを試し、BrickPiの理解が進んだら、Haskellで動作するロボットに挑戦する。
なお、モータを動かす時は、RaspberryPiのボードへの電源供給だけでは、電力不足になる。そこで、BrickPiに付属していた電源パックに単三の電池を8つ搭載し、十分な電力を供給する。今回は、単三が身近になかったので、9Vの乾電池を使用した。マニュアルには、単三で供給した方がよいと書かれている。