Raspberry Pi Pico バーサライタ解像度向上 (C/マルチコア) ーRaspberry Pi Picoへの道7ー

Home > Raspberry Pi > Raspberry Pi Pico バーサライタ解像度向上 (C/マルチコア) ーRaspberry Pi Picoへの道7ー
すき 0
うんこ 0

前回はRaspberry Pi Pico を用いてバーサライタを製作しました。

Raspberry Pi Pico でバーサライタ製作 (C/C++) ーRaspberry Pi Picoへの道6ー

ここでは、表示映像の解像度向上のためにSPI複数出力とデュアルコア動作を検証しましたので報告します。

 

 

SPI複数出力

Raspberry Pi Pico にはハードウェアSPI端子が2個あります (SPI0, SPI1)。

 

この2つのSPI端子でそれぞれLEDテープを制御してみました。

 

Cコード

PIO

SPI入力LEDをPIOなる機能で点灯制御しているのですが、2本制御の際はステートマシンなるモノを分けて使用するとよいようです。

PIOブロックは2個内蔵 (pio0, pio1)され、それぞれにステートマシン4個搭載されています (sm0~3)。

 
ここではpio0のsm0でSPI0を、sm1でSPI1を制御して2本のLEDを点灯しました。
 

狭ピッチバーサライタ

以前製作した狭ピッチのLEDバーサライタをRaspberry Pi Picoで制御してみます。

APA102-2020の再考 - バーサライタへの応用 –

このLEDはリフレッシュレートが低いためRGBそれぞれをフル輝度で使用しなくてはならず8色しか出力できませんが
2mm角のLEDが狭ピッチで配置されていますので解像度向上実験にはもってこいです。

構成

2つのSPI出力でLEDを64セル, 63セルずつ制御します。

 

 

動作

先ほどと同様に2個のSPI出力で制御し、回転速度470rpmで回してみたところ、計127個のLEDを1周 240分割で表示できました。

 

ESP32のデュアルコア制御でも200分割が限界でしたので、やはりRaspberry Pi Pico の高速IOは素晴らしいです。

 

デュアルコア制御

Raspberry Pi PicoはCortex-M0+を2個搭載しています。
更なる高解像表示を目指してデュアルコア制御を試します。

Cコード

core0で回転速度計測とSPI0のLED制御し、
core1でSPI1のLED制御しています。

 

しかし、

デュアルコアでの1周の分割数の向上は確認できませんでした。。。
core1でのLED点灯制御は確実にできていると思うのですが。

core1の動かし方に何か問題があるのでしょうか?

参考

 

画像表示

浮世絵を表示してみました。
シングルでもデュアルでも1周240分割以上にすると表示がおかしくなります。

シングルコア

 
 
 
 
 
この投稿をInstagramで見る
 
 
 
 
 
 
 
 
 
 
 

HomeMadeGarbage(@homemadegarbage)がシェアした投稿

 

デュアルコア

 
 
 
 
 
この投稿をInstagramで見る
 
 
 
 
 
 
 
 
 
 
 

HomeMadeGarbage(@homemadegarbage)がシェアした投稿

 

 

おわりに

ここではRaspberry Pi Picoを用いて狭ピッチLEDバーサライタを製作しました。
高解像表示を目指しましたがデュアルコアによる向上は達成されませんでした。

しかしLED 127個で1周 240分割は過去最大の分解能ですので、ひとまず嬉しいです。

 

デュアルコアはについては引き続き勉強します。なにか間違ってるかもしれません。

それでは次の道でお会いしましょう!

 

追記

回転検出部を別コア化(2021/2/17)

以下のブログでPIOで別ステートマシンでのLED制御がすでに並列処理されているために、
デュアルコアによる表示解像度の向上がなかったことがわかりました。

Raspberry Pi Pico バーサライタで PIO を考えるーRaspberry Pi Picoへの道8ー

そこでステートマシンでの並列処理については理解できたので、LED制御と回転計測をデュアルコアで試してみました。

以下のようにcore0で回転計測、core1でPIOのステートマシン2個でLED(64セル、63セル)を制御してみます。

 

結果としましては大きな分解能向上はありませんでした。
1周 240分解能がギリギリ260分割できそうになるくらいの変化でした。

 

ステートマシンが完全に並列処理できていて、回転が470rpm、SPI信号が30MHzの場合、理論分解能値はだいたい
 30MHz ÷ (32bit × 64セル + 64bit) × 60sec ÷ 470rpm = 1813分割
ですので、SPIクロックが遅すぎることはないようです。

まだまだデータ転送方法など工夫次第で高解像度化できそうですが、とにかくPIOは素晴らしいということがわかりました。

コメントはこちらから

メールアドレスが公開されることはありません。コメントのみでもOKです。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください