Arduino Dueで作る美しいPOVシリンダー – ステップバイステップガイド
部品と材料
| 部品 | 数量 |
|---|---|
| Arduino Due | 1 |
| HC-06 Bluetoothモジュール | 1 |
| LPD8806 LED RGBストリップ IP20 60 LEDs/m - 30 ICs/m (1m) | 1 |
| 可変出力リニアレギュレータ (LM317等) | 1 |
| Texas Instruments 汎用デュアルオペアンプ | 1 |
| 抵抗 20kΩ | 3 |
| 抵抗 220Ω | 1 |
| 抵抗 1kΩ | 2 |
| 汎用NPNトランジスタ | 1 |
| コンデンサ 1000µF | 1 |
| コンデンサ 100nF | 1 |
| コンデンサ 1µF | 1 |
| 抵抗 240Ω | 1 |
| トリミング抵抗 1kΩ | 1 |
| IR送信機 (汎用) | 1 |
| IR受信機 (汎用) | 1 |
| ブレッドボード (汎用) | 1 |
| 発泡スチロールシリンダー (直径20cm、高さ10cm) | 2 |
| 電動モーター 12V (XDRIVE 545-1) | 1 |
| クラウンギア 60T 8mm | 1 |
| クラウンギア 12T 3.2mm | 1 |
| タイミングベルト 80T 6×200mm | 1 |
| ネジ付きバー M8 125mm | 3 |
| ネジ付きバー M8 330mm (シャフト用) | 1 |
| コンタクトリング ASL9017 | 1 |
| 粘着テープ (黒、48mm幅) | 1 |
| 合板ディスク (直径150mm、厚さ10mm) | 2 |
| アルミディスク (直径200mm、厚さ2.5mm) | 2 |
必要な工具と機械
- はんだごて
- 糸鋸盤
- ボール盤
- 直流安定化電源
- Windows 10搭載ノートPC
アプリとオンラインサービス
- Microchip Studio (Arduinoソフトウェア開発用)
- Arduino IDE (代替IDEとして使用可能)
- Cygwin (PCコントロールプログラム用)
- Microsoft Visual Studio 2015 (GUI開発用)
プロジェクト概要
はじめに
これは私の最初のArduinoプロジェクトです。Persistence of Vision (POV) ディスプレイを作成したメイカープロジェクト [2,3,4] に触発されました。
残像効果 (POV) は、複数の離散的な画像が人間の脳内で単一の画像として融合する光学的錯覚であり、映画やアニメーションの動きの知覚の説明とされています [1]。
参考プロジェクト [2,3,4] は離散LEDとシフトレジスタを用いたPOVグローブディスプレイでしたが、私のデバイスは回転するシリンダーと市販のRGB LEDストリップをPOVディスプレイとして使用します。
主な特徴
- POV (残像効果) ディスプレイ
- 回転シリンダー上にアニメーションGIFを表示
- GIF画像をArduinoのRAMまたはフラッシュメモリに格納
- Bluetooth経由でPCと通信
技術仕様
- シリンダー直径: 200mm
- シリンダー高さ: 200mm
- シリンダー材質: 発泡スチロール
- シリンダー重量: 420g
- LPD8806ベースのRGB LEDストリップ 4本
- 画面解像度: 151 × 40ピクセル
- Arduino Dueベース
- HC-06 Bluetoothモジュール搭載
- Bluetooth経由でPCから制御
機械的構造
機械構造は以下の図に示す通りです。デバイスはシャーシとローターで構成されます。

シャーシは2枚の円形合板ディスクを3本のネジ付きバーで接続したもので、ディスク間の距離は120mmです。中央には2つのボールベアリングとシャフト (ネジ付きバー) があります。シャフトは電動モーターから2つのクラウンギアとタイミングベルトを介して駆動され、最大1300 RPM (22 Hz) で回転します。
ローターは2つの発泡スチロールシリンダーと2枚の円形アルミディスクで構成されます。発泡スチロールシリンダーは下側のディスクに接着され、上側のディスクは取り外し可能で、シャフトへの取り付けに使用します。

電子部品はローターの上部に配置され、以下を含みます:
- Arduino Dueボード
- Arduino Due用自作シールド
- 電源基板
- HC-06 Bluetoothモジュール

電源 (7.5V) はスライド接点とコンタクトリングを介して電源基板に供給されます。合計40個のRGB LEDを持つ4本のLEDストリップを使用し、Arduinoシールドにケーブルで接続します。

