HOME >> 鉄道模型実験室 > 総合テストを始めたが・・・・・・

鉄道模型実験室  総合テストを始めたが・・・・・・

■ はじめに

 各要素の機能の確認が出来たので、これらの要素を組み合わせた移動式測定車の総合テストをいよいよ始める事にした。 しかし、すんなりとは行かなかった・・・・・・・・。

  .

 

■ 電圧測定の確認

 最初に、無線通信を使ったモータ端子電圧の測定確認から取りかかった。 移動式測定車をテスト車両と連結した状態を下に示す。

******* New_Keninryoku_test1 ***********
     -------省略-----
void loop()
{
  int voltage;
     -------省略-----
  int data[15];
 //ユニット1
  slit1 = digitalRead(SLIT1_PIN) ;
  slit2 = digitalRead(SLIT2_PIN) ;
  if (slit1 == HIGH & slit2 == HIGH){
  //準備OK
     -------省略----
  //入口スリット
    while (slit1 == HIGH) {
      slit1 = digitalRead(SLIT1_PIN) ;
      digitalWrite(LEDG_PIN, HIGH);
      if (Serial.available() > 21) {
        if (Serial.read() == 0x7E) {
          for (int i = 0; i < 18; i++) {
            byte discard = Serial.read();
          }
          analogHigh = Serial.read();
          analogLow =  Serial.read();
          analogValue = analogLow + (analogHigh * 256);
          data[m] = analogValue;
          m = m + 1;
          if (m > 10)  {
            m = 0;
          }
        }
      }
    }
    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 = 9999;
    }
   //出力処理
    tt = t2 - t1;
    String buf = String(vol)+","+・・・
+String(data[0])+","+・・・+String(data[9])+ ",E";     Serial.println(buf);     digitalWrite(LEDY_PIN, LOW);     delay(500);   }     //ユニット2    ----省略--- }

 モータ端子電圧を測定するために、テスト用の動力車の電極にリン青銅板を差し込んで測定ユニットに接続する。 また、テスト用動力車の車体を取り外しているので、速度測定用の光ゲートを確実に遮断するように、ウレタン発泡部材を加工して動力車の先端部分に両面テープで貼りつけている。

 Arduino の処理プログラムを、左に示す。 以前に紹介した自動測定プログラムを元に、無線通信部分を追加したものである。

 走行中にモータ端子電圧を 50ms 毎に送信してくるので、配列 data[15] の最新の10個のデータを取り込んでおく。 配列は15個分確保しているが、特に意味はありません・・・・・・。

 そして、速度測定ゲートに入ると、その信号を受けてタイムスタンプを記録すると共に、配列データの取り込みを中止し、今度は供給電圧と電流の測定に専念させる。

 車両がゲートアウトした場合には、そのタイムスタンプを記録した後、測定台の傾斜角を測定して測定を終了する。 最後に、これらの電圧・電流値やゲート通過時間などと共に、ゲートイン前のモータ端子電圧測定値10このデータなどを、パソコンに送信する。 この時のシリアルモニタの状態を下に示す。

 このデータをEXCELに取込み、データを整理した状態を下に示す。 左右や真ん中の欄は省略している。

 「平均」のセルには、10個のデータの平均値を自動的に計算するように設定している。 そして、この値よりもっとも大きいデータと最も小さいデータの差を「Mバラツキ」の欄に示す。 そして、この値が大きすぎる場合には、データ欄のデータ値の前に「#」のマークを付けて、計算対象から除外するようにした。 さらに、見やすいように黄色のマークもつけている。 データのバラツキは意外と大きいが、実際の電圧変動なのか、測定誤差なのかは判断が付いていない。

 そして、この平均値をもとに、先回校正を実施した実験データをもとに、電圧値に換算したものを「電圧」欄に計算させるようにした。 さらに、供給電圧のとの差も計算し、動力車での「電圧降下」量として計算している。 この電圧降下量を供給電圧値と電流値を横軸にしてグラフ化したものを下に示す。

   

 測定結果は、電圧降下が 1Volt 以上もある事を示している。 これは以前の推定値から考えて、やや大きいような気がするが、特におかしくはない値であり、妥当な結果と安心している。 測定装置の概要と測定状態を下に示す。

  .

  .

 

