HOME >> 鉄道模型実験室 > 距離センサーを使う

鉄道模型実験室  距離センサーを使う

■ はじめに

 先回の実験「動力車の発進時や停止時の動き」でも述べているように、発進や停止時の動きを的確に把握するには、速度データが必要であると考えている。 模型車両に触れずに測定するにはスピードガンなどの道具があるものの、ホビーとしては高価な道具となってします。 また、精度的にも問題ありそうです。 そこで位置情報を距離センサでセンシングして車両の動きを把握する方法を検討してみたのでその結果を報告する。

 

  .

■ 距離センサーの選択

 距離センサーにはいろいろなタイプがあるが、ホビーとして手軽に使用出来るものとして、シャープ製の測距モジュールを使ってみることにした。 何よりも出力がアナログである点に注目したのである。 センサーの出力を Arduino のアナログ入力端子に接続するだけで簡単に使えそうであったからである。 さらに単価の \ 400.- と言うのも魅力的であった。 何種類かのシリーズがあるが、我が測定装置に合致する測定範囲が 10〜80cm 仕様の GP2Y0A21YK を選択し、秋月に注文した。

 このモジュールの測定原理は、赤外線を使用し三角測量の原理で計測するとのことであった。 また、測定面には測定レンズの軸と直交するような筋が無いようにせよとの説明書の注意書きより推定し、下のイラストのような測定原理と推察する。 出力値と実際の距離との関係が反比例し、1/x の関係になる事もうなずけるのである。

   .

 赤外線LEDから発光された赤外線をスリットを通して測定面に投光する。 この時、スリットからの光は横線が投光されるものと思われる。 この投光された映像をデジカメの原理で受光センサ面で受け、そこに写っている横線状の赤外線映像の位置をCCDセンサで検出する。 投光面に横線とまぎらわしい模様状のものがあるとセンサが混乱するため、説明書の注意書きがあると考えられる。

 また、Timing Chartによると、約 40 m 秒毎にデータ更新してしているようです。 そして注意点として考えられることは、鉄道模型の端部に貼り付けた投光面は限られた面積しか確保できないので、赤外線の投光を如何に線路に平行に発射させる事ではないかと考えます。 あえて投光面を貼り付ける必要は無いかも知れませんが、鉄道模型の側面には横線状の模様がいっぱいあるので、その対策として採用した。

  .

 

■ 処理回路の製作

 今回追加する回路は右の回路図のようにセンサとコンデンサだけである。 コンデンサは10μF 以上の物を使うようにと書いてあったが、手持ちの部品であった 100μF を使用する。 ブレッドボードでは一時的には良いが、定常的に使えないので、 Arduino のシールドの上に載せるように新しく作成することにした。

 基板は一般的な物を使用したが、シールドとの結合ピンの関係でコンデンサなどの部品面が内側になっている。 また、スタートボタンもここに設置した。 当初はスタート信号はD13 番のピンを使うつもりであったが、シールドとの結合ピンの位置がこのゾーンではズレているためにピン位置が合わない事に気が付き、D 5ピンに変更した。 さらに下のシールドに設置していた3個のLEDのために、3mm の穴もあけているが、この穴がシールド基板と追加基板の位置決め合わせのチェックも兼ねている。

■実験装置

 実験装置を紹介する。 下左の写真は測定装置の全体を示し、下右の写真はセンサーと測定車両を位置関係を示す。

 センサーはストック材保管箱の中から格好な部材を見つけ、簡単に追加工を実施して両面テープで装置に貼り付けた。 なにしろ赤外線は目に見えないので、取付には装置のベースと直角になり、センサの投光方向が線路中心になるように気を配った。 投光面は両面に厚紙が貼ってある 厚さ 5mm の発泡スチロール板を加工する。 速度測定ゲートが通過出来るギリギリの大きさにしている。 両面テープを用いて車両に張り付けている。

 ***** スケッチの内容 ******

 #define START_PIN 5
 #define LEDG_PIN 9
 #define LEDY_PIN 8
 #define LEDR_PIN 7

 void setup()
 {
  pinMode(START_PIN,INPUT);
  pinMode(LEDG_PIN,OUTPUT);
  pinMode(LEDY_PIN,OUTPUT);
  pinMode(LEDR_PIN,OUTPUT);
  Serial.begin(9600);
 }

 void loop()
 {
  int voltage;
  int current;
  int angle;
  int distance;
  unsigned long vol;
  unsigned long cur;
  int angle_pin = 0;
  int vol_pin = 1;
  int cur_pin = 2;
  int distance_pin = 3;
  int n;
  int i;
  unsigned long t1;
  unsigned long t2;
  unsigned long tt;
  int start;

 //測定開始ボタンの動作チェック
  start = digitalRead(START_PIN) ;
  if (start == HIGH){
    digitalWrite(LEDG_PIN, HIGH);

    //測定開始ボタンを待つ
    while (start == HIGH) {
      start = digitalRead(START_PIN) ;
    }
    digitalWrite(LEDY_PIN, HIGH); 
 //測定開始
    t1 = millis();

    for(n=0; n<310; n++){    // 310 回測定する
      vol = 0;
      cur = 0;

  //測定
   for(i=0;i<50;i++){
     voltage = analogRead(vol_pin);
     current = analogRead(cur_pin);
     vol = vol + voltage;
     cur = cur + current;
   }
   t2 = millis();
   distance = analogRead(distance_pin);
   angle = analogRead(angle_pin);
      
 //出力処理
   t = t2 - t1;
   String buf = String(vol) + "," + String(cur)
+ "," + String(tt) + "," + String(distance)
+ ","+ String(angle) + ",E";    Serial.println(buf);    delay(50);  }    digitalWrite(LEDY_PIN, LOW);  //測定完了   digitalWrite(LEDG_PIN, LOW);       }    else {     digitalWrite(LEDR_PIN, HIGH);
//スタートボタン不良のエラー処理
    delay(500);     digitalWrite(LEDR_PIN, LOW);   }  }

 