4本のLEDストリップは以下の図のように配置されます。4本のストリップをずらして配置することで、Y軸方向のLED間距離を1/4にしています。X軸方向はソフトウェアで制御し、1回転あたり151回、全40個のLEDを更新します。図のグリッドが表示可能なピクセルに対応します。
電子回路
電子回路は添付のPDF回路図に示す通りです。LM317電圧レギュレータを搭載した電源基板があり、入力7.5Vを4.6Vに降圧し、Arduino DueとLEDストリップに供給します。
Arduino用の自作シールドには、LEDストリップへのコネクタケーブルとIR受信機用の回路が含まれます。IR受信機はローター位置を検出し、Arduinoのタイマー/割り込み入力に接続されます。
4本のLEDストリップ (STRIP0〜STRIP3) はそれぞれ5個のLPD8806ドライバと10個のRGB LEDを持ちます。STRIP0はUSART0、STRIP1はUSART1に接続され、両方ともSPIモードで動作します。STRIP2とSTRIP3は直列に接続し、ArduinoのSPIインターフェースで駆動します。
PCとの通信にはHC-06 BluetoothモジュールをUSART3に接続し、Arduinoの3.3V出力で駆動します。
Arduinoソフトウェア
Arduinoソフトウェアはメインプログラム (mpc.ino) と以下のライブラリで構成されます:
- bt - Bluetoothモジュール用ドライバ
- LDP8806 - LEDストリップ用ドライバ
- MemoryFree - 空きRAM容量検出用関数
- mpcgif - RAM/フラッシュ内のGIFファイル再生
- pictures - フラッシュに格納された内部GIF画像
- trace - ソフトウェアデバッグ用関数
画像のLEDストリップへの周期的出力は割り込み駆動で行われます。2つのトグルフレームバッファを用意し、それぞれ1枚の画像 (40 × 151ピクセル、1ピクセル = 1バイトのカラーパレットインデックス) を保持します。一方のバッファが割り込みとDMAでLEDストリップに出力されている間、もう一方はメインプログラム (GIFデコード等) で準備されます。フレーム割り込みルーチンでバッファを切り替えます。
IRセンサーにより1回転ごとに1回のフレーム割り込みが発生します。フレーム割り込みルーチンはハードウェアタイマーで回転速度を測定し、周期的なカラム割り込み (1回転あたり150回、すなわち1カラムごと) をプログラムします。カラム割り込みルーチンが現在のカラムをLEDストリップに出力します。性能向上のため、出力は3つのDMAチャネルで完全並列に行います。
完全なArduinoソースコードは GitHub で公開されています。
PCコントロールプログラム
PCコントロールプログラム (pccp) はC++で書かれたコマンドラインツールで、Cygwin上で動作し、Bluetooth経由でArduinoと通信します。以下のシングルキャラクタコマンドでPOVシリンダーを制御できます:
- 0-7 - 画面を単色で塗りつぶし (黒、赤、黄、緑、シアン、青、紫、白)
- t - 三角曲線描画 (テストパターン)
- s - 表示画像の回転有効/無効
- r - 単一行描画
- c - 単一列描画
- y - フラッシュ内蔵GIF画像再生
- f - PCから外部GIFファイルをBluetooth経由でダウンロード
- x - ダウンロードした外部GIFファイル再生
pccp はGUIとのインターフェースも提供し、現在の回転速度 (Hzおよびµs) とフレームカウンタ値を表示します。ソースコードは GitHub で公開されています。
グラフィカルユーザーインターフェース
GUIはユニバーサルWindowsアプリとして実装され、POVシリンダーで表示するGIFファイルを選択できます。Microsoftの「Windows Universal Samples」 [5] のFilePickerアプリをベースに開発されました。ソースコードは GitHub で公開されています。

参考文献
- Persistence of vision - Wikipedia
- RGB LED GLOBE - POV - 40 x 200
- POV Globe Display RGB
- POV Globe Display RGB - Project description (in German)
- Microsoft Windows Universal Samples
コード
回路図
回路図はPDFファイルとして提供されています。
製造プロセス
- Arduino POVクロック:残像効果で浮かび上がるLED時計を自作する
- Arduino Nanoで20kHzオシロスコープを自作:Nokia 5110 LCD搭載・簡易DIYガイド
- スマートブラインド:Arduinoとソーラー電源で実現する自動光制御
- Arduino Dueで作るタッチスクリーン三目並べゲーム
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- イタリア語ワードクロック自作:Arduino Nano、NeoPixel、LCD、RTCで時刻を文字で表示
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- Arduinoでシンプルな障害物センサーを自作 – IR LEDとフォトダイオード入門
- Arduino MKR Fox 1200で作る信頼性の高いSigfox kWhメーター
- Bluetooth対応温度モニター:Arduino NanoとHC-06でスマホ監視
- Arduino用絶縁アナログ入力回路の設計:LM331 V-F変換+フォトカプラでノイズ耐性を確保