ESP32でフォトリフレクタを使いたい!

2022-12-04 · Tomoki Ikegami

"Arduinoと同じ回路でやったらハマった話"

~ 目次 ~


1. 何が起きたか

 ラジコン用のスピードメータを作るのに、フォトリフレクタ(赤外線LEDとフォトトランジスタが一緒になったセンサ。色によって赤外線の反射率が変わります)を使ってみようとネット記事1を参考に回路を組んでみました。使用したフォトリフレクタはLBR-127LHDです。

 この記事1では、Arduinoでフォトリフレクタを使う方法が丁寧に解説されていました。(分かりやすい)

 同じ回路とプログラムで試したのですが、うまくいきませんでした。(シリアルモニタにずっと4095と表示されてる??)

 今回はESP32で使う方法を紹介します!

フォトリフレクタをESP32で使ってみた
☝ フォトリフレクタをESP32で使ってみた

2. 回路

2.1. うまくいかなかった回路

 ESP32でこの回路を組むとうまくいきません。色々と違う抵抗を試したり、ネットを調べてみたところ、アナログ入力電圧がArduinoとESP32で違うことが原因でした。

 Arduinoの入力電圧は5[V]が最大で、ESP32は3.3[V]が最大2なのは知りませんでした!(‘Д’)

 ESP32では 0~3.3[V] までのアナログ電圧が 0~4095 のデジタル値に変換されることになります。

 

うまくいかなかった回路
☝ うまくいかなかった回路

2.2. うまくいった回路

 こちらがうまくいった回路です。電源電圧を5[V]から3.3[V]に変更したらうまく動きました(笑)

 これに数時間悩んでいたので、動いて感動しました( ;∀;)//  

うまくいった回路
☝ うまくいった回路

 実際に動かした様子は下のアニメーションのようになります。画質が粗くシリアルモニタの値が読みづらいと思いますが、しっかり変化しています!

実験の様子
☝ 実験の様子
シリアルモニタを拡大(AD変換後のデジタル値が表示)
☝ シリアルモニタを拡大(AD変換後のデジタル値が表示)

3. プログラム

 今回の実験に使ったプログラムです。整理してないので使ってない変数がいっぱいあります(笑)

const int sense_pin = 25 ; //★回路に合わせる。今回は25番ピンを使用。
const float Vr = 3.3; //入力電圧の範囲は0~3.3V(今回は未使用)
const float ANALOG_MAX = 4096; //AD変換の最大値(今回は未使用)
int val = 0;        //センサ入力値
float voltage = 0;  //電圧に変換したセンサ入力値
void setup() {
  Serial.begin(9600);  //伝送速度設定
}
void loop() {
  val = analogRead(sense_pin);                      //センサの値などを読む
  voltage = float(val) * (Vr) / (ANALOG_MAX);  // AD変換(今回は未使用)
  Serial.println(val);          //文字をシリアルモニタに表示
  delay(100);
}

4. センサは壊れないのか?

 電源電圧を3.3Vにしたらとりあえず動きましたが、センサに負担がかかっていないか理論的にもチェックします。

 下の回路図は、データシートから抜粋して電圧とかの記号を書き足したものです。入力側の閉回路①に注目します。

センサが壊れないのか理論的に確認(回路図はデータシートより抜粋して、記号を追記)
☝ センサが壊れないのか理論的に確認(回路図はデータシートより抜粋して、記号を追記)

 上の図の閉回路①でキルヒホッフの電圧則を考えて、センサに流れる電流$I_F$を求めます。電源電圧を$V_{CC}$、抵抗の両端電圧を$V_R$、ダイオードの順方向電圧を$V_F$とすると、

\begin{equation} \label{KVL1} V_{CC}-V_R-V_F=0 \to V_R=V_{CC}-V_F \end{equation}

 オームの法則から、抵抗の両端電圧$V_R$、抵抗値$R_D$、回路に流れる電流$I_F$の関係は、

\begin{equation} \label{ohm_law} V_R =R_D I_F \end{equation}

 式(\ref{ohm_law})から回路に流れる電流$I_F$は、

\begin{equation} \label{I_F} I_F=\frac{V_R}{R_D} \end{equation}

 となるので、式(\ref{I_F})に式(\ref{KVL1})を代入すると、

\begin{equation} \label{I_F2} I_F=\frac{V_R}{R_D}=\frac{V_{CC}-V_F}{R_D} \end{equation}

 最後に式(\ref{I_F2})から、順方向電圧$I_F$を計算します。電源電圧を$V_{CC}=3.3[\rm{V}]$、ダイオードの順方向電圧を$V_F=1.5[\rm{V}]$(仕様書より)、抵抗を$R_D=220[\Omega]$とすると、

\begin{equation} \label{I_F3} I_F=\frac{V_{CC}-V_F}{R_D}=\frac{3.3-1.5}{220}=0.00818\dots \simeq 8 [\rm{mA}] \end{equation}

 20[mA]を超えてないから妥当かな?

5. 参考文献


  1. プチモンテ「フォトリフレクタの使い方 [Arduino]」、(https://www.petitmonte.com/robot/howto_photo_reflector.html↩︎

  2. ソースに絡まるエスカルゴ「【ESP32】analogReadする方法」、(https://rikoubou.hatenablog.com/entry/2017/06/29/135819↩︎