![見出し画像](https://assets.st-note.com/production/uploads/images/160673075/rectangle_large_type_2_37ee83079ab0848fdfbbeac2cae62042.png?width=1200)
フォトリフレクタの使い方 #16 【Arduino UNO R4】
今回は、Arduinoでのフォトリフレクタの使い方についてご紹介します。
フォトリフレクタはライントレースロボットにも使われるセンサーです。
使い方をマスターすれば、ロボット制御の理解もより一層深まります。
ぜひ一緒に、フォトリフレクタの使い方をマスターしましょう!
はじめに
この記事では、Arduino UNOでのフォトリフレクタの使い方についてご紹介しています。
下記の注意事項をお読みいただいた上で、ぜひお楽しみください。
【 注意 】
当Webサイトに掲載された内容によって生じた損害等の一切の責任を負いません。また生じた問題についてはご自身の責任において解決いただくことをあらかじめご承知おきください。詳しくは下記URLの免責事項をご確認願います。当サイトの免責事項に同意いただける場合に限り、当サイトの内容をご利用いただけます
Youtube動画
フォトリフレクタの使い方を動画で解説しています。5分未満の短い動画ですので、サクッとご覧いただけます。
必要なもの
1. マイコンボード
本記事では、Arduino UNO R4 Wi-Fiを使います。
![](https://assets.st-note.com/img/1730779978-dgXDAO902CH1afNJlFT4QLwe.png?width=1200)
2. 電子部品
![](https://assets.st-note.com/img/1730780798-MVx3X7vZiIdWGcub9F68S5BA.png?width=1200)
以下の電子部品を使います。
フォトリフレクタ(RPR-220)
ブレッドボード(SAD-101)
赤色LED*
抵抗*
ジャンパーワイヤー(オスーオス)
ジャンパーワイヤー(オスーメス)
ジャンパーワイヤー(小)
*使用するLEDに合わせて、適切に抵抗値・定格を選んでください。
フォトリフレクタとは?
![](https://assets.st-note.com/img/1730780967-Bg2ofQ43TXObuwSCWIpU6zRK.png?width=1200)
フォトリフレクタは、赤外線LEDとフォトトランジスタが1つになった電子部品です。
![](https://assets.st-note.com/img/1730781018-Gvrl27PRehMtIWFTxpufm45D.png?width=1200)
ここでフォトトランジスタというのは、光が当たると電流が流れるトランジスタのことです。
![](https://assets.st-note.com/img/1730781078-SAs86miXl2DWpxVQrHMyazUP.png?width=1200)
フォトリフレクタはLEDから赤外線を出し、反射してきた赤外線をフォトトランジスタで受け取ります。
![](https://assets.st-note.com/img/1730781128-EM1Xd7UVArcej8hZKIylzDtv.png?width=1200)
例えば反射する面が白だったら、光が反射してフォトトランジスタに当たり、電流が流れます。
一方で反射する面が黒だったら、光が吸収されて、赤外線がフォトトランジスタにほとんど入ってこないので、電流が限りなく小さくなります。
![](https://assets.st-note.com/img/1730781208-9We8RSULJkPuvaMXFsgZYDbq.png?width=1200)
この反射してくる光の多い少ないが、フォトトランジスタによって電流の多い少ないに変換されます。
そのため、マイコンで電圧の値を監視しておけば、今、センサーが見ている面が白なのか、黒なのかが分かるという仕組みです。
フォトリフレクタを動かすための回路
![](https://assets.st-note.com/img/1730781328-tYaBgldSKUA6HzxPkyJMuDZm.png?width=1200)
今回使うセンサー回路の回路図はこんな感じです。トランジスタのコレクタ端子は、ArduinoのA0ピンに繋ぎ、その電圧を監視します。
まず、ダイオード側の抵抗RDとトランジスタ側の抵抗RLを決めていきます。
ダイオード側の抵抗RD
![](https://assets.st-note.com/img/1730781442-WJC1PnOtYU64y2aMNzxEw8AL.png?width=1200)
ダイオード側の抵抗RDは普通のLEDの時と計算は同じで、順方向電圧と順方向電流をデータシートから読んで、それをもとに計算します。
詳しい計算方法は、👇の記事をご覧ください。
データシートのグラフから、IF=10mAの時の順方向電圧を読んで使っています。
計算値は390Ωとなりましたが、ちょうどの抵抗はありませんので、それより大きい抵抗、この動画では220Ωを2個直列にした440Ωでやってみます。
次にトランジスタ側の抵抗RLを決めます。
トランジスタ側の抵抗RL
![](https://assets.st-note.com/img/1730781713-RAhnMjlgTZK7kmurdD1LNOCY.png?width=1200)
データシートによると、
IF=10mA、VCE=2Vの時に、コレクタ電流ICが0.3mA
とのことなので、これを基に単純計算すると、抵抗は10kΩになります。
ただしこの抵抗は感度にかかわるので、場合によっては調整することもあるかと思いますが、とりあえずこの値を使ってやってみます。
![](https://assets.st-note.com/img/1730781772-u12DJbo5mwEzVKHXtTd4fxGQ.png?width=1200)
両方の抵抗が決まったので、図のように配線します。LED回路も同時にArduinoに作っておきます。
配線の様子
![](https://assets.st-note.com/img/1730781942-xKwt1T42CSyqdsa6W0HGAikZ.png?width=1200)
こちらが、実際の配線の様子です。フォトリフレクタを繋ぐワイヤーはマスキングテープでまとめています。
![](https://assets.st-note.com/img/1730781843-FWmNhvAQ5HLjGqrkbdeXB3f1.png?width=1200)
また、フォトリフレクタは端子が4つもあるので、間違えないように気を付けてください。
それではさっそく、プログラミングをしていきましょう。
AD変換値をシリアルモニタに表示してみる
![](https://assets.st-note.com/img/1730782053-8i5L1ANMOtzcpV2goTqERhQW.png?width=1200)
まず、ArduinoのA0ピンで読み取るAD変換値が、白い面と黒い面でどれくらい変化するかを見てみます。
![](https://assets.st-note.com/img/1730782064-J0wtlSPNoFcrvI3UfEVmpLHz.jpg?width=1200)
プログラムはとても簡単で、analogRead( )でA0ピンの値を読んで、それをシリアルモニターに表示するだけです。
//当Webサイトに掲載された内容によって生じた損害・損失の一切の責任を負いません。
//当webサイトの免責事項に同意いただける場合に限り、プログラムをご利用いただけます。
#define LED_PIN 12
#define MEASURE_CYCLE 200
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
Serial.println( analogRead(A0)); //AD変換値の読み取り
delay(MEASURE_CYCLE); //測定間隔
}
![](https://assets.st-note.com/img/1730782333-RyAWPQsN2wLMGjISadcqoOlp.png?width=1200)
実際にやってみると、白い面だと数値はだいたい400くらいです。
![](https://assets.st-note.com/img/1730782339-Gj12hctmf9IDgLSKBpwk8Oeu.png?width=1200)
一方、黒い面にセンサを向けると数値は600から700くらいに変化します。
白と黒を検知するプログラムを作る
![](https://assets.st-note.com/img/1730782578-c0rvoMJ8XnHLCIQaF35N1jA2.png?width=1200)
白と黒で、AD変換の数値がどれだけ変化するかが分かりました。
例えば閾値を500と考えて、500より大きければLEDが点灯、それより下なら消灯というようなプログラムを考えてみます。
![](https://assets.st-note.com/img/1730782615-CWIyQ8z3gOmY2fKliTqFskXj.jpg?width=1200)
実際には、例えばif else文を使って次のようなプログラムを作ります。
//当Webサイトに掲載された内容によって生じた損害・損失の一切の責任を負いません。
//当webサイトの免責事項に同意いただける場合に限り、プログラムをご利用いただけます。
#define THRESHOLD 500 //閾値
#define LED_PIN 12 //ピン設定
#define MEASURE_CYCLE 200 //測定間隔
void setup() {
pinMode(LED_PIN, OUTPUT); //初期設定
Serial.begin(9600);
}
void loop() {
Serial.println( analogRead(A0)); //AD変換値の読み取り
if(analogRead(A0) > THRESHOLD){
digitalWrite(LED_PIN, HIGH); //閾値より大きいなら点灯
}else{
digitalWrite(LED_PIN, LOW); //それ以外なら点灯
}
delay(MEASURE_CYCLE); //測定間隔
}
プログラムの動作確認
![](https://assets.st-note.com/img/1730782834-iJSxCbEmg4PD0hfnUFtAOH3k.jpg?width=1200)
では、プログラムをArduinoに書き込みます。
フォトリフレクタを白い面に当てるとLEDは点灯しませんが、黒い面だとLEDが光るようになりました。
これでフォトリフレクタを使って、色を検知する回路を作ることができました。
おわりに
![](https://assets.st-note.com/img/1730782870-qzoQT06pYM8DblgcRFLWiaeG.jpg?width=1200)
いかがだったでしょうか。
今回は、フォトリフレクタの使い方についてご紹介しました。
フォトリフレクタはライントレースロボットにも使われるセンサーです。仕組みを知っておくだけでも、ロボットへの理解が一層深まると思います。
もしこの記事がお役に立てたら、"スキ"や"サポート"をいただけると励みになります!
最後まで読んでいただき、ありがとうございました。
いいなと思ったら応援しよう!
![みんなの電気・電子回路](https://assets.st-note.com/production/uploads/images/138157511/profile_989d4b71b76782b0522e4d9bfb354b4a.jpg?width=600&crop=1:1,smart)