はじめに
タミヤのカムロボットをベースにして、ラズパイ3と自作のO-Prolog処理系による制御を試みています。回路図などを書き記します。
センサーなど
超音波距離センサモジュール HC-SR04を使っています。これで前方の障害物との距離を測定します。足回りのモータは東芝TA7291Pを2つ使って制御します。ロボットの目の部分にはLEDを埋め込んであります。これをLチカをしてアクションをする際の合図にしようと思っています。これらをサンハヤトのラズパイ用の汎用拡張基板に載せています。
回路図
超音波センサーの回路は下記の記事を参考にしました。echo端子は5Vを返してきます。ラズパイの入力用のGPIOは3.3Vのため抵抗を入れてラズパイの仕様に合わせています。trig端子はGPIO23、echi端子はGPIO24に接続しています。
TA7291Pについてはマルツさんの下記の記事を参考にしました。
https://www.marutsu.co.jp/contents/shop/marutsu/mame/81.html
バッテリー
バッテリーはAnker PowerCore 10000を使っています。
Amazonで2000円くらいでした。電流容量もたっぷりあり、ラズパイ3が安定して動作しています。
カムロボットにはちょうど良いサイズです。次のように収納しています。
カムロボットの青いフレーム部分をちょっとだけカッターで削るとうまく収まります。
LED
タミヤのカムロボットの前面の目らしきところにはLEDがぴったり収まります。
Prologコード
自作のO-Prologを使っています。wiringpi.plというファイルとそれをコンパイルしたwiringpi.oというファイルが付属しています。これはCラッパ-機能を利用してGCCのwiringpiライブラリを呼び出しています。
まずはLチカです。これは単純です。次のようなコードで目のところのLEDがブリンクします。
%LED on/off sample
setup :-
wiringpi_setup_gpio(X),
pin_mode(19,output),
pin_mode(26,output).
test(0).
test(N) :-
digital_write(19,1),
digital_write(26,0),
delay(500),
digital_write(19,0),
digital_write(26,1),
delay(500),
N1 is N - 1,
test(N1).
超音波センサー読み取り
次のようなコードになります。trigである23番GPIOに1を出力し、24番GPIOを読み取って1になるまでの時間を計測します。timer/1は独自拡張の述語です。これでマイクロ秒単位で反応時間を計測しています。これに音速の340メートル毎秒を掛けて、往復しているので÷2にするとセンチメートル単位での距離計測ができます。
setup :-
wiringpi_setup_gpio(X),
pin_mode(23,output),
pin_mode(24,input),
digital_write(23,0),
delay(1000).
measure(X) :-
digital_write(23,1),
delay_microseconds(11),
digital_write(23,0),
read_wait(1),
timer(on),
read_wait(0),
timer(off),
timer(T),
X is T * 34000 /2.
read_wait(X) :-
repeat,
digital_read(24,Y),
X == Y,!.
モーター制御
GPIOの14,15 7,8に1を出力することによりモーターのオンオフ、反転を行います。まだ製作途中でありテストできていません。電源は電池2本で3Vを接続します。カムロボットはもともと単3電池1個だけで動作するのですが、TA7291Pでは減衰するために3V以上を与える必要があります。タミヤより販売されている3V用の電池ボックスに入れ替えています。
WEBカメラ
OpenCVで画像認識することもやろうと思いバッファローの安価なWEBカメラを通販で購入しました。1000円を切っていました。
今後の展望
Prologのメインルーチンはrepeat/0述語を使ってセンサー情報をキャッチし、それに応じたアクションを起こすループをひたすら実行します。repeatは再帰ではなくループで実行するようにしてあります。センサー情報により障害物を回避したりさせる予定です。(今のところ、そこまでできていません)
ところで、せっかくPrologでの制御です。単純なものならPythonでも十分にできます。Prologの強みは人工知能の研究に使われたように学習機能を持たせられることです。センサー情報を述語、節に変換して動的に蓄積し、これを利用してプログラムを変更、動作を変えるということをやってみたいと思っています。