mbed の NeoPixel ライブラリがおかしい件、
やはり波形を細かく見てみないとダメだと言うことで、
ズームアップしてみました。
![](https://blogimg.goo.ne.jp/user_image/0d/50/09742c23743856ed88e31c4cd27be930.jpg)
特におかしなところは無さそうに見えます。
こちらがArduino UNO の波形です。
![](https://blogimg.goo.ne.jp/user_image/77/c5/65677668c8f2ad5bbc2374bb80191954.jpg)
比較しても、違いが有るようには見えません。
しょうがないので、表示がおかしくなっているところの波形を見てみます。
このLEDは自分の分(24ビット)を取り込むと、それ以降を後段にスルーします。
だから、後ろの方になるとデータが少なくなります。
![](https://blogimg.goo.ne.jp/user_image/33/fb/59faab167ca971fee146f1640556bbaf.jpg)
なんじゃこら!
明らかにLの時間が長いところがあります。
元は有ったパルスが消えているようです。
だから表示がおかしくなったと言うわけです。
改めてmbed直後の信号波形を見てみると、
![](https://blogimg.goo.ne.jp/user_image/2c/ba/f7094bbe1360a219964f0397e0c72cff.jpg)
長いパルスが連続するとLの時間がだんだん短くなっているみたいです。
測ってみると
![](https://blogimg.goo.ne.jp/user_image/4f/c2/4d53cb1696772aa3e6c92a1bff946af6.jpg)
330nsしかありません。
その直前のLの時間は
![](https://blogimg.goo.ne.jp/user_image/48/03/201006bf9b7091c0500e223d82331b96.jpg)
440nsあります。
WS2812のスペックでは
T1L = 600 ± 150 ns なので、アウトですが、
WS2812Bのスペックでは
T1L = 450 ± 150 ns なので、OKなはずです。
実際、私の基板はWS2812Bです。
いやいや、そもそもデータシートの書き方が違うだけで
デバイスの正味の
スレッショルドは600nsあたりにあることが分かっています。
では、なぜビットが抜ける現象が起こったのでしょうか。
改めて、ビット周期を測ってみます。
![](https://blogimg.goo.ne.jp/user_image/22/9a/a102bbd9e97c8b514a142bbdc787031c.jpg)
ビットが抜けたところは2.4μsになっています。
これは2ビット分なので、ビット周期は1.2μsです。
800kbpsだと1.25μsなので、少し短いのです。
そこで、改めてArduinoの波形と比べてみると、
mbedの方が、見て分かるくらいジッタが大きいです。
どうもジッタのせいで周期が短くなった時にビット抜けが
発生したようです。
やはり、このライブラリは素性が良くありません。
波形発生の処理方法に問題がありそうです。