HOME >> 鉄道模型工学 > 動力特性の測定の自動化 > 牽引力特性の測定

鉄道模型工学  動力特性の測定の自動化   牽引力特性の測定

■ 牽引力特性の測定準備

 傾斜台式動力特性測定装置の要となる傾斜角検出ユニットの取付と、その較正作業が完了したので、いよいよ模型車両の牽引力特性を測定してみることにした。 測定装置の設置状態を下に示す。

 ************* 動力特性測定 *****************
 
 #define SLIT1_PIN 13
 #define SLIT2_PIN 12
 #define SLIT3_PIN 11
 #define SLIT4_PIN 10
 #define LEDG_PIN 9
 #define LEDY_PIN 8
 #define LEDR_PIN 7
 #define BASE_PIN 6

 void setup()
 {
  pinMode(SLIT1_PIN,INPUT);
  pinMode(SLIT2_PIN,INPUT);
  pinMode(SLIT3_PIN,INPUT);
  pinMode(SLIT4_PIN,INPUT);
  pinMode(LEDG_PIN,OUTPUT);
  pinMode(LEDY_PIN,OUTPUT);
  pinMode(LEDR_PIN,OUTPUT);
  pinMode(BASE_PIN,INPUT);
  Serial.begin(9600);
 }

 void loop()
 {
  int voltage;
  int current;
  int angle;
  unsigned long vol;
  unsigned long cur;
  int angle_pin = 0;
  int vol_pin = 1;
  int cur_pin = 2;
  int n;
  unsigned long t1;
  unsigned long t2;
  unsigned long tt;
  int slit1;
  int slit2;
  int slit3;
  int slit4;
  int cancel;
  
  //ユニット1
  slit1 = digitalRead(SLIT1_PIN) ;
  slit2 = digitalRead(SLIT2_PIN) ;
  if (slit1 == HIGH & slit2 == HIGH){
    
    //準備OK
     vol = 0;
     cur = 0;
     n = 0; 
     digitalWrite(LEDG_PIN, HIGH);
     
     //入口スリット
     while (slit1 == HIGH) {
           slit1 = digitalRead(SLIT1_PIN) ;
           digitalWrite(LEDG_PIN, HIGH);
      }
      t1 = millis();
      digitalWrite(LEDY_PIN, HIGH);
       
      //出口スリット
      while (slit2 == HIGH) {
          voltage = analogRead(vol_pin);
          current = analogRead(cur_pin);
          vol = vol + voltage;
          cur = cur + current;
          n = n + 1;
          slit2 = digitalRead(SLIT2_PIN);
        }
      t2 = millis();
      angle = analogRead(angle_pin);
      cancel = digitalRead(BASE_PIN) ;
      if (cancel == LOW){
        angle = 999;
      }
    
      //出力処理
      tt = t2 - t1;
      String buf = String(vol) + ","
     + String(cur) + "," + String(n) + ","
     + String(tt)+ "," + String(angle) + ",D" + ",E";
      Serial.println(buf);
      digitalWrite(LEDY_PIN, LOW);
      delay(500);
      
  } else {
    digitalWrite(LEDR_PIN, HIGH);
    delay(500);
    digitalWrite(LEDR_PIN, LOW);
  }
  
  //ユニット2         
   slit3 = digitalRead(SLIT3_PIN) ;
   slit4 = digitalRead(SLIT4_PIN) ;
   if (slit3 == HIGH & slit4 == HIGH){
    
     //準備OK
     vol = 0;
     cur = 0;
     n = 0; 
     digitalWrite(LEDG_PIN, HIGH);
     
     //入口スリット
     while (slit3 == HIGH) {
           slit3 = digitalRead(SLIT3_PIN) ;
           digitalWrite(LEDG_PIN, HIGH);
      }
      t1 = millis();
      digitalWrite(LEDY_PIN, HIGH);
       
      //出口スリット
      while (slit4 == HIGH) {
          voltage = analogRead(vol_pin);
          current = analogRead(cur_pin);
          vol = vol + voltage;
          cur = cur + current;
          n = n + 1;
          slit4 = digitalRead(SLIT4_PIN) ;
      }
      t2 = millis();
      angle = analogRead(angle_pin);
      cancel = digitalRead(BASE_PIN) ;
      if (cancel == LOW){
        angle = 999;
      }
    
      //出力処理
      tt = t2 - t1;
      String buf = String(vol) + ","
      + String(cur) + "," + String(n) + ","
      + String(tt)+ "," + String(angle) + ",U" + ",E";
      Serial.println(buf);
      digitalWrite(LEDY_PIN, LOW);
      delay(500);
      
  } else {
    digitalWrite(LEDR_PIN, HIGH);
    delay(500);
    digitalWrite(LEDR_PIN, LOW);
  } 
 }

 

