最近、ESP32を使って赤外線スマートリモコンを制作しています。
トランジスタを使用したスイッチング回路を作成し、赤外線LEDに十分なパルス電流を流せるように設計してみたのですが、なぜかテストを重ねていくうちにLEDの出力が落ちていく現象が見られました。赤外線LEDを交換してみると復活しますが、またしばらくすると出力が低下し使い物にならなくなります。パルス(<10μs)では1Aまで流せるはずのLEDで、設計上は200mAのパルスを流すようにしてあるので、電流値は問題ないはずなのですが、どこかのタイミングで過電流が発生してしまい、故障しているようです。
原因はGPIOピンの初期モードを考慮していなかったため起こった、ESP32が起動する際の意図しない出力でした。
デフォルトのGPIOモードに注意しよう!
ESP32のGPIOピンのモードはプログラムから変更することができます。
pinMode(PIN,MODE)
入力モードとする場合はINPUT、出力とする場合はOUTPUTとします。
しかし、ここで重要なのが、pinMode関数が実行されるまでは、GPIOごとに決まっているデフォルトのモードで動作するということです。
ESP32のGPIOにはそれぞれ既定のモードが決められています。プログラムから任意のモードに切り替えることはできますが、ESP32が起動し、モードを切り替えるプログラムが実行されるまでは、各GPIOは既定のモードで動作します。
たとえ、setup関数の先頭にpinModeをプログラムしていたとしても、ESP32が起動してから実行されるまでにはそれなりの時間がかかります。このため、デフォルトで電圧が印加されるモード(INPUT_PULLUPなど)になっているGPIOに、パルス波を流す前提で設計された回路が接続されていたりすると、ESP32が起動する過程で連続的にONになってしまい、部品が故障してしまいます。
今回赤外線LEDが故障してしまった原因も同じでした。赤外線LEDをリモコンに使用する場合は、10μs以下のパルス波で使用することを前提に設計します。通電時間を小さくする代わりに電流値を大きくすることで実用的な出力を得るようにするのですが、デフォルトでINPUT_PULLUPが設定されているGPIO16ピンに赤外線LEDの回路を接続していたため、ESP32が起動する間に連続してONになってしまっていたようです。
連続上限50mAのLEDに対し、パルス許容最大値の200mAが流れる回路を組んでいたので、赤外線LEDが故障してしまったのでしょう。
起動時に出力モードとなっているピンは要注意!
ESP32のGPIOピンの大半は、プログラムから自由にモードを変更できるようになっています。
一方、ピンモードを変更するプログラムが走るまでは、各GPIOは初期値で動作してしまいます。これを忘れていると、EPS32が起動する過程で意図しない電圧が出力され、トラブルの原因となります。GPIOを使用する際はESP32のデータシートなどを確認し、必ず初期値を確認しておくことをおすすめします。
こちらのサイトの方がすべてのGPIOピンの初期値をまとめてくれています。
コメント