プログラミング素人のArduino

技術屋の末端。プログラミングは専門外。 電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#、ラズパイ始めました。

LED Cube 3x3x3

3x3x3 の3次元のLED Cubeができました。



ハード構成としては、3x3のときと同じ様なものをさらに2段作ります。
ただし、LEDのカソードは一段目と共通にすることを注意しながら組み立てます。



アノード側は1段目と同じですが、カソードは一段目に接続するために足を折り曲げずに置いておきます。
これをはんだつけによって、立体的に積み上げていきます。
赤いリード線(カソード側)がついているほうにこの伸ばしたままにした足をつけます。

写りこんでいるピンセットは ↓逆作動ピンセット
アネックス(ANEX) ステンレスピンセット 逆作動(小) No.134



なにかと活用できます。

さて、プログラミングですが、LEDを一つずつ制御する関数はつくりましたが、これをさらに発展させて、因数を持たせてLEDを制御するようにします。
↓のような因数をもつ関数をつくり、

 int LED(int);  //プロトタイプ宣言
そのなかで、Noに応じてLEDを変化させるために
ifで条件分けします。

また、LEDが27個に増えているのでアノード(マイナス側)は9本に増えています。
また、この関数では計算結果を数値として返すことはしないので "int"で定義しても "void"で定義してもいいようです。
ここではintのままにしておきます。
また、delay(LEDを点灯したままにしておく)が毎回必要そうなので、これもあらかじめ関数に組み込んでおきます。

/*↓LEDを一つずつONするための関数*/
int LED(int no) {
if (no == 1) {
//1
digitalWrite(2, HIGH); //+ 消したいとき
digitalWrite(3, LOW); //+
digitalWrite(4, LOW); //+
digitalWrite(5, LOW); //-
digitalWrite(6, HIGH); //-
digitalWrite(8, HIGH); //-
digitalWrite(9, HIGH); //-
digitalWrite(10, HIGH); //-
digitalWrite(11, HIGH); //-
digitalWrite(A0, HIGH); //-
digitalWrite(A1, HIGH); //-
digitalWrite(A2, HIGH); //-
delay(wait);
return 0;
}
else if (no == 2) {
//2
digitalWrite(2, LOW); //+
digitalWrite(3, HIGH); //+
digitalWrite(4, LOW); //+
digitalWrite(5, LOW); //-
digitalWrite(6, HIGH); //-
digitalWrite(8, HIGH); //-
digitalWrite(9, HIGH); //-
digitalWrite(10, HIGH); //-
digitalWrite(11, HIGH); //-
digitalWrite(A0, HIGH); //-
digitalWrite(A1, HIGH); //-
digitalWrite(A2, HIGH); //-
delay(wait);
return 0;
}

for(j=1;j< times/2;j++){
LED1();
delay(wait);
LED0();
delay(wait);
LED2();
delay(wait);
↑のように書いていたものが↓になります。
for(j=1;j< times/2;j++){
LED(1);
LED(2);

ひとつずつ順番に点けているだけならこれでもよいですが、27個となるとそれも結構大変なので、Noだけを入力すればいいようにします。
/*LED 5連続Pattern*/
void ptn8(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) {
LED(p1);
LED(p2);
LED(p3);
LED(p4);
LED(p5);
LED(p6);
LED(p7);
LED(p8);
}
LED No.を引数として、関数に引数を渡す関数を作成します。
関数 in 関数ですね。こんなこともできます。

8連続パターン、9連続パターン、5連続パターンの3種類を作りました。
もっとこまかく、2~27とかも作ってもいいですが、たとえば、4なら2回同じことを書けば8で使えるので、これは、どのようにすれば一番労力を節約できるか?というだけのことです。

ここでは、関数を"int"ではなく"Void"で作成しましたので、
return 0; 
は要らなくなります。

あとは、↓のようなLEDの配置をイメージしながらパターンを作っていきます。


長くなったので、動画とソース全文はNext