/USBKBD2X68K

X68000キーボードコネクタにUSBキーボードとUSBマウスを接続します

Primary LanguageC++MIT LicenseMIT

私家版 USBKBD2X68K

たねけん氏が公開しているUSBKBD2X68Kの改造版です。改造点は以下のとおり

  • ソースの修正なしにツール(※X68000用)でキーマップの変更が可能な種研プロトコルに対応
  • キーマップのレイヤーを2面用意(いわゆるFnレイヤー)
  • Fnキー機能を追加。2面のレイヤー(通常面, Fn面)をFnキーで切り替え可能
  • Fnキーは「押している間だけFnレイヤーを選択」と「押すたびにアクティブなレイヤーをトグルで切り替え」を指定可能
  • 押している間だけ有効なFnキーについては「他のキーと一緒に押した場合はFnキーとして機能」「単独で打鍵した場合は通常キーとして機能」という、いわゆる「ワンショットモデファイア」としての設定も可能。
  • マウス処理をちょっとだけ改善
  • キーを押しっぱなしにした時、実機だと「最初のキー発生の後、数百ミリ秒で最初のリピートが発生 (delay-time)、以降は押し続けている間数十ミリ秒でリピート (repeat-time)」という動きをしますが、この delay-timeとrepeat-timeの両方の機能を実装しました
  • delay-time と repeat-time はHuman68kのswitch.xで設定した値が反映されます

メモリの関係で以下の機能は削除しています

  • Bluetooth対応は削除しました
  • キーマップを自由に変更できるのでUS版は特に作っていません

本家USBKBD2X68KはBTライブラリが大きいためarduino Leonard等のAtmega32U4採用モデルには書き込めませんが、当私家版は書き込み可能です

そして最大の問題点

ハードウェア的な互換性はありません

たねけん氏のUSBKBD2X68Kでは「キーボードの送受信処理にソフトウェアシリアルを使用、マウスの送信処理にマイコン内蔵のUARTを使用」となっていますが、私家版ではこれを逆にして「キーボードの送受信処理にマイコン内蔵のUARTを使用、マウスの送信処理にソフトウェアシリアルを使用」に変更しています。

使用上の注意

ご存知のとおりX68000は本体の電源がOFFの間もキーボードに対して給電されます(compact除く)。そのため、キーボードに対しては本体の5Vとは別に、常時給電用の5Vのラインが使用されます。

問題はこの常時給電用の5Vのラインは非常に給電能力が貧弱ということです。X68000の電源に無理をかけない範囲だと数百mA程度で使うのが妥当な気がします。

昨今流行のLEDが沢山ついたゲーミングキーボード等は非常に消費電力が大きいものがあり、出来れば接続を避けて下さい。

また古いPS/2キーボードをUSB-PS/2変換ケーブル経由で繋ぐのも、同じ理由であまりお勧め出来ません。

手抜き項目

Fnキー処理に明確な手抜きがあります

例えば「『A』のキーを単独で打鍵したら "A"、Fnキーを押しながら打鍵したら "B" をX68kに通知」となるようにキーマップを定義しているとします

  1. Fn押下
  2. A押下 (Fn押下中なのでX68kにはBの押下が通知される)
  3. A開放 (Fn押下中なのでX68kにはBの開放が通知される)
  4. Fn開放

このような順番でキーを操作する分には問題ありませんが、

  1. Fn押下
  2. A押下 (Fn押下中なのでX68kにはBの押下が通知される)
  3. Fn開放
  4. A開放 (Fn押下中ではないのでX68kにはAの開放が通知される)

このようにキー開放の順番によってはキーBのbreakが通知されない事になります。

あるキーが押された際に「Fnキーが押下中か否か」の状態を押されたキー毎に管理すればいいだけなんですが(そしてキーが開放された際は保管していた状態に従って、X68kに通知するスキャンコードを通常面/Fn面のどちらから取得するか決める)まあ実害少なそうなので気が向いたら対応します

TODO

キーボード上のLEDの制御

マウス移動速度の変更機能 (現在は1/2固定です)

マウスホイール対応 (マウスホイールが操作されたらカーソルの上下キーを発生させると便利かな、と)

現在どっちのレイヤーがアクティブかを知らせるLEDの追加

マルチメディアキーへの対応