ジョイスティックの2軸で音を作る楽器を作ろう
プログラミングで「アナログ入力2つを同時に使う」みたいな作例ある?


「ジョイスティックシンセサイザー」を作ろう! ジョイスティックを左右で音の高さ、上下でビブラート (音の揺れ) を変える楽器なんだ。アナログ入力2つを同時に扱う、いい練習になるよ。
今回は、プログラミングで複数のアナログ入力を扱いたいお子さんに向けて、初心者キットだけで作れる「ジョイスティックシンセサイザー」を紹介します。
キット付属のジョイスティック (2軸 + ボタン) を使って、左右で音の高さ、上下でビブラートの深さを変えるシンプルな電子楽器です。プログラミング自由研究としても、音楽的にも楽しめます。
この記事で作るもの
- ジョイスティックを左右に倒すと音の高さが変わる (連続値、ドレミの音階に量子化はしていない)
- 上下で音にビブラート (揺れ) がつく
- ボタンを押すと音が鳴る
- シリアルモニタに現在の値が表示
使う部品
| 部品 | 役割 | 個数 |
|---|---|---|
| Arduino UNO R3 | 頭脳 | 1 |
| ジョイスティックモジュール | 2軸+ボタン | 1 |
| パッシブブザー | 音を出す | 1 |
| ブレッドボード | 配線 | 1 |
| ジャンパーワイヤー | つなぐ | 7本前後 |
配線図
ジョイスティックモジュール直結: GND → GND +5V → 5V VRx → A0 VRy → A1 SW → D2 ブザー: +足 → D8 -足 → GND
プログラム
#define VRX A0
#define VRY A1
#define BTN 2
#define BUZZER 8
void setup() {
Serial.begin(9600);
pinMode(BTN, INPUT_PULLUP);
Serial.println("シンセ スタート!");
}
void loop() {
int x = analogRead(VRX);
int y = analogRead(VRY);
bool playing = (digitalRead(BTN) == LOW);
int baseFreq = map(x, 0, 1023, 200, 1500);
int vibrato = map(y, 0, 1023, -100, 100);
int finalFreq = baseFreq + vibrato * sin(millis() / 50.0);
Serial.print("X: ");
Serial.print(x);
Serial.print(" Y: ");
Serial.print(y);
Serial.print(" Freq: ");
Serial.println(finalFreq);
if (playing) {
tone(BUZZER, finalFreq);
} else {
noTone(BUZZER);
}
delay(30);
}
プログラムの動き
flowchart TD
A[起動] --> B[X軸を読む]
B --> C[Y軸を読む]
C --> D[ボタン読む]
D --> E["基本周波数を計算
X軸から"] E --> F["ビブラート計算
Y軸×sin"] F --> G{ボタン押されてる?} G -->|Yes| H[ブザー鳴らす] G -->|No| I[ブザー止める] H --> J[30ms待つ] I --> J J --> B
X軸から"] E --> F["ビブラート計算
Y軸×sin"] F --> G{ボタン押されてる?} G -->|Yes| H[ブザー鳴らす] G -->|No| I[ブザー止める] H --> J[30ms待つ] I --> J J --> B
プログラミングのポイント
このプログラムでは、map関数で数値の範囲を変換し、sin関数で振動を作る2つのテクニックを使っています。map関数は整数のだいたいの範囲変換で、範囲外を止めたい時はconstrain関数を組み合わせます。
学べる関数
map(値, 元最小, 元最大, 新最小, 新最大) で範囲変換。sin(値) で-1〜1の値を作って揺れに使う。
sinってなに?


三角関数のひとつで、波みたいに-1から+1の間を行ったり来たりする数学の関数なんだ。これを時間で動かすと、自然な「揺れ」が作れる。中学校で習う前に、ここで体験するとイメージしやすいよ。
自由研究としての展開
研究テーマのアイデア
- 左右だけ動かして、周波数の変化を記録
- 上下のビブラートの強さによる聴こえ方の違い
- パッシブブザーの周波数限界を実測
- 音階表と照らして「ジョイスティックでドレミ」が出せるか
レポートの書き方
レポート構成
- 研究のきっかけ
- map関数とsin関数の説明
- X軸の値と周波数の関係 (表)
- ビブラート強度の体感的な違い
- 本物のシンセサイザーへの応用想像
改造のアイデア
発展アイデア
- X軸を8分割して、ちょうどドレミファソラシドが出るように
- LEDで現在の音の高さを光で表現
- LCDに周波数を表示
- ボタン押下時間で音量を変える (エフェクト)
まとめ
今回は、プログラミング自由研究で楽しめる「ジョイスティックシンセサイザー」を紹介しました。アナログ入力、map関数、sin関数を組み合わせた、プログラミング学習として豊富な作品です。
大切なのは、Xの値が大きいほど周波数が上がる対応を耳で確認することです。シリアルモニタの数字と音の高さを並べて見ると、変換の流れが理解しやすくなります。

他にも初心者キットだけで作れる作例を別の記事で紹介しているので、興味があれば見てみてね。
今日から始める電子工作 
