FlashAirによる鉄道模型制御-GPIO編 寄稿: 綾瀬ヒロ

最終更新: 2015/8

概要

ArduinoのデジタルI/OのHIGH/LOW入力を、FlashAirのGPIOのHIGH/LOWの出力で与えます。よくあるタクトスイッチでデジタルI/OのHIGH/LOWを与えるところを、FlashAirのGPIOに置き換えたものです。Arduinoでは、デジタルI/OピンのHIGH/LOW入力状態に応じて、PWM出力を行い、フルブリッジドライバを介して鉄道模型車両のモータを駆動させます。また、同じくフルブリッジドライバを介して、分岐器(ポイント)の転換用電磁石を駆動させます。

FlashAirによる鉄道模型制御

詳細

FlashAirのCONFIGの設定

FlashAirのGPIOを有効化するため、FlashAir内のSD_WLANフォルダ内のCONFIGファイルに「IFMODE=1」を追加しておきます。

参照: command.cgiの IFMODE

FlashAirとArduinoの接続

FlashAirのGPIO端子を、ArduinoのデジタルI/Oピンに接続します。今回は、単純に何も考えずそのまま直結します。

ビット割当 FlashAir Arduino
0x01 CMD デジタルI/O pin No.2 (D2)
0x02 D0 デジタルI/O pin No.3 (D3)
0x04 D1 デジタルI/O pin No.4 (D4)
0x08 D2 デジタルI/O pin No.5 (D5)
0x10 D3 デジタルI/O pin No.6 (D6)

SDカードの端子を引き出すために、今回は秋月電子通商の「SDカードスロットDIP化モジュール」を改造して使用しました。

参照: SDカードスロットDIP化モジュール

arduino-sensor

SDカードスロットDIP化モジュールにFlashAirを挿したところ

arduino-sensor

全体の回路図

FlashAirのGPIO出力

FlashAirに無線LAN接続を行った端末(ブラウザ)から http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0xXX にアクセスすることで、GPIO端子のHIGH/LOW出力を指示します。 この事例では、FlashAir内に配置したList.htmにJavaScriptでボタンを押下した際に上記URLを要求するようにしました。Webブラウザで操作画面を表示したイメージを以下に示します。

Controller

iPhoneで表示させた操作画面List.htm

ボタン 動作・役割
STOP 緊急停止ボタン。鉄道模型の車両が脱線した場合など、すぐに停止させるため。
DOWN スピードを落とす。1度押下するとArduino側で徐々にスピードを落とす。
RUN 現在のスピードを維持する。
UP スピードを上げる。1度押下するとArduino側で徐々にスピードを上げる。
Left 走行方向を左方向にする。
Right 走行方向を右方向にする。
SW_L ポイントの向き(開通方向)を左向きにする。
SW_R ポイントの向き(開通方向)を右向きにする。
Off すべてのGPIOをLowにする。
Clear 画面をリロードする。

操作画面のList.htmに記述したJavaScriptの例


<script language="javascript" type="text/javascript"> <!—
//関数:FlashAirに対してHTTP通信
function flashair_get( param ){
  var request = new XMLHttpRequest();
  request.open("GET", param, false);
  request.send(null);
} 

//グローバル変数定義
var send_mess = "http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x"; 
var p = 0x00;  

//関数:任意のポートをHigh/Lowにする
function gpio_onoff(port){
  switch( port ){
    case 1:  //緊急停止
             p |= 0x01;
             document.getElementById('RUN_STOP').style.backgroundColor = '#aa0000';
             url = send_mess + p.toString(16);
             flashair_get(url);
             break; 
    case 20: //ポイント制御 High:反位
            (略)
    case 21:  //ポイント制御 Low:定位
            (略)
    case 30:  //走行方向 High:右
            (略)
    case 31:  //走行方向 Low:左
            (略)
    case 4:  //走行制御 High:加速
            (略)
    case 5:  //走行制御 High:減速
            (略)
    case 6:  //走行制御 Low:惰行
            (略)
    } 
    document.getElementById('RESULT').value = p.toString(16);
}
//-->
</script>

GPIO入力状態と動作の定義

この事例では、下表に示す5つの動作を各GPIOに対応させて実現しています。それぞれのGPIOがHIGHになったときの動作を下表のように定義します。またGPIOのすべてがLOWの場合は、現在の状態(速度・方向)を維持するようにしています。

ビット割当 FlashAir HIGH/LOW 動作
0x01 CMD HIGH 鉄道模型車両の走行停止
0x02 D0 HIGH ポイントの向きを左向きに転換する。
LOW ポイントの向きを右向きに転換する。
0x04 D1 HIGH 鉄道模型車両の走行方向を左向きにする。
LOW 鉄道模型車両の走行方向を右向きにする。
0x08 D2 HIGH 鉄道模型車両の走行スピードを上げる。(加速)
0x10 D3 HIGH 鉄道模型車両の走行スピードを下げる。(減速)
Controller

Arduino側のフローチャート

ArduinoにおけるGPIO入力状態のチェックと動作

Arduinoでは、roop関数内で常にFlashAirのGPIO入力状態をチェックします。デジタルI/OのNo.2〜6ピンのHIGH/LOWの状態をチェックし、定義した動作を行うようにします。


const int sdcard_gpio_pin[5] = { 2, 3, 4, 5, 6 };
const int sdcard_gpio_pin_num = 5;
void loop() {  
  for(int idx=0; idx < sdcard_gpio_pin_num; idx++)
  {
    if(digitalRead(sdcard_gpio_pin[idx]) == HIGH){
      if(idx == 0){
        funcspeed_stop();
        state_stop = 1;
      }
      else if(idx == 1){
        pointswitch(1); 
      }
      else if(idx == 2){
        if(state_LR != 1){
          state_LR = 1;
        }
      }
      else if(idx == 3){
        funcspeed(0); //減速
      }
      else if(idx == 4){
        funcspeed(1); //加速
      }
    }
    else{
      if(idx == 0){
        state_stop = 0;
      }
      else if(idx == 1){
        pointswitch(0);
      }
      else if(idx == 2){
        if(state_LR != 0){
          state_LR = 0;
        }
      }
    }
  }
}

試運転をしてみましょう

それでは、この事例で製作した装置で鉄道模型を運転してみましょう。  PWM出力用フルブリッジドライバの出力を線路に接続し、ポイント転換用フルブリッジドライバの出力をポイントに接続します。今回は、関水金属(KATO)の線路を使っていますが、トミーテック(TOMIX)でも同じように接続できます。

写真では、パソコンが接続されていますが、これはシリアルモニタでデバッグしているためで、鉄道模型の運転には必要ありません。 また、写真ではiPadをFlashAirと接続し、操作画面List.htmを表示して操作しています。

Controller

動作の様子を動画でも公開しています。


最後に

この事例では、鉄道模型を動かしていますが、ArduinoのPWM出力によりモータを駆動しているだけですので鉄道模型以外にも応用が可能です。例えば、自動車モデルをFlashAirで操作することも可能でしょう。