■ 赤外線通信の確認

******* New_Keninryoku_test2 ***********
     -------省略-----
 //ユニット1
  slit1 = digitalRead(SLIT1_PIN) ;
  slit2 = digitalRead(SLIT2_PIN) ;
  if (slit1 == HIGH & slit2 == HIGH){
  //準備OK
     -------省略----
   digitalWrite(REST_PIN, HIGH);
  //入口スリット
    while (slit1 == HIGH) {
      slit1 = digitalRead(SLIT1_PIN) ;
      digitalWrite(LEDG_PIN, HIGH);
     -------省略----
    }
    t1 = millis();
    digitalWrite(REST_PIN, LOW);
    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);
      STOP = digitalRead(OUT_PIN);
      if (STOP == HIGH){
        t3 = millis();
        digitalWrite(REST_PIN, HIGH);
      }
    }
    t2 = millis();
    angle = analogRead(angle_pin);
    cancel = digitalRead(BASE_PIN) ;
    if (cancel == LOW){
      angle = 9999;
    }
   //出力処理
    tt = t2 - t1;
    tp = t3 - t1;
    String buf = String(vol)+","+・・・
 
+String(data[0])+","+・・・
+String(data[9])
   +","+String(tp)+ ",E";     Serial.println(buf);     digitalWrite(LEDY_PIN, LOW);     delay(500);   }     //ユニット2    ----省略--- }

  次に、モータの回転数計測の確認を実施する。

 先回報告した外部カウンタを使用した回路を手直して、Arduino と接続し、走行実験を行った。 この赤外線受光部は、測定台の中央部に設置して、楕円周回路の手前と奥側から信号を受ける必要があるため、赤外線受光部モジュールを2個使用し、右のような回路を構成して、サテライト・ユニットした。

 また、モータのペイントマークやギヤ比によって、パルスカウントの回数が設定出来るようにディップスイッチで選択できるようにしている。 Q8 をONすると128回、 Q9にすると256回・・・・・・の様に変更出来るのである。

 LEDは、ArduinoからRESET信号がHIGHの場合に点灯し、準備OKのランプとする。 指定のパルス数をカウントすると完了の信号をArduinoに送信するが、同時に黄色のLEDを点灯させる。 さらに、途中でカウントを実施している事を知らせるためにQ7ポートの信号により赤のLEDを点滅させることにした。

 最初にブレッドボード上で回路を作り、Arduino に接続した。 但し、無線通信XBeeシールドがArduino の5V電源ポートを占領しているため、XBeeシールドのICSP端子の+5 ポートに接続した。 最終的には、シールドは重ねて使用するようにするため、Arduino の5V電源ポートを使用可能となる。

 スケッチは左の様に追加修正した。 

 ・スタンバイ中は、Arduinoからの指令(D4)により、RESETをHIGHにして、緑のLEGを点灯させる。

 ・ゲートインの信号により、RESETをLOWにして、緑のLEGを消灯させると共に、パルスのカウントを開始する。

 ・指定の回数のカウントが完了すると、D5ポートに完了の信号を送信し、その時のタイムスタンプを記録しておく。

 ・ゲートインの時刻と完了の時刻差を計算してパソコンにデータを送信する。

 

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

 そして、実際にテスト車を走行させたが、結果は無残であった。 Arduinoからの信号により、緑のLEDが点灯、消灯するのみで、パルスをカウントしている様子は無かった。

 賢明な諸君は、当方のミスをお見通しと思いますが、当方はただ呆然と眺めているだけでした。

 原因として、赤外線通信のキャリヤ波の周波数がずれ、通信が出来なくなったのではないかと推定し、周波数が測定出来る手配していたテスターが届くのまで待つことにした。

 

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

 

 

■周波数の測定

 Arduino を使っての測定は面倒なので、周波数が測定出来るテスターを注文していた。 そのテスターが届いたので、早速、測定ユニットの発振周波数を測定して見たが、ゼロの表示であった。 発振していない? そんなはずは無いと考えて、テスターの使用マニュアルを見ていると、

  1. 入力値は 5Vrms 〜100Vrms
  2. 正弦波(ゼロクロスのsin 信号波形)で、ロジックパルスはダメ

