Arduinoでジョイスティックを使う方法|配線とanalogReadコードを徹底解説
アナログジョイスティックモジュールは、傾きと押し込みを同時に読み取れる部品です。X軸・Y軸の傾きと、押し込みスイッチの2種類を扱えます。ロボットの操作や、簡易的なゲームコントローラー作りによく使われます。本記事では、配線の基本からコードの書き方までを解説します。あわせて、中央値のばらつきに対応する方法まで、初心者の方に向けて順を追って紹介します。
01ジョイスティックモジュールとは

X軸・Y軸の正体は2つの可変抵抗
アナログジョイスティックモジュールは、一見すると1つの部品に見えます。しかし、中身は意外とシンプルです。X軸用とY軸用、それぞれに可変抵抗(ポテンショメータ)が仕込まれています。スティックを傾けると、内部の軸が連動して回転します。すると、可変抵抗の値が変化する仕組みです。可変抵抗の読み取り方をすでに学んだ方もいるでしょう。その場合、この時点でおおよその動作原理がイメージできるはずです。
中央のSWピンは押しボタンスイッチ
多くのジョイスティックモジュールには、もう1つ機能があります。スティックを真下に押し込むと反応する、ボタンスイッチです。これは「SW」というピンから出力されます。動作原理はシンプルです。これまでに扱ってきたタクトスイッチとまったく同じです。押されるとGNDにつながり、LOWになる仕組みです。
可変抵抗とタクトスイッチを一通り学んだRさんは、ジョイスティックモジュールを手に取った。ピンの数は多く見えたが、よく見ると馴染みのある構成だった。可変抵抗が2つと、タクトスイッチが1つ。すでに知っている部品の組み合わせだと気づいたのだ。この気づきがあると、初めて見る部品でも身構えずに済みます。
02配線方法:Arduinoとジョイスティック

5本のピンをつなぐ
一般的なジョイスティックモジュールには、5本のピンがあります。GND・+5V・VRx・VRy・SWです。GNDはArduinoのGNDに、+5Vは5Vにつなぎます。VRx(X軸の値)はアナログピンのA0に、VRy(Y軸の値)はA1につなぎます。SW(スイッチ)はデジタルピンのD2につなぎます。
SWピンに外部抵抗は不要
SWピンには、モジュール側にプルアップ抵抗が入っていないことがほとんどです。そのままつなぐとフローティング状態になってしまいます。ただし、心配は不要です。コード側で内蔵プルアップを使えば解決します。INPUT_PULLUPを指定すれば、外部抵抗なしで正しく動作します。この考え方は、タクトスイッチの配線とまったく同じです。
03基本のコード|X・Y・SWをまとめて読み取る

