USBキーボードを SBC につなぐ KKBD-USB その1 ~動機と全体設計~

KKBD-USBUSBキーボードを SBC につなぐ KKBD-USB その1 ~動機と全体設計~

MC6800 ROMモニタの記事(その18)で、SBC をスタンドアロン化するにはキーボードが必要だ、という話を書きました。PS/2か USB か、USBなら MCU 側で受けて 2nd ACIA へ流す方式になりそう、と書いたところで終わっていました。

あれからちょっと考えて、「これは ROMモニタとは完全に別のプロジェクトにしたほうが良い」という結論にしました。それで、KKBD-USB という独立したプロジェクトを立ち上げました。

**

MC6800 ROMモニタ phase シリーズとは別記事・別プロジェクトです。** KKBD-USB は SBC の種類を問わず UART 入力のある SBC 全般に使えるキーボード I/F ボードとして開発しています。

何を作るか ― 送信専用のキーボード I/F ボード

一言で言うと、USB キーボード → UART 変換ボードです。USB キーボードをつないで、押したキーを ASCII コードに変換して UART で SBC へ送り出す、それだけです。

KKBD-USB は「送信専用のキーボード I/F 代替ボード」であって、ターミナルエミュレーターではありません。PC のターミナルソフトを使う場合は、PC 側でキー入力を送って SBC からの応答文字を PC 側の画面に表示する、という双方向の通信をしています。KKBD-USB はその「送る」側だけを担当します。SBC からの応答文字を受け取って表示する機能は一切ありません。

文字表示は SBC 側に VRAM 付きのビデオボード等の独立した表示系統を用意する前提です。スタンドアロンのコンピューターとして使う構成、ということですね。

採用したハードウェア構成

MCU は Raspberry Pi Pico(RP2040) にしました。入手が簡単、安い、公式 SDK が使いやすい、そして USB ホスト機能が内蔵されていて外付けモジュールが不要という点です。USB ホスト機能は Pico 内蔵の USB ハードウェアを TinyUSB ライブラリ経由で使います(参考: USB簡単ホスト)。

動作設定はジャンパーピン 4 本(JP1〜JP4)でハードウェアレベルで切り替えます。起動時に一回読み取って以降は固定というシンプルな仕組みです。

行末コード選択(JP1 / JP2 = GPIO 10 / 11)

JP1 JP2 行末コード
OPEN OPEN CR(0x0D)
SHORT OPEN LF(0x0A)
OPEN SHORT CRLF(0x0D 0x0A)
SHORT SHORT (予約 → CR にフォールバック)

ボーレート選択(JP3 / JP4 = GPIO 12 / 13)

JP3 JP4 ボーレート
OPEN OPEN 9600 bps
SHORT OPEN 19200 bps
OPEN SHORT 38400 bps
SHORT SHORT 115200 bps

機能要件まとめ

  • USB HID Keyboard クラスのキーボードを USB ホストとして接続・認識
  • 英数字・記号・制御キー(Ctrl+A〜Z など)を ASCII コードに変換
  • Shift + キーの組み合わせ(大文字・記号)対応
  • Enter キー押下時に JP1/JP2 設定に従い CR / LF / CRLF を送出
  • キーリピート(500ms 初回遅延、50ms 間隔)
  • キーボード未接続時の待ち受け・再接続対応
  • Pico 内蔵 LED でステータス表示(起動中・待機中・送信時・エラー時)

ソフトウェア・レイヤアーキテクチャ

アプリケーション層(main / keymap / keyrepeat / led)、ミドルウェア層(TinyUSB Host HID)、HAL 層(Pico SDK)の 3 レイヤ構成です。ソースは 7 モジュール構成(main.c, usb_host.c, keymap.c, uart_out.c, config.c, led.c, keyrepeat.c)。

開発の進め方について

今回は着手前に要件定義書・詳細設計書・実装計画・テスト戦略の 4 文書を先に整備しました。個人のホビープロジェクトでここまでやるか? という感じもしますが、USB ホストという慣れない領域でもあるので、最初に頭の中を整理する意味も含めて、ちゃんと書いてみました。

現時点では Phase 1〜6 完了、「USB キーボード接続 → ASCII 変換 → UART 送信」のメイン機能は実機検証済みで通常用途では使える状態です。Phase 7(異常系処理の詳細)と Phase 8(長時間検証)が残っているので正式リリースではないですが、一般的な USB キーボードを SBC に接続する用途では問題なく動いています。

次回予告

次回(その2)は、Phase 1 のビルド環境構築から Phase 3 の USB ホスト基盤まで、実装中にハマったところを中心に書く予定です。TinyUSB のホストモードは情報が少なくて、初期化の順番やコールバックの実装方法でかなり時間を使いました。CMake 4.x との互換性の問題もあって、そのあたりの試行錯誤をまとめます。

関連リンク

KKBD-USB