SpotpearのPico HDMI boardを使ってみました。
マイコンとモニタをHDMIで接続して映像出力する基板です。
記事の内容
Ali ExpressでHDMI出力のできる Pico HDMI Boardを入手しました。
・Raspberry Pi Picoと合体してHDMI出力してみる
・サンプルの動作
・文字列の表示
こんな方にお勧め
・Raspberry Pi Picoを使って文字や図形をHDMI端子付きモニタに出力したい
Pico HDMI board
外観

Raspberry Pi Picoと合体させました。
USBコネクタとHDMIコネクタが同じ方向になるように接続します。
おさまりのいい四角柱になります。

使ってみた
Ali Expressで入手時は350円(本体) + 300円(送料)です。
Spotpearのサンプルがあるのでいくつか試してみました。
サンプルは「使い方」で解説します。
マイコンでは4インチ程度までのLCDをSPIで制御することが多いです。
HMIなどのCPU制御付きのモニタでも10インチ前後ですが、大型のモニタへの出力ができます。
とはいえ解像度は粗いので見苦しさは感じます。
きれいに合体しますが、すべての端子が使用できなくなります。
◆作例
当サイトロゴを3D回転させてみました。
少しちらつきが出ていますが描画速度十分早く、工夫すればちらつきも抑制できると思います。
この3Dデータを作るためにビットマップデータ(32 x 32pixels)を各ドットdouble()型でx,yの座標化していましたが始めは動きませんでした。
必要なドットデータだけ残して、できるだけバッファを使わないように工夫すると表示されました。
ワーキングメモリを大きく消費されているのかわかりませんが、あまり潤沢にメモリは使えないようです。
まとめ
良い点はパソコンやテレビにマイコンで書いた絵や文字を表示できます。
文字や図形描画ライブラリも充実していて手軽に使用できます。
Raspberry Pi Picoと合体して使用できるので、簡単な接続でおさまりがいいのは利点です。
反面イマイチな点は、すべての端子を占有してしまうのでHDMI表示以外の使い方ができなくなってしまいます。
また大きなワーキングメモリを使用しているようで、3D回転スケッチを作ったときバッファを小さくしないと動かなくなってしまいました。
準備
Arduino環境
Arduino環境でRaspberryPi Picoを使用します。
Arduino環境の準備はこちらの記事で紹介しています。
ボードライブラリ
今回Raspberry Pi Picoを使用します。
Arduino IDEのボードマネージャからRP2040用のライブラリのインストールとボードの選択をします。
ボードライブラリには「Raspberry Pi Pico/RP2040 by Earle F. Philhower, III」を使用します。
Generic RP2040またはRaspberry Pi Picoを使用します。
追加のボードマネージャのURL | https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json |
検索 | RP2040 |
ボードライブラリ | Raspberry Pi RP2040 Boards(x.x.x)※ |
選択するボード | Raspberry Pi RP2040 Boards(x.x.x) > Raspberry Pi Pico |
モジュールライブラリ
動作には [PicoDVI – Adafruit Fork by Luke Wren(Wren6991)を使用しました。
バージョン1.1.0を選択するとインストール時に多くの依存関係が含まれますが、必要なのは下表の3つです。
(バージョン 1.0.7では必要なライブラリのみをインストールするようです)
ライブラリ名 | 検索 | 確認時バージョン |
---|---|---|
PicoDVI – Adafruit Fork by Luke Wren(Wren6991) | dvi | 1.1.0 |
Adafruit BusIO by Adafruit | busio | 1.16.1 |
Adafruit GFX Library by Adafruit | gfx | 1.11.10 |
1.1.0(2024/9時点での最新)をインストールする場合、多くの依存関係のインストールを推奨されます。

※注意
依存関係のうち「SdFat – Adafruit Fork」がインストールされるとRaspberry Pi PicoでSDカードリーダモジュールのコンパイルができなくなります。
インストールした場合は、あとから個別の削除をすることで解消できます。
使い方
サンプルの実行
説明
HDMI出力のサンプルを動かします。
uf2形式でも提供されているので、Raspberry Pi Picoをマスストレージ認識させて、uf2ファイルをドラッグアンドドロップして書き込みします。
このuf2ファイルを書き込むとシリアル認識されなくなるため、Arduinoスケッチを書きこむ場合はフラッシュの初期化をします。
フラッシュの初期化とシリアル認識は以下の記事を参考にしてください。
作業
1.サンプルを以下のサイトからダウンロードします。
Spotpear pico-HDMI-boardページ : https://spotpear.com/index/study/detail/id/971.html
2.サンプル圧縮ファイルを展開し、サンプルフォルダへ移動します。
Pico-HDMI-board.zip をダウンロードします。
ダウンロードしたファイルを解凍し、解凍フォルダ以下フォルダへ移動します。
…\Pico-HDMI-board\software\build\apps
3.パソコンと接続したRaspberry Pi PicoのBOOTボタンを押しながら電源を投入します。
(picoHDMIboardと接続状態で行います)
4.このフォルダの下位フォルダには拡張し uf2 ファイルを含むファイルが保存されています。
uf2ファイルをストレージ認識されたRaspberry Pi Picoにドラッグ&ドロップする。
この作業でHDMIモニタへの出力ができます。
一度uf2ファイルを書き込んだRaspberry Pi Picoはシリアル認識されなくなっているので、Arduino上で開発する場合は、「説明」にあったフラッシュの初期化とシリアル認識を実施します。

結果
何種類かHDMIモニタに出力しました。
chiristmas_snowflakesは雪の結晶が降り注ぐアニメーション、hello_dvi-okでは、RaspberryPi 5基板が縦にスクロールするアニメーションでした。

文字表示
説明
Arduino環境でのスケッチです。
文字表示のサンプルを出力です。
“Pico HDMI Board”と表示し、立体っぽく表示します。
暗い色と明るい色を斜めにずらすことで凹凸を演出しています。
色のサンプルとして”TAMANEGI BLOG”を色を変えながら表示します。
パレットは16ビットで、赤5bit, 緑6bit,青5bitで構成されています。
スケッチ
#include <PicoDVI.h>
DVIGFX16 display(DVI_RES_320x240p60, picodvi_dvi_cfg);
//パレット情報
//16のbit情報, 赤 5bit, 緑 6bit, 青 5bit, (RRRR RGGG GGGB BBBB)
#define DVI_BLACK (0x0000)
#define DVI_BLUE (0x001f)
#define DVI_GREEN (0x07e0)
#define DVI_LBLUE (0x07ff)
#define DVI_RED (0xf800)
#define DVI_PURPLE (0xf81f)
#define DVI_YELLOW (0xffe0)
#define DVI_WHITE (0xffff)
#define DVI_LGRAY (0xbdf7)
#define DVI_GRAY (0x7bef)
#define DVI_DGRAY (0x39e7)
void setup()
{
display.begin();
display.fillScreen(DVI_GRAY);
display.setFont();
//立体演出
display.setTextSize(3);
display.setTextColor(DVI_DGRAY);
display.setCursor(11, 11);
display.println("Pico HDMI Board");
display.setTextColor(DVI_LGRAY);
display.setCursor(9, 9);
display.println("Pico HDMI Board");
display.setTextColor(DVI_GRAY);
display.setCursor(10, 10);
display.println("Pico HDMI Board");
//各色表示
display.setTextSize(2);
display.setTextColor(DVI_BLACK);
display.setCursor(10, 50);
display.println("TAMANEGI BLOG");
display.setTextColor(DVI_BLUE);
display.setCursor(10, 70);
display.println("TAMANEGI BLOG");
display.setTextColor(DVI_RED);
display.setCursor(10, 90);
display.println("TAMANEGI BLOG");
display.setTextColor(DVI_PURPLE);
display.setCursor(10, 110);
display.println("TAMANEGI BLOG");
display.setTextColor(DVI_GREEN);
display.setCursor(10, 130);
display.println("TAMANEGI BLOG");
display.setTextColor(DVI_LBLUE);
display.setCursor(10, 150);
display.println("TAMANEGI BLOG");
display.setTextColor(DVI_YELLOW);
display.setCursor(10, 170);
display.println("TAMANEGI BLOG");
display.setTextColor(DVI_WHITE);
display.setCursor(10, 190);
display.println("TAMANEGI BLOG");
}
void loop()
{
}
結果
loop()で再描画を繰り返すとちらつくので、setup()で描画を完了させています。

コメント