ラベル WS2812 の投稿を表示しています。 すべての投稿を表示
ラベル WS2812 の投稿を表示しています。 すべての投稿を表示

2017年12月23日土曜日

ESP32で大量のNeoPixelsを正常に動作させる

Adafruits版だと正常に動作しないのですが、facebook上で「このライブラリを使えば動く」と教えていただき、試したところ正常に動作しました。Mさん、ご教授いただきありがとうございました。

ただちょっとビルドを通すのに手間取ったので、その辺を書いておきます。

まず、以下をダウンロードして解凍するか、cloneします。ここにWS2812のライブラリなどが入っています。

esp32-snippets直下のcpp_utilsをesp/esp-idf/components下にコピーします。本来であればこのままで良いのですが、簡単にビルドが通らないソースがある場合にはその拡張子を.cppから.bakに変えてしまいます。私の場合、BLEHIDDevice.cppをBLEHIDDevice.cpp.bak、BLESecurity.cppをBLESecurity.cpp.bakに変更しました。良いんだ今は使わないから(笑)。

ダウンロードした.zipとesp32-snippetsはゴミ箱に入れても構いません。

次に、以下をダウンロードして解答するか、cloneします。

ターミナルでespressif/app/ESP32_gpio_WS2812/mainに移動します。ここにあるWS2812.cppとWS2812.hを削除します(ここにあるのは古いライブラリで最新版は上でcomponents下にコピーしましたので)。

一つ上のディレクトリに戻って、make menuconfigでシリアルポートと通信速度を設定します。通常ならばこれだけで良いのですが、components下に入れた他のライブラリのビルドを通すためにCompilar options->Enable C++ exceptionsをonにします(カーソルを移動してスペースキー)。

WS2812/NeoPixelsはGPIO22に接続します。

これでmake flashします。するとesp-idfのバージョンによってはエラーがでますので、main/main.cの22行目heap_regions.hをincludeしている分をコメントアウトし、26行目のesp_heap_alloc_caps.hをesp_heap_caps.hに変更し、34行目をコメントアウトします。

ソースを保存して再度make flashすればデモ点灯します。

LEDの数や接続ピンを変更するにはmain/ws2812_task.cppの37-38行目の定数を変更します。

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で動かせば何とかなるんじゃないかと思うんですが(思うだけ)。