製作物

【PIC】LEDキューブの作り方!4x4x4 LED CUBE を作ってみた

投稿日:2020-04-20 更新日:

今回は 4x4x4 の LEDキューブの作成に挑戦しました。製作はちょっと大変ですが、完成したときの達成感とその綺麗さは素晴らしいものです。

今回作ったものがこちら↓

LED CUBE

写真で見るよりも実際はもっと綺麗に見えます。今回はこの LEDキューブの製作過程を紹介したいと思います。

制御の仕組み

作り方の前に LEDキューブの制御方法を簡単に説明したいと思います。

4x4x4 = 64 個の LED を直接制御するのは現実的ではないので、各縦列でアノードを共通化、各層でカソードを共通化します。(アノードとカソードはどちらでもいいです)

例えば1番上の層のカソードを GND に、縦の 16本のうち次の 5本を電源に繋げると(抵抗は忘れずに)その部分だけが点灯します。

これで1層分の表示ができますが、このまま他の層も一緒に点けようとすると他の場所まで点灯してしまいます。

ではどうするかというと、各層を一層ずつ表示して高速で切り替えることで、人間の目にはすべての層が点灯しているように見えます。

ちなみにこのような点灯方法をダイナミック点灯と呼び、複数の 7セグLED を点灯させるときなどにも使います。

これによって制御に必要なピンは、カソード4本+アノード 16本の 20本となります。しかし、アノード 16本はマイコンにはまだ少し多いので、シフトレジスタを使用します。

シフトレジスタの詳細については省略しますが、こんな感じでマイコンからのシリアルデータをパラレル出力してくれます。

シフトレジスタの制御は、データ、クロック、ラッチの3本だけでできるので、キューブの制御に必要なピンは4+3=7本で足りるということになります。

このくらいであればピンの少ないマイコンでも十分に足ります。

材料

今回使用した主なパーツ一覧です。値段は購入時の物なので変わっている可能性もあります。また、手元にあるパーツを優先して使ったので、他のパーツを使った方が簡単だったりすることもあるので参考程度にお願いします。

パーツ 個数 値段
青色LED 3mm 64 \224
抵抗 100Ω 16 \16
PIC16F18326 1 \130
シフトレジスタ SN74HC595D 2 \80
トランジスタアレイ 7chシンク TD62003APG 1 \40
加速度センサー MMA8452Q 1 \350
ジェスチャーセンサー APDS9960 1 \600
LCDモジュール 8×2 1 \600
薄型ボリューム 1 \60
電源用microUSBコネクタDIP化基板 1 \80
三端子レギュレータ 3.3V 1 \50
コンデンサ 470μF 0.1μF 1 \20
スライドスイッチ 3 \80
ピンソケット 2×7 1 \30
L型ピンソケット 1×6 1 \20
ICソケット 2 \20
片面紙エポキシユニバーサル基板 Bタイプ 2 \240
SOP16ピン DIP変換基板 2 \60
ねじ・ナット・袋ナット・スペーサー・ 4 \200
\2900

多少値の張るセンサーや LCD は LEDキューブ自体には必要ないのでシンプルな機能だけならばもっと安くなります。

製作の流れ

続いて大まかな製作の流れを説明します。LEDキューブの製作は以下のような流れになっています。

  1. 治具製作
  2. LED加工
  3. キューブ組み立て
  4. 回路組み立て
  5. プログラミング

それぞれの過程についてはこれから詳しく説明していきます。

治具製作

まず初めに LED を綺麗に並べるための治具を製作します。

今回はダイソーで買ってきた MDF で作りました。それがこちら↓

このように MDF に等間隔に穴をあけていきます。穴の直径は LED と同じで大丈夫です。治具が歪んでいるとキューブも歪んでしまうので手を抜かずに作りましょう。

今回は(設計の問題もありますが)この治具の作りが甘かったために後々痛い目を見ることに・・・

LED加工

続いて LED を加工していきます。

