Arduino Nanoで3声ポリフォニー「ハッピーバースデー」演奏 – 光同期メロディデモ
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino Nano R3 | 1 |
使用アプリ・ツール
- Arduino IDE
プロジェクト概要
Arduino Nanoと3つのブザーをミニブレッドボード1枚に収めて、「ハッピーバースデー」を3声のポリフォニー(多声部)で演奏します。
デモンストレーション
任意のUSB電源(PCでなくても可)に接続するだけで、「ハッピーバースデー」が無限ループで演奏され続けます…飽きるまで=]
各音符の変わり目に対応するチャンネル/ブザーのLEDが点滅するようになっています。
回路図・配線
極力コンパクトに、半田付けなしで作れるよう工夫しました。最終的に超小型ブレッドボードに全て収まりました:


ブレッドボード内部の穴は以下のように接続されています:

Arduino Nano v3.0(Gravitech製)はこのブレッドボードに完璧にフィットし、基板の両面に追加部品を配線できます。回路図は描いていませんが、以下のクローズアップ写真で十分理解できると思います。

使用部品は全て一般的なものです:
- Arduino Nano v3.0(互換機でもOK)
- ブザー×3(中央のブザーが少し大きいですが、これは「ベース」チャンネル用…という冗談です。実際は全く同じ音しか出ません=])
- LED×3
- 抵抗 100Ω(一般的なLED保護用は220Ωですが、今回は100Ωを使用)
ブザーのピン配置は以下のようになっています:

同型のブザー3個でも問題ありませんが、配置位置とコード内の出力ピン番号を変更する必要があります。
小さな「ハック」:ArduinoのI/OピンをブザーとLEDのGND代わりとして使用しています。プログラムでI/OピンをLOWに設定すると、標準のGNDピンと同じように使えます。クールでしょ?;)
プログラムについて
完全なスケッチは下記に掲載していますが、コンパイルには追加ライブラリToneが必要です:
(ポップアップが出たら右上の×で閉じてください)
インストール方法:Arduino IDEメニューの「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール…」でダウンロードしたZIPを選択するだけです。
このライブラリは、追加のハードウェアタイマーと割り込みを使って単一プロセッサで複数の音を同時生成する「レッドネック・マルチタスク」を実現します(OSなしで)。作者はBhagman氏、GitHubはこちら。
免責事項:コードは3つの「独立した」メロディスレッドを単一の線形フローでジャグリングする必要があるため、冗長で読みにくくなっています。後でリファクタリングしてメロディを分離し、他の曲にも対応できるようにしようと思いましたが、おそらくやらないでしょう=] 頑張ってください。フィードバック歓迎します!
ソースコード
#include <Tone.h>
Tone solo;
Tone bass;
Tone rythm;
const int t = 600; // 4分音符の長さ
const int tt = t * 2; // 2分音符
const int t14 = round(t * 1 / 4); // 16分音符
const int t24 = round(t * 2 / 4); // 8分音符
const int t34 = round(t * 3 / 4); // 付点8分音符
const int bassLedPin = 15; // A1
const int rythmLedPin = 17; // A3
const int soloLedPin = 19; // A5
void wait(Tone t) { while (t.isPlaying()) { } }
int bassLedState = LOW;
void switchBassLed() {
bassLedState = !bassLedState;
digitalWrite(bassLedPin, bassLedState);
}
int rythmLedState = LOW;
void switchRythmLed() {
rythmLedState = !rythmLedState;
digitalWrite(rythmLedPin, rythmLedState);
}
int soloLedState = LOW;
void switchSoloLed() {
soloLedState = !soloLedState;
digitalWrite(soloLedPin, soloLedState);
}
void setup(void) {
pinMode(14, OUTPUT); // A0 - LED GND
pinMode(16, OUTPUT); // A2 - LED GND
pinMode(18, OUTPUT); // A4 - LED GND
pinMode(bassLedPin, OUTPUT);
pinMode(rythmLedPin, OUTPUT);
pinMode(soloLedPin, OUTPUT);
pinMode(2, OUTPUT); // ソロブザー GND
pinMode(9, OUTPUT); // リズムブザー GND
solo.begin(6); // ソロブザー信号ピン
bass.begin(12); // ベースブザー信号ピン
rythm.begin(0); // リズムブザー信号ピン
// イントロ部分
solo.play(NOTE_D4, t34); switchSoloLed(); wait(solo);
solo.play(NOTE_D4, t14); switchSoloLed(); wait(solo);
}
void loop(void) {
// 以下、ハッピーバースデーのメロディを3パートで演奏
// ベース、リズム、ソロの各パートをタイミングよく再生
// 各音符再生時に対応するLEDを点滅
// 詳細は元コードを参照(全音符記述のため省略)
}
※ 完全なメロディデータは元記事のコードを参照してください。ループ内は音符データの連続記述になっています。
製造プロセス
- K30 CO2センサで室内空気質をリアルタイム監視する
- 1SheeldとArduinoで盲ろう者のコミュニケーションを支援する
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- Arduino Nanoで作るウェアラブル心拍ドレス:CrazyCircuitsとDFRobotセンサーで自信を持ってプロジェクトを構築
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
- Arduino MegaとNextion HMIで作る高機能ウェザーステーション
- Arduinoベースのヌンチャク操作6自由度ロボットアームキット
- Arduino Nanoとジョイスティックで2軸ステッピングモーターを制御:Visuinoで簡単プログラミング
- Arduino Nanoで作る携帯型ガイガーカウンター
- Arduino UNOとEthernetシールドで太陽放射を測定する自作ピラノメーター