フォトリフレクター(LBR-123F)で白黒の判定をしてみた

# 概要
今回はフォトリフレクタを使って、対象物が白か黒かの判定を行いました。またフォトリフレクタに関する記事はありましたが、LBR-123Fに関する記事はなかったのでここに書こうかと思います。

# 用意するもの

・Arduino UNO R3
・フォトリフレクター(LBR-123F)
・ジャンパワイヤ
・動作抵抗器 220Ω　1本
・負荷抵抗器 ?kΩ　1本 (何kΩにすべきかは後に記載)
・白と黒の画用紙
　白と黒の画用紙はこのように、白黒白黒という順序で組み合わせて使います。
 ![1043F028-6574-488D-8FF0-F32380427D62.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/3f0273c2-afac-9e53-d269-7d6d38f6193a.jpeg)



# フォトリフレクタとは
その前にフォトリフレクタとは何なのか解説していきます。フォトリフレクタとは、赤外線を使って、対象物を反射させ、その反射した光の度合いによって、対象物が白なのか黒なのかを判定したり、対象物が存在しているかどうかを判定したりするものです。
赤外線(赤から外れたものなので可視光ではない)なので目視できず、カメラに映すと見えるらしいです。アノードとカソードを通してLEDの赤外線を発射しています。その光からエミッターとコレクターで光を受け取り、白ならば、反射するので光を多く受け取り
黒または反射物がなければ、受光部であるフォトトランジスタで光を多く受け取りません。

# なぜ黒は光を反射せず、白は光を反射するのか？
なぜ色によっては光を反射したりしなかったりするのかわからない人もいるのでここで説明しておきます。普段我々が見ている「色」というものは実は光の反射によって識別されているのです。白は一番光を反射する性質を持つから白色に見える、黒は一番光を吸収する物質なので黒に見える、他の色も光の反射具合によっていろいろな色を目でみえているわけです。実際に、部屋を暗くすると様々な色が黒になったり白になったりすることがありますよね？でも電気をつければちゃんと元の色になる、このことから色というのは光の反射具合によって識別されているのです。今回のことをわかりやすく例えるなら、LEDの発光した光でそれが白か黒かをフォトトランジスタという目で色を識別しています。

# 回路図
回路は下記の通りになります。青の配線のせいで少し見辛いですが、ちゃんと負荷抵抗はあります。
[追記]これよく見たら5Vに接続していました。しかし、動作抵抗や負荷抵抗に関して抵抗値は超えていないので問題ないです。ご了承ください
![AF57E0DC-46DA-4149-8276-CEBB767C2DB2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/3926512d-7945-1144-484c-f56bfe26e0b6.jpeg)

ここでは動作抵抗と負荷抵抗というものがありますが、この二つについて説明します。

### 動作抵抗
動作抵抗とはLEDを点灯する部分の前に設置する抵抗です。ここの抵抗値はよく計算してから設置しておかないといけません。計算方法ですが、電源は3.3Vでとしておきます。そして順電圧が1.2V　順電流は20mAなのでキルヒホッフの法則から
(3.3-1.2) / 0.02 = 105Ωという計算になりました。100Ωでもいいのかもしれませんが、余裕をもって220Ωにしようと思います。

またこの抵抗の調整によって以下の現象が発生します。
抵抗を小さくする　→　発光量が大きくなり、消費電力は上がる
抵抗を大きくする　→　発光量が小さくなり、消費電力は下がる


### 負荷抵抗
負荷抵抗はフォトトランジスタの前に置かれる抵抗です。こちらの抵抗はどうやって計算されるかといいますと、ネットでは複雑でわからなかったので割愛します。
ただ、データシートでのグラフでは1kΩを基準に計測していたので、ここでは1kΩにしておけば壊れることはないと思います。ただ、ネットでは1kΩで計測がうまくいった事例はなく、だいたいが数kΩから44kΩで計測できたというデータを見かけることが多いので今回は22kΩとしておきます。(何kΩがいいかわからない場合、各Ωごとに検証した方が良いと思います)

またこの抵抗の調整によって以下の現象が発生します。
抵抗を小さくする　→　感度が小さくなり、消費電力も上がる
抵抗を大きくする　→　感度が大きくなり、消費電力も下がる