◆ スケッチの修正

 今まで作成してきたスケッチを少し修正して、最終仕様とする。

 追加して内容は、傾斜角センサからの入力とキャンセル・スイッチの信号を取り込み、パソコンへの書き出しに、そのデータを追加することである。 傾斜角の取り込みは、出口スリットを通過後に実施するが、一回だけの測定で良いのか、数回のデータを平均するのが良いのか迷ったが、今回は一発データとした。

 また、傾斜台を持ち上げて、キャンセルスイッチがLOW の状態の時は、傾斜角の値を "999" とするようにした。 文字情報でも良かったが、Excel での処理にエラーが出るのではないかと思ったため数値としたものである。 分岐処理などの方法を考えたが、単純な処理で済ますことにした。

 

◆ Excel のデータ処理の変更

**************  受信処理 02 ******************

Sub Jushin_02()
  Dim N As Integer
  ・・・・・・・・・・・
  m = Sheet4.Cells(4, 2)

  N = 1
  For rn = 1 To 30
    'オープン
     port$ = "COM3"
     h = CreateFile(port$, ・・・・・・・・・・)
     If h < 0 Then
        MsgBox "通信ポート " ・・・・・・・・・・・・・
        Exit Sub
     End If
    'タイムアウト
        c.ReadIntervalTimeout = 0
        ・・・・・・・・・・・・・・・
    '受信待ち
      buf$ = String$(128, vbNullChar)
      While InStr(buf$, ",") = 0
         ReadFile h, buf$, ・・・・・・・
      Wend
      buf$ = Replace(buf$, vbNullChar, "")
    'クローズ
      CloseHandle h
    ' 結果を表示する
      sn = 2
      While InStr(buf$, ",") > 0
        N = InStr(buf$, ",")
        a$ = Left(buf$, N - 1)
        buf$ = Mid$(buf$, N + 1)
        Sheet4.Cells(rn + m, sn) = a$
        sn = sn + 1
     Wend
     Application.ScreenUpdating = True
  Next
  Sheet4.Cells(4, 2) = m + 30
End Sub

 次に、Excelも変更する。

 まず、速度計測用のシートをコピーして牽引力計測用のシートを作成した。

 新しく作ったシートには、牽引力を計算するための欄と計算式を書込み、計算された牽引力、車速などのデータからグラフを作成する様に設定した。 グラフの様式は今までの書式と同じにしている。

 測定された指示値から傾斜角に換算する場合、ゼロ点に履かせたゲタを考慮し、その値を測定前に入力するようにしている。 もし、ゼロ点がドリフトした場合の対策である。

 また、登り坂と下り坂の判別は、送信された6番目の文字の U か D を判断し、

 = IF(G6="D",-1,1)

の関数を使用して、D であれば下り坂と判断して、-1とし、それ以外なら +1 として牽引力計算にかけ合わせるようにした。

 牽引力は、動力車自身の重さと、重り車両の重さにsinθを掛けて、重り車両の走行抵抗分を加えたものとして計算する。

 また、新しくシートを作ったため、データを書き込むシート番号が違ってきているので、速度計測用のマクロとは変更する必要があった。 このため、速度計測用のマクロをコピーして、新しい Sub プログラムとし、それをJushin_02() とし、シート番号と繰り返し回数などを変更している。

 さらに、新しい Sub プログラムをスタートさせるためのボタンも新しいシート内に作り、同じシート内で操作できるようにしている。

 勿論、一行毎にグラフ表示させるおまじない、
          Application.ScreenUpdating = True

も追記しており、これによって、Excel のグラフが、リアルタイム・モニターとしても、使用出来るようになった。 Web のさる方に感謝である。

 計測の繰り返し回収は、一気に測定してしまう意図で、30 回と設定している。 マクロ実行中に、それを中断、再会する方法をまだ習得していないので、この程度を限界とした。

 

■ 試験走行

 準備が出来たので、スケッチをArduino に送信し、EF510-1号機を準備して試験走行を実施した。その時の走行写真を下にしめす。

 計測のための準備として、動力車両や重り車両の重量を測定し、その値をExcel の所定欄に入力しておく。 傾斜台の初期値も入力する。 そして、傾斜台を水平状態とし、車両を走行させながらコントローラのダイヤルを調整し、所定の電圧にセットする。 

 準備で出来たら、Excel をスタートさせ、データの取得を開始する。 車両が車速測定ユニットを通過するたびに、Arduino からデータが送信されるので、Excel は一行毎に入力し、計算されたデータをグラフに表示していく。 車両が一周する毎に、下り坂と登り坂でのデータを測定するので、これに合わせてリフト機構により傾斜を上げて行く。 自分は、表示されたグラフを見ながら、リフト装置のレバーを回転させるだけで良いのである。

