#8中級

速度調整できるKnight Rider風LED

4.5(60)
119 完了
速度調整できるKnight Rider風LED
6個のLEDの上を光が端から端へ走り、折り返して戻ってきます。ポテンショメーターのつまみを回すと、その速さをすぐに調整できます。つまみを一方の端にすると光が飛ぶように進み、反対の端にするとゆっくり進みます。1つのつまみで動作中のアニメーションを操る楽しさを体験できます。

動画

回路図

速度調整できるKnight Rider風LED - Circuit

ソースコード

Arduino (C++)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   Knight Rider LED Effect with Adjustable Speed
4// ─────────────────────────────────────────
5// A potentiometer sets the speed of the Knight Rider (back and forth) LED
6// effect. A0 is read at every step and its 0-1023 value becomes the delay
7// time (ms).
8//
9// Pins:
10//   D2, D3, D4, D5, D6, D7 -> 6 LEDs (in order)
11//   Each LED with a 330 ohm resistor
12//   A0 -> Potentiometer wiper
13//   (outer legs to 5V and GND)
14
15int ledPins[] = {2, 3, 4, 5, 6, 7};   // LED pins in lighting order
16int potValue;                         // Pot value = delay (ms)
17
18void setup() {
19  // Set all LED pins as outputs
20  for(int i = 0; i < 6; i++) {
21    pinMode(ledPins[i], OUTPUT);
22  }
23}
24
25void loop() {
26  // Forward: D2 to D7
27  for(int i = 0; i < 6; i++) {
28    potValue = analogRead(A0);        // Read the speed (0-1023)
29    digitalWrite(ledPins[i], HIGH);
30    delay(potValue);                  // Wait as many ms as the pot value
31    digitalWrite(ledPins[i], LOW);
32  }
33
34  // Backward: D6 to D3. The end LEDs are skipped so the bounce looks seamless
35  for(int i = 4; i > 0; i--) {
36    potValue = analogRead(A0);
37    digitalWrite(ledPins[i], HIGH);
38    delay(potValue);
39    digitalWrite(ledPins[i], LOW);
40  }
41}
42

よくある質問

これまでのプロジェクトと違い、何を学べますか?▾

アナログ入力(ポテンショメーター)と双方向のループを組み合わせます。光が往復する各ステップでポテンショメーターの値を読み取り、待ち時間を更新します。センサーの値に応じて動作を変えるための基礎になります。

読み取り値が揺れます。どうすれば安定しますか?▾

アナログの読み取り値が少し揺れるのは正常です。数回分の平均を取るか、`map()`で値を粗い段階(例:10ミリ秒刻み)に分けると、揺れが目立たなくなります。

ポテンショメーターの代わりに別のセンサーを使えますか?▾

はい、LDRを使えます。ただし、LDR単体では電圧を出力できません。LDRと固定抵抗を5 VとGNDの間につないで分圧回路を作り、2つの部品の接続点をA0につないでください。あとはコード内で`map()`を使い、測定値の範囲を希望する待ち時間の範囲に変換できます。

どのアナログピンを使えばよいですか?▾

Unoでは、A0からA5までのすべてのピンでアナログ値を読み取れます。コードで指定したピンと回路の接続が一致していることを確認してください。A4とA5はI2Cにも使うため、後でディスプレイを追加する予定があればA0を選んでください。