0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

記事1. CircuitPythonでRPi Pico / RP2040 ZEROがUSBキーボード入力を読み込めた話

Last updated at Posted at 2025-09-07

目次

  1. USBホスト初期化とデバイス検出(本記事)
  2. USBキーボード限定オブジェクト化とRAWデータ取得(続)
  3. キーコードのマッピングと出力(続^2)

導入

RPi Pico / RP2040 ZEROは小型マイコンですが、GPIO経由でUSB-Aコネクタを接続すると、USBホストになってデバイスを認識できます。
いままで、TinyUSB+C言語の記事は複数を見つけられました(ライブラリ対応もあるようです)。しかし、私には敷居が高く、動作確認までたどり着けませんでした。
ところが、CircuitPythonにおいて、USB_HOST対応を限定的ですが、ずいぶん前から対応していることを見つけました。(Modules included in this downloadにて、usb_host!おぉ!これは!もしかして?)
今回、USBキーボードに断定ですが(最終目的は1次元バーコードリーダー読み取り)、認識してキー入力データを得るという動作が確認できました。(PnPにも対応してました!凄い。もしかして当たり前?)
本記事は「USBキー入力を取得して何か処理したい人向け」の内容です。


ハードウェア

  • RPi Pico / RP2040 ZERO
  • GPIOピンにUSB-Aコネクタを設置
  • 参考にした製品例:Switch Science 9158
    ブレッドボードで組んで、動作確認。プルダウン抵抗や整合抵抗は省略。
    IMG_3590.JPG

ソフトウェア

  • CircuitPython 9.1.4
  • 必要なライブラリは標準に含まれています。CirciutPythonのUF2をインストールするだけで動作します。

記事1:USBホスト初期化とデバイス検出

import usb.core
import usb_host
import board
import time

dp = board.GP6  # D+
dm = board.GP7  # D-

# USBホストポートの初期化
host_port = usb_host.Port(dp, dm)
print("USBホストポートが初期化されました。")
time.sleep(1.5)

# 前回の接続デバイスIDセット
prev_devices = set()

while True:
    # 現在の接続デバイスのIDセット
    current_devices = set()
    for device in usb.core.find(find_all=True):
        dev_id = (device.idVendor, device.idProduct)
        current_devices.add(dev_id)

        # 新しく接続されたデバイス
        if dev_id not in prev_devices:
            print(f"接続: {device.idVendor:04x}:{device.idProduct:04x} - {device.product} - {device.manufacturer}")

    # 切断されたデバイス
    for dev_id in prev_devices - current_devices:
        print(f"切断: {dev_id[0]:04x}:{dev_id[1]:04x}")

    # 状態を更新
    prev_devices = current_devices

    time.sleep(0.1)

この段階ではまだキー入力は取得していません。
しかし、PnPの動作を確認できます。USBデバイスをUSB-Aコネクタから、抜き差ししてみてください。差してから数秒待ちますが、再認識します。
まず「PicoがUSBデバイスを認識できる」ことを確認する段階です。

【実行例】キーボードとマウスを抜き差ししてみた。

>>> %Run -c $EDITOR_CONTENT
USBホストポートが初期化されました。
接続: 0603:00f2 - USB Keyboard - NOVATEK
切断: 0603:00f2
接続: 1ea7:0066 - 2.4G Mouse - None
切断: 1ea7:0066

<追記>
改めて、「CuircuitPython USB HOST」「CuircuitPython USBHOST」(空白なし)で検索してみると、この程度なら、英語圏内の実例があるのに気づけました。
この先が、役に立つのかどうか?
この後の連休に、まとめてみます。すでにC言語を使えるならば、もっと高度な処理ができますが、CircuitPythonだけで、USBキー入力を読み取れるのは有意義でないかと思いました。

2.(続)USBキーボード限定オブジェクト化とRAWデータ取得

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?