2012年10月6日土曜日

フォトリフレクタで回転計



フォトリフレクタTPR-105F(反射タイプ)を使ってみます。
発光している赤外線LEDの反射光を、フォトトランジスタで受光することで、出力される電流が変化します。



入力側の電流制限抵抗は220Ω、出力側エミッタ-GND間の可変抵抗は50kΩで調節できるようにしましたが、20kΩ前後固定でもいいと思います。



白い紙にマジックで黒い線を入れかざすときちんと反応。
数mmほどの距離が安定している感じです。
このセンサでライントレーサーなどに使うと引っかかったりするかも知れませんね。

これだけではなんなんで、回転計にしてみましょう。

pulseInで1回転の時間を計るようにしましたが、なぜかうまく行かなかったので、analogReadで黒を認識した時間から次の黒を認識瞬間までの時間を測り、カウントアップ。1000msのタイマー割り込みのたびに1分あたりの回転数rpmをシリアルで出力します。

スケッチ:
#include <MsTimer2.h>

int sensorPin = A0;
unsigned long start_time = 0;
unsigned long elapsed_time = 0;
unsigned long tet = 0;
float rpm = 0;
unsigned int cnt = 0;

void setup() {
  Serial.begin(9600);
  MsTimer2::set(1000, avg);
  MsTimer2::start();
}

void loop() {
  while(analogRead(sensorPin) < 600){
  }
  while(analogRead(sensorPin) > 400){
  }
  noInterrupts();
  elapsed_time = micros() - start_time;
  tet += elapsed_time;
  cnt++;
  interrupts();
  start_time = micros();

}

void avg(){
  if(cnt != 0 ){
  rpm = ((float)60000000 / (tet / cnt));
  Serial.println(rpm);
  }
  cnt = 0;
  tet = 0;
}

ユニバーサル基板にセンサーを乗せて計測

手持ちの古い電動ドライバーには1,000rpmと書いてあり、計測してみると910前後と出ました。
正しいのやら正しくないのやら・・・
簡単に検証する方法が思いつきません。

環境:Arduino UNO、Arduino 1.0.1、win7





0 件のコメント:

コメントを投稿