Digisparkは、マイコンのATTiny85の小さなボードです。LEDも付いているのでLEDを点滅させてみたいと思います。せっかくなのでパトランプで使われてそうなフラッシュ(点滅)にしてみます。
Lチカ
マイコンを使ってLEDの点灯と消灯を繰り返すプログラムを書いて動かすことです。プログラミングの練習によく使われています。
パトランプのフラッシュ(点滅)
パトランプのフラッシュの仕方にいろいろあるのがわかりました。以下のサイトを参考にさせていただき、LEDの点滅を作成しています。
用意するもの
- Digispark
- Arduino IDE
- PC
プログラム
DigisparkはのLEDは、P1につながっていたので、PB1を指定しています。
// Digispark の LED のピン番号
#define LED_PIN PB1
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// LED を点灯と消灯を繰り返すタイミング。単位はミリ秒です
// ランダムフォーのような点滅
const int sequence[12] = {
40, // On
40, // Off
40, // On
40, // Off
40, // On
40, // Off
40, // On
160, // Off
100, // On
120, // Off
50, // On
150, // Off
};
bool ledOn = false;
for (int i = 0; i < 12; i++) { // sequence の個数を繰り返す
ledOn = !ledOn; // LED の点灯と消灯の切替
digitalWrite(LED_PIN, ledOn);
delay(sequence[i]);
}
}
sequence
でLEDの点灯と点滅の時間を書いて、その順番でLEDを点灯と消灯をしています。
3回の点滅(トリプルフラッシュ)を繰り返す場合は、次のようになります。
// Digispark の LED のピン番号
#define LED_PIN PB1
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// LED を点灯と消灯を繰り返すタイミング。単位はミリ秒です
// トリプルフラッシュのような点滅
const int sequence[6] = {
50, // On
75, // Off
50, // On
75, // Off
50, // On
500, // Off
};
bool ledOn = false;
for (int i = 0; i < 6; i++) { // sequence の個数を繰り返す
ledOn = !ledOn; // LED の点灯と消灯の切替
digitalWrite(LED_PIN, ledOn);
delay(sequence[i]);
}
}
sequence
の個数を繰り返すところに数字を直接書いていますが、いろいろ修正して試すのなら(sizeof(sequence)/sizeof(int))
を書いたほうが間違えが少なくなるのでそのほうがよいです。
for (int i = 0; i < (sizeof(sequence)/sizeof(int)); i++) {
ledOn = !ledOn;
digitalWrite(LED_PIN, ledOn);
delay(sequence[i]);
}
Lチカでも点滅の仕方を変えれば面白いです。
sequence
は、点灯と消灯の時間をミリ秒で書いていました。
sequence
を10ミリ秒単位で書くこともできます。
#define H true
#define L false
#define LED_PIN PB1 // Digispark のLED
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// LED を点灯と消灯を繰り返すタイミング
const bool sequence[] = {
H, H, H, H, // 40ms
L, L, L, L, // 40ms
H, H, H, H, // 40ms
L, L, L, L, // 40ms
H, H, H, H, // 40ms
L, L, L, L, // 40ms
H, H, H, H, // 40ms
L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, // 160ms
H, H, H, H, H, H, H, H, H, H, // 100ms
L, L, L, L, L, L, L, L, L, L, L, L, // 120ms
H, H, H, H, H, // 50ms
L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, // 150ms
};
bool ledOn = L;
for (int i = 0; i < (sizeof(sequence)/sizeof(bool)); i++) { // sequence の個数を繰り返す
if (ledOn != sequence[i]) {
ledOn = sequence[i];
digitalWrite(LED_PIN, ledOn);
}
delay(10); // 10ms
}
}
これは、sequence
を書くのが面倒です。