はじめに:Arduinoで音楽を奏でる楽しさ
「電子工作で楽器を作ってみたい!」そう思ったことはありませんか?
今回は、Arduino UNO R4と圧電ブザーを使って、本格的な電子ピアノを自作します。プログラミングで音階をコントロールし、実際に曲を演奏できる楽器を、たった1時間程度で作ることができます。
この記事では、音が鳴る仕組みから回路設計、プログラミングまで、初心者の方にもわかりやすく丁寧に解説していきます。記事の最後には、実際にArduinoが「パプリカ」を自動演奏する様子もお見せします!
📝 この記事で学べること:
- 圧電ブザーから音が鳴る仕組み
- tone関数を使った音階の生成方法
- 電子ピアノの回路設計と配線
- 実際に曲を演奏するプログラミング技術
💡 Arduinoが初めての方へ
Arduino IDEのインストールや基本的な使い方については、こちらの記事をご覧ください:
👉 【Arduino入門】開発環境の準備とLED点滅でHello World!
🎵 必要な部品リスト
必須部品
| 部品名 | 数量 | 用途 | 参考価格 |
|---|---|---|---|
| Arduino UNO R4 Minima/WiFi | 1個 | メイン制御ボード | 約3,000〜4,000円 |
| 圧電ブザー(パッシブ型) | 1個 | 音を鳴らすスピーカー | 約50〜100円 |
| タクトスイッチ | 8個 | ピアノの鍵盤として使用 | 約10円/個 |
| ブレッドボード | 1個 | 配線用基板 | 約300円 |
| ジャンパー線(オス-オス) | 20本程度 | 配線接続 | 約500円(セット) |
オプション部品(視覚効果用)
| 部品名 | 数量 | 用途 | 参考価格 |
|---|---|---|---|
| LED(赤・緑など) | 8個 | 押された鍵盤を光らせる | 約10円/個 |
| カーボン抵抗 330Ω | 8個 | LED保護用の電流制限 | 約5円/個 |
電子ピアノ製作に必要な部品一覧
💡 推奨スターターキットのご紹介
これから始める方には、Arduino UNO R4と基本部品がセットになったスターターキットがおすすめです。個別に揃えるより経済的で、すぐに始められます。
ℹ️ 重要な注意点
圧電ブザーには「アクティブ型」と「パッシブ型」があります。今回使用するのは**パッシブ型(自励式)**です。アクティブ型は単一の音しか鳴らせないため、必ずパッシブ型を選んでください。パッケージに「Passive Buzzer」または「圧電スピーカー」と記載されているものを選びましょう。
🔧 圧電ブザーの仕組みを理解しよう
圧電効果とは?
圧電ブザーは、**圧電効果(ピエゾ効果)**という物理現象を利用して音を鳴らします。圧電セラミックと呼ばれる特殊な素材は、電圧をかけると物理的に伸び縮みする性質を持っています。
音が鳴る仕組み:
- 電圧ON → 圧電セラミックが伸びる → 金属板が押される → 「カチッ」
- 電圧OFF → 圧電セラミックが縮む → 金属板が引っ張られる → 「カチッ」
- この伸縮を高速で繰り返す(例:毎秒440回)→ 連続した音(ラの音)として聞こえる
圧電ブザーの動作原理:電圧のON/OFFで金属板が振動し、空気を振動させて音を発生
音階と周波数の関係
音の高さ(音階)は、**振動の速さ(周波数)**で決まります。周波数が高いほど高い音、低いほど低い音になります。
例:
- ド(C4): 523.3 Hz(1秒間に523.3回振動)
- ラ(A4): 880 Hz(1秒間に880回振動)
つまり、Arduinoから目的の音階に対応する周波数のパルス信号を出力すれば、圧電ブザーがその音階を鳴らしてくれるのです!
📐 回路設計と配線方法
回路図の全体構成
電子ピアノの回路図:8つのタクトスイッチで音階を制御
回路の構成要素:
| 接続先ピン | 部品 | 役割 |
|---|---|---|
| D2 | 圧電ブザー | tone関数で音を出力するピン |
| D3〜D10 | タクトスイッチ(8個) | 各音階の入力(内部プルアップ使用) |
| D3〜D10 | LED + 330Ω抵抗(各8個) | 押された鍵盤を視覚的に表示(オプション) |
| 5V / GND | 電源ライン | Arduinoから電源を供給 |
配線のポイント
-
圧電ブザーの接続
- プラス(赤)→ D2ピン
- マイナス(黒)→ GND
-
タクトスイッチの接続
- 一方の端子 → D3〜D10ピン(各1本ずつ)
- もう一方の端子 → GND(共通)
- プログラムで内部プルアップを有効化するため、プルアップ抵抗は不要
-
LED(オプション)の接続
- アノード(長い足)→ 各ピン(D3〜D10)と330Ω抵抗経由
- カソード(短い足)→ GND(共通)
💡 LED抵抗値の計算方法
LEDを使う場合の抵抗値計算については、こちらの記事で詳しく解説しています:
👉 電子工作の登竜門|LEDを光らせる【オームの法則】
ブレッドボード配線例
ブレッドボード上の配線例:カラフルなジャンパー線で見やすく配線
配線のコツ:
- ジャンパー線の色を統一すると、後からトラブルシューティングがしやすくなります
- 赤:5V電源
- 黒:GND
- 青:デジタル入力
- 黄:デジタル出力
- 配線が交差しないように、できるだけシンプルなルートを選びましょう
💻 プログラムコードの実装
完全なソースコード
// Arduino電子ピアノプログラム
// 圧電ブザーで8音階を演奏
void setup()
{
// D3~D10ピンを入力モードに設定し、内部プルアップを有効化
for(int i=3; i<=10; i++) {
pinMode(i, INPUT);
digitalWrite(i, HIGH); // 内部プルアップ抵抗を有効化
}
// D2ピンは圧電ブザー用(tone関数が自動設定するため明示不要)
}
void loop()
{
int frequency = 0; // 出力する周波数を格納する変数
// 各タクトスイッチの状態をチェックし、対応する周波数を設定
if(digitalRead(3)==LOW) frequency = 523; // ド(C4)
if(digitalRead(4)==LOW) frequency = 587; // レ(D4)
if(digitalRead(5)==LOW) frequency = 659; // ミ(E4)
if(digitalRead(6)==LOW) frequency = 698; // ファ(F4)
if(digitalRead(7)==LOW) frequency = 784; // ソ(G4)
if(digitalRead(8)==LOW) frequency = 880; // ラ(A4)
if(digitalRead(9)==LOW) frequency = 988; // シ(B4)
if(digitalRead(10)==LOW) frequency = 1046; // ド(C5)高いド
// 周波数が設定されていれば音を鳴らし、なければ停止
if (frequency != 0) {
tone(2, frequency); // D2ピンから指定周波数のパルス信号を出力
} else {
noTone(2); // 音を停止
}
}
コードの詳細解説
setup関数(初期設定)
for(int i=3; i<=10; i++) {
pinMode(i, INPUT);
digitalWrite(i, HIGH); // 内部プルアップ
}
何をしているのか?
- D3~D10ピンを「入力モード」に設定
digitalWrite(i, HIGH)で内部プルアップ抵抗を有効化- スイッチが押されていない時:HIGH(5V)
- スイッチが押された時:LOW(0V)
- 外部にプルアップ抵抗を付ける必要がなくなります
loop関数(メイン処理)
ステップ1:スイッチの状態を確認
if(digitalRead(3)==LOW) frequency = 523;
digitalRead(3)でD3ピンの状態を読み取り- LOWなら(スイッチが押されているなら)周波数を523Hzに設定
ステップ2:音を出力
if (frequency != 0) {
tone(2, frequency);
} else {
noTone(2);
}
tone(ピン番号, 周波数)で指定した周波数のパルス信号を出力- どのスイッチも押されていない場合(frequency == 0)は
noTone()で音を停止
tone関数の仕組み
tone(pin, frequency) は、Arduinoに標準搭載されている便利な関数です。
機能:
- 指定したピンから、指定した周波数の矩形波(パルス信号)を出力
- 内部的にタイマー割り込みを使用して、正確な周波数を生成
- 複数のピンで同時に使うことはできません(Arduino UNO/R4では1つのピンのみ)
使用例:
tone(2, 440); // D2ピンから440Hz(ラの音)を出力
tone(2, 880, 500); // 500ミリ秒間だけ880Hzを出力(第3引数で時間指定)
noTone(2); // 音を停止
🔗 詳しく知りたい方へ
Arduino tone()関数の公式リファレンス: https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/
よくある質問
Q: なぜif文が8個も並んでいるの?switch文じゃダメ?
A: もちろんswitch文でも書けます!ただし、この書き方には「複数のスイッチを同時に押した時、最後にチェックしたスイッチの音が優先される」という特徴があります。より高度な実装(和音を鳴らすなど)をしたい場合は、配列を使った方法もあります。
Q: 音が出ない場合は?
A: 以下をチェックしてください:
- 圧電ブザーの極性(+/−)が正しいか
- 使っているのが「パッシブ型」の圧電ブザーか(アクティブ型では音階が変えられません)
- タクトスイッチの配線が正しいか
- シリアルモニタで
Serial.println(digitalRead(3));などを使って、スイッチの状態を確認
🎼 音階と周波数の対応表
音階(ドレミファソラシド)は、それぞれ決まった周波数を持っています。以下は、ピアノの「中央ド(C4)」を基準とした3オクターブ分の周波数表です。
主要な音階の周波数一覧
| 音名 | オクターブ3 (低い音) |
オクターブ4 (中央ド) |
オクターブ5 (高い音) |
英語表記 |
|---|---|---|---|---|
| ド | 261.6 Hz | 523.3 Hz | 1046.5 Hz | C3 / C4 / C5 |
| レ | 293.7 Hz | 587.3 Hz | 1174.7 Hz | D3 / D4 / D5 |
| ミ | 329.6 Hz | 659.3 Hz | 1318.5 Hz | E3 / E4 / E5 |
| ファ | 349.2 Hz | 698.5 Hz | 1396.9 Hz | F3 / F4 / F5 |
| ソ | 392.0 Hz | 784.0 Hz | 1568.0 Hz | G3 / G4 / G5 |
| ラ | 440.0 Hz | 880.0 Hz | 1760.6 Hz | A3 / A4 / A5 |
| シ | 493.9 Hz | 987.8 Hz | 1975.5 Hz | B3 / B4 / B5 |
📝 豆知識
- ラ(A4)= 440Hz は、世界標準の「基準音」として定められています(ISO 16規格)
- オクターブが1つ上がると、周波数はちょうど2倍になります(例:A4=440Hz → A5=880Hz)
- 今回のプログラムでは、太字の**オクターブ4(中央ド)**の音階を使用しています
プログラムでの使用例
上記の表から好きな周波数を選んで、プログラムに組み込むことができます:
// 低い音域を使いたい場合(オクターブ3)
if(digitalRead(3)==LOW) frequency = 262; // 低いド(C3)
// 高い音域を使いたい場合(オクターブ5)
if(digitalRead(3)==LOW) frequency = 1047; // 高いド(C5)
🧪 実践!電子ピアノを組み立てて演奏してみよう
完成した回路
回路図に従って、ブレッドボード上に実際に組み立ててみました。
完成した電子ピアノの配線:8つのタクトスイッチと圧電ブザーを接続
配線のポイント:
- ジャンパー線が多く複雑に見えますが、パターンは同じことの繰り返しです
- 1つずつ丁寧に配線していけば、初心者でも30分程度で完成します
- より本格的に仕上げたい方は、ユニバーサル基板にはんだ付けするとコンパクトで丈夫になります
動作テストの手順
-
Arduino IDEでプログラムを書き込み
- 上記のコードをArduino IDEにコピー&ペースト
- ボードは「Arduino UNO R4 Minima」または「Arduino UNO R4 WiFi」を選択
- 「マイコンボードに書き込む」ボタンをクリック
-
動作確認
- タクトスイッチを1つずつ押して、それぞれ違う音が鳴るか確認
- LEDを付けている場合は、押したスイッチが光るか確認
- 音が出ない場合は、上記の「よくある質問」を参照
-
実際に演奏してみる
- まずは「ドレミファソラシド」と順番に押してみましょう
- 慣れてきたら、簡単な曲に挑戦!
📺 演奏デモ動画:ドレミの歌
実際にこの電子ピアノで「ドレミの歌」を演奏してみました。8bitゲーム音楽のような懐かしいサウンドが楽しめます!
動画のポイント:
- タクトスイッチを押すとLEDが光り、同時に対応する音が鳴ります
- 手動演奏なので、リズムは多少ずれますが、それも手作り楽器の味わいです
- 圧電ブザーの素朴な音色が、レトロな雰囲気を醸し出しています
🎁 応用編:Arduinoで曲を自動演奏させよう
手動演奏も楽しいですが、プログラミングの力を使えば、Arduinoに自動で曲を演奏させることもできます!
自動演奏プログラムの基本
tone() 関数に第3引数を追加すると、指定した時間だけ音を鳴らすことができます:
tone(2, 523, 500); // D2ピンから523Hz(ド)を500ミリ秒間出力
delay(550); // 音の長さ + 少し間を空ける
これを応用して、音階と音の長さの配列を作れば、メロディを自動演奏できます:
// メロディの例:ドレミファソファミレド
int melody[] = {523, 587, 659, 698, 784, 698, 659, 587, 523};
int noteDurations[] = {4, 4, 4, 4, 4, 4, 4, 4, 4}; // 4分音符
void loop() {
for (int i = 0; i < 9; i++) {
int noteDuration = 1000 / noteDurations[i];
tone(2, melody[i], noteDuration);
delay(noteDuration * 1.3); // 音と音の間に少し間隔を空ける
}
delay(2000); // 2秒待ってから繰り返し
}
📺 自動演奏デモ:パプリカ
実際に「パプリカ」のメロディをプログラムで自動演奏させてみました。このレトロな8bitサウンドは、ファミコン世代には懐かしく、若い世代には新鮮に聞こえるはずです!
自動演奏のメリット:
- 複雑な曲でも正確に演奏できる
- リズムやテンポが安定する
- 電源を入れるだけで曲が流れる「オルゴール」のような装置が作れる
- MIDI音源のような本格的な演奏システムへの第一歩
さらなる応用アイデア
基本ができたら、次のような拡張に挑戦してみましょう:
-
複数の曲を切り替え
- ボタンを追加して、曲を選択できるようにする
-
音量調整機能
- PWMとアンプICを使って音量を変えられるようにする
-
録音・再生機能
- EEPROMやSDカードに演奏データを保存
- 自分で弾いたメロディを記録して再生
-
MIDIコントローラー化
- USBシリアル通信でPCに接続
- DAWソフト(DTMソフト)と連携して本格的な音源を鳴らす
🧠 まとめ:電子ピアノ製作で学んだこと
この記事では、Arduinoと圧電ブザーを使った電子ピアノの製作を通じて、以下の技術を学びました:
習得した知識・技術
✅ 圧電効果の原理
- 電圧で物質が伸び縮みする圧電効果を利用して音を発生
- 周波数(振動の速さ)が音の高さを決定する
✅ tone関数の使い方
tone(pin, frequency)で任意の音階を生成tone(pin, frequency, duration)で音の長さも指定可能noTone(pin)で音を停止
✅ デジタル入力の基礎
- 内部プルアップ抵抗の活用で外部抵抗を削減
- タクトスイッチの状態読み取り
- 複数入力の効率的な処理方法
✅ 回路設計の実践
- ブレッドボードでの配線技術
- 電源とGNDの適切な分配
- 部品配置の最適化
次のステップへ:さらなる挑戦
この電子ピアノは、基本的な電子楽器です。ここから先は、あなたのアイデア次第で無限に拡張できます:
🎯 初級レベルの拡張
- 音階を増やす → タクトスイッチを12個にして半音(#/♭)を追加
- オクターブ切替 → 1つのボタンでオクターブを上下できるようにする
- LEDパターン → 演奏に合わせてLEDを点滅させるエフェクトを追加
🎯 中級レベルの拡張
- 録音・再生機能 → 演奏を記録してリピート再生
- リズムパターン → ドラムマシンのようなリズム伴奏を追加
- 液晶ディスプレイ → 押した音名や曲名を表示
🎯 上級レベルの拡張
- MIDI対応 → PC用音源ソフトと連携
- Bluetooth連携 → スマートフォンアプリで制御
- マルチティンバー → 複数の音色を切り替え可能に
電子工作の可能性は無限大
この記事で作った電子ピアノは、「センサー入力 → データ処理 → 出力」という、すべての電子工作に共通する基本パターンを含んでいます。
この基礎を応用すれば、次のようなプロジェクトにも挑戦できます:
- IoTデバイス → センサーデータをクラウドに送信
- 自動制御システム → 温度や湿度に応じて機器を制御
- ロボット → モーターやサーボを制御して動く装置を製作
- ゲーム機 → レトロゲーム風の電子ゲームを自作
あなたの想像力が、電子工作の可能性を無限に広げます。
ぜひこの記事をきっかけに、次のプロジェクトに挑戦してみてください。作品ができたら、SNSでシェアしていただけると嬉しいです!
関連記事
Arduinoをもっと学びたい方は、こちらの記事もおすすめです:
Happy Making! 🎵✨