終わりに
今更ですが、JIS配列はすでに記事になっているのを発見しちゃいました。
参照リンクを貼ります。JPキーボード for CircuitPython by @nak435さん HIDってコードにありますからUSB_HIDデバイスを作られたのでしょうか?
私の目的は、USB接続の1次元バーコードリーダーの出力を読みとり、ペーパーレス記録計にRS485で送り込むことだったので、キーマップのうち、数字+Enterキーだけコード変換しprint文で出力する部分をコード表示して終わりたいと思います。
数字が入力されたら1文字づつprint()し、7つの数字の後にEnterキーが押されたとき7桁分の数字を再度print()し、それ以外は蓄積データを破棄します。
コード例(数字7桁+Enterのみprintする)
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)
keyboard = None
prev_devices = set()
# 数字バーコード用キーマップ (HIDキーコード → 文字)
keymap = {
30: '1', 31: '2', 32: '3', 33: '4', 34: '5',
35: '6', 36: '7', 37: '8', 38: '9', 39: '0',
0x28: '\n', # Enter
}
# キー入力7桁を保存する配列
input_data = []
# キーボードを探す関数
def find_keyboard():
devices = list(usb.core.find(find_all=True))
for device in devices:
print(f"デバイス: {device.idVendor:04x}:{device.idProduct:04x} - {device.product} - {device.manufacturer}")
if not devices:
print("USBデバイスが見つかりませんでした")
return None
else:
keyboard = usb.core.find(idVendor=device.idVendor, idProduct=device.idProduct)
if keyboard is None:
print("USBデバイスが見つかりませんでした (再試行)")
time.sleep(0.5)
else:
print("USBデバイスが見つかりました。")
keyboard.set_configuration()
return keyboard
# RAWデータ読み込み用バッファ
buffer = bytearray(8) # HIDキーボードは8バイト固定
while True:
# キーボードがまだ見つかっていない場合
if keyboard is None:
keyboard = find_keyboard()
if keyboard:
print("USBキーボードがオブジェクト化されました。")
else:
time.sleep(0.5)
continue
try:
num_bytes = keyboard.read(0x81, buffer)
if num_bytes > 0:
key_code = buffer[2] # 3バイト目が押されたキーコード
if key_code != 0:
if key_code in keymap:
key_output = keymap[key_code]
# Enterキー
if key_output == '\n':
if len(input_data) == 7:
print("入力完了:", "".join(input_data))
else:
print("無効な桁数。破棄:", "".join(input_data))
input_data.clear()
else:
# 数字キー
if len(input_data) < 7:
input_data.append(key_output)
print("キー入力:", key_output)
else:
# 8桁以上になったら破棄
print("桁数オーバー。破棄:", "".join(input_data))
input_data.clear()
# デバイス接続・切断の監視
current_devices = set((d.idVendor, d.idProduct) for d in usb.core.find(find_all=True))
for dev_id in prev_devices - current_devices:
print(f"切断: {dev_id[0]:04x}:{dev_id[1]:04x}")
if keyboard and (keyboard.idVendor, keyboard.idProduct) == dev_id:
keyboard = None
prev_devices = current_devices
time.sleep(0.05)
except usb.core.USBError as e:
print("USBエラー:", e)
keyboard = None
time.sleep(0.5)
このコードのポイント
- 数字+Enterキーのみを対象
- キーマップはHIDコード30〜39を数字、0x28をEnterに設定
- 7桁揃ったら出力
- Enterキーで7桁入力を確認して出力
- 7桁未満、または桁数オーバーの場合は破棄
- 1文字ずつデバッグ表示
-
print("キー入力:", key_output)
でリアルタイム確認
-
- USB切断・再接続対応
- デバイスが抜かれると自動で再検知
最初 記事1. CircuitPythonでRPi Pico / RP2040 ZEROがUSBキーボード入力を読み込めた話
<追伸>
改めてネットサーフィンすると、ワラワラと関連記事が沸き出てきて「なんで今頃!?情報がダブって、だれかの気を悪くするのではないか?」とひやひやしています。
すでに書かれたことならば、すぐに消しますので、調査不足をお許しください。
ですが、当初は、いくら調べたつもりでも本当にモヤモヤして、C言語か~?(TRYしたけど挫折した)とか、PICO単体ではHOSTは無理?とか、ちょっとお高めのマイコンボードが必要?とか、調査しきれなかったんです。