2017年12月22日金曜日

ESP32で33個以上のNeoPixelを使うと制御が乱れる



■追記■


たくさんつないでも点灯するライブラリを教えていただきました。


■うまく点灯してくれない■

原因はLEDが増えてshow()での処理に1mSec以上かかってしまうとデータ送出の最中にインタラプトが入ってフォーマットが崩れてしまうこと、とのことです。

ということで、ちょっと煩雑ですが、show()の前後を以下のコードにすることで少し解決します。
  portDISABLE_INTERRUPTS();
  strip.show(); // Initialize all pixels to 'off'
  portENABLE_INTERRUPTS();

「少し」というのはときどき1個だけおかしくなったりすることがあるからです。64個使う場合には27番目と56番目です。手元にある他のLEDストライプを使っても同じような感じなので、ソフト側の問題ですねぇ…。

焼け石に水で
    delay(1);
    portDISABLE_INTERRUPTS();
    strip.show();
    portENABLE_INTERRUPTS();

にすると61番目だけがおかしくなります。さらに、
    portDISABLE_INTERRUPTS();
    delay(1);
    strip.show();
    portENABLE_INTERRUPTS();

だとまた別のところが時々おかしくなります(笑)。いや笑い事じゃないですが。まぁ、Disable Interruptしないと全然見られないのに比べれば少しはマシということで…なんかwork aroundが出るのを待ちましょう(他力本願)。

SPIをDMAで動かせば何とかなるんじゃないかと思うんですが(思うだけ)。

0 件のコメント:

コメントを投稿