Raspberry Pi Picoをカスタムキーボード化して「くぁwせdrftgyふじこlp」キーボード爆誕!

f:id:ueponx:20210610002739p:plain

(2021.06.11)コードの記述が短縮できたので追記しました

少し前からRaspberry Pi Pico(以下Pico)のネタを書いていますが、そろそろやろうとしていた、キーボード化に挑戦してみます。 んで、とりあえずはマクロキー化をする感じで考えていましたが、少しネタっぽい感じで「くぁwせdrftgyふじこlp」というフレーズを1キーで入力できる、バカキーボードを作ってみることにします。基本的なプログラミングに関しては、ほぼ同じなので、これを見ながら自分のお好みのものを作ってもらえればと思います。

早速、その過程を記載していこうと思います。

まずはLチカ

以前のエントリーではREPL環境でのインタプリタでLチカを行っていましたが、今回はファイルにMicroPythonのコードを書いて実行していこうと思います。PicoをUSB接続するとストレージとして認識されるのでその中にあるcode.pyを編集していくことになります。

※RaspberryPiで開発環境を整えるためにThonny Python IDEMU Editorを使おうかなと思ったのですが、普通にUSBストレージ内のファイルをVisual Studio Codeで編集して保存するだけで開発できたので、そのまま開発していこうと思います。RaspberryPiでの開発環境については別のエントリーで言及しようかと

USBストレージ内のcode.pyというファイルを編集するだけでファイルの中身が自動的に実行されます。ネット情報ではmain.pyというファイルでもいいのかなと思ったのですが、code.pyのほうが優先されるようです。

まずはLチカを行ってみます。本体のLEDのはGP25として定義されています。ではこのLEDを点灯させるコードを書いていこうと思います。

本体LEDを使用してLチカ

import digitalio
from board import *
import time

led = digitalio.DigitalInOut(GP25)
led.direction = digitalio.Direction.OUTPUT

while True:
    led.value = True
    time.sleep(0.1)
    led.value = False
    time.sleep(0.1)

上記のコードで本体のLチカを行うことができます。基本的にはIOピンを出力設定をして、on/offを設定するだけで点滅ができます。

本体上のLED位置

f:id:ueponx:20210610000652p:plain

Lチカの様子 youtu.be

そこまで難しくはありません。

タクトスイッチを入れる

バカデバイスとはいっても自作キーボードなのでやっぱりボタンが必要です。そこでタクトスイッチをIOに接続して、それを押したらLEDを点灯させてみます。

GP13ピンにタクトスイッチを接続して、プルダウンモードで動作をさせます。(押したときにON=Trueになる)

f:id:ueponx:20210609235610p:plain

今回は少し大きめのタクトスイッチがあったので、それを使ってみました。もちろん一般的なタクトスイッチでも動作には問題ありません。

f:id:ueponx:20210610004155j:plain

タクトスイッチを押すと本体のLEDをLチカさせる

import board
import digitalio

led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT
button = digitalio.DigitalInOut(board.GP13)
button.switch_to_input(pull=digitalio.Pull.DOWN)

while True:
    led.value = button.value

動作の様子

youtu.be

あともう少しでキーボードが完成になります。

PicoをUSBキーボード化する

PicoをUSBキーボード化するにはライブラリが必要になります。USBストレージのlibディレクトリにAdafruit HID Libraryをコピーすることでライブラリのインストールができます。

ライブラリのダウンロード

ライブラリに関しては以下のリンクからダウンロードできます。CircuitPythonのバージョンによってファイルが異なるので、導入したバージョンをみてファイルをダウンロードして展開を行ってください。

circuitpython.org

自分は以下のuf2ファイルを使用してMicroPython環境を作成したのでBundle Version 6.x側をダウンロードしました。

f:id:ueponx:20210610220032p:plain

f:id:ueponx:20210610215924p:plain

ダウンロードが終わったら、展開をしておきましょう。ライブラリもかなり大量のファイルがあるのでかなりサイズが大きいです。

f:id:ueponx:20210610223253p:plain

Picoへライブラリーをコピー

USBのデバイス化をおこなうライブラリは先程のファイルを展開した中のadafruit_hidフォルダがあるので、USBストレージのlibフォルダにコピーします。他所の情報ではコピーするとは書いてあったのですが、ファイル単体なのかフォルダごとなのかがわからない記述も多かったのですが、試したところ「フォルダごとコピーすればOK」だったようです。

コピー後のツリー表示は以下のようになっていれば動作します。

f:id:ueponx:20210610001323p:plain

f:id:ueponx:20210610001131p:plain

USBのHIDドライバもかなり種類がありますね。

f:id:ueponx:20210610001134p:plain

「くぁwせdrftgyふじこlp」キーボードを作る!

ライブラリファイルのコピーが終わったらあとはcode.pyを以下の様に編集していきます。

