HOME >> 鉄道模型実験室 > 試験走行によるシステムの確認

鉄道模型実験室  試験走行によるシステムの確認

 void m_count() {   // 割り込み処理ルーチン
     mcount = mcount + 1;
 }
 void loop() {      //メインループ
//******右旋回 登り坂 ゲート1 ******
// while(1){
// if(digitalRead(STAGER_PIN) == HIGH)
          break ;
//  }     vol = 0; //準備    mvol = 0;    cur = 0;    n = 0;    mcount = 0;  while (slit1 == HIGH) {  
// 入口スロットの通過を待つ    slit1 = digitalRead(SLIT1_PIN) ;    }    t1 = millis();       
 // 入口スロットの通過時刻    attachInterrupt(0,m_count,FALLING);
       // 割り込みを有効にする  while (slit2 == HIGH) {  
// 出口スロットの通過を待つ。
    voltage = analogRead(vol_pin);    current = analogRead(cur_pin);    mvoltage = analogRead(mvol_pin);    vol = vol + voltage;    mvol = mvol + mvoltage;    cur = cur + current;    n = n + 1;    slit2 = digitalRead(SLIT2_PIN);   }    t2 = millis();        
// 出口スロットの通過時刻    detachInterrupt(0);  
 // 割り込みを無効にする    angle = analogRead(angle_pin);
  //傾斜台の角度    cancel = digitalRead(BASE_PIN) ;
//キャンセルボタン    if (cancel == LOW){ angle = 9999;    }    tt = t2 - t1; //出力処理   String buf = String(vol)+","+String(cur)
+","+String(mvol)+","+String(mcount)
+","+String(n) +","+String(tt)+","
+String(angle)+",U,"+ ",E";   Serial.println(buf);    delay(500);  } //*****右旋回 下り坂 ゲート2*****    (以下省略)         

■ はじめに

 各部の機能チェックとデータ計測のための校正作業も完了したので、いよいよシステムの頭脳を挿入して試験走行を実施し、システムの機能を確認する。

 

■ スケッチの設定

 測定データを処理するプログラムは、今までの内容を修正して記述する。

 まず、無線通信から送って来るモータ端子電圧値をシリアルデータとして読込み、配列に格納して置く処理や、赤外線通信によるモータ回転パルスをカウントしていたサテライトユニットからのカウント完了処理などの部分を削除する。 これは以前のプログラムに戻す処理でもある。

 そして、今回追加した部分は、まず、モータ回転数をカウントするための割り込み処理である。 D2 ポートを割り込みを受け取るポートに指定している。 入口ゲートを通過すると割り込み処理を開始して、割り込みが発生するとモータのカウントをひとつ進める処理を設定した。 この時の変数 mcount は、割り込み処理ルーチン(m_count)以外でも使うのでvolatileをつけて宣言している。

 モータ端子電圧は、アナログポートに入力されているため、電圧・電流と同様な処理を実施している。 即ち、ゲートを通過している間に累積し、累積回数もカウントしておく。

 出口ポートを通過すると、累積処理を終了するとともに、割り込み処理も終了しt、傾斜台の角度を読み込んで、出力処理に進む。

 出力は、電圧累積値、電流累積値、モータ端子電圧累積値、モータ回転パルス数、累積回数、ゲート通過時間、傾斜角、登り坂か下り坂の判別記号をコンマ区切りで出力する。

 これらの処理内容の主な部分を取り出して右に示す。 この一連の処理を右旋回の登り坂と下り坂、左旋回中の登り坂と下り坂の四つの場合に分けて記述している。 処理内容は同じであるが、監視するスリットの番号と登り坂と下り坂の判別が異なってくるので、いちいち記述している。 上手く記述すれば同じような記述を繰り返す必要は無いと考えられるが、面倒だし、また素人のプログラム屋にはミスを招くだけなので、コピー&ペーストで対応している。

 スケッチの内容をメモ帳にコピー&ペーストものを添付する。⇒ Measure-2-1.txt

 なお、この四つの場合の入口部分では、 while(1){ } の処理を無効にしているが、その理由を下の項目で説明しよう。

 

 

 

