NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

3×3×3LED CUBEの作製

イメージ 1

 

ネット上でたまたまみつけたLED CUBE、YouTubeで動画をみるとなんとも不思議な光り方をしているではありませんか!これは是非とも自分で作ってみたいと思い立ちNETから情報を収集、どうやらArduino単体で複雑な電子回路を組まなくとも作製可能との事、さっそく以下の通り作製してみました。

 

                    1.材料

材料はマルツと秋月電子Amazonであれば大概の部品は揃います。
AmazonのChipworldは中国直送で激安ですが船便で送られて来るため2週間程度時間がかかりました。何度か注文してみましたがちゃんと注文した製品が注文した数届いているため安心しました。Arduino pro mini 5V版を8個注文して7個動作した為、値段も考慮するとやや満足です。
部品名 必要数 購入先 単価 費用
Arduino pro mini 5V版 1個 Amazon 380円/個 380円
1kΩ抵抗 3本 マルツ 100円/100本 3円
10kΩ抵抗 1本 マルツ 100円/100本 1円
ターミナルブロック 1個 秋月電子 20円/個 20円
Cdsセル 5mmタイプ 1個 秋月電子 30円/個 30円
トグルスイッチ 1個 マルツ 100円/個 100円
ユニバーサル基板Bタイプ 1枚 秋月電子 120円/枚 120円
LED光拡散キャップ3mm 27個 秋月電子 200円/50個 108円
白色3mmLED 27個 マルツ 500円/100個 135円
電池ボックス単3×6本 1個 不用品を使用 100円/個 100円
単三乾電池eneloop 5本 amazon 1000円/4本 1250円
ICソケット(24P)600mil 1個 秋月電子 200円/10個 20円
樹脂スペーサー(MAE-5T) 4個 マルツ 250円/10個 100円
合計 2367円
※その他ニッパー・ラジオペンチ・半田ごて・はんだ・はんだ吸取線・線材が必要です。

 

                    2.回路図

1.材料を配線する前にfritzingを用いて回路図を作りましたので参考までに表面(図1)裏面(図2)を記載します。
一度13番ピンを出力に使用しましたが、LEDがほとんど点灯しない為おそらくArduinoに表面実装されているLEDの影響と思われたことから急遽1番ピン(Tx)に変更したところ、正常に点灯を確認しました。
また電池駆動であることから消費電力を軽減するため、CdSによって暗くなったら点灯、明るくなったら消灯する様に回路を追加しています。(詳細は5.動作確認をご確認ください)
イメージ 2

`図1:表面 `

イメージ 3

`図2:裏面 `

                    3.作製

回路図を元に作製したものがこちら、
LEDの足の曲げ方は"1000ch”様のサイトhttp://blogs.yahoo.co.jp/を参考にさせて頂きました。
イメージ 4

`図3:表面 `

イメージ 5

`図4:裏面 `

イメージ 6

`図5:斜め1 `

イメージ 7

`図6:斜め2 `

 

                    4.スケッチ

Arduino制御用のスケッチは下記の通りです。
int BASE_0 = 2;
int BASE_1 = 3;
int BASE_2 = 4;
int LED_0  = 5;
int LED_1  = 6;
int LED_2  = 7;
int LED_3  = 8;
int LED_4  = 9;
int LED_5  = 10;
int LED_6  = 11;
int LED_7  = 12;
int LED_8  = 1;
int BASE_LIST[3] = {BASE_0,BASE_1,BASE_2};
int LED_LIST[9] = {LED_0,LED_1,LED_2,LED_3,LED_4,LED_5,LED_6,LED_7,LED_8};
int val =0;
// LEDキューブの状態.HIGH or LOWを格納
int led_state[3][3][3];
int LED_NUM = 27;

float COUNT_MAX = 30;//66行目で変化
int count = 0;