3つの値を同時に扱う
配線ができたら、3つの値を読み取るコードを書いてみましょう。X・Y軸はanalogRead()で読み取ります。SWはdigitalRead()で読み取ります。これまで別々に学んできた2つの関数があります。今回は、1つのコードの中で組み合わせて使う形になります。
// ジョイスティックのX・Y・SWをシリアルモニタに表示するコード
const int xPin = A0;
const int yPin = A1;
const int swPin = 2;
void setup() {
pinMode(swPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
int xValue = analogRead(xPin);
int yValue = analogRead(yPin);
int swValue = digitalRead(swPin);
Serial.print("X: ");
Serial.print(xValue);
Serial.print(" Y: ");
Serial.print(yValue);
Serial.print(" SW: ");
Serial.println(swValue == LOW ? "押されています" : "押されていません");
delay(100);
}
シリアルモニタで動きを確認する
このコードを書き込んだら、シリアルモニタを開いてみましょう。スティックを上下左右に倒すと、X・Yの値が0〜1023の範囲で変化します。スティックを押し込むと、SWの表示が切り替わります。
04中央値のばらつきと「デッドゾーン」

中央値はぴったり512にならない
理論上、スティックを離した中央の状態では、決まった値になるはずです。X・Yともに1023の半分、つまり512前後です。しかし、実際にはそう単純ではありません。部品の個体差や、モジュールの製造誤差があります。実際には500前後で多少ばらつくのが普通です。ぴったり512になる方が、むしろ珍しいくらいです。
デッドゾーンという考え方
この誤差をそのままにしておくと、困ったことが起きます。スティックに触れていないのに、わずかに傾いていると判定されてしまうのです。これを防ぐための考え方があります。「デッドゾーン」と呼ばれるものです。中央値から一定の範囲内であれば、動いていないとみなす仕組みです。CdSセンサーの記事で紹介したヒステリシスと似た発想です。「小さな変動を無視する」という点で共通しています。
// デッドゾーンを使って中央付近のブレを無視するコード
const int xPin = A0;
const int center = 512; // 中央のおおよその値
const int deadzone = 30; // このブレは無視する
void setup() {
Serial.begin(9600);
}
void loop() {
int xValue = analogRead(xPin);
int diff = xValue - center;
if (abs(diff) < deadzone) {
Serial.println("中央(動いていない)");
} else if (diff > 0) {
Serial.println("右方向");
} else {
Serial.println("左方向");
}
delay(100);
}
05実践例:スティックの方向を判定する
X・Y両方を組み合わせて判定する
前の章では、X軸だけを見て左右を判定しました。ここでは範囲を広げます。X・Y両方を組み合わせて、上下左右を判定するコードを紹介します。if文を使った条件分岐の応用例です。
// X・Y軸を組み合わせて方向を判定するコード
const int xPin = A0;
const int yPin = A1;
const int center = 512;
const int deadzone = 100;
void setup() {
Serial.begin(9600);
}
void loop() {
int xValue = analogRead(xPin);
int yValue = analogRead(yPin);
int diffX = xValue - center;
int diffY = yValue - center;
if (abs(diffX) < deadzone && abs(diffY) < deadzone) {
Serial.println("中央");
} else if (abs(diffX) > abs(diffY)) {
Serial.println(diffX > 0 ? "右" : "左");
} else {
Serial.println(diffY > 0 ? "上" : "下");
}
delay(150);
}
斜め方向を判定に加える場合
この例では、X・Yのうち変化が大きい方を優先して判定しています。より細かく8方向を判定したいこともあるでしょう。その場合は、斜め方向の条件を追加していきます。条件分岐の書き方については、下記の記事も参考にしてください。
06応用アイデア|サーボモーターとの組み合わせ
スティックの傾きをサーボの角度に変換する
ジョイスティックの値は、そのままサーボモーターの制御にも活用できます。map()関数を使えば変換できます。0〜1023の範囲を、サーボの角度である0〜180度に変換するのです。可変抵抗の記事で紹介した変換方法と、考え方はまったく同じです。
// ジョイスティックのX軸でサーボの角度を操作するイメージ
int xValue = analogRead(A0);
int angle = map(xValue, 0, 1023, 0, 180);
// myServo.write(angle); のように使う
応用先の例
この仕組みには、いくつかの応用先があります。カメラの向きを操作するパン・チルト機構です。ロボットアームの簡易的な操作パネルにも使えます。サーボモーターの制御方法については、下記の記事で詳しく解説しています。
07よくあるトラブルと対処法
症状別の対処早見表
| 症状 | 主な原因 | 対処法 |
|---|---|---|
| X・Yの値がまったく変化しない | VRx・VRyの配線ミス、または電源の配線忘れ | +5V・GNDの配線とアナログピンの接続を確認する(2章参照) |
| SWがまったく反応しない | INPUT_PULLUPの設定忘れ | pinMode()でINPUT_PULLUPを指定する(3章参照) |
| 触れていないのに方向判定される | デッドゾーンが設定されていない、または狭すぎる | デッドゾーンの範囲を広げる(4章参照) |
| 上下左右が期待と逆になる | モジュールの向き、またはX・Yの配線の取り違え | コード側でX・Yを入れ替える、または符号を反転させる |
| 値がノイズっぽく細かくばらつく | 配線の接触不良、または電源ノイズ | 配線をしっかり差し込み直す、複数回の平均を取る処理を加える |
原因を素早く切り分けるコツ
Yさんは方向判定のコードを試したが、スティックに触れていないのに「右」と表示され続けた。配線を確認しても間違いは見当たらなかった。そこで、シリアルモニタで生のX・Y値を表示させてみた。すると、中央値が512ではなく480付近だと分かった。デッドゾーンの基準を実測値に合わせて調整した。すると、正しく「中央」と表示されるようになった。基準値は決め打ちせず、実機で確認することが大切です。
08よくある質問
基本のQ&A
応用のQ&A
関連記事・参考資料
基礎を学べる記事
- YOFUKASI LAB「Arduinoで可変抵抗を読む|配線と値の取得」2026年, https://yofukasi-lab-wp.com/2026/08/29/arduino-potentiometer-analogread/
- YOFUKASI LAB「Arduinoでタクトスイッチ入力|配線とコード」2026年, https://yofukasi-lab-wp.com/2026/08/28/arduino-tact-switch-input/
- YOFUKASI LAB「analogRead・analogWriteの使い方」2026年, https://yofukasi-lab-wp.com/2026/07/30/analog-read-analogwrite/
応用・関連記事
- YOFUKASI LAB「ArduinoでCdS光センサーを使う方法」2026年, https://yofukasi-lab-wp.com/2026/08/31/arduino-cds-light-sensor/
- YOFUKASI LAB「Arduinoでサーボモーターを制御する方法」2026年, https://yofukasi-lab-wp.com/2026/08/18/servo/
- YOFUKASI LAB「Arduinoのコンパイルエラー一覧」2026年, https://yofukasi-lab-wp.com/2026/07/30/error/
参考資料(外部・一次情報)
- Arduino Documentation「analogRead()」, https://docs.arduino.cc/language-reference/en/functions/analog-io/analogRead/
- Arduino Modules Info「KY-023 Dual-Axis Joystick Module」, https://arduinomodules.info/ky-023-joystick-dual-axis-module/
※本記事は個人の学習・電子工作用途を対象にしています。実際の製品や医療機器へ組み込む場合は、電気安全・製品規格の専門家に別途ご相談ください。
コメント