Prolog
Raspberry
PrologDay 10

Prolog制御のおもちゃロボット

More than 1 year has passed since last update.

ArcSoft_画像119.PNG

はじめに

タミヤのカムロボットをベースにして、ラズパイ3と自作のO-Prolog処理系による制御を試みています。回路図などを書き記します。

センサーなど

超音波距離センサモジュール HC-SR04を使っています。これで前方の障害物との距離を測定します。足回りのモータは東芝TA7291Pを2つ使って制御します。ロボットの目の部分にはLEDを埋め込んであります。これをLチカをしてアクションをする際の合図にしようと思っています。これらをサンハヤトのラズパイ用の汎用拡張基板に載せています。

ArcSoft_画像122.PNG

ArcSoft_画像129.PNG

回路図

超音波センサーの回路は下記の記事を参考にしました。echo端子は5Vを返してきます。ラズパイの入力用のGPIOは3.3Vのため抵抗を入れてラズパイの仕様に合わせています。trig端子はGPIO23、echi端子はGPIO24に接続しています。

http://make.bcde.jp/raspberry-pi/%E8%B6%85%E9%9F%B3%E6%B3%A2%E8%B7%9D%E9%9B%A2%E3%82%BB%E3%83%B3%E3%82%B5hc-sr04%E3%82%92%E4%BD%BF%E3%81%86/

上記のページの実体配線図より画像を引用しました。
2017-12-08_7-17-38.png

TA7291Pについてはマルツさんの下記の記事を参考にしました。
https://www.marutsu.co.jp/contents/shop/marutsu/mame/81.html

上記ページの回路図より画像を引用しました。
2017-12-08_7-16-53.png

バッテリー

バッテリーはAnker PowerCore 10000を使っています。
ArcSoft_画像126.PNG

Amazonで2000円くらいでした。電流容量もたっぷりあり、ラズパイ3が安定して動作しています。

カムロボットにはちょうど良いサイズです。次のように収納しています。

ArcSoft_画像127.PNG

カムロボットの青いフレーム部分をちょっとだけカッターで削るとうまく収まります。

LED

タミヤのカムロボットの前面の目らしきところにはLEDがぴったり収まります。
ArcSoft_画像130.PNG

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用の電池ボックスに入れ替えています。

ArcSoft_画像131.PNG

WEBカメラ

OpenCVで画像認識することもやろうと思いバッファローの安価なWEBカメラを通販で購入しました。1000円を切っていました。

BSWHD06MWH
ArcSoft_画像132.PNG

今後の展望

Prologのメインルーチンはrepeat/0述語を使ってセンサー情報をキャッチし、それに応じたアクションを起こすループをひたすら実行します。repeatは再帰ではなくループで実行するようにしてあります。センサー情報により障害物を回避したりさせる予定です。(今のところ、そこまでできていません)

ところで、せっかくPrologでの制御です。単純なものならPythonでも十分にできます。Prologの強みは人工知能の研究に使われたように学習機能を持たせられることです。センサー情報を述語、節に変換して動的に蓄積し、これを利用してプログラムを変更、動作を変えるということをやってみたいと思っています。