Node.js と Node-SerialPortでブラウザから操作するロボット

2016/11/1 7M4MON


Node.js と Node-SerialPortでブラウザから操作するロボットを作ってみました。


 


ロボットの車体はタミヤの楽しい工作「タミヤ 楽しい工作シリーズ No.104 ブルドーザー工作基本セット」を使用しました。
コントローラー部は使わないので切ってしまい、モータードライバーIC「TA7291P」(\150@秋月)で制御することにします。
このモータードライバーICは正転逆転可能で、外付け部品が少なく、5V系でコントロールできます。
電源はエネループ4本の4.8Vを使用しましたが、このICの出力飽和電圧は1V程度なのでFA-130モーターには3.8V程度
加わることになります。よって、推奨電圧からは27%ほどオーバーして使用することになります。

コントロールするマイコンは「PIC16F648A」(\200@秋月)で、内蔵クロック4MHzで使用します。
モーター制御は1モーター当たり2ポート必要です。PORT_BはCCPやUARTと超音波センサで使うのでPORT_Aを使います。
また、攻撃用(?)のクラッカーの紐を引くモーターも追加したので、合計6ポート必要でした。
今回は、PORT_Aのうち、オープンドレイン専用の4と入力専用の5を避けて、0,1,2,3,6,7を使いました。
キャタピラーなので、超信地回転も可能です。


前照灯は放熱基板付1WハイパワーフルカラーRGBLED 「OSTCWBTHC1S」(\250@秋月)を使用しました。
RGBのそれぞれのポートの組み合わせで、7色に変化させることが出来ます。
色を選択するのはハイサイド側で行うこととして、デバイスは2SJ681(\40@秋月)+RN1201(\5@秋月)を選択しました。
LEDには最大で各色200mA、標準で150mA流せるようですが、色味をみながら抵抗値を赤22Ω、青と緑は10Ωとした結果、
赤が107mA、緑が142mA、青が139mAとなりました。
この場合、LEDが消費する電力は合計で1.2W程度で、直視できないほどの明るさです。
電流制限用の抵抗は1Wの酸化金属皮膜抵抗を奢ったのですが、1/2Wの安いカーボン抵抗でも問題ない損失でした。
3色のLEDはカソードコモンとして、PWM制御して明るさを調整します。
人間の目は対数スケールで明るく感じることと、8bitのマイコンの8bitのPWMを使用する都合で、0,1,2,4,8,16,32,64,128,255の10段階としました。
ローサイド側のFETは2SK2201(\70@千石)を使用しました。コントロールする電流は最大で400mA程度しかないので、発熱は少なく、問題ありません。


超音波センサは、HC-SR04を使用しました。
車体に固定した際に干渉するので、ピンヘッダを表裏逆にしています。
タイマ割り込みで0.52秒に一度距離を測定し、Node.jsに送っています。
ループ内で反射時間を測定します。.lstファイルを見ると一カウント当たり11サイクル=11usかかっているようでした。
よって、カウンタと距離の関係は、カウンタ値をdistanceとし、音速を340m/sとすると、340*11*distance/10^6*100/2(cm) = 0.187 * distance (cm)となります。
マイコンではカウント数のみを文字列で送り、割り算はnode.js側でやってもらいます。
実験した限りでは誤差2%程度だったので、おそらく計算式はあっていると思われます。
この超音波センサはたまに応答が無くなることがあるので、タイムアウトした場合前回の値を返すようにしています。
接続されていない場合は65535を返し続けます。
また、距離をマイコン側でも監視して、およそ20cm以内に障害物があれば停止するようにしました。

クラッカーはホームセンターで買った金具でホールドし、タミヤの4速パワーギヤボックスHE 72007を74:1で使用しました。
クラッカーを引けるかトルクが心配だったのですが、楽勝でした。


マイコンのプログラムはgistで公開しました。


Node.jsは作成した当時安定版だったv0.10.26を使用しました。
開発環境はVisualStudio2013と「Node.js Tools」の組み合わせ。これ、すごい便利です。



npmでnode-serialportとExpressを取得しています。
Webページ上にロボットのコントローラーを配置します。
LEDを色を変えるために「jquery.icolor.js」を使っています。
ブラウザの操作を受け取ったら、シリアルポートに書き込むと同時にio.emitして他のブラウザ間と同期を取ります。



そのページのindex.html.jsはこちら

server.tsもgistに置きましたのでご自由にお使いください



と、ここまでは順調に来たのですが、ロボットに組み込んでいた(Node.jsサーバーが走っている)タブレットPCが故障してしまいました。
しかも修理から上がってきた際に直っていなかったため再修理を依頼したりと時間が立つうちに、lack of interest 状態になり
ブラウザからコントロールする作例も珍しいものではなくなってしまいました。
(ハンガーで作ったロボットのPCホルダがSi02BF専用だったので…)

WebRTCとPeer.jsでビデオチャットを追加する計画だったのですが、下記理由で断念しています。
Si02BFの内蔵カメラ (Camera Sensor Unicam ov2680 / 5648 ) はブラウザ(FireFox/Chrome)から選択できないようでした。
念のためドライバのアップデートをしてみたら、そもそもカメラアプリでも映らなくなりました。
他のカメラを繋げば映りますが、なんかいまいちな感じです。



おまけ:無線機をブラウザからコントロールする