電子工作をしている人の中にはマイコンをマウスやキーボードとして動かしてみたいと思ったことがある人もいるのではないでしょうか。
在宅ワークが流行り出した頃くらいに「定期的にマウスを動かすツール」を自作したり販売されたのが少し話題になりましたが、これもマイコンをマウスとして動かしているものです。
この記事では、Raspberry Pi Picoをマウスやキーボードとして動かす方法について解説を行います。
CircuitPythonのUF2を書き込む
Raspberry Pi Picoでマウスやキーボードのような動きをさせるためのライブラリがAdafruitから提供されていますが、それらを動かすためにCircuitPythonのUF2をRaspberry Pi Picoに書き込む必要があります。
以下のURLから「DWONLOAD .UF2 NOW」ボタンを選択しCircuitPythonのUF2ファイルをダウンロードします。
ダウンロードが完了したら以下の記事(「Raspberry Pi PicoにUF2ファイルを配置」の章)を参考にRaspberry Pi PicoにUF2ファイルを配置します。
配置に成功するとRaspberry Pi Picoが別のUSBメモリ(CIRCUITPYという名前)としてマウントされます。
Thonnyの設定変更
MicroPythonではなくCircuitPythonに変更したため、Thonnyの設定を少し変更します。
メニューバーの「ツール」→「Options…」から「Thonny options」画面を開き、「インタプリタ」タブを選択します。
1つ目の選択項目を「CircuitPython (generic)」に、2つ目の選択項目を接続しているRaspberry Pi Picoに変更し「OK」ボタンで反映します。
反映に成功すると画面右下の表示が「CircuitPython (generic)」に変更されます。
CircuitPythonでLチカ
CircuitPythonを使う準備ができたところで、セットアップが正しくできたことを確認するためにLチカプログラムを動かしていきます。
import digitalio
from board import *
import time
led = digitalio.DigitalInOut(GP25)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = True
time.sleep(1)
led.value = False
time.sleep(1)
正しくセットアップできていれば、Raspberry Pi Pico内蔵のLEDが1秒毎にON/OFFされることが確認できます。
Adafruit_CircuitPython_HIDライブラリの追加
CircuitPythonを使う準備ができたら、マウスやキーボードとして動かすためのライブラリをRaspberry Pi Picoに追加します。
以下のリポジトリをローカルにコピーして、その中の「adafruit_hid」フォルダをRaspberry Pi Picoの中の「lib」フォルダに配置します。
Raspberry Pi Picoをマウスやキーボードとして動かす
ここまでで準備が完了したので、ここから実際にRaspberry Pi Picoをマウスやキーボードとして動かすためのコードを書いていきます。
マウスやキーボードとして動かすコードを書いてプログラムを転送するとすぐに指定し挙動をし始めるので、自分のパソコンで動かせないようなコードを書くのはやめておきましょう。
Raspberry Pi Picoをマウスとして動かす
Raspberry Pi Picoをマウスとして動かす場合、Mouseオブジェクトを生成してそのオブジェクトのclick関数やmove関数を呼び出すことで動作します。
import usb_hid
rom adafruit_hid.mouse import Mouse
# マウスオブジェクト生成
mouse = Mouse(usb_hid.devices)
# マウス左ボタンクリック
mouse.click(Mouse.LEFT_BUTTON)
# マウスを移動(x方向の移動量, y方向の移動量, wheelの移動量)
mouse.move(10, 10, 0)
# マウスをドラッグ
mouse.press(Mouse.LEFT_BUTTON)
mouse.move(10, 10, 0)
mouse.release(Mouse.LEFT_BUTTON)
例えば、マウスでぐるっと円を描くように動かす場合には以下のようにします。
import usb_hid
from adafruit_hid.mouse import Mouse
import time
import math
mouse = Mouse(usb_hid.devices)
size = 500
prev_x = size
prev_y = 0
for i in range(360):
x = int(math.cos(i / 180.0 * math.pi) * size)
y = int(math.sin(i / 180.0 * math.pi) * size)
mouse.move(x - prev_x, y - prev_y, 0)
prev_x = x
prev_y = y
time.sleep(0.01)
上記のプログラムを転送するとすぐに実行され、直径500pxの円を描くようにマウスカーソルが動くことが確認できます。
Raspberry Pi Picoをキーボードとして動かす
Raspberry Pi Picoをキーボードとして動かす場合、Keyboardオブジェクトを生成してそのオブジェクトのsend関数を呼び出すことで動作します。
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
# キーボードオブジェクト生成
kbd = Keyboard(usb_hid.devices)
# Aキー入力
kbd.send(Keycode.A)
# Shift + Aキー入力
kbd.send(Keycode.SHIFT, Keycode.A)
キーボードオブジェクトのsend関数は複数のキーを同時に入力することもできるので、ショートカットキーを登録することも可能です。
使用可能なキーコードについては以下のファイルを参考にしてみてください。
終わりに
Raspberry Pi Picoをマウスやキーボードとして動かす方法について解説を行いました。
タクトスイッチやボタンをつけて押したらショートカットが実行されるように割り当てると便利なツールとして使えるようになるかもしれませんね。
決して定期的に1pxずつマウスを動かして在宅勤務しているフリをするためになんか使わないように…。
この記事について誤っている点・不明な点などありましたらコメントまでお願いします。
コメント
お世話になっております。
最近、Raspberry Pi Pico を使って社内教育用のツールを作っておりますが、USB インターフェースでPCにデータを送る方法を探していまして、他のサイトのサンプルでは「ライブラリがない」等のエラーが出て困っておりました。
貴サイトに MicroPython / CircuitPython の違いと、adafruit ライブラリの入れ方や使い方がサンプル例と共に丁寧に書かれていましたので、参考にして無事組み込むことができました。実際には Picoではなく、他社製で小型の RP2040-Zero を使って、マッチ箱程度のケースにキーを6つとLED、Zero の基板を入れ、ZOOM ミーティングの“Mute”等よく使うコマンド6つを入れ、期待通りに動きました。貴サイト情報が大変助かりました。キーを押さえている時間が違っても、1コマンドだけ送るようにするところを工夫しました。
RasPi Pico は本当に面白いですね。3や4もさわっていますが、元々組込み系なので、Pico が好きです。
ありがとうございました。