LEDキューブの作り方!!!

こんばんわ!

LEDキューブの作り方をなるべくわかりやすく説明できたらと思います!

 

今回はArduinoというマイコンで作っていきます!

※ESP-WROOM-32-で作りたい方はこちらもご参考⇩

ESP-WROOM-32-とシフトレジスタを使ったLEDキューブを制御してみます!

 

・まず、LEDキューブには大きさが多数あり、自分が作りたいサイズを選べます!

LEDの個数は以下の通り↓
・3×3×3=27個(初めの一歩)

・5×5×5=125個(素人に自慢できる!)

・8×8×8=512個(すごい!)

・10×10×10=1024個(すげー!)

・16×16×16=4096個!!!(やばい!)

・32×32×32=32768個!!!(怪物!)

(もちろん書いてないだけで4×4×4や7×7×7もありですよ!)

今回、私は8×8×8の単色LEDキューブを作りました。

表現できる色は青と消灯だけです!

 

それじゃ物足りない思い、角4か所に3色LEDを追加しました(笑)


・作り方の大まかな流れはズバリ↓

①部品の注文!

②LEDの足を曲げる

③LEDを組み立てる・シフトレジスタの回路を作る

④配線・センサー追加

⑤プログラミング

です!

 

ではさっそく説明に入りたいと思います!

(今回は8×8×8で説明したいと思います)

①部品の注文

・部品は全部秋月電子で注文しました!

部品は壊れた場合を考え、少し多めに買うことをおすすめします!

 

部品一覧↓

・シフトレジスタ「SN74HC595N」

(1つで8ピン増やせますので8×8×8の場合は64ピン必要なので最低8個必要です。)

⇩⇩⇩(追記)2022年3月13日より、電子工作ステーションさんで販売開始‼

電子工作ステーション 70円+送料(500円以上で送料無料)

 

※SN74HC595Nは秋月電子では販売終了。後継となるものがU74HC595AG-D16-T

となります。ただし、試していないので全く同じように使えるかはわかりません(;^ω^)

 

 

・16ピン用のICソケット

(必須ではありません。ブレットボードをお使いになる場合、必要性は低いですが、

基盤をお使いになる場合はハンダ付けしてしまうといざという時に外せなくなるのであった方が良いです。)

秋月電子 30円+送料

 

・LED(発光ダイオード)
左3mm、右5mm

 

何色でもOKですが、数が多ければ多いほど消費電力が少なく高い電流にも

耐えられるものが良い(赤や黄色は壊れやすい)。8×8×8の場合最低512個。

 

※理由としては、数が多いほど完成した時全部点灯させたとき薄く光ります。

逆に1個だけ点灯させた場合電流が高くなりLEDが壊れる危険性があります。

 

※サイズは5㎜で、透明色のLEDをお勧めします!(見栄えが良くなります。)

 

電子工作ステーション 10円+送料(500円以上で送料無料)

秋月電子  10円+送料

 

・抵抗 (10Ωぐらい。8×8×8の場合64個)

(抵抗は、通常100Ωなどが一般的ですがLED点灯時に、点灯させる個数が多いほど光が弱くなります。

逆に抵抗が小さすぎると少ない数で光らせたときにLEDが、壊れてしまう

危険性がありますので使うLEDと抵抗の組み合わせには注意しましょう!)

 

電子工作ステーショ 1本3円+送料(500円以上で無料)

秋月電子 100本100円+送料

 

・基盤orブレッドボード (ブレットボードの付け直しが楽なのでおすすめです。)
ブレットボード

電子工作ステーション 250円+送料(500円以上で無料)(400穴)

秋月電子 270円+送料(400穴)

 

・導線 (512個のLEDを繋ぐわけですので結構使います。)

 

フラットケーブル(2x10(20P)両端コネクタ付IDCリボンケーブル)

(配線を綺麗にまとめる為に使いますので無くてもなんとかなります。シフトレジスタの半分の個数。)

秋月電子 150円+送料

 

・ボックスヘッダ 20P(2×10)(フラットケーブル×2の個数)

秋月電子 40円+送料

 

・Arduino UNO

電子工作ステーション 1200円(送料無料)(USBケーブル付属なし)

秋月電子 2000円前後+送料(USBケーブル付属あり)

※UNO以外の物でも大丈夫です。

 

・通信対応USBケーブル(無ければ)

電子工作ステーション 50円+送料(500円以上で無料)

ArduinoとPCを繋ぐためのUSBケーブル。
※付属ありの場合や、既にお持ちの方は購入不要です。

 

