APA102-2020の再考 - バーサライタへの応用 –
さて先日購入したLEDストリップの動作に驚愕してもろもろ基本的な動作検証をしたわけですが。。。
ここではもう一度落ち着いてAPA102-2020と向き合ってみたいと思います。
そう。まさに トランキーロ!あっせんなよ
です。
目次
購入品
購入したLEDバーは以下です。
2mm角のSPI入力LED APA102-2020が3mmピッチでぎっしり128個も載った商品で、強度や放熱のためか基板には1mm厚ほどのアルミ板が貼り付けられています。
APA102 DotStar搭載と記載ありますが、5050サイズのチップと異なり高速PWM動作ができないため、バーサライタなどのPOV (Persistence of Vision)には適していないとも明記されています。
商品データシートは以下
https://cdn-shop.adafruit.com/product-files/3776/3776_datasheet.pdf
APA102-2020
購入したLEDバーに搭載されているチップの写真が以下です(小さすぎてうまく撮れない。。)。
APA102-2020でググると正規なのかコピーなのかよくわからないのですが たくさんのチップが検索されます。以下に一部をまとめます。
- APA ELECTRONIC CO., LTD http://neon-world.com/en/
APA 102-2020-256-6 : データシート
APA 102-2020-256-8 : データシート
APA-102-2020-8192-6B : データシート
APA-102-2020-8192-8B : データシート
- Shenzhen LED Color Opto Electronic CO.,LTD http://www.led-color.com/
APA102-2020 Super LED : データシート
恐らく購入したLEDバーに搭載されているAPA102-2020は8ピンでチップ写真から想像するにAPA102-2020-256-8かAPA-102-2020-8192-8Bなのではないかと思います。
しかし、サイトページとデータシートの写真が異なっていたりデータシートもリフレッシュレートが記載ないなど情報不十分ですので、もはや製造元や正式型番を知ることに意味はないように思います。疲れるし。。。
ということで実機で動作を観ていきましょう。
それこそ泥臭き爪真っ黒のエンジニアリングというものです。
APA102-2020動作
測定方法
Arduino UNOでLEDバーのセルを1つ光らせて点灯時の電流を10Ω抵抗による電圧降下でオシロスコープ観測しリフレッシュレートを観ます。オシロにはADALM2000を使用しています。
LED用ライブラリ
LED点灯用のライブラリはAdafruitのDotstar用のライブラリを使用しました。
https://github.com/adafruit/Adafruit_DotStar
ここでこのライブラリの注意点があります。このライブラリのsetBrightness()はLEDの輝度を設定する関数ですが、グローバル輝度を設定するものではありませんでした。ずっと勘違いしていました。。
setBrightness(0~255)は色輝度に係数としてかけられておりました。以下のコードコメントにも明記されております。
https://github.com/adafruit/Adafruit_DotStar/blob/master/Adafruit_DotStar.cpp
正規のDatstar LEDはグローバル輝度を設定すると600Hzほどの低周波PWMが重畳されます。そのためPOVに使用した際に残像の途切れの要因となります。
そこでAdafruitはsetBrightnessをグローバル輝度ではなく色輝度への設定に変更したようです。このライブラリではグローバル輝度は最大値(31)となっております。正しい判断だと思います。
ここではグローバル輝度も変更してLEDの特性を観たいのでライブラリを修正して可変にしております。Adafruit_DotStar.cpp のspi_out(0xFF)もしくはsw_spi_out(0xFF)の0xFFを所望のグローバル輝度に変更します。
たとえばグローバル輝度を16にしたい場合は
0xFF → 0b11110000
グローバル輝度を1にしたい場合は
0xFF → 0b11100001
などです。
グローバル輝度は以下の図のように5ビットの値D4-D1 (0~31)で指定します。
測定結果
リフレッシュレートはやはり600Hz台で グローバル輝度をさげると周波数が上がり、LEDに流れる電流が減りました。
グローバル輝度を16として色輝度を変えていくと以下のような結果となりました。
色輝度 | freq [Hz] | Duty [%] |
0 | – | 0 |
30 | 664.8 | 0.016 |
60 | 648.5 | 1.8 |
128 | 625.1 | 9.4 |
196 | 610.8 | 50.6 |
224 | 597.2 | 72.8 |
240 | 590.4 | 85.3 |
255 | – | 100 |
色輝度-Dutyは以下の通り。
LEDの輝度を上げるとリフレッシュレートが変動して下がるなど よくわからない動きをしておりますが。。。とにかくLEDバーに搭載されているAPA102-2020は低いリフレッシュレートのためPOVには向かないことがよ~くわかりました。
ようするに以下のようになるのです 😥 。
みなさん!!!!!!!!!!
高速バーサライタに使用する際には
APA102ではなく
APA102Cを使いましょう!APA102はリフレッシュレート400Hz
☟まだらになります(´;ω;`)ウゥゥ pic.twitter.com/El6L2PQOmh— HomeMadeGarbage (@H0meMadeGarbage) September 3, 2019
バーサライタへの応用
しかし、ここで「あーリフレッシュレート低いわ。バーサライタ無理だね」と終わってしまってはタダのリサーチャーもしくは評論家止まりなわけで。。
私は泥臭き爪真っ黒のエンジニアリングをやめませんよ。なんせ9430円も払ったんですから。。。
じゃあ色輝度MAXでグローバル輝度のみで調光すればいいのでは?そうすればDuty 100%で低周波PWM制御の影響は受けません。
やってみた
マイコン SPRESENSEを用いてこのLEDバーを使用したバーサライタを試しました。
以前作成したSPRESENSEバーサライタの応用で
LEDバーを搭載!
LEDバーの128個のセルのうち64を使用してグローバル輝度は1としました。のこりの64個はいっさい制御せず電源投入時に点灯したままになったりするので黒テープで隠してます。
動作
SPRESENSEは1コアのみの使用。LED64個の点灯で1周128分解能が達成されました。ギリギリですが。。
SPRESENSE 1コアでAPA102-2020 64セル 分解能128で表示。外周から中心に向かってデータ書き込んどります。ちょっと中心の表示が苦しそう。
グローバル輝度は最小の1(最大値は32)
8色のみ表示可能
0x000000
0x0000FF
0x00FF00
0x00FFFF
0xFF0000
0xFF00FF
0xFFFF00
0xFFFFFF pic.twitter.com/bLwdDE9gB3— HomeMadeGarbage (@H0meMadeGarbage) September 5, 2019
RGBはそれぞれ0か255でしか点灯できないので8色しか出力できません。。。
絵も出してみる。
SPIクロック 10MHz -> 30MHzで表示がだいぶ改善#バーサライタ #APA102 #SPRESENSE pic.twitter.com/GbdKZbDJHw
— HomeMadeGarbage (@H0meMadeGarbage) September 5, 2019
狭ピッチのLEDバーですのでいい感じに絵が出ます。
ちょっと1周の分解能が低いのでマルチコアやSPI出力2個使用などで向上は考えたいですね。
しかし8色しかでないバーサライタをこれ以上いじるかどうかは。。。
また別のお話
追記
大臣の褒め (2020/3/7)
河野 太郎 防衛大臣にお褒めの言葉をいただきました。
誠にありがとうございます。
よくできました。 https://t.co/c0dep9n4ML
— 河野太郎 (@konotarogomame) March 5, 2020