概要
- 当初ESPr Developer 32でNeoPixelを1個制御したかった
- 点灯自体はするのだが、色が正しく反映されない(赤を指定してるつもりでも、緑や青色になる)
- 上記問題を解消するのに丸1日かかった
結論
- NeoPixelの動作電圧5Vに対し、IOの電圧を3.3Vにしてしまっていた
丸1日、試したこと
- 最初に、今回使用したNeoPixelの動作電圧がデータシート上4.5V~6Vということで、NeoPixelのVCCは5V、DINは
ESPr Developer 32
のIO27ピンに接続した。 - ライブラリAdafruit_NeoPixelを使って動作確認用プログラムを作成。
- なんか色がおかしい!clear()も正常に働いていない。
- “esp32 NeoPixel"でググる。
- なんか他の人は大体正常に動作してるっぽい。
- ネットの記事が比較的古い情報だったので、ライブラリのバージョンを疑う。
- ライブラリ
Adafruit_NeoPixel
のバージョンをネットの記事に合わせて下げる(ver1.3.0→ver1.2.3)。 - 動作不良変わりなし。
- Arduino core for the ESP32のバージョンを下げる(ver1.0.4→ver1.0.0)。
- 動作不良変わりなし。
- ライブラリ
Adafruit_NeoPixel
がESP32ボードだとうまく使えないという記事を見かけ、NeoPixelライブラリ自体を疑う。 - 代替ライブラリとしてFastLEDのサンプルを動かす。
- これも色がおかしい!
- 代替ライブラリとしてNeoPixelBusのサンプルを動かす。
- 相変わらず色がおかしい。
Arduino Pro Mini互換機
でAdafruit_NeoPixel
のサンプルを動かす。- ちゃんと想定通りの色が出る。
- ネットで再度ググるが"ESP32でもNeoPixelは使える"という情報ばかり。
- 動作確認に使っていた
ESPr Developer 32
ボードを疑う。 - 違う
ESPr Developer 32
ボードで動作確認する。 - 動作不良変わりなし。
- 同じESP32開発ボードであるESP32 DevKitCを使って動作確認する。
- 動作不良変わりなし。
- 電源だけ
Arduino ProMini互換機
からとってみたりする。 - 動作不良変わりなし。
- ライブラリ
Adafruit_NeoPixel
の実装を見てみる。 - ESP32関係ボードの場合は、マクロ
F_CPU
の値からCPU動作周波数を確認し、インラインアセンブラで信号のHIGH/LOWのタイミングを制御しているらしい。 - 一応マクロ
F_CPU
の値をシリアル出力させて確認してみる。 F_CPU=240000000(240MHz)
で想定通り。- 本当に240MHzで動いてるのかを確認しようかとも思ったが、確認方法もパッとわからないので後回しにする。
- ビルドオプションでCPU動作周波数を変えてみる。
- 動作不良変わりなし。
Adafruit_NeoPixel
のProjectページ(GitHub)のissue
を確認して類似の問題がないか確認する。- https://github.com/adafruit/Adafruit_NeoPixel/issues/139を見つける。
- 細かいことはよくわからないが
NeoPixelBus
を使えば正常に動いたという報告があるみたい。 - といっても前述の通り
NeoPixelBus
のサンプルをそのまま動かしただけでは正常に動作しなかったため、NeoPixelBus
のProjectページ(GitHub)のwiki
を見る。 - https://github.com/Makuna/NeoPixelBus/wiki/FAQ-%232を見つける。
- 自分の無知さに絶望する。
対策
とりあえず以下のいずれかの方法で正常な色が出力されることを確認。
- ロジックレベル変換モジュールを使用してIOを5Vに変換する
- 電源電圧を3.3Vにする(最低定格電圧未満だがとりあえず動いた)
戒め
ロジックレベルは動作電圧に合わせましょう(当たり前)。