■ スケッチの記述

 ハード関係の準備が出来たので、Arduino を動かしてみる事にした。 スケッチの記述は、測定スタートのためのピン番号を5番に変更すると共に、距離データのA/D変換ポートを A3 に指定する。 測定のタイミングは、電圧/電流および時刻を測定した後にA/D変換を実施し、出力するようにした。 右のスケッチの内容を参照。

 EXCEL側は、距離データの欄を増やし、グラフ表示のための細工を行う。 EXCELのグラフ表示では、縦軸のスケールを左と右の2本は取れるが、3本目は表示出来ない。 そこで左右のどちらかの目盛で代用する必要がある。 このためにそのスケールで表示出来るようにデータの数値を変更する必要がある。 今回の距離データはA/D変換後のデジタル値を1/100 にして表示させることにした。

 下のグラフにそのデータを示す。 距離データより、2.7Volt にて動き出していることがハッキリと分かり、遠ざかって行くに従って距離データの値は小さくなっている。

 

 また、最後まで測定出来ていることも確認出来る。 取りあえずは成功と言えよう。

 

 

 

■ センサーの較正

 距離センサが正常に作動している事が確認出来たので、センサーの較正を実施することにする。 まず、測定台の壁に基準線を設けた。 この位置は線路が直線区間に入る付近とし、さらにセンサからは、9cm 離れている場所である。

 この線を基準にして、大小の金尺を用いて車両を停車させる位置を設定して行った。 下の写真を参照。 こうして10mm 毎の距離を測定して行った。 データは同じ距離を5回ずつ測定している。

 測定結果を右のグラフに示す。 最後にマイナス側も測定してみた。

 

 

 5回毎のデータは少しバラツイテいるが、全体としては綺麗な “ 1/x ” のグラフになっている。  ここで、測定限界について検証しておこう。 まず、速度測定用のゲートの位置が 400mm の位置にあるので、ここを過ぎた状態(下左の写真)では、ゲートの壁を測ってしまう恐れがあるので要注意である。 測定データでは奥の方まで測定している様であるが、既に検出精度よりもバラツキが大きくなっているので実用にはならないであろう。

 また、基準位置より手前の場合(下右の写真)では、センサの特性もあるが、車両がカーブに入ってしまうことにより投影面も傾き始めているので使えないと思われる。

 このため、センサの較正は、0〜400mm の間のデータを使って実施することにする。 EXCELのグラフには、 “ 1/x ” の式を近似させる選択が無いので次のような工夫をした。 まず、このセンサー特性を表現する式として、

                  y = a / (x - b) - c

と仮定し、測定データ x (AD変換値)をこの式を使って計算した換算値 y を求め、その値が実際の距離の値にどれだけ合致するかを検証すればよい。 即ち、換算値 y と実測の距離データを再びグラフに表し、その相関が いちいちの関係になる(直線近似、ピッタリとy = x になる)ように係数 a、b、c が求めればセンサー特性の最適な近似式を得ることになるのである。  下の図は、計算シートの一部をスクリーンコピーしたものである。

 必要な部分を拡大したものを下に示す。

 計算対象は0〜400mm の間のデータとして、範囲を設定しておく。 右上のグラフで青色のプロット点で表示。

 次に、AD変換値を x とし、y = a / (x - b) - c の式で計算した y を換算値として計算する欄(黄色のセルで表示)を設ける。 この時の係数である a、b、c を設定するセルを設けておく。  そして、この換算値 y を横軸に、実際の距離データの値を縦軸に取ったグラフを作成する。 下右のグラフ。 この時のプロット点に直線近似を当てはめ、その近似式と R2 を表示させる。 そして、 R2 = 1.0 および y = x に最も近くなる様に、係数 a、b、c をいろいろ変えて行くのである。 最初は当てずっぽうの値を入れて行けば大体の傾向が判ってくるのであるが、最初は大きく変化させて全体傾向を掴むのが良さそうである。  R2の値を決めるのが殆んど係数 b であったので、それだけを変化させてグラフ化したのが左のグラフである。 これより b = 54 と決めた。 AD変換値のドリフト量と想定しているのでデジタル値と判断している。

    .

 そして、a、 c の値もほぼ最適値を設定した。 この方法は、幾つかの組合せが出来てくるが、どれが正解とは言えないと思う。 どの様な式を当てはめれば測定データに最も近い近似式になるのかを判定するものであるので、結局は誤差をどれくらい見積もるかを考える事になる。

 結論として、センサーの信号をAD変換した値を距離データとして計算する近似式を右の式で換算することにする。そして測定タイミングを考慮し、その計算をスケッチ側でなくEXCEL側で実施させることにした。

 

 さて、準備で整ったのでいよいよ実際の測定を実施してみよう。 次回に続く。