フォトリフレクタによる壁距離検知

#概要
最近、マイクロマウスを作ってみたくて色々調べているのですが、壁検知の方法がかなり肝のような気がします。

この記事では、

* 森永式等のLED・フォトトランジスタの動作方法
* フォトリフレクタと壁の距離・方向による変化
* フォトリフレクタの配置について

を考えていきます。

#LEDの回路と、フォトトランジスタの回路について
森永式については

https://www.kerislab.jp/posts/2017-10-20-2range-reflector/

が非常にわかりやすいです。

フォトトランジスタについては、

https://kojimousenote.blogspot.com/2009/08/basicmouse.html

によると

![１無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/3929bc68-1918-5bd4-0d2e-c001484e16b2.png)

ハイパスフィルタで定常成分をカットし（LEDの発信周波数はカットしない周波数、負電源がないので注意がいる）
ピークホールド回路で、信号の強度を取り出すようです。


##実験回路

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/9c8cac31-9e2f-391f-db57-223dbd60146c.png)

LEDの電流は可変抵抗で指定値に調整します(定電流用ICを後で買って使用するつもり)。
$V_{cc}$はesp32使用を想定して3.3Vにします。

センサーについて
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/23612302-b65c-8a78-e98b-bed1f53d760c.png)



##実験1:LED電流とセンサー距離
![IMG_20220211_194230523.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/d28c9181-b3dc-51f0-6281-100c54072109.jpeg)

壁の幅|80mm
---|---
壁の高さ|25mm
$V_{cc}$|3.3V
$R_1$|100kΩ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/644a9eff-199b-820c-30c2-64af24c998c4.png)

当然だが、電流が小さくなるほど、センサーの感度は低下する
ただし、3本の曲線の変化の仕方が近いことが見てわかる。
表示を変更し、LED電流-$V_{out}$のグラフを作ると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/777aa8e7-9fb9-e39e-2626-07293bf7158a.png)

つまり、LED電流に対し比例的に変化していることがわかる。

以降の実験では50mAに調整して実験を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/644a9eff-199b-820c-30c2-64af24c998c4.png)
再度、距離について考えると
20mm~60mmの間でなら使えそうだ。
どの程度の精度が得られるかは、電源などによる電圧変動によるので推定はできないが
60mm以上は結構ずれる気がする
とりあえず、適正距離は30mmといえる。


##実験2：壁の角度の影響
![IMG_20220211_194225698.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/3231ef7d-4d7e-03bf-74eb-a63e98a6917b.jpeg)

壁の幅|80mm
---|---
壁の高さ|25mm
$V_{cc}$|3.3V
$R_1$|100kΩ
LED電流|50mA

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/7203f890-6b9e-586b-6bf8-1c0f93710fe1.png)
として、測定を行った結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/72544c28-a768-97c4-06fd-43227fbe1ed3.png)

* 壁との距離による電圧の変化量は、角度の影響を受けていない（どの角度でも壁との距離10~40mmにおいて傾きがほぼ同じに見える）
* 角度がつくほど、反射光が減るため、$V_{out}$は増加する

表示を変更し、角度-$V_{out}$とすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/d1b53d3b-65ed-b0f5-9e62-900e2dcc5b8e.png)
理論的に考えた時、

* 鏡では反射は帰ってこない
* 乱反射した場合、反射角0度で一番たくさん帰ってくると考えられる
* 表面がツルツルなら乱反射しない
* ざらざらの面で正反射している
* ざらざらな面の角度分布で定まる

参考

https://www.chiba-c.ed.jp/funako/fttp_kousin/ssh/reserch/2019/2019_03p3.pdf

難しい・・・

##実験3:
![IMG_20220211_211704822.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/2e5b58d2-2f28-4573-7965-7cbb4bad0970.jpeg)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/bd868b23-ed08-5555-a999-80f3bbf6749c.png)

壁の幅|80mm
---|---
壁の高さ|25mm
$V_{cc}$|3.3V
$R_1$|100kΩ
LED電流|50mA

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/57898c45-85e0-2e27-dcb5-85bb3a0b3870.png)

* 当たり前だが、壁との距離が近いほど、横方向距離範囲が狭くなる
* 横方向距離+3~-3mmで大きく変動しているが、壁との距離30mm以上になると+10~-10mmぐらいに広がっていく


##実験4:
壁の角度を変化
![IMG_20220211_222054866_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/449054a5-7b4d-117d-b12d-ab4fb622edc6.jpeg)

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/5021ae31-a522-d0cf-de5d-ce933646aca2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/a16855fa-bfc0-728d-c3a9-d654412dd47f.png)
右の軸は、壁との距離40mm,50mmの曲線用

壁との距離がなんでも、-10~10mmの範囲で大きく変化している。

