#FreeBSDタンクとは
FreeBSDタンクとは、FreeBSD で動く RaspberryPi(Zero)で何が動くかのデモをひとまとめにしてキャタピラをつけて逆によくわからなくなってしまった感のある動くオブジェです。
FreeBSD WorkshopやFreeBSD勉強会の懇親会、AsiaBSDCan やOSCのNetBSDブースの片隅などで展示していたので、ちょこっと見たという人もいたと思います。
RaspberryPi を使ったすごい展示物が集まるRaspberryPiのユーザーイベント RaspberryJam などでも場違いにちょこっと展示し、目の肥えたちびっ子から「クソボロロボットじゃん」と言われるなど活動は多岐にわたります。
しかし「FreeBSD環境で何が動くか」の説明のためのデモなのに、何が動いてるのか今ひとつその場での説明が適当で、どっかにまとめて説明とかも書いてなかったので、この機会に紹介しておこうと思います。
#基本動作
- 走行(前後、左右、回転)
- カメラ撮影
- twitter投稿
- Webでの操作
#構成ハードウェア
以下のようなものを適当に寄せ集めました。
- RaspberryPi Zero(カメラコネクターあり)
- WiFi USBドングル(ZeroWでもFreeBSDでは内蔵WiFiはまだ使えないので外付け)
- モータードライブ等のための Explorer Hat (https://shop.pimoroni.com/products/explorer-hat)
- カメラモジュール V1 (https://www.switch-science.com/catalog/1432/)
- タミヤ トラック&ホイールセット(https://www.tamiya.com/japan/products/70100/index.html)
- タミヤ ユニバーサルプレートセット(https://www.tamiya.com/japan/products/70098/index.html)
- タミヤ ツインモーターギヤーボックス (https://www.tamiya.com/japan/products/70097/index.html)
- サーボ(http://www.robotsfx.com/robot/ASV-15.html)
- 距離センサー SHARP GP2Y0E03 (https://jp.sharp/products/device/lineup/selection/opto/haca/diagram2.html)
- シリアルコンソール接続用 USBシリアル変換 (https://www.switch-science.com/catalog/1032/
- ダンボーバッテリー (https://www.cheero.net/lp/powerplus_danboard_mini/)
その場の思いつきで適当に増築しているので、全体にグラグラしています。
#ソフトウェア
FreeBSDタンクのソフトウェア処理としては
- Web操作(python Flaskサーバー)
- 走行(GPIOによるモーター制御)
- 旗振り(ソフトウェア PWM操作)
- カメラ撮影(raspistill コマンド)
- twitter投稿(pythonスクリプト)
- 距離センサー(I2C接続)
Web操作
FreeBSDタンクの操作は基本的にサーバーが WebAPI を待ち受け、APIを受信したらコマンドを実行するという形で行うようになってます。
WebAPI受信サーバーは、この手の作例でよく使われている python の Flaskを使用しています(ports は www/py-flask)。
実際にFreeBSDタンクで使用してるスクリプトは以下に置いてあります。
https://github.com/s-mitu/RaspberryPi/tree/master/FreeBSD/picontrol
http://(FreeBSDタンクアドレス):5000/
にアクセスすると、走行操作用ボタンと、カメラ撮影画像、FreeBSD タンクのTwitter タイムライン(後述)などが表示されます。
おわかりいただけただろうか...
#走行
走行のためのモーター制御は、RaspberryPi Zero に接続した Explorer Hat Proで行っています。RaspberryPi側からは GPIO のON/OFFで制御しています。モーターは右履帯用と左履帯用の2つを制御しているので、前進/後進以外に左右回転や超信地旋回(その場での回転)なども行えます。
FreeBSDタンクでは、WebAPIでコマンド受信すると、GPIOの ON/OFF を行い走行や停止を実行します。
#カメラ撮影
32bit環境だと、上の手順でRaspberryPi公式のカメラモジュールV1での撮影ができます。ただカメラ V2 の撮影はうまく動きませんでした。またPi3/4などの 64bit でも上記の手順は使えません。
FreeBSDタンクでは周期的にカメラ撮影を行い、/tmp以下(tmpfs)に画像を保存していて、WebAPIで取得できるようになっています。
画像を取得し続ける簡単なスクリプトはこちら。 https://github.com/s-mitu/RaspberryPi/tree/master/FreeBSD/camera-loop
#旗振り
サーボのソフトウェアPWM制御(ユーザーランドプログラムでGPIOのON/OFF繰り返し)で適当な旗振りを行います。本当に「動いてる」ってだけであまりちゃんとした角度での動きになっていません。ユーザーランドプログラムで無理やりやってるのとPiZeroの処理が遅いのと、ソフトの作りが適当のとで、サーボの傾きがバラバラです。
一応Cプログラムです。
https://github.com/s-mitu/RaspberryPi/tree/master/FreeBSD/pwm
Twitter 投稿
起動直後やシャットダウン、また走行に関するWebAPI受信時にTwitterに投稿します。
起動直後には内部時刻とIPアドレスを投稿するので、sshで接続するのに便利です。また前進や回転などの走行コマンド受信時にもつぶやいてくれます。
以下のpythonスクリプトのtankannounce.pyで FreeBSDTankアカウント
#距離センサー
タンク背後に雑に設置したI2C接続の距離センサーで距離を取得します。
FreeBSDタンクではループで距離測定してテキストファイルに保存し、WebAPIでその値を取得できるようにしています。
ただI2Cに関してはカメラモジュールを使うと使えなくなるので、現在は機能していません。
#バトル
FreeBSD tank とネコの壮絶バトル動画です。
#最後に
ボロっちくてもなんか動くものができるのは楽しいものです。もしまたどっかの勉強会やカンファレンスで見かけたら、生暖かい目で見守ってやってください。