ラクチン なり!  これぞ自動測定のありがたさなり。                    

 この時に計測された牽引力特性のグラフを下にしめす。 暖機運転もそこそこに測定したので、測定を開始したゼロ点付近のデータがバラツイテいるようであるが、目的とするデータが得られている。

  .

 この時の、電圧と電流の様子もグラフに示す。 右のグラフ。 今までは、負荷によって変化した電圧をコントローラのダイヤルを回して修正していたが、今回からその操作を中止している。 平坦路走行時にセットしたダイヤルのままで、測定しているのであるが、これは、測定している車両の特性と言うよりも、コントローラの特性を示しているものと考えている。

 ちなみに、使用していたコントローラは、TOMIX の N-401 である。

 この試験運転で見つかった問題点として、

  1. 暖機運転の実施と記録。
  2. 測定の繰り返し回数がどこまで行っているの不明なので、その回数の表示。

であったので、その対応も実施した。 繰り返し回数の表示は、ボタンの横に表示欄を設けた。

■ 暖機運転への対応

 測定データの信頼性を向上させるため、測定前の暖機運転時のデータも収集することにした。 牽引力特性の測定を少し修正して使用する。 Arduino 側は同じスケッチが使用できるので、Excel 側を修正した。 そのポイントは、経過時間の計測である。この時間はあまり厳密に計測する必要がないので、Excel が処理した時刻をもって計測することにした。 時刻計測の関数をネットで調べると、丁度ピッタリの実施例を見つけたので、応用させてもらうことにした。

Sub Jushin_03()
・・・・・・・・・・・・・・・・・

 N = 1
 StartTime = Time
 For rn = 1 To 120

   ・・・・・・・・・・・・・・
   ' 結果をセルにセット
   StopTime = Time 
   StopTime = StopTime - StartTime
   sn = 2
   While InStr(buf$, ",") > 0
      ・・・・・・・・・
      buf$ = Mid$(buf$, N + 1)
      Sheet5.Cells(rn + m, sn) = a$
      sn = sn + 1
   Wend
   Sheet5.Cells(29, 21) = rn
   Sheet5.Cells(rn + m, 18) = Minute(StopTime) + Second(StopTime) / 60
   Application.ScreenUpdating = True

 Next
 Sheet5.Cells(4, 2) = m + 120
End Sub

 左に示すように、計測を開始した時点で時刻を設定する。

     StartTime = Time

そして、受信したデータを処理する時点でその時の時刻を計測し、

     StopTime = Time
     StopTime = StopTime - StartTime

として、測定開始からの経過時間を計算する。 さらに、この時間から分と秒を切り出し、”分”単位の経過時間として、所定の欄に書きだすようにした。

     Sheet5.Cells(rn + m, 18) = Minute(StopTime) + Second(StopTime) / 60

そして、画面のリフレッシュのおまじないを実施し、次の信号受信の待機状態に戻るのである。

 

 

 

 

 

 

 

 

 このマクロ実行中は、一切、手を出す必要がないので、測定繰り返し回数は、とりあえず120回と設定した。

 勿論、この暖機運転の記録も、新しいシートを作成したので、牽引力測定シートと同様に、新しく Sub プログラムとボタンを作り、シートナンバーや測定繰り返し回数などを変更した。 この、シートナンバーやボタンの確認は、右に示す Excel のマクロ画面で確認出来る。

 

 これの修正を行ったExcel のシートとして、牽引力計測のシートを例にして、その画面状態を紹介しよう。

 拡大図

 

