プログラミング・フォロ

ヨドバシでプログラミング・フォロが安かったので買ってみた。以前から気にはなっていたものの、micro:bit を直接挿せることを知らなかったので見かけても素通りしていた。

プログラミング・フォロは、エレキットのフォロに micro:bit を取り付けられるようにしたもので、自由にプログラミングできるロボットになる。6足あって前後左右自在に移動できる。

実際にどのように動くのか見当もつかなかった(し、作っても仕組みはよくわからない)のだが、6足のリンク機構をうまく使って、回転するフォロの上半身に合わせて前進・後退できるようになっていた。作ってみて「へぇー、うまくできてるなぁ」と素直に感じた。

組み立て

フォロは接着剤不要のプラモデルのようになっている。しっかりしたパーツと詳細な説明書のおかげで、特に悩んだり困ったりすることなく、1時間程度で組み立てることができた。難しい接続方法もないので、ちょっとした組み立ての経験さえあれば難なく完成させられるのではないかと思う。

工具としてはドライバーとニッパが必要で、バリを取るヤスリがあると便利。

動作には単4電池が4本必要で、付属している電池ボックスに入れて組み立ての際に頭部へ組み込んでおく。電池の取り外しにはドライバーが必要となる。

ドライバで左耳を取り外すと電池ボックスにアクセスできる。

micro:bit の取り付け

頭の部分のカバーを外すことでフォロにmicro:bitを取り付けられる。装着はとても簡単で、ちょうどmicro:bitのLEDがカバーごしに見えるので、ロボットのメッセージ表示にも適している。頭の右下にスライドスイッチがついており、奥にスライドすることで電源を入れることができる。

写真向かって左下に電源スイッチがある。

micro: bit での制御

フォロには2個のDCモータと、2個の赤外線センサが搭載されている。DCモータはHブリッジが2個入ったMX1508というモータドライバで駆動しており、2つの出力ピンによって回転方向とスピードを指定する。赤外線センサはアクティブ方式で、LEDから発せられた赤外線の反射光をセンサで受け、アナログ入力で読み取るようになっている。

ピンと機能の対応は以下の通り

ピン番号対応する機能
P1(入力)右側の赤外線センサの値
P2(入力)左側の赤外線センサの値
P12(出力)赤外線LEDのオン(1)・オフ(0)
P13(出力)前後のモータ(0〜1023)
P14(出力)前後のモータ(0〜1023)
P15(出力)上半身回転モータ(0〜1023)
P16(出力)上半身回転モータ(0〜1023)

P1とP2は赤外線センサの値となる。障害物を検出したい場合には、あらかじめP12に1を出力して赤外線LEDを発光させておく必要がある。

内側にある赤外線LEDを発光させた様子。

センサ値は入射した赤外光の強さを示しているので、障害物との距離が近いほど取得したアナログ値が大きくなる。なお、P1、P2はデジタル値としても取得できる。

P13からP16は2つのモータの出力ピンである。デジタル出力でもアナログ出力でも構わないが、アナログ出力の場合にはPWM信号として回転スピードを指定できるようになる。

フォロを前進させる場合、P13に正の値を指定してP14に0を指定する。後退させる場合は、逆にP13に0を指定してP14に正の値を指定する。同様に、フォロの上半身を左回転させる場合には、P15に正の値を指定してP16に0を指定し、右回転させる場合には、P15に0を指定してP16に正の値を指定する。いずれも両者のピンに0を指定すれば、前進・後退や回転を止めることができる。

プログラミング

障害物をよけながらゆっくり動くプログラムを作ってみた。

from microbit import *
from utime import sleep_ms
pin12.write_digital(1)
while True:
    if ((pin1.read_analog() < 60) and (pin2.read_analog() < 60)):
        pin13.write_analog(256)
        pin14.write_analog(0)
        pin15.write_analog(0)
        pin16.write_analog(0)
        continue
    if (60 < pin1.read_analog()):
        pin13.write_analog(0)
        pin14.write_analog(0)
        pin15.write_analog(256)
        pin16.write_analog(0)
        sleep_ms(1000)
        continue
    if (60 < pin2.read_analog()):
        pin13.write_analog(0)
        pin14.write_analog(0)
        pin15.write_analog(0)
        pin16.write_analog(256)
        sleep_ms(1000)
        continue

ガラガラと大きな音を立てて動くので静かな場所では気をつけた方がいいかも。何かを載せて運んだり、段差を乗り越えたりするのは苦手そうだし、まっすぐ進むのも難しいが、ちょっとしたデモとして見せるぶんには愛嬌があって良いと思う。