##R1とフォトトランジスタの過度応答の関係
LEDを高周波でON,OFFさせて、フォトトランジスタのセンサー出力にハイパスを掛けて使用する都合上フォトトランジスタの立ち上がり遅れが非常に問題となる可能性を秘めています。
単純に立ち上がり遅れがないのが理想ですが、それはあり得ないので・・・

###回路
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/549c30e7-d67f-fd2c-493d-0563eff49b19.png)
$V_G$に方形波を入れて動作を見てみる

FETにはNDS9936を使用した（NDSのチップの向きが思た方向と逆でとまどった・・・）
まず、$V_G$に5Vを入れて電流計を見ながら50mAになるよう可変抵抗を調整した。
Duty50%だからか、方形波を入れて電流計を見ると25.5mAになっていたので、正確に調整できたと思われる

###結果
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/5b1a5573-a67d-4a39-2be8-f27e5a7c69d4.png)

* LEDにはコンデンサ成分が存在する（$V_G = 0V$に下げているのに、$V_{LED}$が0Vにすぐ落ちていない）
* LED-ONの立ち上がりに遅れはないように見える


![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/ff353baa-be3b-c7bc-502f-5c614b4101d5.png)
LEDの周期を2msから20msに変更した

* $V_{LED}=0$にちゃんと移行している

LED-offの時の挙動は今は考えないで、$V_{out}$の挙動を考える

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/4f02d604-1af2-ab33-6119-75facdffe8e2.png)
周期を400usに変更

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/47fd7899-c139-48e6-c24b-bd26b26382a5.png)
可変抵抗間電圧計測結果

これより、$V_{LED}$の立下り時の電流はほとんど0だと考えられる->LEDはほとんど発光していないと考えていい
コンデンサ成分で微量に電圧が残ったと思われる

問題なのは、LED-on時のフォトトランジスタの立ち下がりの遅さだ
光が入ってきてから、電圧が変化するのに時間がかかるのが、フォトトランジスタのフォトダイオードに対する欠点である。

立ち上がりを早くするのに、光バイアスを掛けたりする場合もあるみたいだ

http://mousedaily.txt-nifty.com/rd_daily/files/web.pdf


#ハイパス回路を組み込む
特性はわかった。では、高周波の方形波を$V_G$に与えた時の$V_{out}$はどうなるだろうか。

フォトトランジスタを一次遅れシステムと考える

方形波$w$[rad/s]では

http://www.cfme.chiba-u.jp/~yama/EMS/ems_01ex_ans.pdf

にある通り、$sin(wt) + \frac{1}{3}sin(3wt) + \frac{1}{5}sin(5wt) + \frac{1}{7}sin(7wt) $
のようになっている。つまり、3倍、5倍、奇数倍の周波数を足し合わせることになる。
フォトトランジスタ一次遅れ系のカットオフ周波数より内側の周波数の方形波を使うことがまず、必須条件である。

https://controlabo.com/first-order-system-impulse-step-response/

63.2％点での時刻は25usであることから、カットオフ周波数は約40kHzである。
一次システムの影響を無視するためにLEDを4kHzに指定するとよいだろう。
方形波は奇数倍波が入ってくるので、12k,20k,28k,36kHzが入ってくるだろう。

ハイパス回路は次のDFT計算による周波数振幅取り出しを行うため、必要ないと思われる。

#esp32で特定周波数の振幅を求める（ピークホールド）

http://www.ic.is.tohoku.ac.jp/~swk/lecture/yaruodsp/dft.html

でのDFTを再度記載する

```math
F(k) = \sum^{N-1}_{n=0} f[n] e^{-j \frac{2 \pi}{N} kn}
```
$k$での、振幅$F(k)$は正規化周波数$\frac{2 \pi k}{N}$での振幅である。

```math
正規化周波数　\frac{ k}{N}　 × サンプリング周波数　=　非正規化周波数
```

となる。

サンプリング16kHz,N=16点,$F(4)$を求めることで4kHzでの振幅がわかる
3.1~4.9kHz?の4kHzから少しずれた信号はどうなるのだろうか・・・コメントください

FFTの計算アルゴリズムを少し勉強して、高速化を少し考える。

https://kenyu-life.com/2019/07/08/what_is_fft/

特定周波数($k = 4$)のみを計算するから、FFTを使う必要はない
本当に単純に16回複素数積（実質32回積）をして、さらに二乗ノルム(2回積)を行うので、34回積をすれば、振幅がわかる
16kHzでどのくらいCPUリソースが持ってかれるのか気になるところである。
計算を工夫してもいいが、読みやすさを重視することにする。

esp32に導入するプログラム

```C

```

#センサーの配置の考察
実際にどのようなアルゴリズムにするか

##単純な直線道

##右曲がり