あとは付けたいセンサーがあれば忘れずに!

 

②LEDの足を曲げる

・画像は撮り忘れましたが組み立てるときに半田付けをしやすいように曲げると良いでしょう。

 

私はアノード(+)側を根元から一旦外に曲げ、

LEDの頭より1ミリぐらいはみでるように再び下に曲げました。

 

カソード(-)側は根元から外に曲げるだけです。

③LEDを組み立てる・シフトレジスタの回路を作る

・動作点検をするため、先にシフトレジスタの回路を完成させとくと良いでしょう。

配線図はこのサイトを参考に↓

少ない出力ピンで、大量のLEDを制御する(シフトレジスタ使用)

 

・組み立て方はまず、板などにLEDの頭が刺さるように穴を空け、均等に穴を空けていきます!

私は発砲スチロールに2センチ間隔で1列ずつ作りました。

(1列を64本作り、その後1段(8本)×8段作り、最後に段ごと組み立てて繋ぎました。

縦も横も同じ間隔が大切です!)

 

最終的にはアノード側は縦に繋ぎ、カソード側は横一面にはんだ付けします。

はんだこてを買う!(初めての電子工作入門編)

ちなみに8×8×8の場合はアノード側はシフトレジスタに、カソード側はArduinoのdigitalpinに繋ぎます。

 

↓これは1列ずつ作った後、1段目の組み立て途中の画像です。

↓これは2段目突入の画像です!

 

先に作っといたシフトレジスタで一旦動作確認のため仮配線します。

 

とりあえず先ほどの「少ない出力ピンで、大量のLEDを制御する」に載ってるLED64個の

サンプルプログラムでちゃんと順番に光ればOKです!。

 

追記(2021/12/20)

・1段目を上から見た場合の配線図(3×3×3)⇩

(青がカソード、赤がアノードとなります)

 

追記(2018/4/25)

・新しく製作段階中の動作確認動画を公開しました!

少しでも参考になればと思いますます(;^ω^)

LEDキューブ 8×8×8 製作段階動画①

LEDキューブ  8×8×8  製作段階動画②

 

※ちゃんと光らない場合は配線ミスや、シフトレジスタが故障などの原因が考えられます。

↓4段目!

 

8段目まで完成したらいよいよ配線!


④配線・センサー追加

 

配線の仕方はお任せします!

 

・私はLEDの足、64本(アノード)を1列8本ずつにまとめ、2列ずつボックスヘッダーに繋ぎ、

フラットケーブルでシフトレジスタ側のボックスヘッダーに接続しました!

 

※シフトレジスタも2個分(LED 2列分)をボックスヘッダーにハンダ付けしておきます。

※繋ぎ方は1,2,3と順番に光らせられるように配線してください。

 

↓接続が完了するとこんな感じ

 

あとはLEDのカソード側、つまり「段」の制御はdigitalpinで行うため、

Arduinoのdigitalpin2~9番pinに差してください。

(2番pinが1段目、9番pinが8段目を制御できるように配線してくださいね^^)

 

追加でセンサーなどを常げたい人は繫げてだいたいは終わりです!

 

追記(2021/12/15)

・抵抗は、シフトレジスタとLEDの間に入れてます。

 

追記(2019/11/29)(重要)

SPI通信で制御するため、SPI通信ができるようにArduinoとシフトレジスタを配線してください。

わからない方はお手数ですがググってください(;^ω^)

(SPI通信の記事内に、シフトレジスタとArduinoを接続する配線方法が記載されています)

 

追記(2022/7/24)

2×2×2のスケールですが、一応配線図を作ってみましたのでご参考になればと思います⇩

2×2×2の場合はシフトレジスタ一つで足りますが、シフトレジスタの連結の仕方という意味合いで

載せておきました。同じようにLEDを繋ぎ、シフトレジスタも同じように繋いでいけば膨大な制御が可能になります。

※画像に記載はないですが、LEDとシフトレジスタの合間に抵抗(1Ω~100Ωぐらい)を忘れずに。

※この配線図はかなり昔に作ったものを、思い出しながら作ったため、もしかしたら間違えているところがあるかもしれません。

 

⑤プログラミング

 

・Arduino IDEというソフトを使ってプログラムをArduinoに書き込みます!

Arduino IDEをダウンロードされていない方は、こちら↓の①「Arudino IDEをダウンロード」参考に!

Arduino IDEでESP-WROOM-02(ESP8266)とESP-WROOM-32を使えるようにする!(Windows10)

 

