LESSON 034
フォトインタラプタセンサーモジュールで回転数を測定する。
○ 今回は速度測定モジュール用の写真遮断センサーについてを説明します。
○ LESSON 033 にで使用した 透過形フォト・マイクロセンサをモジュール化した物を使います。
○ 原理は
ですが、検出物をエンコーダーに変更するとエンコーダーのスリットから光が通り、その通った光の数をカウントすれば回転数を算出出来ます。
今回は20のスリットの物を使用します。
この様に使います。
-
- 構成部品
- 配線図
- スケッチ
- 結果
- まとめ
Arduino
USBケーブル
ブレッドボード
OPT101モジュール
ジャンパー線
5V ⇒ VCC
A0 ⇒ OUT
GND ⇒ COM
#include <MsTimer2.h>
const int OUT_data=0;
volatile long cnt = 0;
int data = 0;
boolean state = 0;
void Counter() {
cnt = cnt*100;
Serial.print(cnt);
Serial.println("rpm");
cnt = 0;
}
void setup() {
MsTimer2::set(600, Counter);
MsTimer2::start();
Serial.begin(9600) ;
}
void loop() {
data = analogRead(OUT_data);
if (data > 512 && state == 1){
state = 0;
cnt++;
}
if (data < 256 && state == 0) {
state = 1;
}
}
変数の宣言、変数の初期化
const int OUT_data=0;
volatile long cnt = 0;
変数を割り込みサービスルーチンで扱う場合、変数をvolatileとして宣言します。
int data = 0;
boolean state = 0;
ブーリアン型は、真理値の「真 = true」と「偽 = false」という2値をとるデータ型です。
- void Counter() {
}
サービスルーチン
- void setup()
MsTimer2::set(unsigned long ms, void (*f)())
オーバーフローする時間をmsで指定し、オーバーフローするたびに、関数fをよb
MsTimer2::start();
割り込みを有効にします。
- void loop()
data = analogRead(OUT_data);
if (data > 512 && state == 1){
state = 0;
cnt++;
}
if (data < 256 && state == 0) {
state = 1;
}
スリット部を光(data > 512)が通ればカウンターに1つ追加します
a && b aとbが共に真の場合に真
結果
- void loop()
〇 プログラムの結果 (シリアルデータ)
約60000 RPM になりますが、エンコーダーのスリットは20ありますので
実際は20で割ると
60000 ÷ 20 = 50
3000 RPM になります。
〇 デジタルオシロスコープ と デジタル スマートテスターの実測値
・ デジタルオシロスコープ 1000Hz
・ デジタル スマートテスター 997.8Hz
約1000 Hz になりますが、エンコーダーのスリットは20ありますので
実際は20で割ると
1000 ÷ 20 = 50
50 Hz になります。Hzは 1秒当たりの振幅数なので1分間にすると60を掛けます。
50 × 60 =3000
3000 RPM になります。
○ プログラムでもデジタルオシロスコープ や デジタル スマートテスター ほぼ同じ値が得られました。
○ Arduino を 学ぶ上で書籍やWebpageを参考に作っていますが、私なりに噛み砕いて書いているつもりですが、判らない点がありましたら連絡下さい。