Arduinoでジョイスティックを使う方法|配線とコード

プログラミング・電子工作






Arduinoでジョイスティックを使う方法







入力 / Arduino

Arduinoでジョイスティックを使う方法|配線とanalogReadコードを徹底解説

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

YOFUKASI LAB編集部
公開日:2026年8月27日
読了目安:12分

執筆・実機検証:YOFUKASI LAB運営者

理学療法士/Arduino・Pythonを使った医療機器制作・学会発表経験あり

Chapter 01 / Basics

01ジョイスティックモジュールとは

ジョイスティックモジュールとは

X軸・Y軸の正体は2つの可変抵抗

アナログジョイスティックモジュールは、一見すると1つの部品に見えます。しかし、中身は意外とシンプルです。X軸用とY軸用、それぞれに可変抵抗(ポテンショメータ)が仕込まれています。スティックを傾けると、内部の軸が連動して回転します。すると、可変抵抗の値が変化する仕組みです。可変抵抗の読み取り方をすでに学んだ方もいるでしょう。その場合、この時点でおおよその動作原理がイメージできるはずです。

中央のSWピンは押しボタンスイッチ

多くのジョイスティックモジュールには、もう1つ機能があります。スティックを真下に押し込むと反応する、ボタンスイッチです。これは「SW」というピンから出力されます。動作原理はシンプルです。これまでに扱ってきたタクトスイッチとまったく同じです。押されるとGNDにつながり、LOWになる仕組みです。

編集部想定シナリオ

可変抵抗とタクトスイッチを一通り学んだRさんは、ジョイスティックモジュールを手に取った。ピンの数は多く見えたが、よく見ると馴染みのある構成だった。可変抵抗が2つと、タクトスイッチが1つ。すでに知っている部品の組み合わせだと気づいたのだ。この気づきがあると、初めて見る部品でも身構えずに済みます。



Chapter 02 / Wiring

02配線方法:Arduinoとジョイスティック

Arduino Unoとジョイスティックモジュールの配線方法|VRxをA0・VRyをA1・SWをD2へ接続

5本のピンをつなぐ

一般的なジョイスティックモジュールには、5本のピンがあります。GND・+5V・VRx・VRy・SWです。GNDはArduinoのGNDに、+5Vは5Vにつなぎます。VRx(X軸の値)はアナログピンのA0に、VRy(Y軸の値)はA1につなぎます。SW(スイッチ)はデジタルピンのD2につなぎます。

[画像挿入位置]Arduino Unoとジョイスティックモジュールの配線図(GND・+5V・VRx・VRy・SWの接続関係がわかるもの)

SWピンに外部抵抗は不要

SWピンには、モジュール側にプルアップ抵抗が入っていないことがほとんどです。そのままつなぐとフローティング状態になってしまいます。ただし、心配は不要です。コード側で内蔵プルアップを使えば解決します。INPUT_PULLUPを指定すれば、外部抵抗なしで正しく動作します。この考え方は、タクトスイッチの配線とまったく同じです。

Chapter 03 / Code

03基本のコード|X・Y・SWをまとめて読み取る

ArduinoでジョイスティックのX軸Y軸とSWをanalogRead・digitalReadで読み取る方法

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の表示が切り替わります。



Chapter 04 / Deadzone

04中央値のばらつきと「デッドゾーン」

Arduinoジョイスティックのデッドゾーンと上下左右の方向判定の仕組み

中央値はぴったり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);
}
Chapter 05 / Direction

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方向を判定したいこともあるでしょう。その場合は、斜め方向の条件を追加していきます。条件分岐の書き方については、下記の記事も参考にしてください。



Chapter 06 / Application

06応用アイデア|サーボモーターとの組み合わせ

スティックの傾きをサーボの角度に変換する

ジョイスティックの値は、そのままサーボモーターの制御にも活用できます。map()関数を使えば変換できます。0〜1023の範囲を、サーボの角度である0〜180度に変換するのです。可変抵抗の記事で紹介した変換方法と、考え方はまったく同じです。