この過程でやることは次の2つです。

  • 下からの光透過対策
  • LEDの足曲げ

まず光透過とは何かというと、LED に真下から光を当てると下の写真左のように光っていない LED も光って見えてしまいます。
その対策として LED の底面にシールを貼ったものが右側です。

見栄えはよくなりますが、かなり面倒な作業なのであまり気にしない人は何もしなくても良いと思います。

3mm のシールがあればよかったのですが、百均で探してみても1番小さいもので 5mm の物しかありませんでした。

5mm の LED を使う場合はこれに穴を開ければそのまま使えるので良いですが、今回は 3mm なので、これをさらに小さく切りました。

こんな感じに裏に 3mm の円を並べたものを印刷してそれを目安に切りました。めちゃくちゃ面倒臭かったので正直別の方法を考えた方が良いと思います。

これを貼れば透過対策は完了です。

 

続いて足曲げ加工。今回はアノードを縦に繋ぐので、このようにアノードを外側に少し曲げます。

LeadBend

・・パッと見で分かると思いますが、ここは完全に目分量でやったので幅がバラバラです・・綺麗なキューブを作るためにはここもきちんとそろえた方が良いでしょう。

キューブ組み立て

治具を製作し、LED の加工が終わったらいよいよキューブを組み立てていきます。

まず治具に LED を植えます。

続いてカソードを曲げます。

足りない1辺はスズメッキ線なんかで繋ぎましょう。
ちなみに先程治具を作った段階で後々痛い目を見たと書きましたが、その様子がこちら。

結構隙間が空いています。まあギリギリの設計にしたせいでもあるんですけど、治具の精度の重要性にこのときようやく気が付きました。結局頑張って無理やりはんだ付けしました。

はんだ付けをしたら壊さないように気を付けて治具から外すと、このようにキューブの1層が出来上がります。

これを4層作ります。

この後は、先に4層を繋げてキューブを作ってから基板に乗せるか、基板の上でキューブを組み立てるかのどちらかです。今回は後者にしましたのでキューブは一旦置いといて回路の製作に移ります。

回路の組み立て

とても見にくいと思いますが、回路図を載せておきます。

PIC と PICKit3 の電源ラインが周りと切り離せるようにしているのは、基板に乗せたままプログラムの書き込みが出来るようにするためです。(切り離さないとセンサーなどにも 5V がかかってしまう)

RA0 は普段は可変抵抗に繋げる入力ピンとしますが、プログラムを書き込むときには同様に切り離します。

これを基板に実装していきますが、今回は上下2層の基板で構成することとしました。

なんとなく回路が出来上がる様子を GIF にしてみました。

  

回路が出来たらキューブを組み立てます。内側のはんだ付けは結構大変ですが頑張りましょう。

キューブを組んだら各層を基板に繋げるための足も忘れずに伸ばして完成です。

プログラミング

キューブが出来上がったらプログラミングに移ります。

ここでは LEDキューブのデータをキューブに表示するところまで解説したいと思います。

まずデータの形式について説明しますが、今回は配線の都合上シフトレジスタの出力と LED の対応は下図のようになっています。(上から見た図)

15が先頭ビット、0 が最終ビットです。

1層が 16bit = 2byte なので4層で 8byte のデータが必要なことになります。

キューブ1つのデータを char[8] の配列で管理することにしました。配列の各バイトとキューブの対応関係は下図のようにします。

ここで、例としてこちら↓の縁取りキューブのデータを考えてみると次のようになります。

LED CUBE

次に、このデータを出力する関数を作ります。
が、その前に層を指定する関数と、16ビットをシフトレジスタに送信する関数を低レベル関数として用意します。

L0~L3, SI, SCK, RCK は#define で該当のピンを指定しておきます。

ちなみに層はカソードコモンなのに出力が Low ではなく High なのは、トランジスタで吸い込むようにしているためです。

この関数を使って先程のデータとそのビットを反転した2つのデータを交互に表示するプログラムを書いてみたのがこちらです。

