HOME >> 鉄道模型実験室 > 反射式回転センサーを使う

鉄道模型実験室  反射式回転センサーを使う

■ はじめに

 走行中の動力車のモータ端子電圧やモータ回転数を計測しようとする無謀な取り組みに足を突っ込んでしまった。 今回は、反射式回転センサーを使用してモータの回転パルスを取り込む方法を確認する。

  .

 

■ モータの回転数検知に再挑戦

 今回は、反射式回転センサーを使用して、モータの回転パルスを取り込む方法に再挑戦する。 使用するセンサーは、反射型フォトマイクロセンサ EE-SY110 (オムロン製)である。 使い方は「モータ特性の測定方法に関する小改善」の方法と同じである。

 今回は、センサ単体を購入して細工するもので、動力車に取り付けられるように、下の写真に示すように工作した。

 このセンサの使った実験用に回路は、右の回路図に示す。 発光側には、定格で30mA 流せとのことであるが、乾電池使用の場合(3ボルト)60Ωがぴったりであるのだが、手持ちの100Ω抵抗で代用する。 18mA 流れるので良しとした。

 実験は、最初にArduino からの5ボルト電源を使用し、センサからの信号を Freq Counter でカウントすることにした。

  .

  .

 センサーユニットを手で持って、回転するモータのフライホイール部分にあてがうと、フライホイールに付けた白色ペイントに反応して、反射型フォトマイクロセンサがパルスを発信するはずである。

 シリアルモニタで観察すると、1秒毎に116、とか123 とかの数値を打ち出して来てくれた。 そのデータをメモ帳にコピペしたものを左に示す。

 これは、6,960rpm、7,380rpm に換算出来るのでモータの回転数をセンシングしている事がわかる。 この方法でモータの回転を測定できる事が判ったので一安心である。

 確認のために、乾電池での3ボルト電源でもチェックしたが、問題無く測定出来ることも確認出来た。 右の写真。

 

■ 電圧取り込みと併用してみる

 次に電圧値の取り込みとモータ回転のパルスカウントを同時に実施してみる事にした。 これは Arduino のパルスカウント作業と電圧値の取込み動作が影響し合う事が無いのか確認するためである。

#define START_PIN 2
#define STOP_PIN 3
#define LEDG_PIN 8
#include <FreqCounter.h>
void setup()
{
  pinMode(START_PIN,INPUT);
  pinMode(STOP_PIN,INPUT);
  pinMode(LEDG_PIN,OUTPUT);
  Serial.begin(9600);
  Serial.println("Pulse Counter 3");
}
void loop()
{
  int voltage1;
  int voltage2;
  unsigned long vol1;
  unsigned long vol2;
  long int frq;
  int vol1_pin = 0;
  int vol2_pin = 1;
  int n;
  unsigned long t1;
  unsigned long t2;
  unsigned long tt;
  int start;
  int stop1;
  start = digitalRead(START_PIN) ;
  stop1 = digitalRead(STOP_PIN) ;
  if (start == HIGH & stop1 == HIGH){
     vol1 = 0;
     vol2 = 0;
     n = 0; 
     while (start == HIGH) {
           start = digitalRead(START_PIN) ;
      }
      t1 = millis();
      digitalWrite(LEDG_PIN, LOW);
      FreqCounter::f_comp = 8;
      FreqCounter::start(500); 
      while (stop1 == HIGH) {
          voltage1 = analogRead(vol1_pin);
          voltage2 = analogRead(vol2_pin);
          vol1 = vol1 + voltage1;
          vol2 = vol2 + voltage2;
          n = n + 1;
          stop1 = digitalRead(STOP_PIN);
        }
      t2 = millis();
      tt = t2 - t1;
      while (FreqCounter::f_ready == 0);
      frq = FreqCounter::f_freq; 
      String buf = String(vol1) + "," + 
String(vol2) + "," + String(n)
+ "," + String(tt)+ ","
+ String(frq) + ",E";       Serial.println(buf);       digitalWrite(LEDG_PIN, HIGH);       delay(500);   } }

 実験回路は上記の予備実験その3の回路をブレッドボード上に作り、回転センサは有り合わせの支柱で固定した。 下の写真に実験状態を示す。

 Arduino のスケッチは右上に示すように記述した。 二つの押しボタンは計測開始と終了を指定するボタンである。 この間に、二つの電圧測定と回転数パルスのカウントを実施させるのであるが、FreqCounter::start(500); の命令を電圧測定のサイクルの中に入れておき、サイクル終了後に結果を取り出すように設定している。

 この実験結果の一部を上記と同様にメモ帳にて下に示す。 このデータをEXCELに取込み、整理してモータ端子電圧とモータの回転数をグラフにしてみた。

   

 モータ端子電圧値は校正していないのでArduino の5ボルト基準電圧をもとにA/D 変換した値のままである。

 データとしては、良さそうであるがEXCEL上のデータをみているとどうもおかしいのである。

  tt/nの値がおかしい?

 今までの経験では、殆ど一定の値を示していたのに、今回はバラバラである。

 この値は、電圧測定のサイクル時間を示しているので、バラバラという事は、サイクルが一定していないという事を意味している。 そこで、このtt とn との関係をグラフにしてみた。

  

 そのグラフを右に示す。 測定回数と測定時間は見事に一直線に乗るのだが、これが意味することを理解できないでいる。 

   ・ どういうことなのだろうか? 

   ・ 測定時間が殆どゼロなのに、2000回以上も測定ループが回っている?

   ・ これって、時間が止まっていたということなの?

 測定回数はカウントされているので、測定時間の方が計測されていないと考えると、タイムスタンプがおかしい事になる。 タイムスタンプと「FreqCounter」は同じハードウェアカウンタを使用しているのではないのだろうか? これは、「FreqCounter」の処理を同時に実施してはダメであることを意味しているのではないだろうか。

 良く解らないが、とにかく上記のように結論しておこう。

 

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

 そこで、この「FreqCounter」の処理を電圧測定ループから外して処理をすることにした。

      t2 = millis();
      tt = t2 - t1;
      FreqCounter::f_comp = 8;
      FreqCounter::start(500); 
      while (FreqCounter::f_ready == 0);
      frq = FreqCounter::f_freq; 
      String buf = String(vol1) + "," + String(vol2) + ","
    + String(n) + "," + String(tt)+ "," + String(frq)  + ",E";
      Serial.println(buf);
      digitalWrite(LEDG_PIN, HIGH);
      delay(500);

 スケッチの一部を修正したがその部分を左に示す。

   FreqCounter::f_comp = 8;
   FreqCounter::start(500);

