Arduino IDEでRaspberry Pi Pico のパラレルデジタル出力SDカードの接続を確認したので,128X64RGB LEDディスプレイを動かしてみました。

今までは主にESP32DEVkit-Cで128X64RGB LEDディスプレイを動かしていましたが,Raspberry Pi Pico でもう少し速くなり4096色が使えそうという目論見です。



Raspberry Pi PicoP2.5の64X64RGB LEDを2個連結したディスプレイです。

何とか中間色を出しながら動かすことができましたV(^^)。
季節外れのハロウインものです,,。




このLEDパネルはHUB75E規格のもので,RGB線6本(画面上半分用のRGB線3本,下半分のRGB線3本)と行アドレスを含むコントロール線8本の計14本とGNDの配線が必要です。

PICOはPin番号が綺麗に並んでいるので,Pin0からPin13までをずらっと出力に使用しました(^^)。写真でMPUの手前側のPinの配線はSDカード用です。






[プログラムの定義部]

RGBデータとクロック,また行アドレスのカウンター出力はパラレルに出力するのでそれぞれbit0-bit6とbit9-bit13に"mask"を定義しています。




Pinが並んでいると,出力Pinの設定もpinModeで簡単に書けます(^^)。







[画画像出力部]

今回はRGB値と行アドレスのカウンタ値出力は"gpio_put_masked()"でパラレルに出力し,その他のデジタル出力も"gpio_put()"でできるだけ速くなるようにしてみました。

ただデータをラッチ( _dataLatch )するパルスのHIGH/LOWだけは短すぎたようで不安定でしたので113行のようにnop的に時間稼ぎをしています。





この出力部で1画面の描画時間を計測してみました。



行のカウンタの最上位bitの推移は約0.43msで1サイクルでした。かなり速くなっていますV(^^)


目標の4096色はRGBそれぞれ16階調が必要で,RGB各4bitのデータを使います。

中間色のために1画面に重ね書きする回数は4096色なら15回なので,今回の場合0.43*15=6.45ms で1画面出力という計算になり,これならチラつきなしでいけますV(^^)。


ちなみに,LEDパネルの消費電流は次のような白が多い画面では5V, 4.5Aぐらい流れていますので,電源はしっかりしたのが必要ですね。





以上の画像出力部はかなり我流の方法と考え方です,(^^;;;;;;;,。
他の方の解説も参照してください。

ま,LEDテープなどのいわゆるNeoPixel系は各LEDごとにRGBデータを持っていますが,HUB75(E)規格のLEDパネルは各ドットのRGBがそれぞれ光るか光らないかしかありません。

そのためHUB75系のLEDパネルでは,各ドットで例えばR:G:Bが15:7:3の中間色を出す時は画面を15回重ね書きし,その間にRは15回光り,Gは7回光り,Bは3回だけ光る,,という方法をとります。

また各ドットごとの記憶装置はなく,一瞬光るだけの残像が頼りですので60Hzぐらいでは画面を描き続ける必要があり,スピードが要求されます。

できるだけ 高速に画面に出力するため私はデータのbit毎のバッファデータをあらかじめ用意しておき,その上位bit担当のバッファから順にbit3担当のバッファは8回,bit2のバッファは4回,bit1のは2回,bit0のは1回出力して色の諧調を作っています。



今回のArduino IDEによるRaspberry Pi Picoでのプログラムはパラレル出力などでかなり速くなりました。RGB各5bit階調ぐらいまではいけそうな感じです。

Raspberry Pi Picoはデュアルコア(マルチコア)でもあるので,気ぜわしい画面出力部を並列処理にまわしておくと,動きなどのデータ処理が楽になりそうなので,これも試してみたいですね。

WiFiやBluetoothはありませんが,案外コスパが良いMPUだと思っています(^^)。





AD