1. 何ができるの?
UWSC, 自動操作ライブラリを使っても操作できないプログラム・ゲームを操作できます。
マウスのポインタは動くけど、クリックができない場面に遭遇したので作ってみました。
※マウス・キーボードが誤動作して、PCの設定が変わった、Amazonで変なの買っちゃった、
などの動作をするかもしれなので、ご承知の上ご使用ください。
作者は責任を負いません。
(1)仕組み
作成したPythonライブラリからシリアル経由でArduino Pro Microを制御し、Arduino Pro Micro内部でHID機能を実行します。Arduino Pro Microからマウス・キーボード操作としてWindows・ゲーム等のプログラムを制御します。
Windows・ゲーム等のプログラムから見ると、USBでつながった物理的なマウス・キーボードで操作されている様にしか見えないので、UWSC, 自動操作ライブラリを使っても操作できないプログラム・ゲームも操作できるはずです。
2. 用意するもの
(1) Arduino Leonardo もしくは Arduino Pro Micro
Amzoznだとこれとか
ATmega32U4 5V 16MHz Arduino互換ボード (Leonardo)
Arduino Leonardo 開発ボード 超小型 USB ダイレクト ATmega32U4 ピンヘッダ付
楽天だとこれとか
(2) 実行プログラム
3. 環境構築
(1) Arduino環境構築
① https://www.arduino.cc/en/Main/SoftwareからArduino IDEをダウンロードしてインストール。
② [ファイル] – [環境設定] を開き、追加のボードマネージャのURLに以下を追加
https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json
③ [ツール] – [ボード] – [ボードマネージャ]を開く
④ SparkFun AVR Boardsで検索しインストール
⑤ [ツール] – [ボード] から、SparkFun Pro Microを選択
⑥ [ツール] – [プロセッサ]から、手元のArduino Pro Microにあった設定(3.3V or 5V)を選択
⑦ Arduino Pro MicroをPCにつなげる
⑧ SerialHID.zip内のSerialHID.inoを開く
⑨ [ツール] – [シリアルポート]から、⑦でつなげたArduino Pro Microのポートを指定
⑩ 左上の「→」(書き込みボタン)を押下
⑪ 書込み完了すればOK
(2) Python環境構築
① PySerialをインストール
pip install pyserial
② SerialHID.zip内のSerialHID.pyをアクセス可能なディレクトリに配置
4. 使い方
基本的な使い方は、ArduinoのMouse, Keyboardライブラリを踏襲しています。
https://www.arduino.cc/reference/en/language/functions/usb/mouse/
https://www.arduino.cc/reference/en/language/functions/usb/keyboard/
(1) SerialHIDのインポート
import SerialHID
(2) ポート番号を指定
sh = SerialHID.SerialHID("COM1") #COM1を想定
(3) マウス、キーボードを作成
mouse = sh.Mouse() keyboard = sh.Keyboard()
(4) マウスクリック
mouse.click() #左クリック mouse.click('MOUSE_RIGHT') #右クリック
(3) マウスを動かす
x=100 #右方向がプラス、左方向がマイナス y=200 #下方向がプラス、上方向がマイナス mouse.move(x, y)
(4) マウスのホイールボタンを押下後、1秒たったら離す
mouse.press('MOUSE_MIDDLE') time.sleep(1) mouse.release('MOUSE_MIDDLE')
(5) キーボード入力
str = "ABCabc\n123" keyboard.print(str) #文字列入力
key = keyboard.KEY_TAB #TABキー keyboard.write(key)
(4) 左Shiftキーを押下し、aを入力後、左Shiftキーを離す
key = keyboard.KEY_LEFT_SHIFT #TABキー keyboard.press(key) keyboard.write('a') keyboard.release(key)
コメント
SerialHID.zipをいただけないでしょうか。
2台のPCから別のブラウザでDLできませんでした。
記事内のファイルを直リンクにしてみました。ダウンロードできるかご確認の程よろしくお願いいたします。
ダウンロードできました。ありがとうございます!
Arduino Leonardo にコードを書き込むところまではできたのですが、試しにTABキーを押すプログラムを書いたところ以下のようなエラーが出てしまいました。デバイスマネージャーでポートが正しいことは確認済みです。どうしたらいいでしょうか?
プログラム:
import SerialHID
#Arduino Pro Micro のシリアルポートを指定
sh = SerialHID.SerialHID(“COM6”)
#マウス、キーボードの作成
mouse = sh.Mouse()
keyboard = sh.Keyboard()
key = keyboard.KEY_END
エラーコード:
keyboard.write(key)
runfile(‘C:/.conda/Arduino/タイトル無し4.py’, wdir=’C:/.conda/Arduino’)
Reloaded modules: SerialHID
Traceback (most recent call last):
File “C:\.conda\Arduino\タイトル無し4.py”, line 10, in
sh = SerialHID.SerialHID(“COM6”)
File “C:\.conda\Arduino\SerialHID.py”, line 8, in __init__
SerialHID.ser = serial.Serial(portNum, 9600)
File “C:\anaconda3\envs\Arduino\lib\site-packages\serial\serialwin32.py”, line 31, in __init__
super(Serial, self).__init__(*args, **kwargs)
File “C:\anaconda3\envs\Arduino\lib\site-packages\serial\serialutil.py”, line 240, in __init__
self.open()
File “C:\anaconda3\envs\Arduino\lib\site-packages\serial\serialwin32.py”, line 62, in open
raise SerialException(“could not open port {!r}: {!r}”.format(self.portstr, ctypes.WinError()))
SerialException: could not open port ‘COM6’: PermissionError(13, ‘アクセスが拒否されました。’, None, 5)
ポートが正しいことは確認済み、とのことなので、考えられる原因としては以下の2つがあります。
① TeraTermなどの他のプログラムでポートをつかんだままになっている (記載いただいたサンプルプログラムだとCOM6を開いたままになっている)
② 本プログラムを2重に実行しており、最初に実行したプロセスが残り続けて、後から実行したプロセスでポートを開けなくなっている
また、確率は低いですが、Windowsがポートの認識に失敗している?事象に出会ったこともあり、一度デバイスマネージャーにてArduino Leonardo(COM6)をアンインストールし再度USBを挿しなおしてポートを再認識させると動くようになったため、上記①②の状態となっていない場合は一度アンインストールを試してみていただけますでしょうか?
返信ありがとうございます。プログラムを2重に実行していたみたいです。最初に実行したプログラムを終了させるにはどうしたらいいでしょか?
「プログラムを2重に実行していたみたいです。」はどのようにして2重に実行していたことを確認されましたでしょうか?
もし。最初に実行したウィンドウがあるようでしたらそれを×ボタンで閉じていただき、タスクマネージャーからプロセスが2重に動いていることを確認されたのでしたらタスクマネージャーからプロセスを停止していただければよいかと思います。
確実を期すならPCごと再起動するのが良いかと思います。
一度目は正常に動作したのですが二度目以降はアクセスが拒否されてしまったのでプログラムが二重に実行されていたと判断しました。Spyder でプログラムを実行していたのでコンソールのタブを閉じることで解決しました。いちいち閉じるのは面倒なので別の方法を探してみます。