徒然なるままな想い書き

何気なく見たり聞いたりした時に得られる『思わぬ発見、気付き』を読者の皆さまに届けています。

【Raspberry Pi 2】Webベースの遠隔操作ラジコンをつくる!(3. 制御サーバ編)

f:id:tsurzur:20160326133854j:plain

ラズパイのラジコンの最終回です。前々回前回と、モータ駆動、WebUIについて書いてきたので、最終回の今回では、それらのまとめ役、制御サーバ(Node.js)について書いていきたいと思います。

 

 

制御サーバの位置づけ

f:id:tsurzur:20160412214031j:plain

はじめに制御サーバの位置づけを確認します。前回のシステム構成の図で言うと、今回は上のラズパイ部分の「制御サーバ(Node.js)」に当たります。前々回に紹介したモータ駆動は実際にはこの制御サーバ内で動作させていますし、前回のWebUIは制御サーバのNode.js側で作成したejsによるものであるので、制御サーバは今回のラズパイラジコンのまさに心臓部分にあたります。制御サーバでは大きく3つのことをさせています。

 

  1. WebUI用のejsを読み込み、Web上に表示する
  2. ejsを使って、ラズパイ内のローカルの画像(バギー、十字の補助線)を表示させる
  3. Socket.ioを使って、WebUIからの制御情報(方向、速度)を受信し、モータ駆動させる

 

では、GitHubで公開もしていることですし、実際のソースで説明していきます。まずは、実際にejsを読み込んでWebUIを作り出しているrasp_server.jsから。

 

<rasp_server.js>

 

 

 いろいろ書いていますが、まずは「// Server Initialization」とコメントしている部分からです。ここで必要なモジュールをロードし、「response」というものでWebUIでの対応を書くよと宣言し、ポートを指定してWebUIを表示させます。この時、ポート番号をサーバ起動時に任意に設定するため、argvで引数指定しています。また、Socket.ioもここで待機状態にしておきます。

 

WebUIの対応をresponceでと言いましたが、それは少し下の「// POST Handler」にあります。makeHTMLではejsの指定、その他はWebUI側からのurl要求に応じてバギーの画像、十字の補助線と、ローカルの画像を渡してWebUI側で表示しています(コメントアウトしていろいろ書いてますが、試行錯誤の後です。。。)。

 

さらに少し下に行くと、「// socket.io Handler」とあり、ここでSocket.io関係の処理を書いています。これは、前回のWebUIの部分でsocket.ioに渡すデータとそのIDなるものを指定してたので、そのIDに応じて処理を分けて書いています。「direction」であれば方向ボタン、「speed」であれば速度ボタン、「move」であればバギー画像によるドラッグコントロール(方向、速度)です。ここで、いよいよモータ駆動の処理かと思うかもしれませんが、ソースを見て分かるように、モータ駆動関係の処理はすべて、ctrlというクラス、というか別のjsであるrasp_control.jsの関数に渡しています。できるだけオブジェクト指向で書きたかったこともあって、こんな風に書いてみました。

 

では、次はそのrasp_control.jsです。

<rasp_control.js> 

 

 

こっちもまぁいろいろとやっているんですが、 はじめに「// Raspberry Pi Motor Control」ということで、第一回で書いたモータ駆動の設定値をここで指定しています。その後は、先ほどのsocket.ioのIDに応じた処理を書いています。ソースを読んでもらえばだいたいのことは分かるとは思うので、ここではこれ以上述べませんが、工夫した点としては、

 

  • サーバ側をCtrl+Cで終わらせるとき、通信環境が悪くなってWebUIからの接続が途絶えた時など、途中で処理が止まった時はラジコンラジコンには停止して欲しい。そこで、そういったもろもろの終了時にはexitProc()関数を用意して必ず停止させる。
  • モータ駆動の最後の処理はshellのコマンドだからなのか、コマンドの周期が早いと処理が追いつかず、動作がモタツクことがあった。そのため、コマンドを実行する前に現在の速度、方向と比較し、差がある場合のみコマンドを実行するようにした。

 

です。終了時の処理については、rasp_server.js内のはじめの方「// Exit Handler」で設定を書いています。

 

起動方法

最後に起動方法です。node.jsを使うので、事前にパッケージをインストールしておいてください。node.jsのパッケージ(バージョン関係)は厄介ですが、こちらのサイトの方法でやるとわかりやすいと思います。

 

qiita.com

 

インストールができたら、あとは実行するだけです。

sudo node rasp_server.js [PORT]

これで、http://ラズパイのIPアドレス:[PORT]と指定してブラウザで開くと、前回お伝えしたようなWebUIが表示されます。

 

まとめ

これにて、ラズパイラジコンの作成について、すべてお伝えすることができました。ラジコンというと、今回はバギーでやりましたが、走らせる車体、WebUIのレイアウト、どうやって制御するかなど、作り手の自由度がとても高い、かつ、様々なモジュールを扱うことができる総合的なシステムだと私は思っています。そのため、システム全体を自分の手で組め、考え、勉強できるツールとしては、このラズパイとラジコンの組み合わせがとてもやりやすく、適しているように思えます。Linuxを勉強してみたい、システムを組んでみたいと思っている方は、まずはこういった簡単なシステムを実際に自分の手で組んでみて試してみてはどうでしょうか?結構楽しいですよ!

 

 

ではでは。