組み立て
回路図は大雑把にこんな感じ。
▲手書きでテキトーサーセンw ちなみに、LEDは内部で青と緑のカソードが繋がってるアノードコモン型。 |
なお、抵抗値は以下のような計算で求める。
- カラーLEDのRGBの各々に流す電圧Vfを決める。
ここでは、R:2.0v, G:3.5v, B:3.5v (一般的数値。赤LEDは、緑、青に比べて少ない電気で光る) - 流す最大電流Ifを決める。
ここでは、100mA (ちなみに、このLEDは150mAまでOK) - R = ( 3.6 - Vf ) / If で得られるRが抵抗値。よって、Rr,Rg,Rbをそれぞれ赤LED、緑LED、青LEDとすると、
Rr = ( 3.6 - 2.0 ) / 0.1 = 16Ω
Rg = Rb = ( 3.6 - 3.5 ) / 0.1 = 1Ω
本来、このLEDを使う場合は12vが最適なのだが、あまり電源を大きくすると
- 電池のスペースで軽量化が難しくなる。
- 熱対策が必要になる。
といった問題が起こる。
なので、このへんは妥協することにした。
回路設計が終わったところで、本格的に組み立て。
▲こんな感じで位置調整等考えながら、どうすればうまく収納できるか考える。筒の底になってる白いスイッチは、たまたま見つけて買ってきたやつなんだけど、まさかパイプにちょうどハマるとは思わなかった。これは奇跡。 |
▲パーツをいろいろいじりつつ、なんとかうまく収まりました。 |
▲スイッチの細部。プッシュスイッチは穴あけして足を接続した後、グルーガンで取れないように固定。中心部分は抵抗が入ってる。 |
▲プッシュスイッチの裏側。リード線がぐちゃぐちゃw ここのリード線は中身を取り出すときのことを考えて長めにしてあるんだよね。 |
▲Arduino、トランジスタアレイが入ってる部分。周りをVer.1で使ってたプラスチックを使ってうまくハマるように調整してる。 |
▲Arduinoの裏側。ここもリード線だらけw 白はすべてLEDの配線(赤黒だと目立つので白にしました)。LED1本につき5本、全部で10本分引き込んでる。でも、途中で足りなくなって補強するハメになった・・・かっこわるい。 |
▲電池部分、あと左側からLED部分。分かりやすいようにLEDを点灯させた状態。ネジはLEDを固定させるためのネジ。一応ライブで振ることを考えると、ちゃんと固定しないとね。 |
▲もちろん、電池は交換可能なように、簡単に開くことができる。2つのパイプの直径がギリギリのサイズなので、ここはネジ止めしなくても大丈夫だった。 |
▲取り出してみたところのスイッチ部分。白のスイッチはハンダ付けしてから取付け可能だったけど、プッシュスイッチは足が小さいから取付け後にハンダ付け、かなりきつかった。 |
▲電池ケース。そのままだとうまく入らなかったので、カッターでギリギリまで削った。こういう調整がすごく大変。 |
▲Arduinoの拡大。こいつの裏に基板をつけて配線をしている。 |
▲Arduinoの裏側。配線、ぐちゃぐちゃひどいw この基板の裏にトランジスタアレイ、さらにその上にArduinoを取り付けたんだけど、実は、その配置を間違えてしまっていたせいで、かなり無理のある配線になってしまいますた\(^o^)/ |
▲最初、このピンヘッダが邪魔で入らなかったので、写真のようにL字型に変更した。このピンにUSB接続する回路をくっつけてプログラムを流し込む。なので、こうやってピンヘッダを残しておけば、あとでいくらでもプログラミングが変更が可能になる。 |
プログラミング
ここまでくれば、あとは、動作内容を決めるプログラミングを行い、Arduinoに実行データを送ればおk。
まあ、プログラミングといっても、
- 初期化時で、LEDのピンとプッシュスイッチのピン番号定義。
- ループで、スイッチ処理と決まったモードにしたがってLEDのRGB値を変更して出力。
というぐらいしかしてない。
以下がArduinoIDEでプログラミングしたコード。
// LEDのピン const int LED_R_PIN = 9; const int LED_G_PIN = 10; const int LED_B_PIN = 11; const int LED2_R_PIN = 3; const int LED2_G_PIN = 5; const int LED2_B_PIN = 6; // スイッチピン const int SW_PIN = 7; // 状態の数 const int STATE_NUM = 8; // スイッチ管理 int swValOld = 0; int swVal = 0; int state = 0; int count = 0; // 光らせる値を入れる変数 int rVal = 0; int gVal = 0; int bVal = 0; int rVal2 = 0; int gVal2 = 0; int bVal2 = 0; void setup() { // LEDに接続するピンを出力にセット pinMode(LED_R_PIN, OUTPUT); pinMode(LED_G_PIN, OUTPUT); pinMode(LED_B_PIN, OUTPUT); pinMode(LED2_R_PIN, OUTPUT); pinMode(LED2_G_PIN, OUTPUT); pinMode(LED2_B_PIN, OUTPUT); // スイッチのピンを入力にセット pinMode(SW_PIN, INPUT); } void loop() { // スイッチの値取得 swVal = digitalRead( SW_PIN ); // スイッチ判定(立ち上がりのみ検出) if( swVal == HIGH && swValOld == LOW ) { state++; if( state >= STATE_NUM ) state = 0; delay(100); // チャタリング防止。値はテキトー } // 値更新 swValOld = swVal; switch(state) { case 0: // 最初は消灯 default: rVal = rVal2 = 0; gVal = gVal2 = 0; bVal = bVal2 = 0; break; case 1: // ミクさん rVal = rVal2 = 20; gVal = gVal2 = 255; bVal = bVal2 = 100; break; case 2: // リンちゃん・レンきゅん rVal = 130; gVal = 255; bVal = 20; rVal2 = 140; gVal2 = 255; bVal2 = 20; break; case 3: // ルカ様 rVal = 230; gVal = 220; bVal = 220; rVal2 = 250; gVal2 = 220; bVal2 = 220; break; case 4: // ミク・リン rVal2 = 20; gVal2 = 255; bVal2 = 100; rVal = 140; gVal = 255; bVal = 20; break; case 5: // ねぎとろ rVal2 = 20; gVal2 = 255; bVal2 = 100; rVal = 255; gVal = 220; bVal = 220; break; case 6: // めいこねーさん出ないかな・・・ rVal = rVal2 = 255; gVal = gVal2= 10; bVal = bVal2= 10; break; case 7: // カイトにーさんも出ないのかな・・・ rVal = rVal2= 0; gVal = gVal2= 10; bVal = bVal2= 255; break; } // 出力 analogWrite( LED_R_PIN, rVal ); analogWrite( LED_G_PIN, gVal ); analogWrite( LED_B_PIN, bVal ); analogWrite( LED2_R_PIN, rVal2 ); analogWrite( LED2_G_PIN, gVal2 ); analogWrite( LED2_B_PIN, bVal2 ); }
ちなみに、各LEDの値は実際にLEDを光らせてトライアンドエラーをしながら決めている。
しかも、今回は、接触の問題なのか、LED1とLED2で同じ値を入れても色合いが違っていたため各々で微調整をかけている。
とまあ、以上のような感じで、ネギサイリウムVer.2ができたわけです。
全体を通して感想。
- 正直、一番難しいところは外装の組み立て。回路を如何に小さく収めるか
- 家にある工具、個人で手に入る材料でどうやってそれっぽいものをつくるか
- 普段から100円ショップとかで使えそうな材料を探しておくべき
こんなところかな。
最後に、一つ。
愛があれば何でもつくれるんだよ!