前回からのつづき
この記事はOgaki Mini Maker Faire 2024出展記 (準備編その1)からのつづきです。
OAK-Dカメラを使ってmediapipeの手認識モデルを動かし、かざした手の位置やジェスチャに応じてRaspberry Piでホワイトボードに磁石で貼ったtoio core cubeを動かす展示をしようとしたのであった。が!
やっぱりもう少し小さい展示にしよう
このまま出せばよかったのではありますが、展示ブースの仕様(横幅180cm)および、ブース位置(角ではなく両側が別ブースで埋まっている)の都合もあり、A2サイズ(A3のプレイマットx2)を展示するのはちょっと大きすぎるのではないかという懸念がありました。180cmを3人で割って使うので一人あたりは60cm幅になります。時間を決めて入れ替えながら展示、という手もありますがそれはそれで面倒。
なおかつA2サイズのホワイトボードパネルを持ち運ぶのもけっこう面倒ということもあり、もう少し小さめの展示物に変えよう、と思いました。
サイズは半分のA3プレイマット1枚分に縮小、編隊を組む機数も狭いので3機に減らす。たてて磁石で吸い付かせるのもやめて平置き、そして手認識も別のカメラセンサ GROVE SmartIRジェスチャセンサに変更し、さらにコンパクトに。これだと幅60cm以内に収まります。
ただ、狭いとtoio core cubeを動かす範囲も限られるため、手の動きに対して動かした感が小さいのと、何かしらの視覚的手段で手の位置を操作している人にフィードバックしないと今一つ操作している感がないという問題がありました。
そこで、手の位置はここだと見えてるよ、というのを操作している人に知らせるため、LEDマトリクスをA3プレイマットの下に敷き詰めて発光させてマットの紙ごしに視認できるようにしました。たまたまAmazonのセールでポイント還元がある期間だったので、以下の製品を3枚購入し、つなげてほぼA3サイズ(よりはちょっと小さい)のLEDマトリクス表示装置として使うことにしました。(2022年の展示では24インチ液晶ディスプレイを使いましたが、LEDマトリクスのほうがもっと明るいだろうというのと、前回と同じことはしたくなかったというのはあります)
LEDマトリクスパネルの準備
電気的接続方法
このタイプのLEDマトリクスパネルはHUB75という仕様の信号で動作させます。HUB75のインタフェースを作るのもそんなに大変ではないですが、すでに既製品があるのでそれを使うことにしました。幸い、pythonから呼び出せるライブラリも用意されています。
国内通販ではマルツでの扱いがあります。
なお、接続に必要なケーブルはAmazonで買ってもマイクロファンのものであれば、パネルの枚数に応じて必要な数のHUB75ケーブル、電源ケーブルをつけてくれます。電源そのものは別途自分で用意する必要があります。
(ケーブルのコネクタをはめていくだけで配線はできますが、そこそこ大電流の電気を扱うので電子、電気工作の安全知識は必要です。)
パネルの連結
LEDマトリクスパネルの裏にはM3の雌ねじがあるのでそこを使って連結するような部品を3Dプリンタで作成しました。1枚が64x32ピクセルなので、3つ並べると64x96ピクセル、上下左右に2cmづつ程度の余白をつけるとちょうどA3サイズになるように連結部品を作ってみました。
以下の場所に部品の3Dデータ(3mf、Autodesk Fusion用データ)を置いておきます。
Raspberry Piへ表示ライブラリのインストール
基本的にこちらの説明どおりにインストールしていけばRaspberry PiからpythonでLEDマトリクスに描画できるようになります。ただし、Adafruitで提供しているライブラリはRaspberry Pi 5Bには対応していません。(5BからGPIOのアーキテクチャが違うので) 使えるのはZeroシリーズ、素A+/B+、2~4シリーズまでとなります。
Raspberry Pi 5Bを使う場合はこちらのライブラリが使えそうですが、Adafruitで紹介しているhzellerさんのものとは互換性はありません
GROVE SmartIRセンサの準備
このセンサはI2C/SPI/USBのいずれかのインタフェースでホストとつないで手や指の位置、ジェスチャの情報を得ることができるのですが、公開されているライブラリはArduino用のもののI2C/SPI用のみです。ですので、一旦Arduinoで動くMCUボードXIAO(SAMD21)で受けてそこからUSBシリアル通信でRaspberry Piとつなぐこととしました。手や指の情報は単純にCSVのテキスト情報として送り出すようにしました。
(あとで GROVE SmartIRセンサに関する別記事へのリンクを入れる)
全体構成
toio core cubeをのせて走らせるパネルがA2からA3になったのと、手の位置表示も兼ねるのでだいぶコンパクトになりました。LEDマトリクスパネルも3分割なので、バラしてしまえばコンパクトに持ち運べます。
pythonスクリプトは以下の場所に置いておきます。
なかなかまとまらない
最初、Raspberry Pi Zero W で作り始めたのですが、ちょっとパフォーマンスが足りないのと電源をけちったせいもあり、誤動作やリセットがかかりがちだったので、電源も秋葉原の秋月電子で買える大電流のものに変更するとともに、ちょうど手元にころがっていたRaspberry Pi 3Bに変更。(Visual Studio Codeのsshリモート接続がRaspberry Pi Zeroではできない、という理由もあります)
これでだいぶ安定動作するようになり、とりあえずSmart IRジェスチャセンサでとらえた手の位置をLEDマトリクスパネルに表示、toio core cubeを1機、手の位置追従でうごかせるようにできました。また、手を1本指にするとおしりからスモークを出す、という機能も付けました。
ここまでできればあとはtoio core cubeの数を1から3に増やして編隊にすればいいから簡単...と思っていたのですが、3機になると機体どうしがぶつかったり、押し出されてマットから落ちたりしてなかなかうまくいかず...なおかつpythonスクリプトの作りがわるく、複数機体の制御をするとLEDマトリクスパネルの表示が遅くなったりしてなかなか大変でした。
展示に向けて出発の2日前の時点で若干調整不足ですが時間切れと判断。まあ展示できないことはないレベルまでは来たのでいったんここで切り上げて、あとは出展準備にとりかかります。(日中は本業がありますので、夜にちょっとづつ作っていたのでした)