いくつかの例 ⇒ 実際にやってみて

【アルディーノNANOの2から3番に各LED、6番にパッシブブザーをつけました。カエルの合唱の音楽を鳴らし LED もそれに合わせて点滅させて】

★次から曲名だけで変更してくれる

【カエルの合唱にして】【ラーメン屋は】、、、など

注)どちらの回答がより有用ですか?この選択は Gemini の回答をより有用なものにするために役立てられます。回答の読み込みに少し時間がかかることがあります。

選択肢 A

楽しそうなプロジェクトですね!「カエルの合唱」が鳴るたびにLEDが交互に光れば、まるでカエルたちがステージで歌っているような臨場感が出そうです。

まずは、回路の構成とコードの例をまとめました。


回路の接続イメージ

  • LED 1 (アノード): 2番ピンへ (カソードは抵抗を挟んでGNDへ)
  • LED 2 (アノード): 3番ピンへ (カソードは抵抗を挟んでGNDへ)
  • パッシブブザー (+): 6番ピンへ
  • パッシブブザー (-): GNDへ

※LEDには必ず保護抵抗(220Ω〜1kΩ程度)を入れてくださいね。

サンプルコード

このスケッチでは、メロディの音符に合わせて2つのLEDを交互に点滅させます。

C++

#define NOTE_C4 262
#define NOTE_D4 294
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_G4 392
#define NOTE_A4 440

const int led1 = 2;
const int led2 = 3;
const int buzzer = 6;

// カエルの合唱の音階
int melody[] = {
  NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_C4, // ドレミファミレド
  NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, // ミファソラソファミ
  NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4,                            // ド・ド・ド・ド
  NOTE_C4, NOTE_C4, NOTE_D4, NOTE_D4, NOTE_E4, NOTE_E4, NOTE_F4, NOTE_F4, // ドドレレミミファファ
  NOTE_E4, NOTE_D4, NOTE_C4                                      // ミレド
};

int noteDurations[] = {
  4, 4, 4, 4, 4, 4, 2,
  4, 4, 4, 4, 4, 4, 2,
  8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  4, 4, 2
};

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop() {
  for (int i = 0; i < 29; i++) {
    // LEDを交互に切り替え
    if (i % 2 == 0) {
      digitalWrite(led1, HIGH);
      digitalWrite(led2, LOW);
    } else {
      digitalWrite(led1, LOW);
      digitalWrite(led2, HIGH);
    }

    int duration = 1000 / noteDurations[i];
    tone(buzzer, melody[i], duration);
    
    // 音の間の休止時間
    int pauseBetweenNotes = duration * 1.30;
    delay(pauseBetweenNotes);
    
    // 音が終わったらLEDを消す
    noTone(buzzer);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
  }
  delay(2000); // 1曲終わったら2秒待機
}

ポイント

  • 交互点滅: i % 2 を使って、偶数番目の音と奇数番目の音でLEDを切り替えています。
  • パッシブブザー: 音程をコントロールするためには必ず「パッシブ」型が必要です(アクティブ型だと周波数が固定されてしまい、メロディが奏でられません)。

もし「もっと豪華にLEDを光らせたい(例えばランダムに光らせたい、あるいは音の高さに合わせて光り方を変えたい)」といったカスタマイズをしたくなったら、いつでも教えてくださいね。コードを調整しましょうか?

選択肢 B

Arduino Nanoを使って「かえるの合唱」を演奏し、LEDを同期させるプログラムですね。

パッシブブザー(圧電スピーカー)は、指定した周波数のパルスを送ることで音階を作ります。LEDは2番と3番ピンとのことですので、交互に光らせたり、メロディに合わせて点滅させたりするように構成しました。

回路の確認

  • LED 1: デジタルピン 2(抵抗を挟んで接続)
  • LED 2: デジタルピン 3(抵抗を挟んで接続)
  • パッシブブザー: デジタルピン 6

