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?

記事3. キーコードのマッピングと出力(続^2)

Last updated at Posted at 2025-09-13

終わりに

今更ですが、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は無理?とか、ちょっとお高めのマイコンボードが必要?とか、調査しきれなかったんです。

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?