Arduino Megaで作る美しい5x5x5 LEDキューブ
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Mega 2560 | 1 | |
| 青色LED | 125 | |
| NTE85 NPNトランジスタ | 5 | |
| 22ゲージ錫メッキ銅線 | 1 | 層の接続とカソードをメイン基板へ引き下げる用 |
| 180Ω 抵抗 (1/4W) | 25 | |
| 9cm x 15cm ユニバーサル基板 | 1 | |
| 330Ω 抵抗 (1/4W) | 5 | |
| 9V電源アダプタ (Mega用・任意) | 1 | USB給電でも動作可能だが、コンセント接続用に準備 |
必要な工具と機器
- はんだごて
- グルーガン
- Blu-Tack (再利用可能な粘着剤、LED固定用)
使用するアプリとオンラインサービス
- Arduino IDE
プロジェクト概要
はじめに
多くの人がLEDキューブを愛していますが、8x8x8のような大型キューブは製作もプログラミングも大変な労力が必要です。一方、3x3x3や4x4x4の小型キューブは、LED数が少なく、シフトレジスタやハイサイドドライバなどの外部ハードウェアも不要で製作が容易ですが、大型キューブのような迫力には欠けます。
このプロジェクトの目的は、大型キューブのような臨場感を楽しめるのに、大型キューブ製作に伴う苦労を避けられる、簡単に作れるキューブを作ることです。ここで紹介するのは、Arduino Megaだけで直接駆動できる5x5x5キューブです。シフトレジスタは一切使わず、補助部品として5個のトランジスタ(1層分の25個のLEDのカソードを一括でグラウンドに落とす用)のみを使用します。なぜシフトレジスタを避けるのか? それは手配線が非常に面倒だからです(実際に試しました)。シフトレジスタを使うなら、専用基板の設計・製作が現実的です。
私は以前から大型キューブ用のコードを多く書いてきた経験があり、それらのアニメーションをこの5x5x5キューブ向けに移植しました。
実はこれは3部作の第1弾です。第2弾はこちら(5x5x5 RGBキューブ、設計は似ていますが製作難易度は高め)、第3弾はこちら(8x8x8単色キューブ、やはり外部ハードウェア最小限)です。
注: 5x5x5キューブをMegaで駆動するアイデアを最初に提案したのは私ではありません。MEGA DAS氏が2017年に類似プロジェクトを公開しています。ハードウェア構成はほぼ同一です。私があのプロジェクトを知ったのはこの記事を書き始めてからで、ピン配置と抵抗値が異なる程度の差しかありません。私がこの記事を公開する理由は、キューブ・ソフトウェアの豊富な経験があるからです。私のソフトウェアがきっかけで、キューブ製作に挑戦する人が増えることを期待しています!
上の動画は、Z軸を振幅、水平方向を時間とした正弦波関数を表示しています。大型キューブでは定番のエフェクトですが、5x5x5でも十分楽しめます。
他にも2本の動画を用意しました。どちらも同じ14種類のアニメーション集です。どちらが見やすいか判断できなかったため両方掲載しています。実物は動画よりずっと綺麗に見えますよ!
ハードウェア設計
Megaには大量のデジタルI/Oピンがあります。そのうち5本で各層のカソードをトランジスタ経由でLowにし、残り25本で各層内の25個のLEDアノードをHighに駆動します。この方式なら、MegaのI/Oピン数で6x6x6キューブまで対応可能です。ただし、シンプルさを保つ上で電流制限も考慮する必要があります。Megaのピンあたり最大40mA、総計200mAまでです。青色LEDの順方向電圧は約3V、カソード側トランジスタのVce(sat)約0.7V。5V電源に180Ω抵抗を直列に入れると、LED1個あたり約7.2mA流れます。1層25個全点灯で180mA。常に1層だけ点灯させるマルチプレクス駆動なので、Megaの電流制限内に収まります(トランジスタのベース電流約5mAを加えても総計約185mA)。以上の理由で180Ω抵抗を採用しました。
ピン22〜26がカソード側トランジスタのベース駆動用、ピン27〜51が180Ω抵抗を介して各層の25個のアノードへ接続されます。
このピン配置が少し分かりにくい理由は、ソフトウェアでdigitalWriteではなく直接ポート操作(Direct Port Access)を行っているためです。これにより25個のアノードを高速に設定でき、LED点灯時間を最大化しています。ピン配置はポート単位で管理しやすいよう工夫されています。詳細はソフトウェア解説で触れます。
キューブの組み立て
キューブの作り方には様々な流派がありますが、どの方法でも根気と丁寧さが必要です。ここでは私の手順を紹介しますが、他の解説も参考にしてください。
まずLEDのリード線を成形し、5個を縦に並べて柱(カラム)を作ります。それを5本並べてパネル(1層分)を作り、さらにパネルを5枚重ねてキューブを完成させます。初心者が陥りやすいのが、リード角度の微小な誤差が積み重なり、完成時に歪みが目立つことです。リード成形が最も重要な工程です。時間をかけて正確に行えば、完璧ではないにせよ、見栄えの良いキューブが作れます。
私は一度に25個分のリード成形をしてから1枚のパネルを組み立てる方式を取っています。治具にはBlu-Tackを使用し、LEDを押し込んで固定しながらはんだ付けします。凹みの位置を再利用すれば、全パネルで同じピッチ(全方向0.6インチ)が出せます。標準的な0.1インチピッチのユニバーサル基板に後から差し込める寸法です。
LED同士のはんだ付けについて: キューブ完成後に内部の冷接点や不良LEDが見つかるのは製作者の悪夢です。柱を作る段階で、一つ一つのはんだ付けを確実に行ってください。
パネルが完成したら必ずテストします。テスト用スケッチを用意しています。5本のアノード線を330Ω抵抗経由でピン40〜44へ、5本のカソード線をピン22〜26へ接続して実行します。正常なら上記動画のように全LEDが点灯します(この段階ではトランジスタを使わず、カソードを直接Lowにして点灯させています。本実装ではトランジスタを介するためHighでカソードをLowに落とします)。
5枚のパネルがテスト済みなら、メイン基板への実装準備に入ります。まず基板上に全抵抗とトランジスタを配線します。
アノード列間は0.6インチ(基板上5穴分)空けています。この時点でArduino Megaを基板に固定します(スペーサーまたは薄いプラ板+接着剤で約6mm浮かせています)。
パネルをメイン基板にはんだ付けします。アノード列が正しい穴に入っているか、全列確認してから作業してください。1穴でもズレると完成時に分かります。全パネルのカソード引き出し方向も統一してください。
次に、各層のカソード同士を横方向で接続します。伸ばした錫メッキ銅線で、同一層の5本のカソード線を結びます。
さらに、各層のカソード束をメイン基板のトランジスタコレクタへ引き下げます。これも錫メッキ銅線を使用します。
抵抗からMegaへの全配線が済めば、いよいよ完成キューブのテストです。付属のテストスケッチを書き込むと、全125個のLEDが順番に点灯します。パネル単体テスト済みなので、不具合があれば最近接続したカソード周り(特定層が点かない、一部欠ける等)が疑われます。多くは冷接点です。
ソフトウェア
キューブ内の各LED状態は、グローバルな5x5x5のバイト配列 cube[][][] で管理します。1なら点灯、0なら消灯。すべてのアニメーションはこの配列への1/0書き込みで生成されます。
キューブ・ソフトウェアの心臓部は、定期割り込みによるリフレッシュ処理です。setup() で割り込みを開始し、本体はプログラム末尾に配置。10ms周期(100Hz)で呼び出され、リフレッシュ自体は約6msで完了。残り4msでメインループの処理が実行できます。
リフレッシュ時、各層を1.2msずつ点灯させます。100Hz駆動なので、点灯中のLEDは1秒間に120ms(デューティ比12%)点灯します。この速度で人間の目には連続点灯に見え、12%でも意外と明るく見えます。
リフレッシュ時間を削減し点灯時間を稼ぐため、digitalWriteを避け、直接ポート操作でピン設定を行っています。割り込みルーチン内に25行の直接ポート書き込みが並びますが、これはdigitalWriteループより桁違いに高速です。
loop() は単にアニメーション・ルーチンを順番に呼び出し、最後まで行ったら最初に戻ります。各アニメーションは独立したサブルーチンで、中には共通ユーティリティ(clearCube() 全消灯、copyDown() 1層下へシフトして最上層クリア等)を呼ぶものもあります。コード内に各アニメーションの解説コメントがあります。
ダウンロード可能なスケッチは3種類:メイン(動画の15アニメーション収録)、パネルテスト用、キューブ完成テスト用。後者2つは製作中の検証専用です。
製造プロセス
- アイロン台の製造:設計、素材、生産プロセス
- ルービックキューブ:発明から現代のパズルへ
- プリント基板:設計、製造、未来トレンド
- サーフボードの構造とデザイン:ポリネシアのルーツから現代の革新まで
- 発光ダイオード(LED):誕生から100年寿命へ
- RasPiRobot Board V2:Raspberry Pi を強力なロボットコントローラーに拡張
- DIY Arduinoワードクロック – 文字で時刻を表示する洗練されたリアルタイムクロック
- Arduinoで「棺桶ダンス」メロディーを再現するプロジェクト
- 壊れたスイッチボードをスマートタッチスイッチに改造:温度監視機能付き
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- Arduino UNOで作るシンプル電卓 - シリアルモニターで四則演算