・それではいよいよプログラミングです!

私が作ったLEDキューブのサンプルコードも載せときますね↓

とりあえずこれで1段目だけが1番目と64番目のLEDが50ミリ秒ごとに交互に光るはずです^^

 

2019年2月15日プログラム更新!

上記のソースコードが一部間違っていたため修正しました(;^ω^)

 

※2019年2月15日追記⇩

4×4×4で作った場合のソースコードも載せておきます!↓

(動作確認はしていません(;^ω^))

1段目だけが1番目と16番目のLEDが50ミリ秒ごとに交互に光るはずです^^

 

・仕組みとしてはダイナミック点灯方式というやりかたで光らせてます。

ダイナミック点灯方式とは、点灯しているLEDを一定周波数で高速に点滅させる点灯方法です。

 

・今回のプログラムは1番目と64番目のLEDを高速(1ミリ秒ずつ)で交互に光らせてます。

光の残像で両方点灯しているように見せているわけなのです。

なので同時に点灯させたいLEDの数が多くなればなるほどちらつきが出てきます!

 

・また、今回製作したLEDキューブには曲センサー、圧力センサー、超音波距離センサー、ダクトスイッチ、スピー

カが装備されています。センサーの繫げ方などは後日改めて説明したいと思います!

 

ご不明な点等ございましたらお気軽にコメントください^^

 

また、今回製作したLEDキューブはYouTubeにアップさせていただいておりますのでご視聴頂ければと思います!

LEDキューブ 8×8×8 エレクトリカルパレードを光と連動させてみた!

 

・現在母校に展示されているプログラムで、各センサーで様々な挙動をします↓
LEDキューブ 8×8×8 文字表示! 超音波距離センサー、圧力センサー使用!

 

・エレクトリカルパレードの音楽と連動させるのですがこちらは決められた音階のパターンに沿った光り方をします↓

. LEDキューブ 8×8×8 光と連動! エレクトリカルパレード! (音階連動パターン)

(チャンネル登録していただけると幸いです^^)

 

「補足」

・今回私が作ったLEDキューブはArduinoだけの電流で全点灯させることはできましたが薄暗くはなります。

しかし点灯しているのははっきりわかるレベルなので問題ないかと思います!

これ以上個数を増やした場合外部電源が必要になってくるかと思います。

 

また、センサーなども付けすぎると電流に影響しますので注意です。

今回のは曲センサー、超音波距離センサー、圧力センサーを取り付けましたが正常に機能しました。

尚、スピーカは電流が足りなく音が小さすぎた為外部電流を供給しました。

 

LEDキューブの動作映像も公開していますのでよかったらご参考になればと思います^^

LEDキューブ 8×8×8の動作映像紹介!

 

こちら↓は実際に私が作ったLEDキューブのプログラムをそのまんま公開しております!

LEDキューブ サンプルプログラムを公開!

2019年1月5日追記⇩

ESP-WROOM-32を使って、LEDキューブの作り方も公開いたしましたので

是非チャレンジしてみてください!↓

ESP-WROOM-32-でLEDキューブを作ってみる!(3×3×3)

以上、ご訪問ありがとうございました!


シェアする

