====== PocketTerm35のキーマップを変更する ====== ===== 概要 ===== [[https://www.waveshare.com/|WaveShare]]が提供する[[https://www.waveshare.com/catalogsearch/result/?q=PocketTerm35|PocketTerm35]]のキーボードコントローラはRP2040である ファームウェアをカスタマイズすることで任意のキーマップを実装できる そこで、サポートに、ファームウェアのソースを公開してほしいと連絡すると、[[https://circuitpython.org/|Circuit Python]]だから、code.pyを変更すればキーマップをカスタマイズできるよ、といわれた なるほど、それならばそれでやってみよう ===== CIRCUITPYをマウントする ===== Circuit Pythonのデバイスは、CIRCUITPYというUSBマスストレージとターミナルにつながるUSBシリアルデバイスを提供する なので、ホスト端末からは CIRCUITPYが見えるはずだが、PocketTerm35には存在していない サポート曰く「(RP2040の)リセットボタンを押せばみえるよ」とのことだが、リセットを押したとて出てこない のちにわかるのだが、boot.pyのなかでCIRCUITPYを無効化しているので、基本的に出てこないのだ import storage sotrage.disable_usb_drive() ではどうするのか **いい感じにRESETボタンを連打する** これしかないので、いい感じにRESETボタンを連打してください この問題についても、改造の過程で解消していきたいと思う ===== 準備 ===== Circuit Pythonの改造は比較的難易度は低いが、不完全なコードをデプロイすると PocketTerm35のキーボードが一切効かないなどということになりかねないリスクがある なので、必ず以下の準備をする * CIRCUITPYのバックアップ * USBキーボード できれば以下のものもあるとよい * ファームウェアの回復用のuf2ファイルセット((Waveshareのサポートに頼むともらえるかもしれない)) ===== キーマップの設計 ===== 不便であると感じているのは以下の点 * 左シフトキーがない * ゲームパッド風のキーがあるのにただ英字が割り当てられているだけでゲームパッドとして機能しない * マウスがないと困る場面でマウスとして使える機能が欲しい * CIRCUITPYの存在が不安定 の なので、以下のようにキーマップを変更することにする * TABキーは左シフトにして Fn+TABでTABキーとする * 右シフトキーには右シフトを割り当てる(デフォルトでは左シフトになっている) * Fn+上, Fn+下, Fn+左, Fn+右, Fn+L, Fn+Rはマウスカーソルの移動および左クリック、右クリックとする * Select, Start は常時ゲームパッドの Select/Start にする * 刻印通り Fn+SelectをPrint Screen、Fn+Start を Pauseとする * Fn+BでカーソルキーとABXYLRのアクションキーをゲームパッドとしてふるまうようにする * Fn+AでカーソルキーとABXYLRのアクションキーをデフォルトのカーソルキーとABXYLRの英字に戻す * 左Fnキーを押したままRP2040をRESETすると CIRCUITPYが有効化される(デフォルトでは無効) ===== 依存するライブラリ ===== * adafruit_hid * [[https://github.com/adafruit/Adafruit_CircuitPython_HID/blob/main/examples/hid_gamepad.py|hid_gamepad.py]] デフォルトのファームウェアとして入っている Circuit Pythonは Adafruit hidを利用しているが、なぜかhidという名前になっている 互換性を鑑みて adafruit_hid と入れ替えたい [[https://circuitpython.org/libraries|Circuit Python Libiraries]]からVersion 10.x用のライブラリを取得し、中にある adafruit_hid のフォルダを丸ごと CIRCUITPY/libの下にコピーする hidは消してしまっても構わない hid_gamepad.pyは[[https://github.com/adafruit/Adafruit_CircuitPython_HID|Adafruit CircuitPython_HID]]のexamplesの中にある これを同じく CIRCUITPY/libにコピーしておく ===== コード ===== ==== boot.py ==== ==== code.py ====