~ 目次 ~
1. 何が起きたか
ラジコン用のスピードメータを作るのに、フォトリフレクタ(赤外線LEDとフォトトランジスタが一緒になったセンサ。色によって赤外線の反射率が変わります)を使ってみようとネット記事1を参考に回路を組んでみました。使用したフォトリフレクタはLBR-127LHDです。
この記事1では、Arduinoでフォトリフレクタを使う方法が丁寧に解説されていました。(分かりやすい)
同じ回路とプログラムで試したのですが、うまくいきませんでした。(シリアルモニタにずっと4095と表示されてる??)
今回は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]に変更したらうまく動きました(笑)
これに数時間悩んでいたので、動いて感動しました( ;∀;)//
実際に動かした様子は下のアニメーションのようになります。画質が粗くシリアルモニタの値が読みづらいと思いますが、しっかり変化しています!
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. 参考文献
-
プチモンテ「フォトリフレクタの使い方 [Arduino]」、(https://www.petitmonte.com/robot/howto_photo_reflector.html) ↩︎
-
ソースに絡まるエスカルゴ「【ESP32】analogReadする方法」、(https://rikoubou.hatenablog.com/entry/2017/06/29/135819) ↩︎