の項を移動しただけである。

 この状態でテストした結果、電圧測定のサイクル時間 tt/n は、0.231ms となり、いつもの様な数値を示し(当然か) モータ回転数のグラフも正常なように見える。

 前回の時のデータとはかなり異なっており、こちらが正解と判断すると、やはり前回の方法では問題有りとすべきであろう。

 Arduino 上でのパルスカウントは、他の処理と同時進行は避けるのが良さそうであるとの結論が出たので、最終的なタイムチャートを組み立てる時には、工夫が必要となりそうである。 処理時間の延長が許されるのか、あるいは外部カウンターが必要となるのかは、無線通信の処理時間と合わせて検討する事にしよう。

 .

 

■ 赤外線通信を試してみる

 次に、このパルスを赤外線を使って飛ばして見ることにした。 使用した部品は、SIR-34ST3F ローム製の赤外線LEDと、RPM6938 同じくローム製のリモコン受光モジュールである。

 ネットなどの説明書によると、赤外線通信は色々外乱を避けるためキャリア波に乗せて通信するののだと書いてあるが、テスト中はリモコンなどを使わなければ良いのだろうと高をくくって、右のような回路で実験してみることにした。

 赤外線LEDには、30mA ぐらいを流せと書いてあるが、今回も手持ちの100Ω抵抗で代用する。 また、センサの出力側の絶対最大定格値は 20mA までと明記されていたので、安全をみてトランジスタスイッチを用いることにした。

 トランジスタは初めて使うのであるが、説明書によると周りの抵抗値の設定など、ややこしい事がかいてあったが、良くわからないままに、1KΩの抵抗をベース側につなぐことにした。

 実験状態を下に示す。 ブレッドボードには、余分なものが乗っているが、回路はつなげていない。 Arduino は例の周波数カウンタを走らせている。

 実験結果は、見事に失敗である。 シリアルモニターには、ゼロが並ぶばかりである。 近くにあったリモコンを持ってきて、ボタンを押すと皮肉にも数値を表示するのである。 押すボタンによって数値は変化するが、リモコンの赤外線には確実に反応している事は確認できたが・・・・・・・・・・。

 やはり、キャリア波に乗せて通信させる必要があるようである。 リモコン受光モジュールの説明書をしげしげとみていると、ちゃんと周波数特性まで記載されているではないか!  キャリア周波数は37.9KHz ±1KHzで-3dB、 ±2KHzで-7dB となかなか厳しい指定である。 さて、どうやってキャリア波に乗せて通信させるるのだろうか? また、どうやって指定の周波数のキャリア波を発生させるのだろうか?

       やや、路頭に迷う状態に陥ってしまった。

 

