SSブログ

Arduinoでフォトリフレクタを試してみました [Arduinoで自動運転(DCC)]

こんにちは。今日の都内は低気圧が過ぎ去ってまずまずのお天気になってます♪
南風の影響か暖かいので過ごしやすいですが、まだ2月なんですよねぇ。

さて、確定申告とかでバタバタしていましたが、月曜日にはこんなのを買ってきていました。

P1110027.JPG

今週はこの中のフォトリフレクタを試していました。
arduinoでフォトリフレクターを使う具体例は数多く見つかりましたので、イロイロと参考にしながら試行錯誤していました。
で、こんな具合の回路にしてみました。

P1110040.JPG

フォトリフレクタには回路が2あって、1つはLED、もう1つはフォトトランジスタ(照度で抵抗値が変化する素子)の素子のこととあります。つまり電気を流すことで反射光の照度を抵抗値として取得することができる装置とあります。
今回使うのは秋月で入手可能なTPR-105です。
ネット上の先例では、使っている抵抗値が人それぞれで、私も何パターンも試しましたが、最終的にLED側には220Ωでフォトトランジスタ側には1GΩ1MΩ(2016年5月19日訂正)を使いました。

P1110038.JPG

このピンクに光っているのが赤外線LEDです。

で、今回は、最初に緑のLEDを点灯させて、紙片をフォトリフレクタに近づけるとそれを検知して、LEDを赤⇒橙⇒緑へと切り替えるようなプログラムにしてみました。




今回の回路でフォトリフレクタからの閾値を確認するプログラムです。


//********************************************************************
//* フォトリフレクタからの閾値を表示するプログラム
//********************************************************************
int pin = 0; //
void setup() {
Serial.begin(9600) ;
pinMode(pinLED,OUTPUT);
}
void loop() {
int val;
val = analogRead(pin) ; //アナログ0番ピンからセンサ値を読み込み
Serial.println(val) ; // シリアルモニターへ表示
delay(100) ; // 100ms待つ
}

このプログラムを実行して閾値を求めます。
まずは、通常の閾値です。

リフレクタ1.jpg

次に紙片を近づけた時の閾値です。

リフレクタ2.jpg

この閾値から閾値が960より小さい時にLEDを切り替えるようにしました。

こちらが、最初に緑のLEDを点灯させて、紙片をフォトリフレクタに近づけるとそれを検知して、LEDを赤⇒橙⇒緑へと切り替えるようなプログラムです。
フォトリフレクタからの閾値が一定しないので悩んでいたのですが、閾値の平均を求めるやり方で解決している例を発見し、私も同様なやり方でなんとか解決しました。


//***************************************************************************
//* 最初に緑のLEDを点灯させて、紙片をフォトリフレクタに近づけると
//* それを検知して、LEDを赤⇒橙⇒緑へと切り替えるプログラム
//***************************************************************************

void setup() {
pinMode(11,OUTPUT); // 11番ピンをデジタル出力にする
pinMode(12,OUTPUT); // 12番ピンをデジタル出力にする
pinMode(13,OUTPUT) ; // 13番ピンをデジタル出力にする
}
// 繰り返し実行される処理(メインの処理)
void loop() {
int val ;

digitalWrite(11,HIGH);

val = SENSOR_read(0) ; // センサーから読み込む

if (val < 960) {
digitalWrite(11,LOW);
for (int i=1;i<4;i++){
digitalWrite(14-i,HIGH);
delay (5000);
digitalWrite(14-i,LOW);
}
}

}
// フォトリフレクターからの読み込み処理(30回読込み平均をとる)
int SENSOR_read(int PinNo) {
long ans ;
int i ;

ans = 0 ;
for (i=0 ; i < 30 ; i++) {
ans = ans + analogRead(PinNo) ; // 指定のアナログピン(0番端子)から読取り
}
return ans/30 ; // 30回の平均値を返す
}

次はポイント切り換えをやってみようと思います。

nice!(2)  コメント(2)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 2

コメント 2

taka@

じぇじぇじぇじぇじぇーーーー!!!

ダンボさん、こんにちは!
イキナリびっくりポンな記事ですね~
私もやりたいけどやれない(やる気が無い?)電子工作を
サクサクとされているなんてスゴイ!!!Σ(゚д゚;)

自動運転に自動制御、夢の世界ですね~(^^)
by taka@ (2016-03-03 16:41) 

目黒のダンボ

taka@さん、こんにちは!

じぇじぇじぇにびっくりぽんなイキナリナ状況になってます♪(笑)

>私もやりたいけどやれない(やる気が無い?)電子工作を
>サクサクとされているなんてスゴイ!!!Σ(゚д゚;)
今はネット上に素晴らしい情報を皆様が公開しているのでありがたく参考にさせて頂いています。

>自動運転に自動制御、夢の世界ですね~(^^)
少し前までは自動運転とかってまったく興味なかったので、自分でもじぇじぇじぇでびっくりぽんです。
それにしても、マイコン制御がこんなに安価で簡単になっているとはありがたい時代になりました。
なにせ、私の学生時代には、テンキーで16進数を書き込んでいた時代ですから。
by 目黒のダンボ (2016-03-04 12:30) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0