ユーザ用ツール

サイト用ツール


pocketterm35

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
pocketterm35 [2026/07/02 06:03] – [キーマップ変更] arakipocketterm35 [2026/07/10 05:19] (現在) – [キーマップ変更] araki
行 68: 行 68:
   * ガンガンゲームを楽しみたい人   * ガンガンゲームを楽しみたい人
   * ARM64とx64の違いがイマイチ判ってない人   * ARM64とx64の違いがイマイチ判ってない人
 +  * DTBOがなんなのかわかってない人
  
 画面サイズ640x480しかないので、汎用的なポータブルデバイスを欲しい人には向いていない 画面サイズ640x480しかないので、汎用的なポータブルデバイスを欲しい人には向いていない
行 154: 行 155:
  
 waveshare-35dpi-[345]b.dtbo は /boot/firmware/current/overlay の下においてやればいい waveshare-35dpi-[345]b.dtbo は /boot/firmware/current/overlay の下においてやればいい
 +
 +**カーネルなどの更新を行った場合、新しく /boot/firmware/new/overlayが作られ、その下には waveshare-35dpi-[345]b.dtbo はないので、改めてこれらのファイルをコピーする必要がある**
 +
 +リブートする前なら /boot/firmware/new/overlay の下に、リブート後なら /boot/firmware/current/overlayの下にそれぞれコピーする((いずれも Ubuntu26.04LTSの場合))
  
 <file ini config.txt> <file ini config.txt>
行 761: 行 766:
 原因をまじめに突き止めてもよかったのだが、codexを起動して「steamの設定を日本語にしたが、フォントがないのか□が表示されてしまう」とプロンプトしたらあっという間に設定をなおしてくれたので、どうやったのかはあまりちゃんと把握していないが、とにかく日本語が表示されるようになった 原因をまじめに突き止めてもよかったのだが、codexを起動して「steamの設定を日本語にしたが、フォントがないのか□が表示されてしまう」とプロンプトしたらあっという間に設定をなおしてくれたので、どうやったのかはあまりちゃんと把握していないが、とにかく日本語が表示されるようになった
  
-なので、同じトラブルに見舞われた人がいたら、codexに相談することをお勧めする+なので、同じトラブルに見舞われた人がいたら、codex((claude(Opus4.8)は解決できなかったのでcodex一択である))に相談することをお勧めする
  
-{{ ::pocketterm35:xegraderplus.png?400|}}+{{ ::pocketterm35:xegraderplus_prod.png?400|}}
  
-なお、テストプレイのために XeGrader plus (体験版)を導入して遊んでみた+なお、テストプレイのために XeGrader plusを導入して遊んでみた
  
 カーソルキーとスペースキーで操作できるので、この端末で遊ぶのにはもってこいだ カーソルキーとスペースキーで操作できるので、この端末で遊ぶのにはもってこいだ
行 848: 行 853:
 ジョイパッドとして認識されているわけでもないため、ゲームやPCエミュレータからジョイパッドとしても使えなければ、ゲームで一般的に使われる英字キーでもないので、まったく利用価値がない ジョイパッドとして認識されているわけでもないため、ゲームやPCエミュレータからジョイパッドとしても使えなければ、ゲームで一般的に使われる英字キーでもないので、まったく利用価値がない
  
-これはジョイパッドとして認識されるようにするか、最低でも、単純な英字キーとは別のものに割り当てるべきだろう+<del>これはジョイパッドとして認識されるようにするか、最低でも、単純な英字キーとは別のものに割り当てるべきだろう 
 + 
 +これらの制御は RP2040で行われているようなので、ファームウェアを書き換えることで改善できると思われるので、今後の研究対象のひとつだと思っている</del> 
 + 
 +キーコードの割り当ては、RP2040側にインストールされている CircuitPythonにて行われている 
 + 
 +背面のRP2040リセットのボタンをいい感じに連打していると、CIRCUITPYというUSBメモリデバイスが現れることがある((標準のboot.pyによって、CIRCUITPYが出ないようにされているので、いい感じでRESETを連打することで、boot.pyの実行がキャンセルされることがあるので、そのタイミングでCIRCUITPYが現れる。本当にいい感じで連打してとしかいいようがない))ので、それが出てきたら、中の boot.pyや code.pyを変更したり、追加のライブラリを libフォルダーに入れたりしてカスタムすることができる 
  
