概要

  • 当初ESPr Developer 32NeoPixelを1個制御したかった
  • 点灯自体はするのだが、色が正しく反映されない(赤を指定してるつもりでも、緑や青色になる)
  • 上記問題を解消するのに丸1日かかった

結論

  • NeoPixelの動作電圧5Vに対し、IOの電圧を3.3Vにしてしまっていた

丸1日、試したこと

  1. 最初に、今回使用したNeoPixelの動作電圧がデータシート上4.5V~6Vということで、NeoPixelのVCCは5V、DINはESPr Developer 32のIO27ピンに接続した。
  2. ライブラリAdafruit_NeoPixelを使って動作確認用プログラムを作成。
  3. なんか色がおかしい!clear()も正常に働いていない。
  4. “esp32 NeoPixel"でググる。
  5. なんか他の人は大体正常に動作してるっぽい。
  6. ネットの記事が比較的古い情報だったので、ライブラリのバージョンを疑う。
  7. ライブラリAdafruit_NeoPixelのバージョンをネットの記事に合わせて下げる(ver1.3.0→ver1.2.3)。
  8. 動作不良変わりなし。
  9. Arduino core for the ESP32のバージョンを下げる(ver1.0.4→ver1.0.0)。
  10. 動作不良変わりなし。
  11. ライブラリAdafruit_NeoPixelがESP32ボードだとうまく使えないという記事を見かけ、NeoPixelライブラリ自体を疑う。
  12. 代替ライブラリとしてFastLEDのサンプルを動かす。
  13. これも色がおかしい!
  14. 代替ライブラリとしてNeoPixelBusのサンプルを動かす。
  15. 相変わらず色がおかしい。
  16. Arduino Pro Mini互換機Adafruit_NeoPixelのサンプルを動かす。
  17. ちゃんと想定通りの色が出る。
  18. ネットで再度ググるが"ESP32でもNeoPixelは使える"という情報ばかり。
  19. 動作確認に使っていたESPr Developer 32ボードを疑う。
  20. 違うESPr Developer 32ボードで動作確認する。
  21. 動作不良変わりなし。
  22. 同じESP32開発ボードであるESP32 DevKitCを使って動作確認する。
  23. 動作不良変わりなし。
  24. 電源だけArduino ProMini互換機からとってみたりする。
  25. 動作不良変わりなし。
  26. ライブラリAdafruit_NeoPixelの実装を見てみる。
  27. ESP32関係ボードの場合は、マクロF_CPUの値からCPU動作周波数を確認し、インラインアセンブラで信号のHIGH/LOWのタイミングを制御しているらしい。
  28. 一応マクロF_CPUの値をシリアル出力させて確認してみる。
  29. F_CPU=240000000(240MHz)で想定通り。
  30. 本当に240MHzで動いてるのかを確認しようかとも思ったが、確認方法もパッとわからないので後回しにする。
  31. ビルドオプションでCPU動作周波数を変えてみる。
  32. 動作不良変わりなし。
  33. Adafruit_NeoPixelのProjectページ(GitHub)のissueを確認して類似の問題がないか確認する。
  34. https://github.com/adafruit/Adafruit_NeoPixel/issues/139を見つける。
  35. 細かいことはよくわからないがNeoPixelBusを使えば正常に動いたという報告があるみたい。
  36. といっても前述の通りNeoPixelBusのサンプルをそのまま動かしただけでは正常に動作しなかったため、NeoPixelBusのProjectページ(GitHub)のwikiを見る。
  37. https://github.com/Makuna/NeoPixelBus/wiki/FAQ-%232を見つける。
  38. 自分の無知さに絶望する。

対策

とりあえず以下のいずれかの方法で正常な色が出力されることを確認。

戒め

ロジックレベルは動作電圧に合わせましょう(当たり前)。