(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チカの様子
VIDEO 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
動作の様子
VIDEO youtu.be
あともう少しでキーボードが完成になります。
PicoをUSBキーボード化する
PicoをUSBキーボード化するにはライブラリが必要になります。USBストレージのlibディレクト リにAdafruit HID Libraryをコピーすることでライブラリのインストールができます。
ライブラリのダウンロード
ライブラリに関しては以下のリンクからダウンロードできます。CircuitPythonのバージョンによってファイルが異なるので、導入したバージョンをみてファイルをダウンロードして展開を行ってください。
circuitpython.org
自分は以下の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
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)
led.value = False
adafruit_hid.keyboard()
の引数にキーの名前をしてすればキーモード入力ができます。以下が参考になります。
circuitpython.readthedocs.io
キーコードは以下が参考になると思います。
github.com
ちなみに今回は入力時には日本語入力モード変換にしてあるという前提で処理を記述しています。もし英数入力モードから日本語入力モードに変換する部分も入れたい場合にはコメントアウト している部分を処理に入れてください。日本語109キーボード にある【全角/半角】キーは使えないので、USキーボード同様に【ALT】キー+
【`】キーで日本語入力モードに変えています。この処理がトグルなので、元の状態関係なく日本語入力にして元に戻すにはWindows の場合はIME などの設定を変更する必要があります。(ちょっと面倒)
あと【`】はバッククォートだと思っていたのですが、キーコードとしてはGRAVE_ACCENT
を使うようです。
ja.wikipedia.org
では動作させてみます。
VIDEO 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
while True :
if button.value:
led.value = True
layout.write('qawsedrftgyhujikolp \n ' )
led.value = False
これでかなりコードが短くなりました。あくまでもキーコードに関してはUS配列のキーボードのものを踏襲するので日本語109などとキーの刻印が違うときには少し挙動が変わるので注意が必要かもしれません。
おわりに
Pico
をキーボードエミュレーションさせることでUSBキーボードにすることができました。タクトスイッチにキーバインド を割り当てることで目的のマクロキーボードを作る事ができます。キーボード以外にもHIDデバイス である、ゲームパッド デバイス にすることやマウスとしても使用することができるので、ちょっとしたデバイス ならすぐできてしまうのかも。
ゲームなどのキーボードを複数使うような操作もこれならできちゃいそうです。チート行為になる可能性があるのでその辺りは注意してください。
せっかく作った「くぁwせdrftgyふじこlp」キーボードですがそう使う機会はなさそうですけどねw
参考
uepon.hatenadiary.com