ライブラリ
Spresense Arduinoでは、Adafruit の Adafruit_NeoPixel ライブラリは使えない。。Spresense Arduino用のNeoPixelライブラリとしては、hideakitaiさんのSpresenseNeoPixel と、hideakitaiさんのnepils がある。nepils のほうが後発で、Adafruit_NeoPixel を継承しており、API互換となっている。そのため、nepils を利用するためには Adafruit_NeoPixel をインストールする必要がある。また、Adafruit_NeoPixel の一部の機能は無効になっており、完全互換ではない。
Adafruit_NeoPixel を使用した過去のソースを Spresense Arduino で流用したいなら nepils で。
※個人の感想です。
nepils の不具合?
上記の nepils ライブラリはなぜか setPixelColor()が使用できなくなっている。なんらかの事情で setPixelColor(n, r, g, b, w) を無効化したせいで、他のオーバーロードまで無効になっている? Adafruit_NeoPixel_Spresense.h に下記の2行を追記すれば使えるようになる。
public: using Adafruit_NeoPixel::setPixelColor;
マルチコア使用時の不具合
上記のライブラリは信号出力をGPIOでおこなっており、割り込み禁止したうえでインラインアセンブラでタイミング調整をしている。ところが、メインコア以外のコアを起動すると、このタイミングにジッタが生じてNeoPixelがチカチカする現象が発生する。この原因はよく分からない。
SPRESENSEさん、マルチコア使ったら割り込み禁止しててもNeoPixelのパルス幅がゆらいでチラつく件。(なんでタイミングずれる?)#SPRESENSE pic.twitter.com/zJk9sfLni9
— 西村 備山 (@lipoyang) 2023年12月4日
SPI版Adafruit_NeoPixel
上記問題を回避するため、 Adafruit_NeoPixelライブラリのSPI版を作成した。GPIOのかわりにSPIのMOSIで信号出力を行う。
このライブラリを使用することで、マルチコアプログラミングでもちらつきなくNeoPixelを制御することができた。
SPRESENSEで無駄にマルチコア使って通信とLED制御を並列処理する。#SPRESENSE pic.twitter.com/nz2jzgJcqT
— 西村 備山 (@lipoyang) 2023年12月5日
参考