工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduinoジョイスティックマウス:正確なカーソル操作

必要な部品と材料

部品数量
Arduino UNO1
2軸ジョイスティック1

必要なアプリとオンラインサービス

プロジェクト概要

マウスやトラックパッドの代わりに、ジョイスティックでパソコンのカーソルを操作するシステムを作成しました。ジョイスティックは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ファイルのパスをコピーしておきます。その後、コマンドプロンプトで以下を実行:

  1. cd <Pythonファイルのパス>
  2. py -m pip install --upgrade pip
  3. py -m pip install mouse
  4. py -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")で実行します。

実行手順

  1. Arduinoスケッチ(後述)をArduino UNOにアップロードし、回路図に従ってジョイスティックを接続します。
  2. Pythonスケッチをメモ帳にコピーし、Arduinoの正しいCOMポートを指定して「.py」拡張子で保存します。COMポートはデバイスマネージャで確認できます。
  3. PythonのIDLE(Python GUI)を開き、保存したファイルを開いて実行します(F5キーまたは「Run」→「Run Module」)。
  4. エラーが出る場合は、IDLEを再起動し、COMポートが正しいか確認してください。
  5. エラーなく実行できたら、ジョイスティックを動かしてカーソルが追従するか確認します。

ソースコード

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") # 左クリック

回路図

Arduinoジョイスティックマウス:正確なカーソル操作

※ このプロジェクトでは、ジョイスティックのVCCを5V、GNDをGNDに接続し、VRxをA0、VRyをA1、SWをデジタルピン9に接続しています。SWピンは内部プルアップを使用しています。

製造プロセス

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