皆さんこんにちは。yossyです。
今回はRaspberry Pi PicoとMicroPythonで「コピペ専用キーボード」を作ります。毎日「Ctrl + C」と「Ctrl +V」を押す作業で疲れていませんか?
このプロジェクトでは、ラズピコを使ってボタンを押すだけでコピペができる装置を作ります。
MicroPythonでUSBを使う
MicroPythonのRapsberry Pi PicoをPCに接続すると、通常はシリアル通信として使われます。
ですが、ラズピコのMicroPythonはそれだけではありません。実は、ラズピコをキーボードやマウスのようなUSB HID(ヒューマンインターフェースデバイス)として動作させるための機能も備わっています。
今回は、micropython-libで提供されているusb-device-hidライブラリを活用して、ラズピコをコピペ専用キーボードに仕上げます。
必要なライブラリの準備:mpremoteとusb-device-hid
micropython-libで提供されているライブラリをインストールする際や、ファイルを転送する操作をスムーズに行うためにmpremoteというコマンドラインツールを導入します。
ステップ1: mpremoteのインストール
mpremoteはPythonのpip経由で簡単にインストールできます。PythonがインストールされたPCのコマンドプロンプトで、
pip install mpremote
として入力してインストールします。これで、mpremoteを使う準備ができました。
ステップ2: USB HIDライブラリのインストール
次に、ラズピコがキーボードとして振る舞うために必要なusb-device-hidライブラリをインストールします。
ラズピコをPCに接続した状態でコマンドプロンプトを立ち上げて、コマンドプロンプトで以下のコマンドを実行します。
mpremote mip install usb-device-hid
Thonnyなどにラズピコが接続されたままになっていると、mpremoteがラズピコにアクセスできずエラーになることがあります。ラズピコにアクセスしているプログラム(Thonnyなど)を一旦終了してから実行するようにしましょう。
これで、ラズピコがUSBデバイスとして機能できるようになりました。
製作
それでは、制作していきましょう。完成イメージはこんな感じです。

必要なもの
- Raspberry Pi Pico(usb-device-hidライブラリがインストール済み)
- タクトスイッチ 2個
- ジャンパーワイヤー
- ブレッドボード
- MicroUSBケーブル
これだけで大丈夫です。電子工作初心者でも簡単に揃えられるものばかりで、特別に必要なパーツはありません。

配線

