(2021.06.11)コードの記述が短縮できたので追記しました
少し前からRaspberry Pi Pico
(以下Pico
)のネタを書いていますが、そろそろやろうとしていた、キーボード化に挑戦してみます。
んで、とりあえずはマクロキー化をする感じで考えていましたが、少しネタっぽい感じで「くぁwせdrftgyふじこlp」というフレーズを1キーで入力できる、バカキーボードを作ってみることにします。基本的なプログラミングに関しては、ほぼ同じなので、これを見ながら自分のお好みのものを作ってもらえればと思います。
早速、その過程を記載していこうと思います。
まずはLチカ
以前のエントリーではREPL環境
でのインタプリタでLチカを行っていましたが、今回はファイルにMicroPython
のコードを書いて実行していこうと思います。Pico
をUSB接続するとストレージとして認識されるのでその中にあるcode.py
を編集していくことになります。
※RaspberryPiで開発環境を整えるためにThonny Python IDE
やMU 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位置
Lチカの様子 youtu.be
そこまで難しくはありません。
タクトスイッチを入れる
バカデバイスとはいっても自作キーボードなのでやっぱりボタンが必要です。そこでタクトスイッチをIOに接続して、それを押したらLEDを点灯させてみます。
GP13
ピンにタクトスイッチを接続して、プルダウンモードで動作をさせます。(押したときにON=Trueになる)
今回は少し大きめのタクトスイッチがあったので、それを使ってみました。もちろん一般的なタクトスイッチでも動作には問題ありません。
タクトスイッチを押すと本体の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
動作の様子
あともう少しでキーボードが完成になります。
PicoをUSBキーボード化する
PicoをUSBキーボード化するにはライブラリが必要になります。USBストレージのlibディレクトリにAdafruit HID Libraryをコピーすることでライブラリのインストールができます。
ライブラリのダウンロード
ライブラリに関しては以下のリンクからダウンロードできます。CircuitPythonのバージョンによってファイルが異なるので、導入したバージョンをみてファイルをダウンロードして展開を行ってください。
自分は以下のuf2ファイルを使用してMicroPython環境を作成したのでBundle Version 6.x
側をダウンロードしました。
ダウンロードが終わったら、展開をしておきましょう。ライブラリもかなり大量のファイルがあるのでかなりサイズが大きいです。
Pico
へライブラリーをコピー
USBのデバイス化をおこなうライブラリは先程のファイルを展開した中のadafruit_hid
フォルダがあるので、USBストレージのlibフォルダにコピーします。他所の情報ではコピーするとは書いてあったのですが、ファイル単体なのかフォルダごとなのかがわからない記述も多かったのですが、試したところ「フォルダごとコピーすればOK」だったようです。
コピー後のツリー表示は以下のようになっていれば動作します。
USBのHIDドライバもかなり種類がありますね。
「くぁ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()
の引数にキーの名前をしてすればキーモード入力ができます。以下が参考になります。
キーコードは以下が参考になると思います。
ちなみに今回は入力時には日本語入力モード変換にしてあるという前提で処理を記述しています。もし英数入力モードから日本語入力モードに変換する部分も入れたい場合にはコメントアウトしている部分を処理に入れてください。日本語109キーボードにある【全角/半角】キーは使えないので、USキーボード同様に【ALT】キー+ 【`】キーで日本語入力モードに変えています。この処理がトグルなので、元の状態関係なく日本語入力にして元に戻すにはWindowsの場合はIMEなどの設定を変更する必要があります。(ちょっと面倒)
あと【`】はバッククォートだと思っていたのですが、キーコードとしてはGRAVE_ACCENT
を使うようです。
では動作させてみます。
追記(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
参考