【Raspberry Pi 2】Webベースの遠隔操作ラジコンをつくる!(1. モータ制御編)
最近ブログをサボってましたが、密かに裏では実は色々とやっていました。本業の仕事が一番はもちろんのことですが、前々からブログでも取り上げているラズパイ君でも色々と挑戦して遊んでいました。
ラズパイについては以前からTweetのBot、VPNサーバ、VNCと、既に色々と遊んできましたが、実際に遊んでみて、「単発の小さなものではなくてもっと大きいアプリケーションをつくってみたい」と思うようになっていました。そこで、一つではなく、複数のモジュールを組み合わせることで成り立つシステム、アプリケーションをラズパイで作ってみようと考え、「遠隔操作ラジコン」を作ってみることにしました。遠隔操作ラジコンを選んだのは、既に実際に作っている人が多くて先人の知恵が使えそうなことと、モノをつくるんだから動くモノがいいでしょという単純な理由です。
システム構成
はじめにシステム構成を図にしてみます。
各モジュールについては、
- モータ制御:Raspberry Piでラジコンを作る - Pieces for electronic kitsを参考にし、前輪はServoBlaster、後輪はWiringPiを使って制御
- カメラ映像:MJPG-streamerを使って、Web上でストリーミング配信する
- 制御サーバ:Node.jsを使って、タブレットからのコマンドをモータ制御に渡す
- Web UI:Socket.IOを使い、JavaScriptでサーバ側と双方向通信し、データのやり取りを行う。また、ストリーミング配信されたカメラ映像を表示する。
のような感じです。遠隔操作UIについては、最近のクロスプラットフォームの流れからもぜひWebベースでのアプリケーションにしたいと思っていたので、Node.jsベースで作ってみました。図を見て分かるように色々と組み合わせてやっていますが、一つの記事ですべてまとめて書くほど私の文章スキルはないので、今回はモータ制御についてのみ書いていきます。次回以降、残りについても書いていく予定です。
モータ制御
先人の知恵として、基本的にRaspberry Piでラジコンを作る - Pieces for electronic kitsを参考にさせていただきました、ありがとうございました。
まずは、使ったもの。大体は秋月電子さんで購入できます。
- 車体:タミヤのバギー工作セット - Amazon.co.jp | 楽しい工作シリーズ No.112 バギー工作基本セット (70112) | ホビー 通販
- 前輪用モータ:ES08A
- モータドライバ:TA7291P
- モバイルバッテリ:何でも
- 単3電池3本:何でも
- ジャンパー線:オスメスを適当に
- はんだこて
- ブレッドボード
GPIOの配線は以下の表のようにしました。
ドライバ | 前輪モータ | 後輪モータ | ラズパイ | 電池 |
1(GND) | 茶(GND) | GND | - | |
2(OUT1) | 1 | |||
3 | ||||
4(Vref) | GPIO18 | |||
5(IN1) | GPIO14 | |||
6(IN2) | GPIO15 | |||
7(Vcc) | 5V | |||
8(Vs) | 赤(Vs) | + | ||
9 | ||||
10(OUT2) | 2 | |||
黄(制御) | GPIO4 |
なおラズパイのGPIOの番号は以下のサイトで確認できます。
後輪モータ:WiringPi
後輪モータでは、ラジコンの前進後退、また、そのスピードを制御します。
ここでは、WiringPiというラズパイのGPIOを制御できるライブラリを使用します。インストールは、
git clone git://git.drogon.net/wiringPi
cd wiringPi
sudo ./build
と、簡単にできちゃいます。使用方法は、
# 出力ピンの指定
gpio -g mode 14 out
gpio -g mode 15 out
# PWM制御ピンの指定
gpio -g mode 18 pwm
# PWMの値を設定(0 - 1023)
gpio -g pwm 18 512
# 14ピン(前進)をオン・オフ
gpio -g write 14 1
gpio -g write 14 0
# 15ピン(後退)をオン・オフ
gpio -g write 15 1
gpio -g write 15 0
というふうに使います。後輪モータの配線次第で14・15の前進後退は逆になることはありますが、これらコマンドを動的に変えることで、後輪の制御が可能となります。
前輪モータ:ServoBlaster
前輪モータではバギーのステアリング部分を操作し、ラジコンの左右方向を制御します。参考にしたサイトでは自作パーツでモータを取り付けていますが、私にはそんな技術もないので、前輪モータをバギーの前部分に接着剤で固定し、回転部分とステアリング部分を釘・ネジの組み合わせで接着しました。
前輪モータの制御については、ServoBlasterというライブラリを使用します。インストールは、
git clone git://github.com/richardghirst/PiBits.git
cd PiBits/ServoBlaster/user
make servod
sudo make install
と、これまた簡単にできちゃいます。使用方法は、
# 起動
sudo servod --p1pins=7 --pcm
# 動作確認: echo サーボ番号=周波数 or 割合(%) > /dev/servoblaster
echo 0=512 > /dev/servoblaster
echo 0=50% > /dev/servoblaster
ここで、注意点ですが、通常ServoBlasterを単体で使う場合には問題ないのですが、今回のようにWiringPiと組み合わせて使用する場合、はじめのservodの起動の時に、オプションで"--p1pins=7 --pcm"の部分を忘れずに指定するようにして下さい。これがないと、ServoBlasterとWiringPiを同時に使うことができず、ServoBlasterの制御が効かなくなってしまいます。
次回
これでモータ制御の下準備はできました。このモータ制御をタブレット側からのコマンドと組み合わせることで、ラジコンをタブレット側から遠隔操作することができるようになります。組み合わせを行う制御サーバについては話が長くなるのでまた別の機会に書くとして、次回はタブレット側のUI(カメラのストリーミング配信と、JavaScript+Socket.IOによる双方向通信)について書きたいと思います。
ではでは。