ブレッドボードにタクトスイッチを2つ配置して、以下のように配線します。
ボタン | 配線 |
---|---|
コピー | GP16 / GND |
ペースト | GP17 / GND |
プログラム
usbについてのライブラリを使うのは初めてだったので、プログラムはChatGPTを活用して作成してみました。
以下のコードをTnonnyに貼り付けて、ラズピコに main.py
という名前で保存してください。Pico Wで使う際は、47行目のLEDのピン番号を'LED'
に書き換えてください。
from machine import Pin
import time
import usb.device
from usb.device.hid import HIDInterface
# HIDキーボードとして振る舞うクラス
class Key(HIDInterface):
def __init__(self):
# HIDレポートディスクリプタを設定してUSB HIDキーボードを初期化
super().__init__(
b'\x05\x01\x09\x06\xa1\x01\x05\x07\x19\xe0\x29\xe7\x15\x00\x25\x01\x75\x01\x95\x08\x81\x02'
b'\x95\x01\x75\x08\x81\x01\x95\x06\x75\x08\x15\x00\x25\x65\x05\x07\x19\x00\x29\x65\x81\x00'
b'\xc0',
set_report_buf=bytearray(1), # OUTレポート受信用のバッファ(使わなくても必要)
protocol=1, # プロトコル 1 = キーボード
interface_str="CopyPasteKB" # デバイス名(PCに表示される)
)
# 修飾キー付きで1キー送信 → 自動でキーリリースも送る
def press_key(self, modifiers, keycode):
report = bytes([modifiers, 0x00, keycode, 0, 0, 0, 0, 0]) # キー押下レポート
self.send_report(report)
time.sleep_ms(50) # 少し押しっぱなしにする
self.send_report(b'\x00' * 8) # キーリリース(全て0)
# LEDを点滅させる関数(フィードバック用)
def flash_led(times=1, duration=100):
for _ in range(times):
led.on()
time.sleep_ms(duration)
led.off()
time.sleep_ms(duration)
# メイン関数
def main():
k = Key() # HIDキーボードインスタンス生成
# USB HIDとして初期化(ここでPCに「キーボード」として認識される)
usb.device.get().init(k, builtin_driver=True)
# ボタンの設定(GP16 = コピー、GP17 = ペースト)
btn_copy = Pin(16, Pin.IN, Pin.PULL_UP)
btn_paste = Pin(17, Pin.IN, Pin.PULL_UP)
# PicoオンボードLED(GP25 / 'LED')を出力設定
global led
led = Pin(25, Pin.OUT)
# ボタンの前回の状態(チャタリング防止用)
prev_copy = 1
prev_paste = 1
# USBホスト(PC)に認識されるまで待機
while not k.is_open():
flash_led(times=1, duration=50) # 点滅を繰り返して「準備中」を通知
time.sleep_ms(200)
# 接続完了の合図:LEDを3回点滅
flash_led(times=3, duration=100)
# メインループ:ボタンの状態を監視
while True:
now_copy = btn_copy.value() # 現在のコピー用ボタンの状態(0=押下)
now_paste = btn_paste.value() # 現在のペースト用ボタンの状態(0=押下)
# コピー:ボタンが押された瞬間にCtrl+Cを送信
if prev_copy == 1 and now_copy == 0:
k.press_key(0x01, 0x06) # Ctrl(0x01) + 'C'(0x06)
flash_led(times=2, duration=50) # コピー時はLEDを2回点滅
# ペースト:ボタンが押された瞬間にCtrl+Vを送信
if prev_paste == 1 and now_paste == 0:
k.press_key(0x01, 0x19) # Ctrl(0x01) + 'V'(0x19)
flash_led(times=4, duration=50) # ペースト時はLEDを4回点滅
# 前回の状態を更新
prev_copy = now_copy
prev_paste = now_paste
time.sleep_ms(10) # ポーリング周期(10ms)
# 実行エントリーポイント
main()
コードの解説
class Key(HIDInterface):
:ここでラズピコをUSBキーボード(HIDデバイス)として振る舞わせるためのクラス(設計図)を定義しています。
__init__
内の長いバイト列は「HID Report Descriptor」と呼ばれるもので、これはキーボードの機能(押せるキーの種類や同時押しできるキー数など)を決めている、いわゆる「おまじない」のようなものです。
press_key(self, modifiers, keycode)
は、指定された修飾キー(Ctrlなど)とキーコードをPCに送信する関数です。
modifiers
: 0x01 で左Ctrlキーを意味します。keycode
: 0x06 は ‘C’ キー、0x19 は ‘V’ キーに対応します。
ボタン処理のロジックではprev_copy や prev_paste といった変数を使って、ボタンが「押された瞬間」だけを検出するようになっています。これにより、ボタンを押しっぱなしにしてもキー入力が連続送信されるのを防いでいます。
flash_led
は内蔵ledを点滅させるための処理で、動作確認ではprintを使うことができないので、内蔵LEDを使って状態を確認します。
動作の様子
「コピペ専用キーボード」が完成したので、実際に動かしてみましょう!
こんな感じで左手デバイスのように、プログラミングをする際にコードをコピペしたりできます。

Excel作業やブログ執筆にも使えますね!
まとめ
今回はRaspberry Pi Picoでコピペ専用キーボードを作ってみました。
MicroPythonでそのまま書けるので、「センサーと組み合わせたキーボード」なんてものも作れると思います。戻る/進むボタンを追加したり、ケースを作成したりするのも楽しそうです。
ぜひ皆さんもオリジナルのキーボードを作って、作業を効率化してみてください!



もし完成したらXで教えて下さい✨
コメント欄で感想や質問もお待ちしています📝
コメント