自作電子ピアノキーボード:内蔵曲付きで演奏も作曲も楽しめる
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino UNO | 1 |
| Adafruit 標準LCD - 16x2 白文字/青背景 | 1 |
| SparkFun プッシュボタンスイッチ 12mm | 8 |
| 抵抗 220Ω | 4 |
| 抵抗 560Ω | 1 |
| 抵抗 1kΩ | 1 |
| 抵抗 4.7kΩ | 1 |
| 抵抗 10kΩ | 3 |
| 抵抗 1MΩ | 1 |
| ブザー(ピエゾ) | 1 |
| LED(汎用) | 1 |
| 単回転ポテンショメータ - 10kΩ | 1 |
| ジャンパーワイヤー(汎用) | 1セット |
| ブレッドボード(汎用) | 1 |
プロジェクト概要
はじめに
私は電子工作の世界には完全に初心者です。コーディングのバックグラウンドはありますが、常に新しいアイデアや提案を歓迎しています。
最近、ピエゾブザーとそのコーディングについて学んでおり、これがこれまでの学習成果としての作品です。新機能やスイッチの追加など、拡張の余地は大いにあり、今後取り組む予定ですが、まずは次のチャレンジへ進みます!
以下はデバイスの動作デモ動画で、プリセット曲のメニューも含まれています。実は曲4と5は同じですが、より大きく良いものを作りたいという衝動に駆られ、さらに多くの曲の音楽コードを書くことは今回の課題ではありませんでした。メインループと各曲ループの基本コードは自分のアイデアに合わせて簡単にアレンジできるので、自由に変更してください。
動作デモ
(動画プレースホルダー)
ハードウェアのセットアップ方法
ピアノ鍵(スイッチ)
ピアノ鍵のスイッチは「抵抗ラダー」方式で接続します。抵抗を順番に配置し、各スイッチを電源に接続します。このプロジェクトでは(単位:Ω)1M、10k、4.7k、1k、560、220を使用しました。左端の第1ピアノスイッチは電源に接続し、かつ回路内の次のスイッチにも接続します。第2スイッチは最小の抵抗に接続し、それ以降の各スイッチは順に大きい抵抗に接続します。最後のスイッチは10kΩ抵抗でグラウンドに落とし、かつ全7スイッチをArduinoの「アナログ入力」ピンA0に接続します。メインスケッチで各ピアノ鍵に対応する音楽周波数を定義します。このプロジェクトではC4、D4、E4、F4、G4、A4、B4を使用し、C4を左端のスイッチに割り当てました。周波数値を変更したり、スイッチを追加して完全にカスタマイズすることも可能です!
LCD画面
回路図に従ってLCDピンを接続します。LCDピン3をポテンショメータに接続し、画面コントラストを調整します。ポテンショメータの両端ピンを電源とグラウンドに接続してこの回路を完成させます。LCDピン15は220Ω抵抗を介して電源に接続します。これらのピンが自分のプロジェクトで異なる場合は、コードを適宜更新してください。
メニュースイッチ
メニュースイッチを電源に接続し、10kΩ抵抗でグラウンドに落とします。このスイッチはArduinoのピン7にも接続し、コードで制御できるようにします。
LED
LEDは「メニューモード」に入ったとき(ピアノ鍵が無効化される)に点灯して知らせます。メニュースイッチを押すとLEDが点灯します。LEDのアノード(プラス側)をArduinoのピン6に、カソードを220Ω抵抗でグラウンドに接続します。
ピエゾブザー
ピエゾブザーの片側をArduinoピン8に、もう片側を220Ω抵抗でグラウンドに接続します。コード内のtone関数がこのピンを参照して音を出します。
コードの仕組み
セットアップ部分
LiquidCrystal.hとpitches.hライブラリをインポートし、後でそれらを参照できるようにする- メニュースイッチの名前を定義し、どのピンが入力/出力かを決定、7つのピアノ鍵それぞれの周波数値を設定
- 各曲ごとに新しいタブを作成し、コードを整理・理解しやすく、後で拡張しやすくする。曲を削除・追加する場合は、メインの「Electronic Keyboard」スケッチのコードも併せて変更すること
メインループ
- キーボードはLED消灯、すべてのピアノ鍵が有効な状態で開始
- ループがメニューボタンの押下を検知すると、ピアノ鍵を無効化しLEDを点灯して「メニューモード」であることを表示
メニューへのアクセス
- メニューボタンを押してプリセット曲を順に切り替え、任意のピアノ鍵を押してLCDに表示されている曲の再生を開始
- LCDに現在再生中の曲名が表示され、曲が終わるとメニューの同じ位置に戻る。そこから再生し直すか、次の曲へ進める
- メニューボタンをダブルクリックするとメニューが最初から再開
- ピアノ鍵モードに戻るには、メニューの残りの曲をすべて巡る。LCDが空白になりLEDが消灯したら、ピアノ鍵が再び使えるようになる
コード
- Electronic Keyboard(メイン)
- Song1〜Song5(各曲)
- pitches.h(音階定義ライブラリ)
Electronic Keyboard Arduino
メインコード(抜粋)
// LCD画面、スイッチ、LEDの設定
#include <LiquidCrystal.h>
#include "pitches.h"
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int LCDswitchPin = 7; // メニュー/LCDスイッチ名定義
int LCDswitchState = 0; // メニュー/LCDスイッチ状態をオフ/LOWに設定
int prevLCDswitchState = 0;
int blueLED = 6;
int LCDswitchCounter = 0; // メニューボタン押下カウンタ
// (このコードはメニューボタン押下をカウントし、PCに表示し、
// 「メニューモード」終了後にゼロから再開する。
// 現在このスケッチでは他の効果はないが、
// 後で新機能でプロジェクトを拡張する際の良い出発点になる)
// 音楽ノート鍵 - 周波数値設定
int notes[] = {262, 294, 330, 349, 392, 440, 494}; // C, D, E, F, G, A, Bの音
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(LCDswitchPin, INPUT);
pinMode(blueLED, OUTPUT);
digitalWrite(blueLED, LOW); // ピアノ鍵がオンの間はLEDをオフ
}
void loop() {
LCDswitchState = digitalRead(LCDswitchPin);
int keyVal = analogRead(A0);
Serial.println(keyVal);
lcd.noDisplay();
digitalWrite(blueLED, LOW); // メインループ開始毎にLEDをオフ
// ************** メニューボタン押下で"LCDstart"開始 ***********
if (LCDswitchState == HIGH) {
digitalWrite(blueLED, HIGH); // LEDオンでピアノ鍵無効&「メニューモード」表示
lcd.display();
lcd.clear();
LCDstart();
}
// ***********************************************************************
////// キーボード音符&周波数判定 //////
// 作成した抵抗ラダーで各ピアノ鍵ボタンの電圧を変化
// 220Ω = C5, 560Ω = D5, 1kΩ = E5 等...
if(keyVal == 1023) { tone(8, notes[0]); } // C
else if(keyVal >= 990 && keyVal <= 1010) { tone(8, notes[1]); } // D
else if(keyVal >= 960 && keyVal <= 980) { tone(8, notes[2]); } // E
else if(keyVal >= 900 && keyVal <= 945) { tone(8, notes[3]); } // F
else if(keyVal >= 650 && keyVal <= 710) { tone(8, notes[4]); } // G
else if(keyVal >= 500 && keyVal <= 550) { tone(8, notes[5]); } // A
else if(keyVal >= 5 && keyVal <= 10) { tone(8, notes[6]); } // B
else if(keyVal <= 1) { noTone(8); } // スイッチ未押下時は音なし
}
// 以下、LCDstart()、Song1title()〜Song5title()、各曲再生関数が続く...
Song1 Arduino
第1曲:スーパーマリオブラザーズ テーマ曲
void Song1() {
lcd.clear();
int melody[] = { NOTE_E7, NOTE_E7, 0, NOTE_E7, 0, NOTE_C7, NOTE_E7, 0, NOTE_G7, 0, 0, 0, NOTE_G6, 0, 0, 0, ... };
int noteDurations[] = { 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, ... };
lcd.setCursor(1, 0); lcd.print("Now playing...");
lcd.setCursor(0, 1); lcd.print("MARIO THEME SONG");
// 再生ループ処理...
Song1title();
}
Song2 Arduino
第2曲:スーパーマリオブラザーズ アンダーワールド曲
Song3 Arduino
第3曲:ジェパディ テーマ曲
Song4 Arduino
第4曲:短い汎用メロディ
Song5 Arduino
第5曲:短い汎用メロディ(曲4と同一)
pitches.h Arduino
楽曲用音階ライブラリ。他のキーボード/曲スケッチと同じフォルダに保存。
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
// ... NOTE_DS8 4978 まで定義
回路図
回路図ファイルは別途参照してください。
製造プロセス
- TJBot入門:組み立て、設定、音声制御で自分だけのAIロボットを構築
- スマート渇きアラート植物アラーム – 最適な水やりタイミングを知らせるDIYセンサー
- イタリア語ワードクロック自作:Arduino Nano、NeoPixel、LCD、RTCで時刻を文字で表示
- MIDIキーボードをArduino・LED・MuseScoreでスマートピアノチューターに変身
- Arduinoでシンプルな障害物センサーを自作 – IR LEDとフォトダイオード入門
- Arduino MKR Fox 1200で作る信頼性の高いSigfox kWhメーター
- Bluetooth対応温度モニター:Arduino NanoとHC-06でスマホ監視
- コンパクトなRDA5807ミニステレオラジオ:Arduino Nanoプロジェクト
- 非接触ジェスチャー錠: APDS-9960とArduinoでセキュアアクセス
- Arduino Nanoコンパニオンキット – 電子工作に必須の部品とツールを搭載した多機能IC型デバイス
- Arduino UNOで作る精密反応速度テスター