Arduino IDEでRaspberry Pi Pico のパラレルデジタル出力とSDカードの接続を確認したので,128X64RGB LEDディスプレイを動かしてみました。
今までは主にESP32DEVkit-Cで128X64RGB LEDディスプレイを動かしていましたが,Raspberry Pi Pico でもう少し速くなり4096色が使えそうという目論見です。
Raspberry Pi PicoとP2.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だと思っています(^^)。
今までは主にESP32DEVkit-Cで128X64RGB LEDディスプレイを動かしていましたが,Raspberry Pi Pico でもう少し速くなり4096色が使えそうという目論見です。
Raspberry Pi PicoとP2.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