小型ボリューメトリックディスプレイ
(mitxela.com)- 小型のLEDマトリクス、RP2040ボード、LIR2450バッテリー、モーターを丸ごと回転させ、**残像効果(POV)**に基づく手のひらサイズの3D表示装置を作ったプロトタイプ
- 8x10 LEDマトリクスを回転させ、IRセンサーで周期を読み取り、測定した速度に合わせてボリューメトリックバッファを出力
- RP2040のデュアルコアとGPIO同時制御を活用し、一方のコアは回転間隔を計測し、もう一方のコアはLEDデータをサイクル単位で出力
- バッテリー保護回路、充電方式、3Dプリントホルダーの耐久性、LED電流制限の欠如が主な制約であり、プロトタイプでは約3.6V未満で警告を表示
- Blenderで3D極座標スライスと流体・炎シミュレーションデータを作成したが、カメラには実物より立体感が弱く写り、次のバージョンでは位置合わせと解像度の改善が必要
回転する電子キャンドルのアイデア
- 目標は、どの角度から見てもちらつくろうそくの炎のように見える電子キャンドルを作ることだった
- 一般的な残像ディスプレイはベアリングやスリップリングのような支持構造が必要になるため、モーターとバッテリーを十分小さくして装置全体が一緒に回転する方式を選んだ
- LEDマトリクス基板は、別のPCB注文に一緒に入れて素早く製作した
- 中国では小型PCBは実質的に安価で、より重要なのは配送の速さだった
- Charmhigh CHM-T36VAピックアンドプレース機を使用
- 部品リールを載せる作業には時間がかかるが、このLEDマトリクスは部品種類が1つだけなので、基板組み立てを素早く繰り返せた
- ステンシルは正式には製作せず、アセテートにレーザーエッチングして使用
- LEDマトリクスは0603と0805部品でそれぞれ作成し、後続バージョンでは直角支持用の円形PCBを構想
ハードウェア構成
- マイクロコントローラーは小型サイズとフラッシュ容量を考慮してWaveshare RP2040-tinyを選択
- Raspberry Pi Picoはデュアルコア125MHz、最大16MBフラッシュ、低価格が利点だが、ボード自体が大きすぎた
- bare RP2040は外部QSPIフラッシュ、クリスタル、補助コンデンサなどが必要で、単独使用は面倒
- RP2040-tinyはPicoを実質半分にしたような形で、USBポートとreset/bootボタンはフラットフレックスケーブルで接続された補助ボードにある
- バッテリーはLIR2450を使用
- リチウムイオン充電式で、100mA以上を供給できる
- より小さいLi-ionバッテリーは容量と電流供給能力が下がる
- RP2040ボードが対角約29mmあるため、より小さなバッテリーを使っても結果はこれ以上小さくならない
- バッテリーホルダーはPETGで3Dプリント
- 初期バージョンは壁厚0.5mmで2つの部品を接着した構造だったため、落とすたびに接着線が割れる弱点があった
- その後は壁厚1mmと、別方向でのプリント構造を試した
- 回転検出はTCRT5000 IRセンサーで処理
- 出力はアナログだが、pull-upをかけてGPIOに直接接続
- RP2040入力にはソフトウェアで無効化可能なシュミットトリガがあり、実質的にコンパレータのように使えた
- モーターはRF-410CAを選択
- 類似のCD/DVDドライブ用モーターは直径や軸長が少しずつ異なっていた
- 30FPSには約1800RPMが必要で、多くの小型モーターの無負荷速度5000〜10000RPMは速すぎた
- 速度はPWMで下げる方針にした
回路とプロトタイプ組み立て
- LEDマトリクスは8x10構造なのでGPIOを18本使用
- これに加えて、センサー入力1本、モーター制御1本、バッテリー電圧監視1本も必要
- ボード上のWS2812 LEDはGPIO16に接続されており、マトリクス用GPIOを確保するためにLEDを取り外してエナメル線をはんだ付けした
- モーター制御には小型のSOT-23 MOSFETとフライバックダイオードをデッドバグ方式で取り付けた
- IR LEDは電源ラインに直接接続
- 回転していないときの省電力のためにはソフトウェア制御が理想だが、プロトタイプではGPIO節約のため省略した
- LEDマトリクスは電流制限抵抗やドライバトランジスタなしでGPIOに直接接続
- RP2040 GPIO全体のsource/sink電流は約50mA
- GPIOのオン抵抗とPWMデューティサイクル制限に頼る方式であり、チップが停止してマトリクスが固定点灯するとLEDを過電流駆動する可能性がある
- バッテリーのプラス端子はボードのVBUSに直接接続
- この構造ではUSBケーブルを接続するとバッテリー端子に5Vがかかる可能性があり、プロトタイプ段階の仮ハックに近い
- バッテリーを外すために背面に小さな穴を開け、プラスチックが割れた後はゴムバンドでバッテリーを固定した
表示制御ソフトウェア
- ソフトウェアはIRセンサーを監視し、トリガー間の時間を使ってマトリクス表示速度を決める
- RP2040はすべてのGPIOピンを同じクロックサイクルで設定・入力できる点が利点として活きた
- STM32は32ビットプロセッサでもIOが16ビットレジスタに束ねられており、同時変更を試みるとバス競合の問題がある
- 必要なGPIO出力データは事前に前処理しておき、測定した回転速度に比例して順次出力する
- デュアルコアARM Cortex-M0は割り込みではなくbusy-waitループで使用
- 1つ目のコアはIRセンサーを監視し、SysTickでトリガー間のサイクル数を測定
- 2つ目のコアは照明信号を待ち、その後自身のSysTickでボリューメトリックバッファをサイクル精度で走査する
- モーター制御は単純なロジックから開始
- RPMが1200未満ならモーターを90%出力で駆動
- それ以外では60%出力に下げる
- 慣性と空気抵抗のおかげで、現在のプロトタイプではこの単純制御で十分機能する
- マトリクスは列単位でスキャン
- 上から見ると各放射線は少し螺旋状になるが、全体がヘリックスになるより補正しやすい
- 中心部LEDのデューティサイクルは外周部より比例的に下げる
バッテリー電圧監視と充電
- LIR2450 bare cellには保護回路がなく、電圧が下がりすぎると永久損傷する可能性がある
- 3Vを大きく下回ると問題で、実際の限界はセルによって約2.7V程度
- 電圧監視は100K抵抗2本で分圧し、最後に残った使用可能なGPIOへ接続
- RP2040-tinyではADC基準電圧が可変だった
- ADC基準が電源電圧だと、電源電圧が下がる際にバッテリー電圧低下を検出しづらい
- RT9193-33 3.3V LDOは300mAでdropoutが220mVのため、バッテリーが3.52Vに達するとRP2040の電源電圧も下がり始める
- プロトタイプでは約3.6V未満で警告を表示するよう設定した
- 次のバージョンでは基準電圧の追加を計画している
- 最初はバッテリーを外して単独充電器に入れる方式だったが、新しい充電器は初回使用で故障した
- その後、ベンチ電源を50mA電流制限と4.2V定電圧に設定して単セルのリチウムイオンを充電
- バッテリー容量が120mAhか60mAhか確信が持てなかったため、1Cより保守的な充電電流を選んだ
- 開発の便宜のため、PCとRP2040-tinyプログラミングボードの間に挟むUSBインターセプトボードを作成
- 5Vラインを切り離してバッテリーピンを露出し、バッテリーを外さずに電源を接続できるようにした
- データラインは接続されたままなので、バッテリーを装着したままプログラミングできる
- 後にBQ21040DBVRリチウムイオン充電ICをUSBインターセプトボードの途中に取り付けた
- プログラミングケーブルをつないだままバッテリーを充電できる
- プロトタイプは電源が切れず、IR LEDだけでも約9mAを消費し、全体の待機電流も約15mAあるため、完全充電終了条件には到達しない
- ケーブル電圧降下のため、バッテリー電圧も4.1V以上まで上がらない可能性がある
Blenderでボリューメトリックデータを作る
- 表示データは3D極座標 r, theta, z 形式で生成する必要がある
- 最初のテストはワイヤーフレームキューブで行った
- Blender標準キューブにwireframe modifierを適用
- キューブの稜線が上を向くようにx軸45度、y軸
atan(1/sqrt(2))だけ回転
- スライス生成のため、別のキューブを薄い切片状に変形し、boolean modifierを使用
- カメラとスライスをEmptyにparentし、EmptyのZ回転をアニメーション化
- カメラはorthographicに設定し、解像度を8x10に合わせた
- 背景は黒、キューブ材質はemissiveにし、compositorのcolour rampでしきい値を決めた
- 現在のディスプレイは1ビット voxelのみ使用
- 各voxelはオンかオフしかない
- Blenderでしきい値を調整し、適切なcutoffを見た目で選んだ
Render animationはワイヤーフレームキューブの24枚のスライス画像を作り、Pythonスクリプトでこれをヘッダーファイルに変換してコードに含めた- Blender driverを使ってカメラ回転とキューブ回転をフレームベースの式で制御
- カメラ回転には
(frame/24)*2*piを使用 - キューブのy回転には
floor(frame/24)*pi/24を使い、1周ごとに少しずつ回転するようにした - モーターRPMに応じて再生速度を調整できるよう、各データフレームを離散的に保とうとした
- カメラ回転には
流体と炎のシミュレーション
- Blenderの流体シミュレーションは始めるのは簡単だが、多くのパラメータのため狙った結果に合わせるのが難しかった
- 液体シミュレーションは流体粒子をmeshに変えやすく、ボリューメトリックディスプレイへ移すのも比較的容易だった
- 1/24速度でシミュレーションした後、同じ方法で極座標ボリューメトリックデータを抽出しようとしたが、極端に遅い時間スケールは不安定性を生み、再生速度を落とす簡単な方法は見つからなかった
- Multi-viewまたはStereoscopy機能も検討
- 複数のカメラを追加して複数視点を同時にレンダリングできる
- しかし24台のカメラを等間隔に回転させる手早い方法がはっきりせず、スライス用boolean modifierも一緒にレンダリングする必要があった
- カメラのclipping distanceで薄いシーン切片をレンダリングする回避策も試した
- 切断されたオブジェクトの内部が埋まらず、表面だけが描画される問題があった
- volumetric materialである程度埋められるか試したが成果はなかった
- 最終的にはBlender Pythonスクリプトで24回レンダリングした
- EmptyのZ回転を24個の角度に変え、各角度でアニメーション全体を再レンダリング
- これによりリアルタイム流体シミュレーションを保ったまま、各回転方向のスライスを得た
- 炎シミュレーションはOpenVDBにbakeした後、再びBlenderに読み込んで処理
- Volume to Mesh modifierでボリュームデータにしきい値処理を施した
- その後カメラスライスとboolean modifierを適用し、同じスクリプトを再実行した
表示品質と次のバージョン
- 実機は写真や動画より立体感が強く見える
- LEDの位置ずれはソフトウェアで補正できる可能性がある
- boolean sliceの位置を中心から少しずらして、実際の回転中心に合わせられる
- マトリクススキャンパターン補正のために、引き伸ばしたキューブの代わりに少し曲がった形を使うこともできる
- 現在の解像度ではこうした改善は目立たないかもしれない
- 最も重要な条件は、外周部の個々のvoxelがどの角度からでも1つの点として見えること
- 位置合わせがずれると、1つのvoxelが2回点灯したように長く見えることがある
- 中央の文字
mは、どの方向からでも読めるよう別方式でレンダリングした- 前後どちらから見ても読める向きでテキストがスクロールするようにした
- 次のプロトタイプでは位置合わせと解像度を改善する予定
- 小型のスライドスイッチがなかったため、バッテリーを外さずに電源を切る機能は入れられなかったが、小さなアセテート片をバッテリーと接点の間に挟む方法で対処した
- IRセンサーがすでにあるのでリモコン追加も可能そうだが、現在のセンサーは復調型ではない
- ソースコードはGitHubで公開されている: source code on github
1件のコメント
Hacker Newsの意見
改善アイデアがいくつかある。同じモーターの予備があるなら2つ分解して、2つのアセンブリのブラシで回転式の電力伝達装置を作れる
装置1つにつきモーターを2個犠牲にする必要はあるが、ぴったり合って非常に安定しており、コンデンサと整流器を付ければ、もうバッテリーを気にしなくてよくなる
整流器はアセンブリが1回転したという信号も出してくれるので、周期を推測せずに実際の位置を基準に画像の安定化を維持できる
誘導で電力を送ることも可能かもしれないが、十分な効率で伝送できず、入力電圧を上げすぎる必要があり、火災が心配だった
この助言は2001年のBurning Manのアートプロジェクトから得たもの。かなり悲惨な初期プロトタイプの写真はこちら: https://github.com/sowbug/tqw/blob/master/photos/side.jpg。最終的なインスタレーションはとてもよく動作した
LIDAR企業はこういうことをどう処理しているのかも気になってくる
1: https://www.adafruit.com/product/1407
2: https://www.adafruit.com/product/2162
後から見れば当然に思えるひらめきのあるアイデアの1つだ
比較的原始的な個別部品を手作業で組み合わせただけでも結果がこれほど説得力あるなら、次のクリスマス頃にAmazonのどこかの7文字のドロップシッピングブランドからフルカラー高解像度版が出ない理由はないのではと思う
ただし大半はただのおもちゃに近い。透明に光る表面しか表示できず、触れることもできないなら、実際にできることは多くない
ケーブルで吊ったLEDで作った、ずっと大きな非回転版も見られるし [2] とても格好いいが、目新しさはすぐに薄れ、生産的な用途に使うディスプレイではないと気づく
何でも高品質にレンダリングして操作できる本物の3Dビジュアライゼーションが欲しいなら、VR/ARヘッドセットが適しているように見える。メガネ不要の新しい3Dモニターもあるが、まだ実際に見た人は多くない
Amazonで売れそうなおもちゃは作れるかもしれないが、こういう物にキラーアプリがあるのかはよく分からない
[1] https://en.wikipedia.org/wiki/Volumetric_display#Swept-volum...
[2] https://www.ledpulse.com/
本当にすばらしい小さなプロジェクトだ。他のプロジェクトもぜひ見るべき。一部は以前HNにも投稿されていた
https://mitxela.com/projects/hardware
個人的にはMIDIスライドホイッスルが一番好き
[0] https://mitxela.com/projects/headphone_amps
創造的。こういうものを最後までやり遂げる粘り強さと興味はたぶんあるけれど、こんなに素晴らしいプロジェクトを思いつく想像力が足りない。
幸いインターネットがあるので、人々が作り出す印象的なものを見ることができる。
そうすれば、プロジェクトに取り組むエネルギーが湧いたときに、アイデアを思いつくことにエネルギーを浪費せずに済む。
サイドプロジェクトで実際に完成させられる量が大きく変わる。思っているより興味深いアイデアをたくさん持っている可能性は高い。ただ、アイデアが浮かぶタイミングと、それを実行したり広げたりする時間・エネルギーがあるタイミングが合わないと、消えてしまう。
粘り強さと規律が身についても、今度は請求書を払わなければならないので、邪魔者はアイデアBではなく、ただの普通の仕事になる。
何かを記録しておくことには同意する。たいていのことと同じで、真剣に練習すれば上達する。
よく見落とされるのは、(1) 技術的知識、(2) 体系的な発明、(3) 動機。
技術的知識があれば、どんなプロジェクトが可能か、あるいは経済的に実現可能かが分かり、道中の障害物を描けるようになる。不可能な発明はあまり役に立たない。
体系的な発明とは、ランダムに思いつくのではなく、物事を体系的に見ていくこと。たとえば (a) 体積ディスプレイを作りたい、(b) 仮想3D物体に命を吹き込みたい、を分析するようなもの。この2つの間には微妙な違いがある。
体積ディスプレイ (a) は、優雅な理論的基盤を持つライトフィールドディスプレイから、ここで見られる体積残像ディスプレイまでさまざま。問題領域を深く調べれば、可能な解法にいずれたどり着く可能性が高い。
3D物体に命を吹き込むこと (b) は、デジタルファブリケーション、VRゴーグル、触覚インタラクション、ロボットなど、はるかに広い問題領域を意味し得る。
動機も本当に重要。なぜ発明するのか、何を現実にしたいのかを理解することにも大きな意味がある。人々に喜びを与えたいのか、単にものすごく格好いいのか、命を救える有用な医療機器なのか、といったこと。
価値あるテーマに集中する方法も学べるし、発明の腕を大きく高めてくれる。もちろん、ただ自分たちが好きだから作るというのも重要で正当な理由 :)
個人的にいちばん大事なのは、その過程を楽しむこと。
これはホログラムファンの動作方式と非常によく似ている。すべての電子機器が回転する部分の中にある。
そうしたファンでは、上側の基板を駆動するためにワイヤレス電力伝送をよく使う。
https://youtu.be/bT716nyK0AY
ロンドンにいる、あるいは訪れるなら、180 Studios [1] の展示ではこうした種類の技術をアートショーでよく使っている。
アートと技術に興味があるなら行く価値がある。
[1] https://www.180studios.com/
こういうものが好きなら素晴らしい YouTube チャンネル。
安いOLEDディスプレイを十分速く更新して、もっと高い解像度を出せるのか気になる。可能かもしれないが、放射状の断片の間の空間がピクセル間隔よりはるかに大きくなる可能性が高く、むしろ見た目が悪くなるかもしれない。
中心合わせの問題は、LED基板を2枚、上に背中合わせで載せれば解決できそう。
片方の基板はLEDを半分だけずらしてインターレース効果を作り、同時に解像度を2倍にすることもできる。
もっと大きい 50x50 くらいの、頑丈なRGB版があって、コーディングなしで別の画像を表示できるなら、200ドル以上払う気がある。
最近投稿されたがあまり注目されなかった、もうひとつの素晴らしい体積ディスプレイプロジェクトもある。
https://news.ycombinator.com/item?id=38406824