// ジョイスティックのX軸でサーボの角度を操作するイメージ
int xValue = analogRead(A0);
int angle = map(xValue, 0, 1023, 0, 180);
// myServo.write(angle); のように使う

応用先の例

この仕組みには、いくつかの応用先があります。カメラの向きを操作するパン・チルト機構です。ロボットアームの簡易的な操作パネルにも使えます。サーボモーターの制御方法については、下記の記事で詳しく解説しています。



Chapter 07 / Troubleshooting

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付近だと分かった。デッドゾーンの基準を実測値に合わせて調整した。すると、正しく「中央」と表示されるようになった。基準値は決め打ちせず、実機で確認することが大切です。

Chapter 08 / FAQ

08よくある質問

基本のQ&A

Q.スティックを離しても、X・Yの値がぴったり512になりません。故障ですか?
A.故障ではありません。ジョイスティックの中央値は、個体差によって500前後で多少ばらつくのが普通です。ぴったり512になる方が珍しいくらいです。気になる場合は、起動時に中央値を測定して基準にする、あるいはデッドゾーンを設ける方法で対応してください。

Q.SWピンにプルアップ抵抗を別途つける必要がありますか?
A.多くの場合、必要ありません。ArduinoのINPUT_PULLUPを使えば、内蔵のプルアップ抵抗で代用できます。外部に抵抗を用意しなくても、SWピンをそのままデジタルピンにつなぐだけで動作します。

応用のQ&A

Q.X軸とY軸の向きが、期待と逆になっています。なぜですか?
A.モジュールの向きや、VRx・VRyの配線の取り違えが主な原因です。上下や左右が逆に感じる場合は、コード側でX・Yの値を入れ替えるか、符号を反転させて調整してください。ハードウェアを変更しなくても、ソフトウェア側で簡単に対応できます。

Q.ジョイスティックでサーボモーターを動かすことはできますか?
A.できます。analogRead()で取得したX・Yの値をmap()関数でサーボの角度(0〜180度)に変換すれば、スティックの動きに合わせてサーボを動かせます。パン・チルト機構のようなカメラ雲台の制御にも応用できる、定番の組み合わせです。

関連記事・参考資料

基礎を学べる記事

  1. YOFUKASI LAB「Arduinoで可変抵抗を読む|配線と値の取得」2026年, https://yofukasi-lab-wp.com/2026/08/29/arduino-potentiometer-analogread/
  2. YOFUKASI LAB「Arduinoでタクトスイッチ入力|配線とコード」2026年, https://yofukasi-lab-wp.com/2026/08/28/arduino-tact-switch-input/
  3. YOFUKASI LAB「analogRead・analogWriteの使い方」2026年, https://yofukasi-lab-wp.com/2026/07/30/analog-read-analogwrite/

応用・関連記事

  1. YOFUKASI LAB「ArduinoでCdS光センサーを使う方法」2026年, https://yofukasi-lab-wp.com/2026/08/31/arduino-cds-light-sensor/
  2. YOFUKASI LAB「Arduinoでサーボモーターを制御する方法」2026年, https://yofukasi-lab-wp.com/2026/08/18/servo/
  3. YOFUKASI LAB「Arduinoのコンパイルエラー一覧」2026年, https://yofukasi-lab-wp.com/2026/07/30/error/

参考資料(外部・一次情報)

  1. Arduino Documentation「analogRead()」, https://docs.arduino.cc/language-reference/en/functions/analog-io/analogRead/
  2. Arduino Modules Info「KY-023 Dual-Axis Joystick Module」, https://arduinomodules.info/ky-023-joystick-dual-axis-module/

※本記事は個人の学習・電子工作用途を対象にしています。実際の製品や医療機器へ組み込む場合は、電気安全・製品規格の専門家に別途ご相談ください。


関連記事

特集記事

コメント

この記事へのコメントはありません。

TOP
CLOSE