フォトセンサーで物体の存在を検出する

〔Arduinoの動かせ方入門に戻る〕



物体の存在を検出するには色々有りますが、
距離3cm以上の物体を検出するセンサーとして超音波距離センサー・レーザー距離センサー・
赤外線距離センサー等が有ります。
距離3cm以内の物体を検出するセンサーとしては近接センサー(磁気センサー)やリードスイッチに
光電センサー(フォトセンサー)です。

尚、赤外線距離センサーについてはこちらを参照して下さい。
Arduinoで超音波距離センサーの話はこちらを参照して下さい。
PIC16F1827で超音波距離センサーの話はこちらを参照して下さい。

リミットスイッチ・マイクロスイッチ
マイクロスイッチ  物体が触れた時、機械的にスイッチが入る機械式
 スイッチです。
 秋月電子のこちらで販売しています。 *1)
 このスイッチはノーマルクローズなので通常はON
 スイッチが押されるとOFFですね。
 配線はプルアップかプルダウン抵抗を付けて
 デジタル入力に配線します。

 このスイッチは物体を停止させる位置に付いていたりします。


リードスイッチ
通常はスイッチはOFF状態で磁石を近づけるとONするスイッチです。
防犯などで窓に付いていたりしますよね、
磁石を窓に着け、スイッチを壁側に取付けて窓が閉まっている時は磁石が近くにあるから スイッチONで、窓が開けられると磁石が離れていくのでスイッチOFFって感じですよね。
このスイッチの配線もプルアップかプルダウン抵抗を付けてデジタル入力に配線します。
また、秋月電子のこちらで販売しています。

近接センサー
近接センサー 非接触で物体を検出できます。
センサーで高周波の磁界を発生させて、物体(金属)が近づくと電磁誘導によって物体に電流が流れます、 この電流によって検出コイルのインピーダンスが変化するのでこれを検出すれば物体の接近が判ると言う事です。
なのでぇ、金属しか検出できません、また、このセンサーはマイコンでの利用はないと思います。

光電センサー
光の色々な性質を利用して物体の存在を検出するセンサです。
検出方式には、透過型と反射型が有ります。
透過型1 透過型は、この様に投光器から光を出して受光器で受けます。
この間を物体が通過すれば光が遮られて検出が出来ると言う事です。
このセンサーは工場のラインで活躍していますね。

透過型2 これもオムロン製透過型センサーです、秋月電子のこちらで販売しています。
この角柱の間を物体が通過すると検出できるフォトセンサーですね。
モータの回転計測等に利用されていると思います。

反射型 こちらは、秋月電子で販売している 反射型のフォトセンサーです。
反射型は、投光器から光を出して物体で反射した光を受光器で受けます。
ロボットカーのライントレース検出や、障害物検出等に利用されていると思います。
今回はこのフォトリフレクタLBR-127HLDをArduinoに接続してみます。

《配線図1》

配線図1 LBR-127HLDセンサーの部品図が無いのでLEDで代用した図面となっています センサーの足を良く見て配線しましょう。
ちなみに、白いLEDが赤外線LED側で赤いLEDがフォトトランジスタ側となります。

それとぉセンサーはブレッドボードに挿しての利用は出来ません、 オス-メスのジャンパー線で引き出すか、半田付けするか等の工夫が必要でしょう。
あ、足を曲げれば刺さりますかね ^^)

赤外線LEDの抵抗(RD)について
順方向電流(IF)がMAX60mAで
順方向電圧(VF)がMAX1.5Vですので
(VCC電源−順方向電圧)÷ 順方向電流

IF=20mA VF=1.5V VCC=5V で計算
(5V - 1.5V) ÷ 0.020A = 175Ω
(175Ωは無いので180Ωを使います)
20mAは0.020AというふうにAに変換して計算します。

今回は手持ちで220Ωを付けたのでIF=16mA程でしょうか100Ω付けるとIF=35mAでもOKでしょう。

抵抗1KΩ(RL)はプルアップ抵抗となります。

《スケッチ1−1》

@まずは、上記図画面の様に配線しましょう。
Aarduinoボード(Arduino Duemilanove 328)はUSBケーブルで接続して、arduino IDEを起動させます。
BIDEに下記のスケッチプログラムをコピーペーストして貼り付けて下さい。
 とりあえずアナログ0番の信号をIDEのシリアルモニター画面に表示して見るだけです。