■ テスト走行の実施

 スケッチの内容が固まったので、Arduino に送信してテスト走行を実施した。 当初は、上記の while(1){ } の記述部分を if 文を使って記述していた。

 使用した動力車は、KATO のEF81一般色 (品番: 3010-1)EF81-119号機である。 このモデルはKATO製電気機関車の新シリーズの第一弾となったモデルで、フライホイール付き動力やボディマウントスカートを始めて採用するなどの特徴を有する古いもでるである。 まだ、新しい測定方法で特性を測定していなかったため、テスト用車両に使用した。

 

 回転パルスセンサとモータ端子測定電極の取り付け状況を下左に示す。

   

 走行中の送信内容をシリアルモニタで観察した結果を上右にしめす。 モニタの内容をメモ帳にコピー&ペーストして保存したものである。

 第1回目のテスト結果より、角度のキャンセルスイッチが浮いているため 9999 の信号を出している事がわかった。 このマイクロスイッチを再調節して対応したが、3行目からの信号に対しては、何故こうなるか理解できない。

 Arduino のキャンセルスイッチを押して再起動させると、今度は3行目からの内容を送信するのである。 しかし、電源をOFFして再起動すると、再び上記のように、1行と2行目だけは正常と思われる送信を実施するものの、3行目からは異常データとなってしまう。

 こうなると素人プログラマーにはお手上げであるので、 if 文が怪しいと睨んで、この部分をキャンセルしてテストを継続した。 自動運転は、シーケンスに従って行動しているので、測定順番も狂うこと無く順番に実施出来ている。 従って、あえてステージ信号を頼りに、場合分けする必要は無いのである。 何かの異常が有った場合には、測定を中止して再起動させればよいと判断し、ステージ信号を使わないことにした。 何故なのか理解できないままであるが、その結果は見事に成功であった。

 このArduino の送信データをもとに、パソコン上のEXCELに取り込んでデータ処理とグラフ化をリアルタイムで実施しているので、その処理も変更した。  牽引力特性を測定するシートも速度特性を測定するシートと同様に修正を実施した。 速度特性を測定するシートについて、その一部のスクリーンコピーを下に示す。

 まず、モータのパルス数に注目しよう。 距離が108mm あるゲート間を通過する間にモータは何回転するか計算して、滑りゼロの場合には、パルス数 = 2 * 108 * i /πD で計算出来る。 その結果は、パルス数は 179.0回と計算されるので、データはまさのその通りの値を示している。 カウント開始や終了間際でのカウント誤差を考えると、納得のいく精度であろう。

 次に、測定時間 tt と累積回数 n より、一回辺りの測定時間を計算すると、tt/n ≒0.344 msec であるとデータは示している。 以前の場合は、0.233msec であったので測定時間は5割ほど伸びている事がわかる。 しかい、ゲート通過時間内に測定を1000〜2000 回も実施しているので、その平均値をとるデータ収集は、まだまだ精度が高い状態を維持していると考えてよいであろう。 そして、電圧降下量のデータも安定した値を示しているので、無線通信を使った場合よりも精度が向上したと判断する。

 

■ 実際のデータを収集してみる

 データ処理のEXCELも修正出来たので、いよいよ本格的にデータを収集することにした。 しかし、止めとけば良いのに、またまた慾を出して、上記の失敗したif 文記述をwhile(1){ } の記述方法に変更して、再トライを実施した。 その時のデータを下に示す

  .

 そしてグラフ化したスリップ率の値を右に示す。 やはり mcount のデータが変である。 他のデータも変であるようであるが、車輪が滑らない限り一定値を示すこのデータが異常を見つけやすいのである。 結果として計算されたスリップ率の異常である。 平坦路走行でこんなに車輪が空回りしているはずは無いのである。

 今度も、while(1){ } の記述を無効にして測定してみると、正常と思われるデータを得ることが出来た。

      なんで・・・・・・・・・・・・・・・・・・?

 結局今度も、シーケンスの動作を信頼して、ステージ信号無しで実施することにした。

 なお、折角のステージ信号なので、右旋回中や左旋回中の信号として、LEDを点灯させるようにしておこう。 この信号を見ながら、傾斜台のリフト動作を実施すると、ポカ除けになると考えている。

 

● EF81-119号機の測定結果

 while(1){ } の記述を無効にして測定した結果を次に示す。

 まず、速度特性について示す。 この車両は古いモデルなので全体的にバラツキが大きいようである。 特に速度と電圧、あるいはモータ回転数などはもっと安定してもよいはずであるが、変化が大きいように思われる。 本当にモデルのせいなのか、測定方法のせいなのかは、測定データの蓄積が必要であろう。

 次に、牽引力特性を示す。

 テスト車両として古いモデルを選択したのは適切ではなかったようである。 最近測定した車両を使って比較するべきだったと反省するが、データ収集は正常に実施出来ることは確認出来た。

  また、動作状態を何時ものように動画に記録したのでご覧ください。