【Ubuntu Budgie】中華製Bluetoothフットペダルが動かない?原因は「偽iPad」認識だった・・・

AmazonやAliExpressなどで安価に入手できるページ ターナー「P2 Smart Pedal」などのBluetoothフットペダル。楽譜の譜めくりとかでお世話になるやつです。

スマホでは問題なく使えるのに、Linux(Ubuntu Budgie)でBluetooth接続した時だけブラウザのスクロールが全く効かないという現象に遭遇しました。

USB接続なら動くのにBluetoothだと動かない。有線よりはワイヤレスで使いたいねん。
evtest で見ると信号は来ているのに、ChromeやTuxGuitarなどのアプリでは無反応。

調査の結果、このデバイスがLinuxに対して嘘の情報を送っていることが判明しました。スマートフォンに対応させるためでしょうけど、Linuxで使うには都合が悪いです。そのため、Pythonスクリプトを使って、この行儀の悪いデバイスを強制的に「便利なスクロールデバイス」に矯正してみました。

環境

  • OS: Ubuntu Budgie 24.04.3 LTS x86_64
  • Kernel: 6.8.0-88-lowlatency
  • Device: P2 Smart Pedal (Bluetooth接続)
  • 症状:
    • ペアリングは成功する。
    • evtest コマンドでは入力を検知している。
    • しかし、ChromeやテキストエディタでPageUp/Downが反応しない。

なんで動かんの?

evtest コマンドでデバイスの情報を詳細に見てみると、こんな状況でした。

Input device ID: bus 0x5 vendor 0x5ac product 0x22c ...
Properties:
  Property type 1 (INPUT_PROP_DIRECT)
  Event type 3 (EV_ABS)
  Event code 0 (ABS_X)
  Event code 1 (ABS_Y)
  1. Vendor IDがApple (0x5ac): どうやらApple製品を名乗っています。
  2. INPUT_PROP_DIRECT: これは「タッチパネル(画面を直接触るデバイス)」を示す属性です。
  3. 絶対座標 (EV_ABS): マウスのような相対移動ではなく、画面上の座標データを持っています。

つまるところ:
Linux側はこれをキーボードではなく「Apple製のタッチスクリーン(iPadのようなもの)」として認識していました。
そのため、ペダルを踏んで PageUp の信号を送っても、OS側は「画面のどこかをタッチした信号」や「誤動作」として処理し、アプリへのキー入力をブロックしていたのです。

ちなみにUSB接続時は、普通のキーボードとして素直に認識されてました。

対処策:Pythonで信号を「乗っ取る」

udev ルールや libinput の設定ファイルで属性を消そうと試みましたが、デバイス側の主張が強くうまくいきませんでした。
そこで、Pythonの python-evdev ライブラリを使って、OSの手前でデバイス入力を横取り(Grab)し、正しい信号に変換して再送信することにしました。

せっかくなので、単なるキー入力ではなく「PageUp/Downはマウススクロール」「矢印キーはそのまま」という便利な挙動にカスタマイズします。

1. 必要なツールのインストール

sudo apt update
sudo apt install python3-evdev python3-pip

2. 変換スクリプトの作成

/usr/local/bin/fix_pedal.py として以下のスクリプトを作成しました。

このスクリプトは以下の処理を行います。

  1. デバイス(P2 Smart Pedal)を見つけて独占的につかむ(grab)。これによりOSへの誤ったタッチ信号を遮断。
  2. 仮想デバイス(UInput)を作成。
  3. PageUp/Down が来たら → マウスホイールの信号に変換。
  4. それ以外のキー(矢印キーなど)が来たら → そのままキー入力として通過。
import evdev
from evdev import UInput, ecodes
import sys

# --- 設定 ---
# スクロールの速さ(正の整数)
SCROLL_SPEED = 1
# ------------

# 1. デバイスを探す
devices = [evdev.InputDevice(path) for path in evdev.list_devices()]
pedal = None
TARGET_NAME = "P2 Smart Pedal" # Bluetooth接続時のデバイス名

for device in devices:
    if TARGET_NAME in device.name:
        pedal = device
        break

if not pedal:
    sys.exit(1)

# 2. 仮想デバイスの機能を定義
# 元のデバイスが持っている「全キー機能」をコピーし、
# さらに「マウスホイール(REL_WHEEL)」機能を追加します。
cap = {
    ecodes.EV_KEY: pedal.capabilities().get(ecodes.EV_KEY, []),
    ecodes.EV_REL: [ecodes.REL_WHEEL]
}

try:
    # 仮想デバイス作成
    ui = UInput(cap, name="P2 Fixed Scroll & Key", version=0x3)
    
    # 3. 本物のデバイスを乗っ取る(これでタッチ属性の影響を消す)
    pedal.grab()
    
    # 4. 変換ループ
    for event in pedal.read_loop():
        # キーイベントのみ処理
        if event.type == ecodes.EV_KEY:
            
            # --- PageUp -> 上スクロール ---
            if event.code == ecodes.KEY_PAGEUP:
                if event.value >= 1: # 押した or 長押し
                    ui.write(ecodes.EV_REL, ecodes.REL_WHEEL, SCROLL_SPEED)
                    ui.syn()
            
            # --- PageDown -> 下スクロール ---
            elif event.code == ecodes.KEY_PAGEDOWN:
                if event.value >= 1:
                    ui.write(ecodes.EV_REL, ecodes.REL_WHEEL, -SCROLL_SPEED)
                    ui.syn()

            # --- それ以外(矢印キーなど) -> そのまま通す ---
            else:
                ui.write(ecodes.EV_KEY, event.code, event.value)
                ui.syn()

except OSError:
    pass
finally:
    if pedal:
        try:
            pedal.ungrab()
        except:
            pass
    if 'ui' in locals():
        ui.close()

3. 自動起動の設定 (Systemd)

毎回手動で実行するのは面倒なので、Bluetooth接続時や再起動時に自動で動くようにSystemdのサービス化を行います。

/etc/systemd/system/p2-pedal.service を作成:

[Unit]
Description=Fix P2 Smart Pedal Input
After=network.target bluetooth.target

[Service]
Type=simple
# -u オプションでバッファリングを無効化
ExecStart=/usr/bin/python3 -u /usr/local/bin/fix_pedal.py
Restart=always
RestartSec=5
User=root
Group=root

[Install]
WantedBy=multi-user.target

サービスの有効化と起動:

sudo systemctl daemon-reload
sudo systemctl enable p2-pedal.service
sudo systemctl start p2-pedal.service

結果

これで、Bluetooth接続でもギター弾きながら、楽譜をスクロールできるようになりました。

  • ペダルのPageUp/Down: スクロール(マウスホイール動作)。
  • その他のキー: 矢印キーとして正常に機能。

「信号は来ているのに動かない」という時は、evtestINPUT_PROP_DIRECT などの余計な属性が付いていないか疑ってみると良いかもしれません。同じような格安Bluetoothデバイスでお困りの方の参考になれば幸いです。

コメント