3x3x3LED cubeを制御する Arduino UNOプログラミングワークショップfor kid’s part4


ダイナミック点灯LED cubeで雨のような効果を出す

LEDcube1
まずはダイナミック点灯の下準備。FlexTimer2という割り込みライブラリを使用します。ライブラリと言うのはざっくりいうと、親切な誰かが作ってくれたスペシャルなプログラムをだれでも簡単に利用できるようにしてくれたものです。ありがたく使わせていただきましょう。

割り込みとは何かというと、loop内の処理中に他の処理をするということですね。今回はloop内はダイナミック点灯の処理、割り込み処理rainで点灯させるLEDの決定。上から下へ移動を行っています。
wimleers/flexitimer2をダウンロードしてArduino/libraryに保存。

#include <FlexiTimer2.h> //flexTimer2というライブラリを使います。ダウンロードしてください。
const int anode_pins[] = {2,4,5,6,7,8,9,10,12};    // アノードに接続するArduinoのピン
const int cathode_pins[] = {A0,A1,A2};  // カソードに接続するArduinoのピン
const int number_of_anode_pins = sizeof(anode_pins) / sizeof(anode_pins[0]);
const int number_of_cathode_pins = sizeof(cathode_pins) / sizeof(cathode_pins[0]);
int first=0,second=0,third=0; //一番上の段で点灯させるものから順にfirst,second,thirdという変数を用意

void rain()//割り込みをかけるのはこのrainです。
{
  third=second;// 二段目で点灯していたものを三段目に代入
  second=first;// 一段目で点灯していたものを二段目に代入
  first=random(number_of_anode_pins);//一段目はランダムに
  
}
void clear_segments() {        //ここでは点灯していたものを消す作業をclear_segmentsに保存しておきます。
  for (int j = 0; j < number_of_anode_pins; j++) {
    digitalWrite(anode_pins[j], LOW);
  }
}
// setup() は、最初に一度だけ実行される
void setup() { 
  for (int i = 0; i < number_of_anode_pins; i++) {
    pinMode(anode_pins[i], OUTPUT);  // anode_pinsを出力モードに設定する
  }
  for (int i = 0; i < number_of_cathode_pins; i++) {
    pinMode(cathode_pins[i], OUTPUT);  // anode_pinsを出力モードに設定する
  }
  FlexiTimer2::set(100, rain); //100ミリ秒に一回割り込みをかけます。rain
  FlexiTimer2::start();
}
void loop () { //ここはただ繰り返します。で0.1秒ごとに割り込みが入ります。
  clear_segments(); //anode pinすべてを一度消します。
   digitalWrite(cathode_pins[0], LOW);
   digitalWrite(anode_pins[first], HIGH); //一段目の点灯
  digitalWrite(cathode_pins[1], HIGH);
  digitalWrite(cathode_pins[2], HIGH);
  delay(2); // 2ミリ秒待ってもらいます。delayなしにするとcathodeピンのオンオフが間に合わず、すべての段が点灯してしまうのです。
  clear_segments();
  digitalWrite(cathode_pins[0], HIGH); 
  digitalWrite(cathode_pins[1], LOW);
   digitalWrite(anode_pins[second], HIGH);  //二段目の点灯
  digitalWrite(cathode_pins[2], HIGH);
  delay(2);
  clear_segments();
  digitalWrite(cathode_pins[0], HIGH); 
  digitalWrite(cathode_pins[1], HIGH);
  digitalWrite(cathode_pins[2], LOW);
   digitalWrite(anode_pins[third], HIGH); //三段目の点灯
   delay(2);
}

雨が降るようなイメージになったでしょうか?割り込みの時間等をかえていろいろと試してみてください。あとはいろいろなパターンを試していきましょう。

ご自由にどうぞ