パソコン、特に会社支給のノートパソコンで、離席中でもアクティブ状態を認識させたいなら、マウスジョイグラーが最適です。会社支給のパソコンの多くは、ソフトウェアのインストールやアプリの起動履歴の監視を許可していません。そのため、マウスポインターを自動的に動かし、OSにはマウスとして認識させるデバイスを使えば、この問題を解決できます。Amazonで7ドルから40ドル程度のUSBデバイスを購入するか、4ドルのRaspberry Pi Picoを使って自作のマウスジョイグラーを作るのも良いでしょう。
このハウツーでは、Raspberry Pi PicoとCircuitPythonを使って、DIYマウスジグラーを作ります。ドライバも必要なく、たった4ドルで作れるこのプロジェクトは、時間とお金の節約になります。Picoを使用しましたが、この手順はCircuitPython対応のRP2040搭載マイクロコントローラ(ほぼすべて)で使用できます。Adafruit Trinkey QT2040のようなRP2040搭載マイクロコントローラは、8ドルで購入できますが、USB Type-Aポートを内蔵しているため、PCとの接続にケーブルも不要で、Picoよりもさらに優れています。
Mouse Jiggler 用の CircuitPython の設定
1. Raspberry Pi Pico用のCircuitPython公式ページにアクセスし、最新リリースのUF2ファームウェアイメージをダウンロードします。執筆時点ではCircuitPython 8 Beta 6でした。RP2040を搭載した別のボードをお使いの場合は、Circuitpython.orgでそのボードのUF2ページをご覧ください。
2. BOOTSELボタンを押しながら、Raspberry Pi Picoをコンピューターに接続します。新しいドライブ「RPI-RP2」が表示されます。
3.ダウンロードしたCircuitPython UF2ファイルをRPI-RP2にコピーします。これにより、CircuitPythonがPicoの内部フラッシュストレージに書き込まれます。新しいドライブ「CIRCUITPY」が表示されます。
作業を進める前に、CircuitPythonライブラリをいくつか用意する必要があります。これらの事前に記述されたコードライブラリは、プロジェクトに追加機能を追加します。
1. PicoにインストールされているCircuitPythonと同じバージョンのライブラリバンドルをダウンロードします。CircuitPython 8をインストールしたので、バージョン8.xのバンドルをダウンロードしました。
Tom's Hardware の最高のニュースと詳細なレビューをあなたの受信箱に直接お届けします。
2.バンドルをデスクトップに抽出し、そこに含まれる lib フォルダーを開きます。
3.この lib フォルダからadafruit_hid フォルダをCIRCUITPY ドライブの lib フォルダにコピーします。
Mouse Jiggler 用の CircuitPython コードの作成
1. Thonny をまだインストールしていない場合は、ダウンロードしてインストールしてください。Thonnyは、Python 3、MicroPython、CircuitPython に対応した Python エディタです。
2. Thonny を開き、「ツール」>>「オプション」に移動します。
3. 「インタープリター」を選択し、インタープリターをCircuitPython、ポートを自動に設定して「OK」をクリックします。これで、ThonnyはCircuitPythonを実行しているPico Wに接続できるようになります。
4. 「ファイル >> 開く」をクリックし、CircuitPython デバイス (Raspberry Pi Pico) で code.py を開きます。
5.ファイル内に既に存在するコードを削除します。
6. USB_HID ライブラリをインポートし、続いて Adafruit のマウス サポート ライブラリをインポートします。
import usb_hid
from adafruit_hid.mouse import Mouse
7.時間ライブラリから sleep 関数をインポートします。これを使用して、各動作の間に短い遅延を追加します。
from time import sleep
8.仮想マウスを制御するオブジェクト m を作成します。
m = Mouse(usb_hid.devices)
9.ループを作成し、その中のコードを継続的に実行します。テスト目的であれば、このループはforループに置き換えることができます。そうしないと、コードがロックされ、作業ができなくなります。
while True:
代替テスト for ループ
for i in range(2):
10. 「move」を使用して、カーソルを100ピクセル左に移動します。
m.move(-100, 0, 0)
11. Pythonシェルにメッセージを出力し、0.5秒間停止します。出力することでコードのデバッグが容易になります。
print("I am working")
12.次に、マウスを 100 ピクセル右に移動し、別のメッセージを出力して、さらに 0.5 秒間停止します。
m.move(100, 0, 0) print("I am so busy") sleep(0.5)
13.マウスを 100 ピクセル下に移動し、メッセージを印刷してもう一度一時停止します。
m.move(0, -100, 0) print("So much to do") sleep(0.5)
14.マウスを 10 ピクセル上に移動し、メッセージを印刷してから再度停止します。
m.move(0, 100, 0) print("I need a vacation") sleep(0.5)
15.コードを code.py として Raspberry Pi Pico(CircuitPython デバイス)に保存します。CircuitPythonは Pico をコンピューターに接続すると自動的に code.py を実行します(MicroPython は main.py と boot.py を使っても同様に実行できます)。OS はこれを「単なるマウス」と認識するため、このプロジェクトはどの OS でも使用できます。
完全なコードリスト
import usb_hid
from adafruit_hid.mouse import Mouse
from time import sleep
m = Mouse(usb_hid.devices) while True: m.move(-100, 0, 0) print("I am working") sleep(0.5) m.move(100, 0, 0) print("I am so busy") sleep(0.5) m.move(0, -100, 0) print("So much to do") sleep(0.5) m.move(0, 100, 0) print("I need a vacation") sleep(0.5)
DIYジグラーへのボタンの追加
プラグアンドプレイのマウスジグラーは便利ですが、ボタンを押すだけで作動する方がもっと便利です。ここでは、GPIO12にジグラーのオン/オフを切り替えるボタンを追加するようにコードを修正しました。
このプロジェクトに必要なもの
- ラズベリーパイ ピコ
- ハーフサイズのブレッドボード
- プッシュボタン
- オス-オスケーブル2本
回路は非常にシンプルで、押しボタンをGPIO 12とGNDに接続するだけです。GPIO 12はHighにプルアップするように設定し、ボタンが押されるとピンがGNDに接続されます。これによりピンの状態がLowに変化し、これをジグラーコードのトグルとして使います。このプロジェクトは、以前のバージョンのコードをベースに構築します。
1. boardとdigitalioの2つのインポートを追加します。これら2つのライブラリはGPIOへのアクセスを提供し、GPIOピンの状態を設定できます。
import usb_hid
from adafruit_hid.mouse import Mouse
from time import sleep
import board
from digitalio import DigitalInOut, Direction, Pull
2.オブジェクト「ボタン」を作成し、これを GPIO12 に設定します。
m = Mouse(usb_hid.devices)
button = DigitalInOut(board.GP12)
3. GPIO 12を入力に設定し、ピンをハイにします。一部のGPIOピンには内部抵抗があり、ハイにすると3.3V、ローにするとGNDになります。
button.direction = Direction.INPUT
button.pull = Pull.UP
4. 2つの変数「active」と「button_press」を作成し、それぞれに0を格納します。これらの変数には、ジグラーがアクティブでボタンが押されたかどうかを示す0または1が格納されます。コード開始時には、どちらも0で非アクティブに設定されています。
active = 0
button_press = 0
5.コードを実行するために while True ループを追加します。
while True:
6.ボタンの状態とactiveに格納されている値を確認する条件文を作成します。ボタンが押されると、GPIO 12の状態がHigh(True)からLow(False)に変化します。ボタンが押された後、条件文はactiveに格納されている値を確認します。デフォルト値は0で、ジグラーがアクティブではないことを意味します。
if button.value == False and active == 0:
7.変数を 1 に更新し、Python シェルにメッセージを出力します。
active = 1 button_press = 1 print("Turning on")
8.この条件では5秒間の一時停止を追加します。これにより、ボタンを押す時間と、コードが押下を認識できる時間を確保し、ボタンの重複押下を防ぐための十分なデバウンス時間を確保できます。
sleep(5)
9. else if 条件を使用して、ボタンが現在押されていないこと、および active と button_press に格納されている値が 1 であることを確認します。これは、ボタンが押されており、マウス ジグラー コードを実行する必要があることを意味します。
elif button.value == True and active == 1 and button_press == 1:
10.マウス ジグラー コードを再利用して、画面上でマウスを移動します。
m.move(-100, 0, 0) print("I am working") sleep(0.5) m.move(100, 0, 0) print("I am so busy") sleep(0.5) m.move(0, -100, 0) print("So much to do") sleep(0.5) m.move(0, 100, 0) print("I need a vacation") sleep(0.5)
11.ボタンが押されたことと、active と button_press に値 1 が格納されていることを確認する別の条件文を作成します。これは、ユーザーがジグラー コードをオフにしたいということを意味します。
elif button.value == False and active == 1 and button_press == 1:
12.ユーザーにメッセージを出力し、変数に格納されている値をリセットしてから 5 秒間停止します。
print("Turning off") active = 0 button_press = 0 sleep(5)
13.プロジェクトをcode.pyとしてRaspberry Pi Picoに保存すると、ボードがリセットされ、コードが実行されます。ボタンを押すと、ジグラーコードのオン/オフが切り替わります。
完全なコードリスト
import usb_hid
from adafruit_hid.mouse import Mouse
from time import sleep
import board
from digitalio import DigitalInOut, Direction, Pull m = Mouse(usb_hid.devices)
button = DigitalInOut(board.BUTTON)
button.direction = Direction.INPUT
button.pull = Pull.UP
active = 0
button_press = 0
while True: if button.value == False and active == 0: active = 1 button_press = 1 print("Turning on") sleep(5) elif button.value == True and active == 1 and button_press == 1: m.move(-100, 0, 0) print("I am working") sleep(0.5) m.move(100, 0, 0) print("I am so busy") sleep(0.5) m.move(0, -100, 0) print("So much to do") sleep(0.5) m.move(0, 100, 0) print("I need a vacation") sleep(0.5) elif button.value == False and active == 1 and button_press == 1: print("Turning off") active = 0 button_press = 0 sleep(5)
特別なAdafruit Trinket QT2040バージョン
AdafruitのTrinkey QT2040は、 Raspberry PiのRP2040を搭載したUSBドングル型のボードです。従来のGPIOは搭載されておらず、互換性のあるブレイクアウトボードと接続するためのStemmaQTコネクタを採用しています。
このボタントグルコードの特別バージョンでは、ボード内蔵のユーザーボタン(BOOT)を使用してコードのオン/オフを切り替え、NeoPixelを使用してジグラーがアクティブかどうかを示します。このコードは以前のボタントグルコードとほぼ同じですが、ボタン参照(CircuitPythonの抽象化)を使用し、NeoPixelを設定するように変更されています。
1. PicoにインストールされているCircuitPythonと同じバージョンのライブラリバンドルをダウンロードします。CircuitPython 8をインストールしたので、バージョン8.xのバンドルをダウンロードしました。
2.バンドルをデスクトップに抽出し、そこに含まれる lib フォルダーを開きます。
3.この lib フォルダから次のファイル/フォルダを CIRCUITPY ドライブの lib フォルダにコピーします。
アダフルーツ_hid
adafruit_pixelbuf.mpy
ネオピクセル.mpy
4. Thonny で新しいファイルを開き、前の例のコードをコピーします。
5.インポートに、NeoPixel ライブラリをインポートする行を追加します。
import neopixel
6.ボタンを設定したら、新しい行を追加して、Trinkey QT2040 上の単一の NeoPixel への接続を作成します。
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
7. ジグラーをオンにするelse if条件までスクロールダウンします。ここでボタンが押され、active変数とbutton_press変数が1に設定されます。ピクセルを赤に設定し、明るさを4分の1にする行を追加します。
pixel.fill((32, 0, 0))
8. ジグラーのコードがオフになっているところまでスクロールします。ここでボタンが押され、active変数とbutton_press変数が1に設定されます。NeoPixelの色を緑、明るさを4分の1に変更します。
pixel.fill((0, 32, 0))
9.コードをcode.pyとしてAdafruit Trinkey QT2040に保存します。ボードがリセットされ、コードが実行されます。ボタンを押すとコードが切り替わります。
完全なコードリスト
import usb_hid
from adafruit_hid.mouse import Mouse
from time import sleep
import board
from digitalio import DigitalInOut, Direction, Pull
import neopixel m = Mouse(usb_hid.devices)
button = DigitalInOut(board.BUTTON)
button.direction = Direction.INPUT
button.pull = Pull.UP
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1) active = 0
button_press = 0
while True: if button.value == False and active == 0: active = 1 button_press = 1 print("Turning on") sleep(5) elif button.value == True and active == 1 and button_press == 1: pixel.fill((32, 0, 0)) m.move(-100, 0, 0) print("I am working") sleep(0.5) m.move(100, 0, 0) print("I am so busy") sleep(0.5) m.move(0, -100, 0) print("So much to do") sleep(0.5) m.move(0, 100, 0) print("I need a vacation") sleep(0.5) elif button.value == False and active == 1 and button_press == 1: pixel.fill((0, 32, 0)) print("Turning off") active = 0 button_press = 0 sleep(5)