ネット上でたまたまみつけた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.動作確認をご確認ください)
`図1:表面 | ` |
`図2:裏面 | ` |
3.作製
回路図を元に作製したものがこちら、LEDの足の曲げ方は"1000ch”様のサイトhttp://blogs.yahoo.co.jp/を参考にさせて頂きました。
`図3:表面 | ` |
`図4:裏面 | ` |
`図5:斜め1 | ` |
`図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ここまで
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へ再配線し再度消費電流を計測した結果、
消費電流が半分近くに下がりました。これで電池寿命は10日位?
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 |
6.まとめ
立体配線のためLEDの足が真っ直ぐでないと半田付が難しいが、2個目の作製になると慣れてきたため全工程を3時間程度で作製出来ました。Arduino pro miniにはまだD0,13とA0,1,2,4,5,6,7の計9ピン残っており、4×4×5LED CUBEが作製可能ではないかと考え中です。励みになりますのでよければクリック下さい(^o^)/