---------------------------------------------------------------------
 void setup() {
     Serial.begin(9600) ;     // 9600bpsでシリアル通信のポートを開きます
 }
 void loop() {
     int ans ;

     ans = analogRead(0)  ;   // センサーから読込む
     Serial.println(ans) ;    // シリアルモニターに表示させる
     delay(500) ;             // 500ms時間待ちで繰り返す
 }
---------------------------------------------------------------------
CIDEツールバーの赤枠部分「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを
 行います。

upload

D正常終了後、ツールバーの右側のアイコン「SerialMonitor」ボタンをクリックしてシリアルモニター
 画面を起動させます。

Eセンサーの前に物体をかざしてみましょう、値が変化するはずです。
 約5mm〜4cm位が使用可能距離でしょう、物体に近づければ数値は低くなっていきます。
 約3mm以内ほどになって行くと今度は数値が上がって行きます、この辺は使用不可ですね。
 4cm以上では数値の変化が少ないですね。
 物体が無い時は大体1018位で約3cm位に物体があれば985位の数値でした。

《スケッチ1−2》

こんどのスケッチはセンサーから読み込んだ値を平均化して、約3cm(985)以内になれば Arduinoに付属の13番接続LEDを点灯させます。
985の値が閾値なので自分の欲しい距離を上のスケッチ1−1で調べて変更して下さい。
(物体が3cm以内に存在すればLEDが点灯、物体が離れればLEDは消灯すると思います)
---------------------------------------------------------------------
// 電源起動時とリセットの時だけのみ処理される(初期化と設定処理)
void setup() {
     pinMode(13,OUTPUT) ;                    // 13番ピンをデジタル出力にする
}
// 繰り返し実行される処理(メインの処理)
void loop() {
     int val ;

     val = IDSread(0)  ;                    // センサーから読み込む
     if (val < 985) digitalWrite(13,HIGH) ; // LED点灯
     else           digitalWrite(13,LOW) ;  // LED消灯
}
// センサーからの読み込み処理(30回読込み平均をとる)
int IDSread(int PinNo) {
     long ans ;
     int i ;

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

《配線図2》

配線図2 スケッチ1−2ではセンサーの出力をそのままArduinoのアナログ入力に入れてソフトで 閾値(985)のそれ以上それ以下を判断(ソフトウエアでコンパレータ)させた回路でしたが、 この回路では閾値の判断をオペアンプを利用して行いその出力をデジタル入力に入れて 見たいと思います。
このオペアンプの回路をコンパレータと言います。
コンパレータ専用のICでLM339などが有りますが、持ってないしぃ、 ここでは汎用オペアンプLM358Nを利用してみます。

オペアンプの基本概要や増幅等の話はこちらを参考にして下さい。

この回路によりアナログ入力が足りない場合等に利用出来ますがぁ、部品増えますけどね。

また、温度センサー等に代えればある温度以上になったらファンを回すとか出来ますよね。


コンパレータとは

二つの電圧または電流を比較し、どちらが大きいかで出力のHIGH/LOW状態が切替わる回路です。
少し詳しいお話は、こちらのHPサイト[始める電子回路]さんか[A story of Circuits]さん を参考にして下さい。

《スケッチ2》

自分の設定したい場所に物体を置き、半固定抵抗を調整します。
短い距離で調整したい場合は左方向に回します、右回しでは長い距離で反応します。
調整したポイントから物体が遠ざかればLEDは消灯で、ポイント以内なら点灯します。
---------------------------------------------------------------------
// 電源起動時とリセットの時だけのみ処理される(初期化と設定処理)
void setup() {
     pinMode(13,OUTPUT) ;                    // 13番ピンをデジタル出力にする
     pinMode(3,INPUT) ;                      // 3番ピンでオペアンプの出力を入れる
}
// 繰り返し実行される処理(メインの処理)
void loop() {
     if (digitalRead(3) == LOW) digitalWrite(13,HIGH) ; // LED点灯
     else                       digitalWrite(13,LOW) ;  // LED消灯
}
---------------------------------------------------------------------
注意として
配線図2のオレンジ色線を見て下さい、フォトトランジスタのVCCがArduinoの3.3V電源に配線されています、 これを5.0Vに配線したとしますと調整できる距離が1cm以内となります。
それは、こちらオペアンプの説明にも有りますようにLM358Nは3.8Vまでしか振れない 関係です、でぇ、3.8Vの出力が1cm辺りで、それ以上の距離(電圧)は調整不可です。
なのでぇ、0-5Vでなく0-3.3Vを入れてやればぁ3.8V以内なのでぇ、 センサー能力可能距離全域で調整可能なんですぅ。



リンク切れ見直し(*2) 2020/03/03
リンク切れ見直し(*1) 2017/01/10


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.