void setup(){
    // 各pinのIN/OUT設定
    pinMode(BASE_0,OUTPUT);
    pinMode(BASE_1,OUTPUT);
    pinMode(BASE_2,OUTPUT);
    pinMode(LED_0 ,OUTPUT);
    pinMode(LED_1 ,OUTPUT);
    pinMode(LED_2 ,OUTPUT);
    pinMode(LED_3 ,OUTPUT);
    pinMode(LED_4 ,OUTPUT);
    pinMode(LED_5 ,OUTPUT);
    pinMode(LED_6 ,OUTPUT);
    pinMode(LED_7 ,OUTPUT);
    pinMode(LED_8 ,OUTPUT);

    // LEDキューブの状態初期化
    int i=0,j=0,k=0;
    for(i=0; i<3; i++){
        for(j=0; j<3; j++){
            for(k=0; k<3; k++){
                led_state[i][j][k] = LOW;
            }
        }
    }
    randomSeed(analogRead(0));
}

// openFrameworks風にループ内を分割
void loop(){
    update();
    action();
}

// 状態の更新
void update(){
    if(count >= COUNT_MAX){
        COUNT_MAX=random(10,50);
        if (analogRead(3)>500){ //壱番は500、弐番は670
            // LEDキューブの状態初期化
            int i=0,j=0,k=0;
            for(i=0; i<3; i++){
                for(j=0; j<3; j++){
                    for(k=0; k<3; k++){
                        led_state[i][j][k] = LOW;
                    }
                }
            }
            randomSeed(analogRead(0));
            action();
            delayWDT(9);
        }else{
        // ランダムに状態変化
        led_toggle(random(LED_NUM));
        count = 0;
        }
    } else {
        count++;
    }
 }

// 状態の反映
void action(){
    blink_cube();
}

// LEDキューブをダイナミック点灯
void blink_cube(){
    int i=0,j=0,k=0;
    for(i=0; i<3; i++){
        // i番目の段以外はHIGH
        digitalWrite(BASE_0,HIGH);
        digitalWrite(BASE_1,HIGH);
        digitalWrite(BASE_2,HIGH);
        digitalWrite(BASE_LIST[i],LOW);
        
        // 同一段内の9つのLEDを制御
        for(j=0; j<3; j++){
            for(k=0; k<3; k++){
                digitalWrite(LED_LIST[j+k*3], led_state[i][j][k]);
            }
        }
        // 気持ち程度delay.なくてもok
        delay(2);
    }
}

// 指定番号のLEDの状態をトグル
void led_toggle(int num){
    int i,j,k;
    i = num / 9;
    j = (num % 9) / 3;
    k = num % 3;
    if(led_state[i][j][k] == HIGH){
        led_state[i][j][k] = LOW;
    } else {
        led_state[i][j][k] = HIGH;
    }
}

//delayWDTここから
#include <avr/sleep.h>
#include <avr/wdt.h>
void delayWDT(unsigned long t) {        // パワーダウンモードでdelayを実行
  delayWDT_setup(t);                    // ウォッチドッグタイマー割り込み条件設定
  ADCSRA &= ~(1 << ADEN);               // ADENビットをクリアしてADCを停止(120μA節約)
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // パワーダウンモード
  sleep_enable();
  sleep_mode();                         // ここでスリープに入る
  sleep_disable();                      // WDTがタイムアップでここから動作再開 
  ADCSRA |= (1 << ADEN);                // ADCの電源をON (|=が!=になっていたバグを修正2014/11/17)
}
void delayWDT_setup(unsigned int ii) {  // ウォッチドッグタイマーをセット。
  // 引数はWDTCSRにセットするWDP0-WDP3の値。設定値と動作時間は概略下記
  // 0=16ms, 1=32ms, 2=64ms, 3=128ms, 4=250ms, 5=500ms
  // 6=1sec, 7=2sec, 8=4sec, 9=8sec
  byte bb;
  if (ii > 9 ){                         // 変な値を排除
    ii = 9;
  }
  bb =ii & 7;                           // 下位3ビットをbbに
  if (ii > 7){                          // 7以上(7.8,9)なら
    bb |= (1 << 5);                     // bbの5ビット目(WDP3)を1にする
  }
  bb |= ( 1 << WDCE );
  MCUSR &= ~(1 << WDRF);                // MCU Status Reg. Watchdog Reset Flag ->0
  // start timed sequence
  WDTCSR |= (1 << WDCE) | (1<<WDE);     // ウォッチドッグ変更許可(WDCEは4サイクルで自動リセット)
  // set new watchdog timeout value
  WDTCSR = bb;                          // 制御レジスタを設定
  WDTCSR |= _BV(WDIE);
} 
ISR(WDT_vect) {                         // WDTがタイムアップした時に実行される処理
  //  wdt_cycle++;                        // 必要ならコメントアウトを外す
}
//delayWDTここまで

 

                    5.動作確認

