bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

Raspberry PiからLego Mindstormsを使用できるようにする―準備

1.Raspberry PiにBrickPiを搭載する

Raspberry Piの特徴の一つは、外部の周辺機器との接続が簡単なことである。モータをつけることで動くものを作成できるし、さらに、センサをつければ検知も行えるようになる。一方、Lego Mindstormsには、Legoのブロックを組み合わせておもちゃを作成できる機能だけではなく、モータやセンサを利用できるようになっている。これらを利用することで、サッカーロボや自動操縦カーなどを作成できる。ここでは、RaspberryPiとLego Mindstormsを接続することで、これまでには見られなかった、新しい世界を切り拓く。

Raspberry Piには、周辺機器との入出力のために、外部端子が備わっている。この外部端子はGPIO,UART,SPIやI2Cなどのプロトコルでの信号のやり取りを許している。
f:id:bitterharvest:20150628111243j:plain

一方、Lego Mindstormsは、それ自身、マイコンを搭載しており、モーターやセンサーを用いて、ライントレースカーやショベルカーなどを組み立てて遊べるようになっている。このマイコンの上でHaskellが動けば申し分ないのだが、それは相当に難しそうである。そこで、このマイコンを使わず、代わりにRaspberry Piを用いて、Lego Mindstormsに備わっているモーターやセンサーを動かして、ロボットを作成してみる(嘗て、Ultra Sonic Sensorを使用したとき、I2Oのプロトコルが一般的なものと異なっていて解決に時間がかかったが、万一の場合に備えて、メモを残しておく。もし、トラブルに遭遇したら、ここを参照すること)。
f:id:bitterharvest:20150628111746j:plain

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本にさす。内側にあるピンはそのままにしておく)。
f:id:bitterharvest:20150628100748j:plain

(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のコネクタに名前を付けている。
f:id:bitterharvest:20150628105605j:plain

簡単なプログラムを用いてテストする。タッチセンサをS1に接続し、モータをMAに接続する。
f:id:bitterharvest:20150628100840j:plain

タッチセンサに触れたときモータが回転するプログラム(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に接続する。
f:id:bitterharvest:20150628100928j:plain

このプログラム(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の乾電池を使用した。マニュアルには、単三で供給した方がよいと書かれている。