と書いてあった。 がっくりである。 メーカーが悪いのではなく、当方がマニュアルを充分に確認せずに、8千円もするテスターを注文したのが悪いのである。 ネットでの商品案内では、そんなことは書いてなかったぞ! 使用マニュアル(PDFアイル)をダウンロードして良く読めば良かった・・・・・・と反省するも後の祭りである。

 気を取り直して、何とか測定出来ないかと考えたが、ゼロクロスのsin 信号波形に整形する方法を知らないので、このテスターに使用を諦めた。 高い勉強代になってしまったが、コンデンサの容量なども測定出来るので、無駄ではなかったと考える事にしよう。

  .

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

 やはり、 Arduino を使って測定することにしたが、そのままでは測定出来ないので、Arduinoが読み込んでくれるように測定値を増幅させて入力する工夫をした。 一番簡単なのはトランジスタを使う方法と考えて、もう一度トランジスタの説明書を読み直した。 そして、右のような回路を作ることにした。 パルス状の信号を増幅するといっても、スイッチ作用で充分であるので、もっとも簡単な回路である。 この回路をブレッドボード上に構成した状態を下左に示す。

 そして、この回路を使って測定ユニットのタイマー出力端子のパルスを測定すると、見事Arduino は反応してくれた。 周波数測定結果は、32KHz であった。 やはり周波数がずれていたようである。 測定時の様子を下右の写真に示す。

 そこで、追加注文していた部品を使って測定ユニットの発振回路を修正することにし、ブレッドボードで回路を組んでチェックしてみた。 コンデンサの値を2ケタ近く小さくし、抵抗値をその分大きくしたものである。 周波数は38Khz確保出来た。

 そして、この結果をもとに測定ユニットの発振回路を修正した。 ブレッドボードの状態を下左に、測定ユニットの状態を下右に示す。

  .

この時の構成回路を左に示す。 抵抗などの数値は新しいテスターで測定した実測値である。 この実測値をもとに計算式で周波数を計算すると、40.3KHz になるが、実際の組みあがった回路での(上右の写真)周波数は、38.2KHz であり、少しことなっていた。 回路構成によって容量などか微妙に変化しているのかな?

 回路が組みあがった状態で、周波数を37.9KHz に調整し、再度、走行テストをじっしすることにした。

 なお、右上の写真の左端に、10μFのコンデンサも追加した。 手作り室内灯用に使っていたコンデンサである。 モータ端子電圧の変動を少しでも小さく出来ないかと考えて追加したものである。

  .

 

■ サテライト・ユニットの制作

 ブレッドボードで構成していたサテライト・ユニットの回路をユニバーサル基板の上に構成した。 Arduino とはリード線で接続するように工作している。 右の写真に示す。 これらの工作物を使って、再び走行テストを実施した。

    しかし、今回も結果は無残であった

 Arduinoからの信号により、緑のLEDが点灯、消灯するのみで、パルスをカウントしている様子は無かった。 さらに、電圧データの方もおかしな数値を表示するようになってしまった。

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

  少し頭を冷やして、冷静に考えるることにした。 まず、電圧データの方は、入力部に10μFのコンデンサを追加したのが原因と考え、これを切り取って再測定してみると正解であった。 理由は理解できないが・・・・・・。