Arduino スケッチ (プログラム)

C++

// ピンの設定
const int led1 = 2;
const int led2 = 3;
const int buzzer = 6;

// 音階の周波数定義
#define NOTE_C4  262 // ド
#define NOTE_D4  294 // レ
#define NOTE_E4  330 // ミ
#define NOTE_F4  349 // ファ
#define NOTE_G4  392 // ソ
#define NOTE_A4  440 // ラ

// メロディのデータ
int melody[] = {
  NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_C4, 0, // かえるのうたが
  NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, 0, // きこえてくるよ
  NOTE_C4, 0, NOTE_C4, 0, NOTE_C4, 0, NOTE_C4, 0,                   // クワ クワ クワ クワ
  NOTE_C4, NOTE_C4, NOTE_D4, NOTE_D4, NOTE_E4, NOTE_E4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_C4 // ケケケケ...
};

// 音の長さ (4:四分音符, 8:八分音符)
int noteDurations[] = {
  4, 4, 4, 4, 4, 4, 4, 4,
  4, 4, 4, 4, 4, 4, 4, 4,
  4, 4, 4, 4, 4, 4, 4, 4,
  8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4
};

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop() {
  for (int thisNote = 0; thisNote < sizeof(melody) / sizeof(int); thisNote++) {
    
    // 音の長さを計算 (例: 1000ms / 4 = 250ms)
    int noteDuration = 1000 / noteDurations[thisNote];
    
    if (melody[thisNote] == 0) {
      // 休符の場合
      delay(noteDuration);
    } else {
      // 音を鳴らす
      tone(buzzer, melody[thisNote], noteDuration);
      
      // LEDを交互に光らせる
      if (thisNote % 2 == 0) {
        digitalWrite(led1, HIGH);
        digitalWrite(led2, LOW);
      } else {
        digitalWrite(led1, LOW);
        digitalWrite(led2, HIGH);
      }
      
      // 音が鳴っている間待機
      delay(noteDuration);
    }

    // 音の切れ目を作るために少し止める
    noTone(buzzer);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    delay(noteDuration * 0.30);
  }

  // 曲が終わったら2秒待機
  delay(2000);
}

プログラムのポイント

  • tone() 関数: 指定したピンに特定の周波数を出力します。
  • 同期: 音を鳴らすタイミング(tone)と同じループ内で digitalWrite を行い、LEDを光らせています。
  • 休符の処理: 0 を休符として扱い、その間は音を鳴らさず delay だけさせています。
  • リズム: 最後の「ゲゲゲゲ…」の部分は、noteDurations8(八分音符)にすることでテンポを速くしています。

もし「もっとLEDを激しく点滅させたい」や「3拍子っぽく光らせたい」などのアレンジがあれば教えてくださいね。次は、このコードに「光センサー(Cdsセル)を追加して、暗くなったら歌い出す」ような機能を追加してみるのはいかがでしょうか?

【アルディーノNANOの2から8番に各LED、10番にパッシブブザーをつけました。
ドレミの音楽を鳴らし LED もそれに合わせて点滅させて】

【接続を変えました。2から4番に3色LED、6番にパッシブブザー。
さくらさくらの音楽を鳴らし LED もそれに合わせて点滅させて】

【LEDの色をピンク多くして】、、、など

ロボットカーの例

【Arduino Nanoにモータ1を6とピン7に、モータ2を4とピン5に2つ接続。
10に赤LED、9に緑色LED、8に青LED、2に赤外線センサを接続。
赤外線リモコンのボタン前で青LEDを1秒点灯し1秒前進、
後で緑LEDを1秒点灯し1秒後退、
右で赤LEDを0.1秒点灯し0.1秒右折後に0.1秒前進、
左で赤LEDを0.1秒点灯し0.1秒左折0.1秒前進、
1で赤LED1秒点灯、6で緑LEDと赤LED1秒点灯、7で全LEDを1秒点灯
コード例を教えて】