Describe関数をタイマ1で4ms毎に呼び出し、各層のデータを出力します。

表示をタイマ割り込みで行うことによって、main関数では自由にパターンを切り替えることができます。

その他のポイントとしては、data変数を const宣言することと、Describe関数中の z変数を static宣言することです。

データは定数なので、const宣言をすることで PIC のデータメモリではなくプログラムメモリに書き込まれるようになります。これでより多くのデータを保存できます。

staticについては C言語の基本的事項ですが、これをつけないと関数が終了される度にローカル変数は破棄されてしまうので毎回 z = 0 になってしまいます。

私が製作した LED キューブでは、加速度センサーやジェスチャーセンサー、LCD などを搭載していますが、プログラムの解説はこの基本部分だけにしたいと思います。

 

また、プログラムとは直接は関係ありませんが、この先を進めるにあたって問題となる点があります。それはデータの作成です。

先程は手計算でデータを作りました。少しなら別に良いですが、たくさんのデータを作ろうと思うととても大変です。

そのため、データを自動で作成してくれるソフトを Unity で作りました。

出力したデータはメモ帳にコピペして保存するというお粗末なものですが、自分で使うだけなので細かいことは気にせず作りました。

ソフトを作るのは手間ですが、それ以上にデータを手動で作るのは手間なので、作る価値は十二分にあると思います。

今回私が制作したものはこちらからダウンロードできるようにしておいたので、気になる方は使ってみてください。

 

今回の記事は以上です。ここまで見ていただきありがとうございます。最後に、動画をニコニコにあげたのでそちらも見てくれると嬉しいです。

 

-製作物

執筆者:


  1. K T より:

    初めまして。
    きっちーさん
    KT といます。
    サイトためになり、大変参考にさせて頂いています。
    大変厚かましいお願いですが、
    LEDキューブの作り方!4x4x4 LED CUBE を作ってみた
    で作成された Unity プログラム
    を教えていただくことは出来ないでしょうか?
    対価も支払うことも、検討しています。
    よろしくお願いいたします。

    • きっちー より:

      コメントありがとうございます。

      対価はこの記事を読んで実際に作ろうと思ってもらえるだけで十分です。
      完成品でよろしければダウンロードできるようにしておいたのでご活用ください。
      プログラムの中身が必要等ありましたらまた相談してください。

    • KT より:

      きっちーさん
      kTです。
      お忙しいところ恐縮です。
      早速のご返答ありがとうございます。
      早速ダウンロードさせていただきます。
      厚かましいお願い聞いていただき
      ありがとうございました。
      また、何か有れば、相談させて頂きます。

きっちー へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

オペアンプを使った積分型ADCを作ってみた

トランジスタ技術2022年4月号に掲載されていた積分型ADC (Analog to Digital Converter)の記事を見て、面白そうだったので実際にブレッドボードで作ってみました。 初めに言 …

1セル1基板のアナログライフゲーム作ってみた vol.2

この記事は前回からの続きとなります。前回をご覧になっていない方は是非こちらもご覧ください。 1セル1基板のアナログライフゲーム作ってみた vol.1   目次1 コントローラー2 555+可 …

USB給電の小型吸煙器を作ってみた

今回はUSB給電で動作する小型の吸煙器を作ってみました。 今まではんだ付けの際はヤニの煙を吸わないように気を付けながら行っていましたが、吸煙器を使うことでとても快適になりました。 もっと早く作ればよか …

バブルソートを行う電子回路を作ってみた

今回は CPU を用いずにハードウェアでバブルソートを行う回路を作ってみました。 ソート対象の変数はコンデンサに充電された電圧で、フリップフロップで状態管理、オペアンプで比較・代入を行います。 &nb …

PICでカラーLCDモジュールを動かしてみた話【ST7789】

今回は以前に Amazon で購入したまま積んでいた フルカラーグラフィックLCD を PIC で制御してみました。 激ムズというわけではありませんでしたが、いくつかつまずいたポイントがあったので備忘 …