*********  New_Keninryoku_test3  *******
 int Flag;

 ……… 省略

    //出口スリット
    while (slit2 == HIGH) {
   ……… 省略
      slit2 = digitalRead(SLIT2_PIN);
      STOP = digitalRead(OUT_PIN);
      if (STOP ==HIGH & Flag == 0){
        t3 = millis();
        Flag = 1;
      }
    }  ……… 省略

 また、気になっていたスケッチの一部を修正した。 カウント完了の信号を受けて、そのタイムスタンプを記録した後にすぐ、REST_PIN をHIGH に変更するのを止めて、処理終了後に変更するようにした。 そして、一度タイムスタンプを記録した後はスルーするように Flag を立てるようにした。 その修正部分を右に示す。

 次に、問題のユニットを眺めていた。 キャリヤ波の周波数はOKなので、どこが悪いのだろうかと思いながら、赤外線受光モジュールの各足にテスターをあててその電圧を測ってみた。 すると、出力部の足の電圧はおよそ5Volt で、測定車が近づくと 2Volt 以下に低下し、離れていくともとの 5Volt 近くに戻っている状態であった。

 ここで、賢明な諸君はすぐに気が付くであろう。 自分も慌てて赤外線受光モジュールの説明資料を見た。 出力回路はプルアップ回路になっており、信号パターンの説明図でも、通常時はHIGHレベルで、パルスを受けるとLOWレベルに下がるのである。 即ち、上記の回路図に示すように、二つの赤外線受光モジュールをダイオードで結合していると、常時HIGH の状態になってしまう。 二つの赤外線受光モジュールが同時にパルスを受けないとLOWにならないのでる。

  .

 浅はかな素人考えで有ったことを反省しつつ、対策を検討した。

 OR回路を使ってパルスカウンタに入力しようか、トランジスタを使おうかといろいろ考えたが素人には対応策が見つからない。 論理回路を処理出来るのは、「自動列車停止装置 システムの検討」で使用した汎用ロジックIC があったので、その真理値表を見ていたが、なんとNAND回路ひとつで対応出来る事に気が付いた。 入力と出力のHIGH/LOW レベルは逆転するが、パルスカウントなので問題無いはずである。

 

 

 

 

 

 そこで、その残り部品の汎用ロジックIC TC4093BP を使って回路を組むことにした。 修正したサテライト・ユニットを上に示す。 ユニバーサル基板に余裕スペースがあったので、何とか対応出来た。 NAND 回路は4個も要らないが、手持ちのものはこれしか無かったのでこのICを使用した。 不要な足はGND に接続している。

 さて、このユニットを使って再び走行テストを実施した。

     今回は 成功である。

 しかし・・・・・・・・、手前と奥とでパルスの完了時間が大きく違っているのである。

 何時ものようにシリアルモニタの値をメモ帳にコピペしたものの一部を右に示す。 E のひつつ前のデータがカウンタ完了時間である。 単位はmsec である。 進行方向がU とD とで異なっている事がわかる。この進行方向は、傾斜台を傾けた時に登坂になるU の場合、即ち奥側と、下り坂になる D の場合、即ち手前側のゲートを通過した場合を示している。

 そこで、ユニットの向きを180度回転して信号を受けてみると、それに従ってパルス完了時間も変化する。 これはサテライト・ユニットに依存する現象である判断でき、二つの受光ユニットの特性が異なっているのではないかとしか思えない。 そんなバカな? 回路構成の間違いだろうかとも考えたが、原因不明に付き二つの受光モジュールの使用を中止する事にした。 受光モジュールをひとつにすれば問題ないだろう!・・・・・・・・・・。

 原因不明なので、正確にパルスを拾ってカウントしているのかどうか怪しのではないかと思いつつ、受光モジュールをひとつにする構成にすることにした。 対応策は既に考えているのである。

  .

 

■ やっと成功した赤外線通信

 サテライト・ユニットについて、赤外線受光モジュールをひとつにした単純化回路に修正した。 修正したユニットを下左に示す。

 次に、このユニットの設置方法であるが、受光モジュールがひとつだけなので、測定台の上方に設置するしかないのである。 そこで、園芸用の支柱を持ち出し、50cm 程の高さに設置して、赤外線を受けるようにした。 その状態を下右に示す。

 このユニットを使って再び走行テストを実施した。

     今回は うまくいった。

 手前のゲートを通過する時と、奥のゲートを通過する時とのパルスの完了時間は殆ど同じとなった。

 

 やっとこさでここまで来ることが出来たので、その様子を動画として記録しておくことにした。

 パルスカウントの指定回数は、128回に指定している。 従って、赤LEDが点灯するとすぐにカウント完了の橙色LEDが点灯するが、その様子を観察する事が出来るであろう。 また、無線通信が受信中もシールドのLEDが点滅しているが、判別出来るだろうか?

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

 走行中の動力車のモータ回転数とモータ端子電圧の値を測定出来るようになったが、その測定値の信頼性は有るのだろうか・・・・? 最後にこの確認が必要であるが、しっかりとした検証方法がないのである。 このため、多くの実験データから判断するしかないと思っている。 色々な観点から、データは信頼できそうだと証明する必要があるので、今後は、実験データを収集していく作業を進めるひつようがある。