arduinoに4.スケッチを書き込み動作確認した結果、上手いこと動作した為調子に乗ってもう一つ同じものを作りました。
イメージ 1

`図7:動作確認 `
がしかし、消費電流を測定したところ、

 

VCC電圧 LED ON時電流 LED OFF時電流
7.58V 38.2mA 33.8mA

LEDがOFFになってもまったく電流が減少していない!
そこで無駄に高いVCCの電圧(1.2V電池×6本)を下げるため電池を一本減らして5本にしたところ、

 

VCC電圧 LED ON時電流 LED OFF時電流
6.35V 27.9mA 24.9mA

だいぶ下がったと思いきやLEDをONからOFFにしても3mAしか下がっていない・・・?
と言う事はArduino自体が殆どの電力を消費していると判明。
LED OFF時にArduinoを休止状態にしなければ、CdSを点けた意味があまりない事が分かった。
ウッチドッグタイマーなる休止機能がArduinoには備わっているとの事から早速スケッチに導入した結果、

 

VCC電圧 LED ON時電流 LED OFF時電流
6.35V 27.9mA 5.0mA

一気に一桁mAに下がった!!
だがなんとなく1mAは切って欲しかったので、前から気になっていたArduino基盤上に表面実装されているやたらと明るい電源用の赤いLEDをおもむろに半田ごて二本を使い取り除いた所、

 

VCC電圧 LED ON時電流 LED OFF時電流
6.35V 24.2mA 0.33mA

勝った気がした。
一日の半分が点灯、半分が消灯として平均消費電流は最初36.0mAであったものが12.3mAと約3分の1に減少しました。
eneloopの容量は1900mAなので最初は52.8時間(2.2日)点灯していたものが、154.5時間(6.4日)と大幅に増加しました(^o^)

 

2016年1月12日追記
LEDの明るさが、電池を交換した直後から電池が終わるに連れて暗くなっておりました。Arduino pro mini へ5~12V供給しても、内蔵されているDCDCコンバータでデジタルピンからの出力は5Vとなるはずが、明るさが"徐々"に暗くなるのはおかしいです。ArduinoPro miniの回路図を見たところVCCに接続するとダイレクトに電源電圧が回路に流れる事が判明!!やっちまいました(反省)。接続先はRAWが正解で正規版ではMIC5205と言うDCDCコンバータで(手持ちの正規版Arduino Pro mini基盤上を拡大鏡で見たところKB50と記載があった為その通りみたいです)、INが16V迄、出力が5Vの150mA迄との事。今回使用した激安Arduino pro mini類似品は、DCDCコンバータ上にS8NLと記載しており、ググりましたがデータシート等見つからなかった為、詳細は不明です。とりあえず激安品のRAWに7Vを加えたところ、3個中1個のDCDCコンバータが死亡しました・・・。VCC接続ではまだ動く様です
(セーフ?)。2個はRAWが使える様でしたので、回路を前回のVCCからRAWへ再配線し再度消費電流を計測した結果、
電源+接続先 VCC電圧 LED ON時電流 LED OFF時電流
VCC 7,02V 28.9mA 0.33mA
RAW 7,02V 15.98mA 0.33mA
消費電流が半分近くに下がりました。これで電池寿命は10日位?

 

                    6.まとめ

立体配線のためLEDの足が真っ直ぐでないと半田付が難しいが、2個目の作製になると慣れてきたため全工程を3時間程度で作製出来ました。Arduino pro miniにはまだD0,13とA0,1,2,4,5,6,7の計9ピン残っており、4×4×5LED CUBEが作製可能ではないかと考え中です。
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【NOBのArduino日記!】目次に戻る