はじめに
RaspberryPi Pico でキーボードやマウスなどのUSBの入力装置( HID:Human Interface Device) を作る方法を解説します。言語はいつも解説しているMicroPythonの発展形である「CircuitPython」を使用します。
回路はタクトスイッチ2つ使い、それぞれのタクトスイッチが「キーボードのaキー」「マウスの右クリック」として使えるようにします。
~ この記事の内容 ~
環境
この記事の回路やプログラムは、以下の環境で作成しています。
環境 | バージョンなど | 備考 |
開発用PCのOS | Windows11 | Windows10でもOKです |
言語 | CircuitPython Ver1.8 | |
開発環境 MuEditor | Ver.1.2 | |
ボード | RaspberryPi Pico |
CircuitPythonの設定
PicoでCircuitPythonを使うには、CircuitPython用のファームウェアをPicoに書き込む必要があります。お済でない方は、こちらの記事を参考にファームウェアの書き込みを行ってください。
ライブラリのインストール
デフォルトのCircuitPythonには、HIDのライブラリは含まれていないため以下の方法でHIDライブラリを追加します。
① ライブラリのダウンロード
以下のサイトから、複数のライブラリをまとめた圧縮(Zip)ファイルをダウンロードします。
ページの少ししたにある「Bundle for Version 8.x」のボタンから圧縮ファイルをダウンロードしてください。

②ライブラリのインストール
ダウンロードした圧縮(Zip)ファイルを解凍し、フォルダ内の「lib」の中にある「adafruit_hid」フォルダをコピーします。
コピーしたフォルダを、Picoの「lib」フォルダ内に貼り付ければ、ライブラリのインストールは完了です。
RaspberryPi Picoとの接続
RaspberryPi PicoのGPIOにタクト(タクタイル)スイッチを2個つなげます。
抵抗は1kΩを使用していますが、直結を防止しているだけなので、220Ωなど小さいものでも構いません。
ピン番号 | 内容 | 備考 |
38 | GND | グラウンド |
36 | 3V3(OUT) | 電源(3.3V) |
24 | GP18 | タクトスイッチA(キーボード)用に使います |
21 | GP16 | タクトスイッチB(マウス)用に使います |
※ GNDは未使用です。
Picoピンアサイン(Pin-Out)
※ Pico公式サイトより引用
使用する部品
RaspberryPi Pico
Pico本体です。半導体不足が続いていますが、価格・納期とも安定しています。

ブレッドボード
サンハヤト製がおすすめです。少々固いですが、品質は高いです。スペースが広いので配線・デバッグが楽に行えます。

抵抗
お手持ちのものでOKです。ない方は一度セットで揃えてしまうと送料と時間が節約できます。
タクトスイッチ
ブレッドボードで使えるものならOKです。

プログラム概要
今回のプログラムの概要は以下の通りです。
- タクトスイッチを設定する
- タクトスイッチAが押されたら、キーボードの「a」を送信
- タクトスイッチBが押されたら、マウスの「右クリック」を送信
実行結果
後述するプログラムの実行結果です。
タクトスイッチAを押して「a」キーをメモ帳上に入力。途中手動で「半角/全角]キーを押しているので表示が「あ」になっています。
入力後、タクトスイッチBを押して、メモ帳上に右クリックメニューを表示しています。
全体コード
全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。
import board, digitalio, usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard import Keycode
from adafruit_hid.keyboard import Mouse
# GP16,18ピンを入力に設定します
tactA = digitalio.DigitalInOut(board.GP16)
tactA.switch_to_input(pull=digitalio.Pull.DOWN)
tactB = digitalio.DigitalInOut(board.GP18)
tactB.switch_to_input(pull=digitalio.Pull.DOWN)
# キーボード・マウスのオブジェクトを作成します
keyboard = Keyboard(usb_hid.devices)
mouse = Mouse(usb_hid.devices)
# 前回値用の変数を初期化します。
beforeA = 0
beforeB = 0
print("Loop start ")
while True:
# タクトスイッチA,Bが押されているか取得
nowA = tactA.value
nowB = tactB.value
# タクトスイッチAが押された(立ち上がり)
if nowA == 1 and beforeA == 0:
print("sendA")
keyboard.send(Keycode.A)
# タクトスイッチBが押された(立ち上がり)
if nowB == 1 and beforeB == 0:
print("sendB")
mouse.click(Mouse.RIGHT_BUTTON)
# 前回値として現在のスイッチの状態を保存します。
beforeA = nowA
beforeB = nowB
プログラムの自動実行(電源ONで実行)をさせたい場合は、プログラムのファイル名を「code.py」にしてPicoに保存してください。
コードのポイント
入力ピンの設定
タクトスイッチをつなげたGP16・18ピンを入力に設定します。
今回の回路はタクトスイッチが押された場合のみ、電源(3V3)から電気が流れる回路なのでピンの設定を「Pull.DOWN」に設定します。
# GP16,18ピンを入力に設定します
tactA = digitalio.DigitalInOut(board.GP16)
tactA.switch_to_input(pull=digitalio.Pull.DOWN)
tactB = digitalio.DigitalInOut(board.GP18)
tactB.switch_to_input(pull=digitalio.Pull.DOWN)
タクトスイッチの状態取得
valueプロパティでタクトスイッチ(がつながったGP16,18)の状態を取得します。状態はタクトスイッチに応じて以下のように変化します。
タクトスイッチの状態 | valueの内容 |
押された | 1 |
押されていない | 0 |
# タクトスイッチの状態を取得します
nowA = tactA.value
nowB = tactB.value
スイッチが押された時だけ処理をする
以下のコードで、タクトスイッチが「押された時」を確認します。
今回のプログラムでは無限ループで連続的にスイッチを確認します。そのため単純に「タクトスイッチがONか?」を条件にしてしまうと、ゆっくりスイッチが押された場合に、
「2回(2ループの間)スイッチが押された」と判定されてしまいます。
そこで、以下のように条件にスイッチの「今回のループの値」と「前回のループの値」を使うことで、「スイッチが押された瞬間(立ち上がり)」1回だけを検知するようにします。

