エンジニア『まつ』 の戦いの記録

エンジニア『まつ』 の戦いの記録を発信する。

Raspberry Pi 3 で WiFiラジコン(4) 〜 ラジコン操作用プログラム作成 (JavaScript)

今回はWiFi ラジコンの操作用のプログラムの作成です。

最終的な完成形

完成形は以下のイメージです。

  • Raspberry Pi 上で Node.js の Express を利用してサーバーを作成します。
  • iPhone から WiFi を通じて、ブラウザから 上記の サーバーに接続します。
  • iPhone のブラウザには Express を利用したページが表示されており、前進・左旋回・右旋回・後進 のボタンがあります。
  • Express サーバ は iPhone から来た要求を受けて GPIO を通じてモーターの制御を行います。

またチャレンジ目標としては

  • USBカメラを Raspberry Pi に搭載して、iPhone からUSBカメラを通じた映像を確認しながら操作可能とします。

システム構成

f:id:matu-developer:20161016134634p:plain

  • iPhone から WiFi を通じて、ブラウザに操作用のページを作成します。サーバー側は Node.js の Express を利用して画面を作成します。
  • GPIOの制御は PIGPIO という Raspberry Pi の GPIO 制御用ライブラリを利用します。
  • GPIOを制御することで、モータードライバ (TA7291P) を通して、モーターの回転を制御します。

PIGPIO について

www.npmjs.com

Raspberry Pi の GPIOを制御するライブラリは Python では色々あるのですが、今回は JavaScript を利用したかったので、色々探しました。
探した結果上記の PIGPIO ライブラリが利用しやすいと思います。

npm で配布されているため、Express から Node.js を利用して、簡単にGPIOを操作できます。

また今回は利用していないのですが ソフトPWM も利用することができます。
JavaScript で ソフトPWMを利用できるライブラリがなかなか無い

new Gpio(26, {mode: Gpio.OUTPUT})).digitalWrite(1)

今回開発したプログラムについて

以下の GitHub で公開しています。

github.com

///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の割合を減らすことでモーターの回転を弱めることができます。
(今回は必要なかったため利用していないです)

旋回

「ひだり」への旋回時には「左側モーターを後転」「右側モーターを前転」して制御を行います。「みぎ」への旋回時はその逆です。