Raspberry Pi 3 で WiFiラジコン(4) 〜 ラジコン操作用プログラム作成 (JavaScript)
今回はWiFi ラジコンの操作用のプログラムの作成です。
最終的な完成形
完成形は以下のイメージです。
- Raspberry Pi 上で Node.js の Express を利用してサーバーを作成します。
- iPhone から WiFi を通じて、ブラウザから 上記の サーバーに接続します。
- iPhone のブラウザには Express を利用したページが表示されており、前進・左旋回・右旋回・後進 のボタンがあります。
- Express サーバ は iPhone から来た要求を受けて GPIO を通じてモーターの制御を行います。
またチャレンジ目標としては
- USBカメラを Raspberry Pi に搭載して、iPhone からUSBカメラを通じた映像を確認しながら操作可能とします。
関連記事
- Raspberry Pi 3 で WiFiラジコン 〜 必要なもの - エンジニア『まつ』 の戦いの記録
- Raspberry Pi 3 で WiFiラジコン(2) 〜 車体づくり - エンジニア『まつ』 の戦いの記録
- Raspberry Pi 3 で WiFiラジコン(3) 〜 電子回路(基盤) - エンジニア『まつ』 の戦いの記録
- Raspberry Pi 3 で WiFiラジコン(4) 〜 ラジコン操作用プログラム作成 (JavaScript) - エンジニア『まつ』 の戦いの記録 <=今回はここ
- Raspberry Pi 3 で WiFiラジコン(5) 〜 Webカメラ + 完成 + デモ - エンジニア『まつ』 の戦いの記録
システム構成
- iPhone から WiFi を通じて、ブラウザに操作用のページを作成します。サーバー側は Node.js の Express を利用して画面を作成します。
- GPIOの制御は PIGPIO という Raspberry Pi の GPIO 制御用ライブラリを利用します。
- GPIOを制御することで、モータードライバ (TA7291P) を通して、モーターの回転を制御します。
PIGPIO について
Raspberry Pi の GPIOを制御するライブラリは Python では色々あるのですが、今回は JavaScript を利用したかったので、色々探しました。
探した結果上記の PIGPIO ライブラリが利用しやすいと思います。
npm で配布されているため、Express から Node.js を利用して、簡単にGPIOを操作できます。
また今回は利用していないのですが ソフトPWM も利用することができます。
JavaScript で ソフトPWMを利用できるライブラリがなかなか無い
new Gpio(26, {mode: Gpio.OUTPUT})).digitalWrite(1)
今回開発したプログラムについて
以下の GitHub で公開しています。
///rc-control/src/server/controllers/rc-controller.js var Gpio = require('pigpio').Gpio; var RIGHT_FW_PIN = 26; var RIGHT_BK_PIN = 19; var LEFT_FW_PIN = 13; var LEFT_BK_PIN = 11; var ALL_PINS = [RIGHT_FW_PIN, RIGHT_BK_PIN, LEFT_FW_PIN, LEFT_BK_PIN]; function post(req, res){ var action = req.body.action; console.log('rc:action = ' + action); if (action == 'stop') { try { ALL_PINS.forEach((pin) => { (new Gpio(pin, {mode: Gpio.OUTPUT})).digitalWrite(0); }); }catch(e) { console.log(e); } } else { var pins = getActionPin(action); try{ (new Gpio(pins.right, {mode: Gpio.OUTPUT})).digitalWrite(1); (new Gpio(pins.left, {mode: Gpio.OUTPUT})).digitalWrite(1); }catch (e) { console.log(e); } } res.send(req.body); } function getActionPin(action) { switch(action) { case "forward": return {right: RIGHT_FW_PIN, left: LEFT_FW_PIN}; case "back": return {right: RIGHT_BK_PIN, left: LEFT_BK_PIN}; case "right": return {right: RIGHT_BK_PIN, left: LEFT_FW_PIN}; case "left": return {right: RIGHT_FW_PIN, left: LEFT_BK_PIN}; } } module.exports = {post};
開発時のポイント
モーターの強さの制御
モーターの回転速度を PWM を利用して制御することができます。
PWMはプログラム的に1秒間の数百回とかの頻度で、ON、OFFを繰り返し、そのONの割合を減らすことでモーターの回転を弱めることができます。
(今回は必要なかったため利用していないです)
旋回
「ひだり」への旋回時には「左側モーターを後転」「右側モーターを前転」して制御を行います。「みぎ」への旋回時はその逆です。