■ 動力特性の測定

 さて、いよいよこのシステムを使用して、ひと通りの特性項目を測定することにした。 供試車両は、同じくEF510-1号機である。

 まず始めに暖機運転を実施する。 前述の試験運転から一日が経っているので、車体は充分に冷めていると考えている。 計測は暖機運転シートで実施する。

  

 負荷状態は、登りの駆動状態で、18.5グラム、5.5Volt、下りの制動状態で、-20.4グラム、5.2Voltであった。 15分近くも運転すると、速度や電流は落ち着いて来ているが、途中で特性が ピコピコ と変化している。 この測定中は、パソコンやコントローラなど、どこも触らずに、唯、じーと見ているだけである。 測定中のノイズとは思われないので、模型車両の動力特性が変動したものである、としか考えられない。 暖機運転は5分程度でも充分に落ち着いてくるようである。

 次に、速度特性を計測した。 測定は速度計測シートで実施する。

 

 測定データは意外とバラツイており、電流値も 6Volt 以降で傾きが変化している。 この傾向は、以前調査したデータとも合致している。 これはこの車両特有の現象であり、構造上の問題とも考えれる。 また、途中で飛び出している異常データもあるが、原因不明である。

 次に、牽引力特性を計測した。 測定は牽引力計測シートで実施する。

 

   .

 充分に暖機運転を実施したつもりであるが、ご覧のとおりデータはしっかりとバラツイテいる。

 このデータを見て、自分は少しがっかりとしている。 もっと綺麗なデータが取れると思っていたが、バラバラのデータである。

 水平状態から測定を始めて、傾斜角を増加して行ったが、傾斜角の設定は、何度か繰り返して上下させている。  通常、この様な特性はヒステリシスを持つと言われているが、この模型車両の場合、当てはまらないと考えている。  メカ機構の場合のヒステリシスは摩擦抵抗が原因になっているが、回転中の部品では、その回転や力が常に変化しているので、ヒステリシスとしては表れないと思っている。 さらに、今回の測定方法では、線路を一周する間に、駆動状態と制動状態を繰り返すので、その動作状態での差は発生するものの、傾斜角の増減、即ち負荷の増減によるヒステリシスは考え難い。 モータ特性のヒステリシスとも考え難い。

 また、電圧と電流の関係を左に示すが、負荷電流によって電圧の低下はみられるものの、電源側のふらつきは無いと言える。 従って、このバラツキは車両特性の変動、あるいはふらつきとしか言いようがないのではないか。 残念ながら、模型車両の動力は、不安定であり、ふらふらと変動している・・・
  ・・・・・・・・・と考えるのが妥当な気がする。

 以前より、自分は 「鉄道模型車両」 は、“精密機器” では無い と思っている。 精密機器とは、その作動に信頼性があり、どんな場合でも正確にかつ安定的に作動するものである。 例えが時計がそうである。 一年間で1秒も狂わないという時計は珍しくない。 オリンピック競技などで使用されるストップウォッチでも、誰が何処で測ってもその計測された時間の値を、皆が信頼している。 ロケットなどの大きな装置でも、狙った軌道に正確に乗せる事ができるのである。 このような機器を精密機器と呼ぶべきである。
  これに対して、鉄道模型はどうだろうか? 確かに小さく緻密に作られており、一見して精密機器のようであるが、緻密に作られているだけで、その性能は測定するたびに変化するし、ギクシャクと走行する場合もある。 これは精密機器としては失格である。
  しかし、もともと、 精密機器として使用する事を前提としていないので、これで充分なのである。 鉄道模型は緻密さをセールスポイントし、正確さは求められていないのである。 メーカーが模型車両の性能を発表しないのも当然であり、この鉄道模型に対して、動力特性を測定しようとしている小生が無謀なのかもしれない。

 この測定データを “綺麗に見せる” 方法はある。 何回も測定するのではなく、細かく測定して行くものの、負荷の増加を一回だけ実施する方法である。 多少は凸凹すると思うが、連続した一本の曲線が出来るはずである。

 この様な方法で、データを綺麗に表示するのは、姑息な方法であり、その車両の特性を正確には表していないのだが、場合によっては有効かも知れない。 例えば制動領域へ移行する遷移点まわりの状況を調査する場合には、連続データとして計測出来るものと思われる。 また、プロット点の数を省略した簡易的な測定の場合にも、有効な方法と思われる。

*****************************************

■ おわりに

 昨年から始めた動力特性の自動測定について、そのシステムを一応は完成することが出来た。 面倒な測定作業は大幅に簡素化され、その測定精度も満足のいくものであり、当初の目標は達成できたと考えている。 今後はこのシステムを使用して、多くの動力車の特性を調査していきたい。 その中で、改善点を見つけ、さらに使いやすいシステムを目指して行こう。

 そして Arduino と簡単な電子回路の取り扱いを習得することが出来たことが、何よりも嬉しいことである。 メカ屋の自分でも出来る事を知り、今後のホビーの幅を広げて行きたい。 模型の自動運転! 自動踏切だって? ・・・・・・・・・・・・・ニーズを感じたら手を出すかも知れません。

 今後は、中断している 動力車の調査や、マイコレクションの動力特性のデータ充実を図っていきたい。

 

・・・・・・ 完 ・・・・・・・