■ 発信回路を検討する

  .

 発信回路だけのユニットは売っていないのだろうか? 残念ながら適当なユニットは探せなかった。 そこで、使わなくなったリモコンを分解してみたが、発信回路は分からない。  肝心の部分は一体化されたIC の中である。  リモコンおもちゃも分解してみた。 やはり、コンパクトに一体化されているので、発信回路だけ頂く事は不可能である。 分解した基板のボタン部分に接続して送信できないだろうかと考えたが、リモコン類はボタンに応じてコード化された信号を送信しているようなので、パルスのみを送信するような機能は発揮出来ないと思われる。

 やはり自分で回路を構築するしか手は無いように思われたので、幾つかの発信回路の例をネット上で探した。 自分でも出来そうな例をやっと見つけた。 タイマーIC 555 を使用する回路である。 555 は光る看板を作る時に勉強していたので、使ってみる事にした。

 説明書にあった左のような回路図を参考に組立ることにし、抵抗とコンデンサの計算をしてみた。

 C = 0.1μF、Ra = 100Ω、Rb = 150Ωで、発信周波数は 36Khz、デューティ比は62.5%と計算されたので、手持ちの部品を使って回路を組んでみた。 周波数はArduino の Freq Counter でカウントする。

  実験結果は、ゼロ行進であった。 発振しない!

 諦めずに、他の抵抗値での組み合わせを実施すると、見事に発振しているではないか! 目標の周波数に近づけるべく、抵抗の組合せを色々変えてみた。 また、コンデンサを取り換えたり、抵抗を直列や並列に何個も組み合わせて実験してみると、右のような結果を得た。 デューティ比は大きくはずれているが、目標の38Khz が出せることが判った。 組み合わせた抵抗の合成抵抗値をテスターで測定し、コンデンサの容量は発振周波数から逆算している。 しかしRa = 100Ωでは何故発振しないのか不明のままである。

 実際の回路では、半固定抵抗を使って微調整をすれば、目標周波数にさらに近づける事も出来るだろうし、気温や湿度によって変化した場合でも対応出来そうである。 そしてこの回路を使って実際に赤外線送信を実施してみよう。

 

  .

■発信回路を使って赤外線通信にトライ

 キャリア波の発振回路とセンサの出力回路をどう組み合わせるのか迷ったたが(知識がないのである)、スイッチ回路の考え方から右のような回路を組んでみる事にした。

 トランジスタのベース回路に接続する抵抗値をどうやって決めるのか、難しい説明を充分に理解できていないが3Volt/1000Ω=3mA と言う単純な計算で、1KΩの抵抗を使うことにした。

 発振回路の出力をセンサからの出力でスイッチングし、その出力でLEDの電流をスイッチングする構成にしている。 発振回路は上記の状態をそのまま使用している。すなわち、抵抗RAは、460Ωと464Ωの抵抗を並列に、RB は、101Ωの抵抗を2個並列に使用し、コンデンサは0.1μFを使用した。

 この時の実験状態を下に示す。 嬉しい事に一発で反応してくれた。

    大成功である!

 この時のシリアルモニタのデータも記載しておこう。 モニタには1sec 当たりの回転パルスが表示されており、回転数の変化に対応して応答している事が判る。 勿論、停止中はゼロ表示である。

 電圧との並行測定も予定していたが、先の実験結果より意味が無いことが判っているため、中止とした。

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

 今回の実験により、モータの回転数を測定する方法が確認出来た。 もしかしてArduino ではなくて、外部カウンタが必要となるかもしれないが、14bitカウンターを用意しているので対応出来ると思われる。 また、測定車には、オペアンプIC、タイマIC 555、トランジスタ2個とLEDを搭載すれば対応できそうなので、スペース的にはだいじょうであろう。

 次はいよいよ、無線通信の確認である。 ハード時には問題ないはずであり、ややこしそうな設定が出来るかどうかである。 次回は、その無線通信の確認実験を報告することにしよう。