-これらの制御は RP2040で行われているようなので、ファームウェアを書き換えることで改善できると思われるので、今後の研究対象のひとつだと思っている 
  
 ==== 電池容量のOS側からの検出 ==== ==== 電池容量のOS側からの検出 ====
行 917: 行 928:
 つまりは、できること・できないことは Adafruit CircuitPython次第ということだ つまりは、できること・できないことは Adafruit CircuitPython次第ということだ
  
-まず、作業を始める前に、スクリーンロックをOFFにするかUSBキーボードを用意する+なお、この部分は大変に長くなるので[[PocketTerm35のキーマップを変更する]]にまとめる 
 + 
 +<del>まず、作業を始める前に、スクリーンロックをOFFにするかUSBキーボードを用意する
  
 スクリーンロックがかかると、CIRCUITPYドライブはアンマウントされてしまうので、万一不具合がある状態だとキー入力ができず、スクリーンロックを解除できず、結果CIRCUITPYを修正できなくなってしまう スクリーンロックがかかると、CIRCUITPYドライブはアンマウントされてしまうので、万一不具合がある状態だとキー入力ができず、スクリーンロックを解除できず、結果CIRCUITPYを修正できなくなってしまう
行 1040: 行 1053:
 ここまでの準備をして、code.pyを書き換えた ここまでの準備をして、code.pyを書き換えた
  
 +まず、ゲームパッドを code.pyで扱えるように宣言する
  
 +from hid_gamepad import Gamepad と gp = Gamepad(usb_hid.devices) を追加するのがこの部分で必要なことである
  
 +<code python>
 +import usb_hid
 +from hid.keyboard import Keyboard
 +from hid.keycode import Keycode
 +from hid.consumer_control import ConsumerControl
 +from hid.consumer_control_code import ConsumerControlCode
 +from hid.keyboard_layout_us import KeyboardLayoutUS
 +from hid_gamepad import Gamepad
 +import board
 +import microcontroller
 +import digitalio
 +import time
 +import pwmio  #PWM模块
 +
 +
 +bl_pwm_value = 32767            #中间值
 +ad_pwm_value = 32767            #中间值
 +
 +try:
 +    # Set up a keyboard device.
 +    kbd = Keyboard(usb_hid.devices)
 +    layout = KeyboardLayoutUS(kbd)
 +    consumer_control = ConsumerControl(usb_hid.devices)
 +    gp = Gamepad(usb_hid.devices)
 +</code>
 +
 +そして、カスタムのキーコード(負数)を追加する
 +
 +-112以降の "GAMEPAD_xxx"が追加されたシンボルである
 +
 +<code python>
 +# Define custom function keys using a dictionary
 +CUSTOM_KEYS = {
 +    # Add more custom keys as needed
 +    "FN_KEY"                : -100,
 +    "FN_MUTE"               : -101,
 +    "FN_VOLUME_DOWN"        : -102,
 +    "FN_VOLUME_UP"          : -103,
 +    "FN_LOCK_SCREEN"        : -104,
 +    "FN_BL_CONTROL_SCREEN"  : -105,
 +    "FN_BL_PWM_DOWN"        : -106,
 +    "FN_BL_PWM_UP"          : -107,
 +    "SHIFT_GRAVE_ACCENT"    : -108,
 +    "SHIFT_BACKSLASH"       : -109,
 +    "SHIFT_LEFT_BRACKET"    : -110,
 +    "SHIFT_RIGHT_BRACKET"   : -111,
 +    "GAMEPAD_THUMB"         : -112,
 +    "GAMEPAD_THUMB2"        : -113,
 +    "GAMEPAD_TRIGGER"       : -114,
 +    "GAMEPAD_TOP"           : -115,
 +    "GAMEPAD_BASE3"         : -116,
 +    "GAMEPAD_BASE4"         : -117,
 +    "GAMEPAD_TOP2"          : -118,
 +    "GAMEPAD_PINKIE"        : -119,
 +    "GAMEPAD_UP"            : -120,
 +    "GAMEPAD_DOWN"          : -121,
 +    "GAMEPAD_LEFT"          : -122,
 +    "GAMEPAD_RIGHT"         : -123
 +}
 +</code>
 +
 +そして、カスタムキーが操作されたときに呼び出される処理のマッピングが以下である
 +
 +マッピングが関数のタプルになっているものは、押されたとき、離されたときの処理で、単純に関数だけが書かれているものは押されたときだけ呼び出される
 +
 +<code pyhotn>
 +SPECIAL_KEY_FUNCTIONS = {
 +    CUSTOM_KEYS["FN_MUTE"                 : toggle_gp19,
 +    CUSTOM_KEYS["FN_VOLUME_DOWN"          : ad_pwm_down,
 +    CUSTOM_KEYS["FN_VOLUME_UP"            : ad_pwm_up,
 +    CUSTOM_KEYS["FN_LOCK_SCREEN"          : lock_screen,
 +    CUSTOM_KEYS["FN_BL_CONTROL_SCREEN"    : toggle_gp21,
 +    CUSTOM_KEYS["FN_BL_PWM_DOWN"          : bl_pwm_down,
 +    CUSTOM_KEYS["FN_BL_PWM_UP"            : bl_pwm_up,
 +    CUSTOM_KEYS["SHIFT_GRAVE_ACCENT"      : shift_grave_accent,
 +    CUSTOM_KEYS["SHIFT_BACKSLASH"         : shift_backslash,
 +    CUSTOM_KEYS["SHIFT_LEFT_BRACKET"      : shift_left_bracket,
 +    CUSTOM_KEYS["SHIFT_RIGHT_BRACKET"     : shift_right_bracket,
 +    Keycode.CAPS_LOCK                       : toggle_gp22,
 +    ConsumerControlCode.SCAN_PREVIOUS_TRACK : scan_previous_track,
 +    ConsumerControlCode.PLAY_PAUSE          : play_pause,
 +    ConsumerControlCode.SCAN_NEXT_TRACK     : scan_next_track,
 +    CUSTOM_KEYS["GAMEPAD_THUMB"           : (gamepad_press_thumb, gamepad_release_thumb),
 +    CUSTOM_KEYS["GAMEPAD_THUMB2"          : (gamepad_press_thumb2, gamepad_release_thumb2),
 +    CUSTOM_KEYS["GAMEPAD_TRIGGER"         : (gamepad_press_trigger, gamepad_release_trigger),
 +    CUSTOM_KEYS["GAMEPAD_TOP"             : (gamepad_press_top, gamepad_release_top),
 +    CUSTOM_KEYS["GAMEPAD_BASE3"           : gamepad_btn_base3,
 +    CUSTOM_KEYS["GAMEPAD_BASE4"           : gamepad_btn_base4,
 +    CUSTOM_KEYS["GAMEPAD_TOP2"            : (gamepad_press_top2, gamepad_release_top2),
 +    CUSTOM_KEYS["GAMEPAD_PINKIE"          : (gamepad_press_pinkie, gamepad_release_pinkie),
 +    CUSTOM_KEYS["GAMEPAD_UP"              : (gamepad_press_up, gamepad_release_up),
 +    CUSTOM_KEYS["GAMEPAD_DOWN"            : (gamepad_press_down, gamepad_release_down),
 +    CUSTOM_KEYS["GAMEPAD_LEFT"            : (gamepad_press_left, gamepad_release_left),
 +    CUSTOM_KEYS["GAMEPAD_RIGHT"           : (gamepad_press_right, gamepad_release_right),
 +}
 +</code>
 +
 +この変更を行ったために、メインループにも手を入れた
 +
 +<code python>
 +# Main loop
 +try:
 +    while True:
 +        current_keys = set(scan_keyboard())
 +
 +        # Handle keys that were released
 +        for key in previous_keys - current_keys:
 +            if key is not None and key >= 0:
 +                kbd.release(key)
 +            elif key is not None and key in SPECIAL_KEY_FUNCTIONS:
 +                if isinstance(SPECIAL_KEY_FUNCTIONS[key], tuple):
 +                    (fun_make, fun_break) = SPECIAL_KEY_FUNCTIONS[key]
 +                    fun_break()
 +
 +        # Handle keys that are pressed
 +        for key in current_keys - previous_keys:
 +            if key is not None:
 +                if key in SPECIAL_KEY_FUNCTIONS:
 +                    if isinstance(SPECIAL_KEY_FUNCTIONS[key], tuple):
 +                        (fun_make, fun_break) = SPECIAL_KEY_FUNCTIONS[key]
 +                        fun_make()
 +                    else:
 +                        SPECIAL_KEY_FUNCTIONS[key]()
 +                elif key >= 0:  # 过滤掉负值键码
 +                    kbd.press(key)
 +
 +</code>
 +
 +キーマップは以下のようになる
 +
 +
 +<code python>
 +# Define the key map for the keyboard matrix
 +KEY_MAP = [
 +    #col0                       col1                                col2                                    col3                                col4                                        col5                                    col6                                    col7                                    col8                        col9
 +    [CUSTOM_KEYS["GAMEPAD_UP"], CUSTOM_KEYS["GAMEPAD_LEFT"],        CUSTOM_KEYS["GAMEPAD_DOWN"],            CUSTOM_KEYS["GAMEPAD_RIGHT"],       CUSTOM_KEYS["GAMEPAD_TOP2"],                CUSTOM_KEYS["GAMEPAD_PINKIE"],          CUSTOM_KEYS["GAMEPAD_TRIGGER"],         CUSTOM_KEYS["GAMEPAD_TOP"],             CUSTOM_KEYS["GAMEPAD_THUMB2"],CUSTOM_KEYS["GAMEPAD_THUMB"]], # row 0
 +    [Keycode.ONE,               Keycode.TWO,                        Keycode.THREE,                          Keycode.FOUR,                       Keycode.FIVE,                               Keycode.SIX,                            Keycode.SEVEN,                          Keycode.EIGHT,                          Keycode.NINE,               Keycode.ZERO],          # row 1
 +    [Keycode.Q,                 Keycode.W,                          Keycode.E,                              Keycode.R,                          Keycode.T,                                  Keycode.Y,                              Keycode.U,                              Keycode.I,                              Keycode.O,                  Keycode.P],             # row 2
 +    [Keycode.A,                 Keycode.S,                          Keycode.D,                              Keycode.F,                          Keycode.G,                                  Keycode.H,                              Keycode.J,                              Keycode.K,                              Keycode.L,                  Keycode.BACKSPACE],     # row 3
 +    [Keycode.Z,                 Keycode.X,                          Keycode.C,                              Keycode.V,                          Keycode.B,                                  Keycode.N,                              Keycode.M,                              Keycode.FORWARD_SLASH,                  Keycode.ENTER,              None],                  # row 4
 +    [Keycode.SHIFT,             Keycode.CAPS_LOCK,                  Keycode.MINUS,                          Keycode.EQUALS,                     Keycode.SEMICOLON,                          Keycode.QUOTE,                          Keycode.COMMA,                          Keycode.PERIOD,                         Keycode.RIGHT_SHIFT,        None],                  # row 5
 +    [CUSTOM_KEYS["FN_KEY"],     Keycode.CONTROL,                    Keycode.LEFT_ALT,                       CUSTOM_KEYS["GAMEPAD_BASE3"],       Keycode.SPACE,                              CUSTOM_KEYS["GAMEPAD_BASE4"],           Keycode.RIGHT_ALT,                      Keycode.WINDOWS,                        CUSTOM_KEYS["FN_KEY"],      None]                   # row 6
 +]
 +
 +</code>
 +
 +あとは、キーを押したり離したりの処理を書けば完成である
 +
 +カーソルキーはゲームパッドでもあり、キーボード上のカーソルキーでもあるので、押すと両方に対してコードを送信している
 +
 +もしこれで何か問題が起きるようであれば、キーマップの方を Keycode.UP_ARROW, DOWN_ARROW, LEFT_ARROW, RIGHT_ARROWに戻してしまえばとりあえず不具合は出ないと思われる
 +
 +<code python>
 +def gamepad_press_thumb():
 +    # A button
 +    gp.press_buttons(2)
 +
 +def gamepad_release_thumb():
 +    gp.release_buttons(2)
 +
 +def gamepad_press_thumb2():
 +    # B button
 +    gp.press_buttons(3)
 +
 +def gamepad_release_thumb2():
 +    gp.release_buttons(3)
 +
 +def gamepad_press_trigger():
 +    # X button
 +    gp.press_buttons(1)
 +
 +def gamepad_release_trigger():
 +    gp.release_buttons(1)
 +
 +def gamepad_press_top():
 +    # Y button
 +    gp.press_buttons(4)
 +
 +def gamepad_release_top():
 +    gp.release_buttons(4)
 +
 +def gamepad_press_top2():
 +    # L button
 +    gp.press_buttons(5)
 +
 +def gamepad_release_top2():
 +    gp.release_buttons(5)
 +
 +def gamepad_press_pinkie():
 +    # R button
 +    gp.press_buttons(6)
 +
 +def gamepad_release_pinkie():
 +    gp.release_buttons(6)
 +
 +def gamepad_btn_base3():
 +    # Select button
 +    gp.click_buttons(9)
 +
 +def gamepad_btn_base4():
 +    # Start button
 +    gp.click_buttons(10)
 +
 +def gamepad_press_up():
 +    # Send both Gamepad / Keyboard
 +    gp.move_joysticks(x=0, y=-127)
 +    kbd.press(Keycode.UP_ARROW)
 +
 +def gamepad_release_up():
 +    gp.move_joysticks(x=0,y=0)
 +    kbd.release(Keycode.UP_ARROW)
 +
 +def gamepad_press_down():
 +    # Send both Gamepad / Keyboard
 +    gp.move_joysticks(x=0, y=127)
 +    kbd.press(Keycode.DOWN_ARROW)
 +
 +def gamepad_release_down():
 +    gp.move_joysticks(x=0,y=0)
 +    kbd.release(Keycode.DOWN_ARROW)
 +
 +def gamepad_press_left():
 +    # Send both Gamepad / Keyboard
 +    gp.move_joysticks(x=-127, y=0)
 +    kbd.press(Keycode.LEFT_ARROW)
 +
 +def gamepad_release_left():
 +    gp.move_joysticks(x=0,y=0)
 +    kbd.release(Keycode.LEFT_ARROW)
 +
 +def gamepad_press_right():
 +    # Send both Gamepad / Keyboard
 +    gp.move_joysticks(x=127, y=0)
 +    kbd.press(Keycode.RIGHT_ARROW)
 +
 +def gamepad_release_right():
 +    gp.move_joysticks(x=0,y=0)
 +    kbd.release(Keycode.RIGHT_ARROW)
 +</code>
 +</del>
 <del>boot.pyをいじれば、ゲームパッドなどもついかできそうだが、boot.pyを壊してしまったら CIRCUITPYドライブは現れない <del>boot.pyをいじれば、ゲームパッドなどもついかできそうだが、boot.pyを壊してしまったら CIRCUITPYドライブは現れない
  
pocketterm35.1782972224.txt.gz · 最終更新: by araki