Arduinoジョイスティックマウス:正確なカーソル操作
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino UNO | 1 |
| 2軸ジョイスティック | 1 |
必要なアプリとオンラインサービス
- Arduino IDE
- IDLE (Python GUI)
プロジェクト概要
マウスやトラックパッドの代わりに、ジョイスティックでパソコンのカーソルを操作するシステムを作成しました。ジョイスティックはX軸・Y軸の両方向にカーソルを動かせ、内蔵スイッチでクリック機能も実現しています。
基本原理
ジョイスティックは基本的に、X方向とY方向に配置された2つのポテンショメータで構成されています。Arduinoはジョイスティックから0〜1023の範囲でアナログ値を読み取ります。ジョイスティックが中央(デフォルト位置)にあるとき、アナログ値は500付近になります。
Arduinoスケッチは、ジョイスティックが中央から離れると、位置に応じて-感度から+感度の範囲(デフォルト値は10)で値を出力するようにプログラムされています。ジョイスティックを一方の極限まで倒すと10、反対側の極限まで倒すと-10が出力されます。
X軸とY軸の値を区別するために、コロン「:」で区切って出力します。例:
X値:Y値:スイッチ状態
ジョイスティックボタン(SW)の状態(1/0)は、X・Y値の後にシリアルモニタに出力されます。
パソコンでこれらの値を認識するには、Pythonのmouseモジュールを使用します(従来のpyautoguiから変更)。
Pythonプログラミング
前提条件: Python 3がインストールされていること。公式サイトからダウンロード可能です。
インストール後、Pythonファイルのパスをコピーしておきます。その後、コマンドプロンプトで以下を実行:
cd <Pythonファイルのパス>py -m pip install --upgrade pippy -m pip install mousepy -m pip install pyserial
mouseモジュールでマウス操作を、pyserialモジュールでArduinoとのシリアル通信を行います。
Pythonプログラムは、Arduinoが出力するデータを読み取り、X・Y方向の値とスイッチ(SW)の状態を解析します。現在のカーソル座標はmouse.get_position()で取得し、ピクセル単位のX・Y座標として取得できます。
ジョイスティックが動くと、Arduinoから送られてくるアナログ値を現在のカーソル位置に加算して、目的の方向へカーソルを移動させます。移動にはmouse.move(X+x, Y+y)関数を使用します(X,Yは現在位置、x,yはArduinoからの増減値)。
クリック操作は、SWの状態に基づきmouse.click(button="left")で実行します。
実行手順
- Arduinoスケッチ(後述)をArduino UNOにアップロードし、回路図に従ってジョイスティックを接続します。
- Pythonスケッチをメモ帳にコピーし、Arduinoの正しいCOMポートを指定して「.py」拡張子で保存します。COMポートはデバイスマネージャで確認できます。
- PythonのIDLE(Python GUI)を開き、保存したファイルを開いて実行します(F5キーまたは「Run」→「Run Module」)。
- エラーが出る場合は、IDLEを再起動し、COMポートが正しいか確認してください。
- エラーなく実行できたら、ジョイスティックを動かしてカーソルが追従するか確認します。
ソースコード
Arduinoコード
//////////////////////////////////
// Joystick controlled mouse
// by Shubham Santosh
/////////////////////////////
void setup() {
Serial.begin(9600);
pinMode(9, INPUT); // SWピン
digitalWrite(9, HIGH); // 内部プルアップ
}
int prev_state = 0; // スイッチの前回状態
void loop() {
int z = 0, xpos = 0, ypos = 0;
int x = analogRead(A0);
int y = analogRead(A1);
int sensitivity = 10; // 好みに合わせて調整可能
// X軸(上下)
if (x >= 550) // 上方向
xpos = map(x, 550, 1023, 0, sensitivity);
if (x <= 450) // 下方向
xpos = map(x, 450, 0, 0, -sensitivity);
// Y軸(左右)
if (y >= 550) // 右方向
ypos = map(y, 550, 1023, 0, sensitivity);
if (y <= 450) // 左方向
ypos = map(y, 450, 0, 0, -sensitivity);
// スイッチ状態の読み取り(立ち上がりエッジ検出)
int curr_state = digitalRead(9);
if (curr_state == 1 && prev_state == 0) // スイッチ押下
z = 1;
else
z = 0;
// ジョイスティックが動いたか、スイッチが押された場合のみ送信
if (xpos != 0 || ypos != 0 || z == 1) {
Serial.print(xpos);
Serial.print(":");
Serial.print(ypos);
Serial.print(":");
Serial.println(z);
}
prev_state = curr_state;
delay(10); // 安定動作用
}
Pythonコード
# Joystick controlled mouse
# By Shubham Santosh
# last edited 12/11/2020
import mouse, sys
import time
import serial
mouse.FAILSAFE = False
ArduinoSerial = serial.Serial('COM3', 9600) # 正しいCOMポートを指定
time.sleep(1) # 1秒待機
while True:
data = str(ArduinoSerial.readline().decode('ascii')) # データ読み取り
(x, y, z) = data.split(":") # x, y, zに分割
(X, Y) = mouse.get_position() # 現在のカーソル位置取得
(x, y) = (int(x), int(y)) # 整数に変換
mouse.move(X + x, Y - y) # カーソル移動(Y軸は反転)
if '1' in z: # SWが押されたら
mouse.click(button="left") # 左クリック
回路図

※ このプロジェクトでは、ジョイスティックのVCCを5V、GNDをGNDに接続し、VRxをA0、VRyをA1、SWをデジタルピン9に接続しています。SWピンは内部プルアップを使用しています。
製造プロセス
- コンピュータマウスの進化:設計、製造、未来のトレンド
- 温度制御ファンサーキット:メディア家具冷却用DIYリレーシステム
- Raspberry Pi制御アクアポニックスシステム:構築ガイド & コード
- Raspberry Pi、PIRセンサー、MQTTで作るモーション制御AWS IoTボタン
- Bluetooth 制御 Raspberry Pi ロボットに音声フィードバックを追加して構築
- Pythonで作るWi-Fi制御Raspberry Piロボット - ステップバイステップガイド
- Alexa制御ARDrone 2.0デモ:Raspberry PiとHologram Novaで音声操作ドローン
- 古いラジコンカーをXboxコントローラーで操作可能に - ArduinoとUSBホストシールドで実現
- Arduinoとジョイスティックでインタラクティブゲーム – LEDフィードバック付き
- Arduinoベースのヌンチャク操作6自由度ロボットアームキット
- FeNi42 合金:精密シール向け低熱膨張合金