目次
導入
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
ブレッドボードで組んで、動作確認。プルダウン抵抗や整合抵抗は省略。
ソフトウェア
- 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キー入力を読み取れるのは有意義でないかと思いました。