Twitterを拝見していると、真横や斜め、その場で旋回等自由自在に動き回る「メカナムホイールを使ったラジコン」が目に留まりまして、私も作ってみる事にしました。
過去にラズパイを使ったキャタピラ式のラジコンを作成した事があるので、プログラムはそれを応用する事にしました。↓
ブラウザで操作出来る仕組みにしたいので、ラズパイにWEBサーバーを立てる必要がありますが、python http.serverやwebiopiは少々不便でしたので今回はApacheを使用する事にしました。動作の流れとしては次の通りです。
スマホ(ブラウザ)→ラズパイ(Apache(html→js→CGI(python)))→GPIO→DCモータードライバ→DCモーター
jsからpythonスクリプトを動かしたいので、CGIを使います。
それでは初めに、必要な部品をまとめておきます。
目次 [非表示]
使用部材

・ユニバーサルプレート × 1枚
・メカナムホイール(L,R) × 2セット
・TTモーター × 4つ
・ミニ接合金物アングルA-4 × 4枚
・なべ小ねじM3 10mm × 8本(ミニ接合金物アングル固定用)
・なべ小ねじM3 25mm × 4本(TTモーター固定用)
・RaspberryPi3 × 1つ
・5V電源と6V電源(乾電池やモバイルバッテリーなど)
・DRV8833 DC モーター ドライバー × 2個
・ジャンピングワイヤー × 多数
・ブレッドボード(小) × 1個
ネジ等の部品はコーナン等のホームセンターで手に入ります。
続いて組み立てます。
組立

モーター、メカナムホイールを写真のように組み立てます。
注意点としましては、メカナムホイールはL,Rがあり、前輪はそのままですが、後輪はL,Rが逆になります。
あと、この時点でモーターに導線をはんだ付けしておくと楽でした。その後は仮で電池を繋いで、モーターの正転、後転を確認しておきます。(導線は8本、つまりGPIOを8つ使用するので、タイヤ毎の回転方向となる電圧の向きHIGH,Lowを把握しておく。)
メカナムホイールの進行方向

4輪駆動で各タイヤに正転、後転、停止の制御をかければ、組み合わせに応じて図のような動作が再現できます。今回は全ての方向を網羅させたいので、図に左下と右下、停止を加えた「11パターン」の組み合わせを作ります。
各モーターに1~4の番号を割り振り、Aが+(正転)、Bが-(後転)、等を割り振って紙に記しておけば、後の配線やプログラム記述が楽になります。
ラズパイ、モータードライバ実装と配線
今回しようするモータードライバは1つで2ch制御出来るので、前輪と後輪に分けて実装することにします。
配線は、
ラズパイ(GPIO)→モータードライバIN→モータードライバOUT→DCモーター
となるので、モーターに接続した8本の導線はモータードライバのoutに、INにはラズパイのGPIOから8つ引っ張ってきます。
GPIOと各モーターの紐づけ(制御)については、先ほど控えた紙などを参考にすればいいと思います。
なお、電源についてはラズパイ(5V)とモータードライバ(6V程度)は別で取る事とします。
プログラム
Apacheのインストール
それではプログラムに入っていきますが、初めにWEBサーバーのApacheをインストールしておきます。また、CGIを使えるように設定の変更も行います。
この辺りの詳細については過去記事でまとめていますので、そちらを参照願います。↓
html
モーターの操作画面となるhtmlになります。jsで非同期通信を使うので、Ajaxは必須です。
また、カメラ画像も載せたいので、mjpgストリーマーのリンクを貼っています。(mjpgストリーマーを起動後ここにアクセスすればOK)。
mjpgストリーマーについても過去記事でまとめています。↓
css
javascript
touchstart(ボタンを押している時),touchend(ボタンを離したとき)でpythonに値を渡す関数を呼び出しています。
押したボタンに応じて異なる値を、Ajaxを用いてpythonへpostしています。
python
html,css,jsは同じ階層に置き、pythonはcgiスクリプトなので、同じ階層にcgi-binディレクトリを作成し、その配下にpythonファイルを作成します。
内容は至ってシンプルで、jsからpostされた値を受け取り、その値によってGPIOの出力HIGH,LOWを変化させています。
それでは、これで完成ですので、動作確認をしてみます。
動作確認
いやあメカナムホイールって楽しいですネ。1日中触ってられそうです。外に持ち出してやってみたいけど近所の子供たちに潰されそうで出来ないのがネックではあります。。