Home Made Garbage

SPRESENSE のマルチコアプログラミングで バーサライタ

ホーム
電子工作
Raspberry Pi
IOT
WEB

ついにSPRESENSE にArduino IDEでのマルチコアプログラミング環境が誕生しました。

 

前回SPRESENSEを使用して製作したバーサライタ(POVディスプレイ)にマルチコアを導入してどれほどの高速動作が達成されるのか観てみました!

SPRESENSE で バーサライタ

 

 

マルチコアプログラミング

SPRESENSEは6つのCPUを搭載しております。Arduino  IDE環境でのプログラミング詳細は以下の公式のドキュメントの記載の通りです。

 
MPライブラリというマルチコア用のライブラリが今回追加となりました。Mainコアと5つのSubコアの制御やコア間の通信を司ります。

コアごとにArduinoプログラムを用意して、コアを指定してコンパイルというなかなかの力技です(;^ω^)

構成の概要

3つのCPUを使用してバーサライタしてみました。

  • Mainコア:フォトリフレクタで回転を検出して2つのSubコアに発光タイミングを送信
  • Sub1, 2コア:Mainコアからのタイミングを受けてSPIテープLED Dotstarを発光

 

Arduino IDEコード

Mainコア

フォトリフレクタでバーサライタ装置のマーカを検出して割り込みで回転時間を測定してMP.Send関数で表示すべき画像のアドレスを各Subコアに渡しています。

コア間でメモリが共有されているので表示データのアドレスだけを渡しています。

 

LED表示画像データ graphics.h は画像やGIFからpythonで生成しています。画像の色データを極座標変換してLED用に配列にしています。またLED位置によって輝度を線型的に調整してバーサライタ表示時に明るさが均等になるようにしています。Divで1周当たりの画像分解能を指定しています。

 

Sub1コア

Mainコアからの画像アドレスをMP.Recv関数で受けてLED発光させます。MP.RecvTimeout関数でデータ受信の待ちモードを指定しており、ここではMP_RECV_BLOCKINGでデータを受信するまで永久に受信待ちに入るモードにしています。

Adafruitが提供するライブラリのハードウェアSPI使用では拡張ボードのSPI4しか使用できないためAdafruit_DotStar.cpp と Adafruit_DotStar.h をメインボード用に改造して
Adafruit_DotStar_SPI5.h、Adafruit_DotStar_SPI5.cpp
をつくってSPI5でLEDテープを制御できるようにしました。

 

Sub2コア

Mainコアからの画像アドレスをMP.Recv関数で受けてSPI4でLEDテープを発光させます。

 

 

動作

1コアから3コアにすることで1周での画像分解能が120から400にまで向上しました!わーい!!

性能指数:LED 57個 × 回転速度 730rpm × 400分解能 ÷ 100 = 166440 hPOV

 
ちなみに性能指数とはバーサライタの性能を示す独自の指標です。

 性能指数  [hPOV(ヘクトポブ)] = LED数 × 回転数 × 一周の分解能 ÷ 100

次は今回のアップデートでフラッシュメモリへの読み書きのライブラリも追加されたので長尺の動画表示にトライしたいです。

マルチコアへの道

シングルコア

性能指数:LED 58個 × 回転速度 730rpm × 120分解能 ÷ 100 = 50808 hPOV

デュアルコア

性能指数:LED 58個 × 回転速度 730rpm × 220分解能 ÷ 100 = 93148 hPOV

その後の話

フラッシュ仕様検討

分解能が上がったことによって表示データが大きくなり、現状ですと5フレームしか書き込めない状態です。

SPRESENSEのコンパイルされたコードはフラッシュメモリにインストールされ、実行されるときにSRAMに展開されて実行されます。
SRAMは1.5MBのうちのMineコアが768kB、Subコアが128kB割り当てられます。

表示データに使用できる容量はSRAMサイズを超えられないのです。。。

そこで8MBもあるフラッシュを有効に使用できないか検討しました。
Fileライブラリを使用するとフラッシュにファイル形式でデータを保存できます。

そこで表示データ(LED57個 × 分解能400の32ビットデータ)をテキストデータとしてフラッシュに保存して、再度読み込んで配列にする実験をしました。
テキストデータを1文字づつ読んで32ビット分で文字列にして16進数に変換して配列化しました。

1フレーム分の配列を読み込むのに3分20秒もかかりました。。。。

マルチコアで読み込んで配列生成しながら、長尺の動画を表示したかったのですが時間がかかり過ぎのため断念しました。。。

参考

装置構成の変更

2本のLEDテープの配置を2本平行ではなく、1直線に並べました。回転の際の表示のずれを抑えるためです。

 

ずれが軽減され精度が増しました。でももっとやりたくなっちゃう。。キリがないww

 

さいごに

今回のSPRESENSEバージョンアップによってバーサライタの性能が大きく向上しました。

いつかフラッシュメモリの使用も気軽にできるようになるかと思います。今回のバージョンアップのように。

祈りを込めて。。。

そして バーサライタ装置をステージ上にそっと置き
 地を引きずりながら漂う煙のようにその場を後にした。

しかし その表情はどこか誇らしげであったという

Related Posts

コメントはこちらから

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

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