いくつかの例 ⇒ 実際にやってみて
【アルディーノ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だけさせています。 - リズム: 最後の「ゲゲゲゲ…」の部分は、
noteDurationsを8(八分音符)にすることでテンポを速くしています。
もし「もっと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秒点灯
コード例を教えて】