37件のフィードバック

  1. YouTubeの方で動画をみて、きました!
    4×4×4で同様のLEDキューブを作ろうと考えています。

    作成中のお写真の方を拝見しようと思ったのですが、小さくてあまり見えなかったので、配線がどのようになっているかを是非とも詳しく見せていただくことはできないでしょうか。

    • コメント頂きありがとうございます^^
      実物は現在学校にあって写真ではお見せできません(;^ω^)

      参考としてこちらのサイトをご覧ください^^
      少ない出力ピンで、大量のLEDを制御する(シフトレジスタ使用)
      http://www.hiramine.com/physicalcomputing/arduino/shiftregister.html

      LEDのアノード(+)側の配線は上記のサイトと全く同じで問題ありません。
      (上記のサイトの例は32個なので、4×4×4で作るのであれば16個で接続してください)
      あとはシフトレジスタに繫げた16個のLEDのカソード(-)側をArduinoのdigitalピンに差して完了です!

      同じのを合計4セット(4段)作ってカソード(-)側をセット(段)ごとにdigitalピンの1から4に繫げれば制御できるようになりますので頑張ってください^^

      またご不明点やわからないところありましたらご遠慮なくコメント下さいな^^
      お待ちしております^^

      • ご丁寧に解説していただきありがとうございました!

        とりあえず、まずは実践あるのみで作ってみようかと思います!
        再びわからないことがあったら、お尋ねするかもしれませんが、その際はよろしくお願いいたします!

  2. 4*4*4のキューブは作ってみたんですが、プログラムは初めてなんで上記プログラムを入力してみました。しかし、
    for(unsigned int pat=0; pat digitalWrite(SS,LOW);の部分で
    expected’;’ before ‘)’ tokenというエラーが出ました。’)’が足りないと思い、いろいろ試してみましたが分かりません。エラーが出ないようにするにはどうしたらいいか教えていただけないでしょうか。また、これを4*4*4に変更することは出来るのでしょうか?
    教えていただけないでしょうか、よろしくお願いします。

    • 返信遅れてしまい申し訳ないです(;^ω^)
      上記のプログラムを見直したところ確かに。
      for(unsigned int pat=0; pat digitalWrite(SS,LOW);が意味不明なことになっていました(;^ω^)

      それと同時に
      ///////①パターン・光り方作成//////
      byte pattern1[] = {
      …..
      };
      のところも抜けている所がありました(;^ω^)

      ソースコードの修正をし、更新致しましたのでお手数ですがもう一度お試しください(;^ω^)

      誠に恥ずかしいながらご指摘を頂き気づきました!
      ありがとうございます^^

      4×4×4の件につきましては、
      可能です!
      せっかくなので4×4×4バージョンのソースコードを追記いたしました^^
      これで試してみたくでさい^^

      ファイトです!

  3. 返信ありがとうございました。
    60の手習いがんばってみます。
    時折質問すると思います。
    よろしくお願いします。

  4. ど素人なのですが、後々16×16×16を作りたいと思っています。大量のLEDを使うのですが、その大きさでここのサイトに載っているやり方で作っても問題ないですか?
    何か付け足したり一手間工夫を加えないといけませんか?

    • Foolさん、コメント頂きありがとうございます^^
      16×16×16でも可能ですが、Arduinoだけだと電流が不足することが想定されるので、シフトレジスタはArduinoから電流を貰わないで単独で外部から電流を供給するようにする必要があるかと思います(;^ω^)
      ご参考にどうぞ↓
      https://mixi.jp/view_bbs.pl?comm_id=58434&id=72237970

      あとArduinoの容量は少ないので短いプログラムしか実行できなくなるかと思います(;^ω^)
      それを改善するため、現在ESP-WROOM-32での作り方を製作中です^^

  5. 現在男子高校生で、8×8×8LEDキューブを制作しています。
    こちらのサイトを参考にしているのですが、配線が分かりません。
    詳しく教えていただけないでしょうか?

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

      同じ回路で作れますよ^^
      抵抗は、8×8×8の場合64個で大丈夫なはずです‼
      シフトレジスタと、LEDの間に入れてみてください^^

      ※記事内に抵抗512個と記載ありますが、間違えてました(;^ω^)

  6. LEDキューブの下から、LEDのアノード線が64本出ている状態なのですが、配線のカソードはどうすればよいでしょうか?

    • カソードはアルディーノのデジタルピンに繋げていきます‼
      今回紹介している作り方だと、アルディーノの、digitalpin2~9番pinに差していきます‼
      アノードとカソードが断線しないように、上手く配線しておくと良いです^^

  7. 現在、https://www.hiramine.com/physicalcomputing/arduino/shiftregister.htmlのサイトを参考にして、LED32個の接続例と全く同じ物を作っているのですが、サンプルコード通りに動作しません。シフトレジスタをTC74HC595APではなくSN74HC595Nを使っているのが原因でしょうか?

    • SN74HC595Nで自分も作っているので、そこは問題ないかと思います(;^ω^)
      配線やプログラムを今一度見直してみましょう‼

  8. LEDキューブを、文字の形になる様に光らせたいのですが、サンプルコードなどはあるでしょうか?
    KOCHIと見える様に光らせてみたいです!

    • サンプルコードは載せて無いです(;^ω^)
      文字はかなり難易度が上がりますが、ダイナミック点灯の仕組みを理解すればできます^^

      例えばLEDキューブを横から見たとし、1段目の1番のLEDと、8段目のの8番のLEDを付けたい場合、通常に光らせると1段目の8番目のLEDと8段目の1番目のLEDも余分に光ってしまいます。
      しかしこれを交互に、高速で光らせればあたかも1段目の1番目のLEDと、8段目の8番のLEDだけが同時につくように見せられます‼
      これがダイナミック点灯で、これにより文字も表示することが可能になます‼

      頑張ってください^^

  9.  本来、プラスの出力をするピンに、GNDに刺さる想定の線が刺さっていて、なぜその状態で光るのか分からないのですが、なぜかLEDが光って動きました。
     なぜGNDに接続する想定の線をプラス出力のピンに刺して動くのかが分からず困っています。
     もし差し支えなければ、なぜGND側に刺す想定の線をプラスの出力のピンに刺しているのかを教えていただけると幸いです。

    • コメントありがとうございます。
      なるべく分かりやすいものを製作しますので、暫しお待ちくださいませ‼

    • 先程2×2×2でのスケールで配線図を追記しましたので、ご参考になればと思います。

  10. ありがとうございます!!!!!!!!!!!
    まさか返信してくれるとは思いませんでした。参考にさせて頂きます。

      • プログラムをどう書き換えればいいのかあまりよく分かりません。
        出来ればどうすればいいか教えてくれませんか?

        • まず、シフトレジスタを使う数を考えてみましょう。

          8×8×8の場合だと、64本のアノードをシフトレジスタに繋がなければなりません。
          64本繋ぐためにはシフトレジスタが(1個で8個繋げられるので)8個必要になります。

          6×6×6の場合は36本のアノードを使いますので、シフトレジスタは5個必要になります。
          この5個という数字を「#define SREG_NUM 8」→「#define SREG_NUM 5」変えます。

          そう考えると、下記のようなコードになります。

          #include
          #define SS 10
          #define SREG_NUM 5 // シフトレジスタの数

          /*作り方
          誰でも簡単に8×8×8LEDキューブのプログラムを作れます。
          ①パターン・光り方作成
          ②動き作成
          この二つをお好みに変えて頂くだけで使えるはずです。
          以上
          */

          /*テンプレート
          0が消灯、1が点灯になります。

          B00000000,B00000000,B00000000,B00000000,B00000000, //全部消灯

          B11111111,B11111111,B11111111,B11111111,B11111111, //全部点灯

          */
          ///////①パターン・光り方作成//////
          byte pattern1[] = {
          // 左から1~64番目。
          // 1 8 16 24 32 40 48 56 64
          B10000000, B00000000, B00000000, B00000000, B00000000,
          B00000000, B00000000, B00000000, B00000000, B00000000,
          };
          byte pattern_len1 = 2; //パターンの数を入れます。

          //上記の「①パターン・光り方作成」では2パターンなのでpattern_len1は2になります。

          //下記は変更箇所は無し(アルディーノの設定になります。)
          void setup() {
          Serial.begin(9600) ; // 9600bpsでシリアル通信のポートを開きます
          //SPI設定
          SPI.begin();
          SPI.setBitOrder(LSBFIRST);
          SPI.setClockDivider(SPI_CLOCK_DIV4); // 16MHz/2 = 8MHz
          SPI.setDataMode(SPI_MODE3);
          pinMode(SS, OUTPUT);
          digitalWrite(SS, HIGH);
          //(6×6×6の場合は6段しか使わないので、6段版に変えます。10→8)
          for (int i = 2; i < 8; i++) { pinMode(i, OUTPUT); //段のpinをセット } } void loop() { //セットメイン //(6×6×6の場合は6段しか使わないので、6段版に変えます) int dan[6]; dan[0] = 0, //a[0]は無視し、 //段をセットします。(6×6×6の場合は6段しか使わないので、6段版に変えます) dan[1] = 2, dan[2] = 3, dan[3] = 4, dan[4] = 5, dan[5] = 6, dan[6] = 7; //段をHIGHにします。(6×6×6の場合はループ数も9→7にします) for (int i = 1; i < 7; i++) { digitalWrite(dan[i], HIGH); } //////////②動き作成↓////////// //1段目を光らせます。段制御はHIGHで消灯、LOWで点灯なので気をつけてください。 digitalWrite(dan[1], LOW); //for(unsigned int pat=0; pat digitalWrite(SS,LOW); for (unsigned int pat = 0; pat < pattern_len1 * SREG_NUM; pat += SREG_NUM) { digitalWrite(SS, LOW); for (unsigned int sr = 0; sr < SREG_NUM; sr++) { SPI.transfer(pattern1[pat + sr]); } digitalWrite(SS, HIGH); //①で作成したpattern1を適用 delay(50); //50ミリ秒待ってから次の動作 } } これで多分動くと思いますのでやってみてください^^

コメントを残す

メールアドレスが公開されることはありません。

コメントする