先程のタクトキーを押したらLEDが点灯するというのにキー操作を行う処理を追加すればほぼ終わりです。

タクトスイッチを押すと、キーボードで「くぁwせdrftgyふじこlp」を入力する(入力中は本体のLEDを点灯させる)

import time
import board
import digitalio
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode

def keyInput(keycodeName):
    keyboard.send(keycodeName)

keyboard = Keyboard(usb_hid.devices)

led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT
button = digitalio.DigitalInOut(board.GP13)
button.switch_to_input(pull=digitalio.Pull.DOWN)
led.value = False

while True:
    if button.value:
        led.value = True
        # 日本語変換モードに切り替える
        # keyboard.send(Keycode.ALT, Keycode.GRAVE_ACCENT)

        keyInput(Keycode.Q)
        keyInput(Keycode.A)
        keyInput(Keycode.W)
        keyInput(Keycode.S)
        keyInput(Keycode.E)
        keyInput(Keycode.D)
        keyInput(Keycode.R)
        keyInput(Keycode.F)
        keyInput(Keycode.T)
        keyInput(Keycode.G)
        keyInput(Keycode.Y)
        keyInput(Keycode.H)
        keyInput(Keycode.U)
        keyInput(Keycode.J)
        keyInput(Keycode.I)
        keyInput(Keycode.K)
        keyInput(Keycode.O)
        keyInput(Keycode.L)
        keyInput(Keycode.P)
        keyInput(Keycode.ENTER)

        # 日本語変換モードから英数モードに切り替える
        # keyboard.send(Keycode.ALT, Keycode.GRAVE_ACCENT)
        led.value = False

adafruit_hid.keyboard()の引数にキーの名前をしてすればキーモード入力ができます。以下が参考になります。

circuitpython.readthedocs.io

キーコードは以下が参考になると思います。

github.com

ちなみに今回は入力時には日本語入力モード変換にしてあるという前提で処理を記述しています。もし英数入力モードから日本語入力モードに変換する部分も入れたい場合にはコメントアウトしている部分を処理に入れてください。日本語109キーボードにある【全角/半角】キーは使えないので、USキーボード同様に【ALT】キー+ 【`】キーで日本語入力モードに変えています。この処理がトグルなので、元の状態関係なく日本語入力にして元に戻すにはWindowsの場合はIMEなどの設定を変更する必要があります。(ちょっと面倒)

あと【`】はバッククォートだと思っていたのですが、キーコードとしてはGRAVE_ACCENTを使うようです。

ja.wikipedia.org

では動作させてみます。

youtu.be

追記(2021.06.11)

先程のコードではいちいち1つのキーを押下するのにコードを書いていましたが、さすがにこれではコードが大量になってしまいます。そこで、USB_HIDにあるキーボードレイアウトというモジュールadafruit_hid.keyboard_layout_usを使用することで、キーコードの指定ではなく文字列を引数にすることで簡単に入力ができます。特殊キーの同時入力はできませんが、シフトキーなど押しながらの入力に関しては文字を判別してキーコードを判別してくれるのでかなり記述は楽になります。

adafruit_hid.keyboard_layout_usモジュールを使用して書き直す

import time
import board
import digitalio
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS #追加部分

def keyInput(keycodeName):
    keyboard.send(keycodeName)

keyboard = Keyboard(usb_hid.devices)
layout = KeyboardLayoutUS(keyboard)  #追加部分

led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT
button = digitalio.DigitalInOut(board.GP13)
button.switch_to_input(pull=digitalio.Pull.DOWN)
led.value = False

# 「くぁwせdrftgyふじこlp」キーボード

while True:
    if button.value:
        led.value = True
        # 日本語変換モードに切り替える
        # keyboard.send(Keycode.ALT, Keycode.GRAVE_ACCENT)

        layout.write('qawsedrftgyhujikolp\n') #変更部分

        # 日本語変換モードから英数モードに切り替える
        # keyboard.send(Keycode.ALT, Keycode.GRAVE_ACCENT)
        led.value = False

これでかなりコードが短くなりました。あくまでもキーコードに関してはUS配列のキーボードのものを踏襲するので日本語109などとキーの刻印が違うときには少し挙動が変わるので注意が必要かもしれません。

おわりに

PicoをキーボードエミュレーションさせることでUSBキーボードにすることができました。タクトスイッチにキーバインドを割り当てることで目的のマクロキーボードを作る事ができます。キーボード以外にもHIDデバイスである、ゲームパッドバイスにすることやマウスとしても使用することができるので、ちょっとしたデバイスならすぐできてしまうのかも。

ゲームなどのキーボードを複数使うような操作もこれならできちゃいそうです。チート行為になる可能性があるのでその辺りは注意してください。

せっかく作った「くぁwせdrftgyふじこlp」キーボードですがそう使う機会はなさそうですけどねw

参考

uepon.hatenadiary.com

/* -----codeの行番号----- */