キーボード操作
タクトスイッチAが押された場合に、send関数を使ってPicoからPCにキーボードの「a」キーを送信します。
# タクトスイッチAが押された(立ち上がり)
if nowA == 1 and beforeA == 0:
print("sendA")
keyboard.send(Keycode.A)
PCが日本語入力モードの場合は「あ」が入力されます。
Muエディタで実行した場合でも、PCに向けてキーが送信されます。確認の為にPico単体でプログラムを実行する必要はありません。
マウス操作
タクトスイッチBが押された場合に、click関数を使ってPicoからPCにマウスの「右クリック」を送信します。
# タクトスイッチBが押された(立ち上がり)
if nowB == 1 and beforeB == 0:
print("sendB")
mouse.click(Mouse.RIGHT_BUTTON)
その他の操作方法
前述した関数やキー以外にも、様々な操作をPCに送信することができます。紹介は一部のみになるので、詳細は後述の公式リファレンスをご覧ください。
デバイス | 関数 | 内容 |
keyboard | press | 引数で指定したキーを押したままにします。 |
release | 引数で指定したキーを離します。 | |
send | 引数で指定したキーを1度押して、離します。 |
デバイス | 関数 | 内容 |
mouse | click | 引数で指定したボタンを1度押して、離します。 |
move | 引数(x,y,wheel)でポインタ移動やスクロールを行います。 | |
press | 引数で指定したキーを押したままにします。 |
公式リファレンス
https://docs.circuitpython.org/projects/hid/en/latest/index.html
まとめ
RaspberryPi Pico CircuitPythonで、キーボードやマウスなどの入力装置(HID)を作る方法を解説しました。
PicoとCircuitPythonの組み合わせは、ボードも低価格で、プログラムも短くてすむため、自作のキーボードや、自分用ショートカットデバイスなどを「安く・簡単に」作りたい方に、おすすめの組み合わせだと思います。
「マウス・キーボードってどう作るんだろう?」「安くて簡単に作りたい」と考えている方は、ぜひPico+CircuitPythonを使ってみてください。
参考になればうれしいです。
お知らせ
\ 3月17日にPicoの本が発売されました /
Picoの基礎から50種類の電子パーツの動かし方までがソースコードと実体配線付で解説されています。初心者はもちろん中級者まで楽しめる内容です(電子書籍版もあり)。
\ 3月15日にPicoの本が発売されました /
雑誌 Interfaceの特集内容に大幅加筆。Picoの基礎~いろいろな動かし方を詰め込んだ、さまさに「攻略本」な一冊です。

Picoで使えるおすすめ工具
RaspberryPiやPicoで使えるおすすめ工具も紹介しています。「何を買えばいいわからない」「おすすめの工具が知りたい」という方は、こちらの記事をご覧ください。
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。