# プログラム

プログラムは次のようになります。 A0に繋げたアナログピンからアナログ値を出力します。
対象物がないまたは、黒であれば1000程度の値　白であれば0に近い値となります。

```
void setup() {
  Serial.begin(9600);
}
 
void loop() {  
  int val = analogRead(A0);
  Serial.println(val);
  delay(100);
}
```

# 検証
以上のことを踏まえてテストしていきますが、結果がうまくいくかどうかは、周りの光量や、紙との距離、反射による角度などによって決まるので、この検証結果および白黒との境界線は環境によって異なりますので自分で確認してから決めてください。

それでは、動作抵抗220Ω、紙との距離を5mm程度という条件で進めますが、負荷抵抗をどうすべきかわからないので
1kΩから44kΩで計測していきます。

### ・負荷抵抗　1kΩの場合
負荷抵抗1kΩの場合、アナログ値はこのような結果になりました。反射物がない場合はどの抵抗も700近くの値となりましたが、白の場合は670程度、黒は685程度と感度が小さいためか、差が小さい状態となりました。

反射物なし
![対象物なし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/0999d6cb-3c2f-6c62-8d4a-c52b87e9852c.png)

白
![白.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/5a4452be-dc6f-5aa1-5ddf-d9ff4411e5b5.png)

黒![黒.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/a74b2d5d-a36e-80e9-7184-c4f43e40ebe9.png)


### ・負荷抵抗　10kΩの場合
負荷抵抗10kΩの場合、アナログ値はこのような結果になりました。白だと400程度で、黒だと670程度となりました。先ほどの抵抗値と比べて差は開けましたが、まだ差は200以上となり、まだまだいけるかと思います。

対象物なし
![対象物なし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/d26cfdb3-af1b-70a9-057e-56cd754e0f53.png)

白

![白.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/1fcd9edd-02cc-dc5a-9ec4-4d18c0b717b8.png)

黒
![黒.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/d0286a85-6f0b-9014-5139-45f8d50e2489.png)

### ・負荷抵抗　22kΩの場合
負荷抵抗22kΩの場合、アナログ値はこのような結果になりました。白は200程度、黒は670程度となり、差は470程度となりました。まだまだいけるかと思います

対象物なし
![対象物なし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/e3f16694-646c-bf46-1da3-7870855ebcac.png)

白
![白.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/d8645b71-a9b4-dafd-90e1-f8fc558925d3.png)

黒
![黒.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/ae0dcf63-ef1f-bb00-2a4a-87f0ac79c344.png)


### ・負荷抵抗　44kΩの場合
負荷抵抗44kΩの場合、アナログ値はこのような結果になりました。白は70程度で黒は550程度となり、差は480程度となりました。ただ、負荷抵抗を大きくすればするほど、感度が大きくなるので、読み込む白黒との距離がちょっとでも違うと値に大きく差が出るので、紙との距離は精密な機械とかできっちり固定してから読み込んだほうがいいと思います。ただ、白黒のしきい値としては70程度の小さい値で設定することができるので、負荷抵抗はこれでいいと思います。

対象物なし
![対象物なし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/d2102252-89e0-50d2-a55c-dd2ea2d7f0b5.png)

白
![白.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/e76cb37a-cfe6-b993-7097-d5cb111266b7.png)

黒
![黒.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900339/87385c1a-a26e-fec1-1721-7ec65c67afef.png)

# 結論
以上の検証結果を踏まえ負荷抵抗は44kΩにすればよいかと思います。ただし、投稿者による調べになりますので、何kΩにすべきかはご自身で調べていただくことを推奨します。

# 参考
https://www.petitmonte.com/robot/howto_photo_reflector.html

https://www.tenkaichi-hanseikai.com/entry/2024/01/13/143659

https://www.youtube.com/watch?v=hjtiFv3fLpY

https://learn.switch-education.com/microbit-md-tutorial/30-phref.html#:~:text=%E8%B5%A4%E5%A4%96%E7%B7%9A%E3%81%A8%E3%81%84%E3%81%86%E3%80%81%E7%A7%81%E3%81%9F%E3%81%A1%E4%BA%BA%E9%96%93,%E8%AA%BF%E3%81%B9%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82