【自作ガジェット】Raspberry Pi Picoで「コピペ専用キーボード」を作る!

  • URLをコピーしました!

皆さんこんにちは。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ケーブル

これだけで大丈夫です。電子工作初心者でも簡単に揃えられるものばかりで、特別に必要なパーツはありません。

¥1,430 (2025/03/11 22:15時点 | Amazon調べ)

配線

ブレッドボードにタクトスイッチを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を使って状態を確認します。


動作の様子

「コピペ専用キーボード」が完成したので、実際に動かしてみましょう!

こんな感じで左手デバイスのように、プログラミングをする際にコードをコピペしたりできます。

yossy

Excel作業やブログ執筆にも使えますね!

まとめ

今回はRaspberry Pi Picoでコピペ専用キーボードを作ってみました。

MicroPythonでそのまま書けるので、「センサーと組み合わせたキーボード」なんてものも作れると思います。戻る/進むボタンを追加したり、ケースを作成したりするのも楽しそうです。

ぜひ皆さんもオリジナルのキーボードを作って、作業を効率化してみてください!

yossy

もし完成したらXで教えて下さい✨

コメント欄で感想や質問もお待ちしています📝

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次