DitDahChat用USBアダプターを作る(1)

DitDahChatに電鍵を接続するには(1)マウスを改造する、(2)USBシリアル変換ケーブルを介して接続する、(3)USBキーボードエミュレーションを実装したアダプターを使用する、の3種類があります。とくに(3)は遅延がほぼないそうで、DitDahChatで使っているという話をブログやSNSで見かけます。

このUSBキーボードエミュレーションを使った打鍵方式は、海外のインターネット電信システムであるVBandで使われています。VBandのサイトではVBand用のアダプターが頒布されています。VBandはキーボードの [ と ](日本語106キーボードの場合は @ と [ )、左右CTRLキーで打鍵できるようになっています。そのキーの入力をアダプターが代わりにするという仕組みです。

たしかにこの方法なら端末からはUSBキーボードとして見えるため、PCでもモバイル端末でも使えます。USBシリアル変換ケーブルのようにOSやドライバーの対応状況を意識する必要もありません。

これまでにDitDahChatでもVBandのアダプターを使えるようにしてほしいというリクエストもありました。そこで新しいDitDahChatではVBandと同じキーボードのキーでも打鍵できるようにしました。VBandのアダプターも使えますし、JJ2XMJさんが次のDitDahChat/VBand用のアダプターを頒布されています。

sites.google.com

USBキーボードエミュレーターであれば、これまでに使ってきたRaspberry Pi Pico 2でもできそうです。そこで、Raspberry Pi Pico 2を使ってDitDahChat用USBアダプターができるか試してみることにしました。アダプターの名前は「DitDahChat Adapter Pico」とします。

作成にあたり、次のブログ記事を参考にさせていただきました。

まず、Raspberry Pi Pico 2(以下、Pico)上のMicroPythonをリモート制御するmpremoteをPCにインストールします。

> pip install mpremote

次にPicoにmicropython-libのusb-device-keyboardをインストールします。

> mpremote mip install usb-device-keyboard

これで準備ができましたので、USBキーボードエミュレーターのコードを作成していきます。micropython-libのサンプルをもとに次のようにしました。

import usb.device
from usb.device.keyboard import KeyboardInterface, KeyCode, LEDCode
from machine import Pin
import time

KEYS = (
    (Pin.cpu.GPIO16, KeyCode.LEFT_CTRL),
)

class ExampleKeyboard(KeyboardInterface):
    def on_led_update(self, led_mask):
        pass

def keyboard():
    for pin, _ in KEYS:
        pin.init(Pin.IN, Pin.PULL_UP)

    k = ExampleKeyboard()
    usb.device.get().init(k, builtin_driver=True)

    keys = []
    prev_keys = [None]

    while True:
        if k.is_open():
            keys.clear()
            for pin, code in KEYS:
                if not pin():
                    keys.append(code)
            if keys != prev_keys:
                k.send_keys(keys)
                prev_keys.clear()
                prev_keys.extend(keys)

        time.sleep_ms(1)

def main():
    keyboard()

if __name__ == "__main__":
    main()

最初は左CTRLキーのみとします。GPIO16のピンの状態を見て左CTRLを送信します。

Picoの方は次のように配線しました。タクトスイッチを押すと左CTRLが押された状態になります。

新しい方のDitDahChatに接続してみたところ、タクトスイッチの押下に合わせて打鍵できました。

今後はDitDahChatのエレキーモードでも使えるように右CTRLの追加やPicoへの電鍵の接続、Picoに実装したエレキーでの打鍵なども試してみたいと思います。

JI1JDI

ゆるく楽しくアマチュア無線とプログラミングを楽しんでいます。 scrapbox.io