マイコンを使ってキーボードを自作できることはよく知られている。しかし、「Arduino ProMicro が必要?」、「コードが難しそう」といった理由から制作に踏み出せずにいた。
しかし2025年12月、EEprotocol氏がキーボード制作をはじめ、便乗する形で取り掛かった。
なのでこの企画は「CircuitPythonを使ってみた」というのが正しい気がする。
CircuitPythonを導入しよう。やることは以下の2つ。
CircuitPythonをインストールするにあたって.uf2ファイルが必要である。リンク先からPicoに対応した.uf2ファイルをダウンロード。
https://circuitpython.org/board/raspberry_pi_pico/
ダウンロードできたことを確認したら、次はPicoにインストールをする。Pico本体を用意して、bootsetボタンを押したままPCに接続。するとRPI-RP2という名前のデバイスが認識される。bootsetボタンを押したまま接続しないと認識されないので注意。
ここに.uf2ファイルを置くとPicoがCIRCUITPY(D:)として認識される。後でも書くが、pythonのコードはcode.pyに書き込み、必要なライブラリはここのlibに置く。

あとはMu Editorをインストール。リンク先からダウンロード。https://codewith.mu/
環境構築はこれで終了。あとはMuで書いたコードをPicoの code.py に書き込むだけ。とりあえずLチカだけやっておこう、内蔵LED(GP25)を点滅させてみる。
import time
import board
import digitalio
led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = True
time.sleep(1)
led.value = False
time.sleep(1)
キーボード用のライブラリを使ってみよう。今回はadafruit_hidを使う。まずはライブラリをリンクからダウンロード。
https://circuitpython.org/libraries
ダウンロードできたらadafruit_hidを探してコピー、CIRCUITPY(:D)の中のlibにadafruit_hidのフォルダを置く。
import board
import digitalio
import time
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
kbd = Keyboard(usb_hid.devices)
layout = KeyboardLayoutUS(kbd)
led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT
buttonA = digitalio.DigitalInOut(board.GP20)
buttonA.direction = digitalio.Direction.INPUT
buttonA.pull = digitalio.Pull.UP
buttonB = digitalio.DigitalInOut(board.GP19)
buttonB.direction = digitalio.Direction.INPUT
buttonB.pull = digitalio.Pull.UP
led.value = True
time.sleep(2.5)
led.value = False
prevA = True
prevB = True
while True:
currentA = buttonA.value
currentB = buttonB.value
if prevA and not currentA:
layout.write("Osaka University ")
prevA = currentA
if prevB and not currentB:
layout.write("The University of Osaka ")
prevB = currentB
time.sleep(0.02)
ここまでで文字の入力が成功した。次回はマトリクス状にキーを並べてキーの読み取りをしたい。あるいは、ロータリーエンコーダーを試してみたい。
ここで新しいボードが登場。RP2040 Zero(以下、ゼロ)を導入する。例のEEprotocol氏のプリント基板を一枚いただいたので、氏がseedstudio ESP32-C3を使っていたところをゼロにしてキーボード作成をしてみようと思う。
ほぼ変わらないとはいえ、新しいボードを使い始めるときはまずLチカである。ゼロには内蔵LEDとしてWS2812b,つまりフルカラーLEDがついている。neopixelのライブラリ neopixel.mpy を使って光らせてみよう。ゼロの内蔵LEDはGP16に割り当てられている。ちなみに、.uf2ファイルはPicoのものと同じでよい。
import board
import neopixel
import time
pixel = neopixel.NeoPixel(board.GP16, 1, brightness=0.1)
while True:
pixel[0] = (255, 0, 0)
time.sleep(1)
pixel[0] = (0, 255, 0)
time.sleep(1)
pixel[0] = (0, 0, 255)
time.sleep(1)
無事にLチカが成功した。次はロータリーエンコーダを使ってみる。import rotaryioを使うと容易に実装できる。そして今回はスイッチ付きロータリーエンコーダを用いる。正回転と逆回転の読み取りにGP3,GP4、スイッチの読み取りににGP2を割り当てた。encoder.positionで位置、つまり回転量を取得することができる。
まず初めにadafruit_hidのマウスホイール機能を試してみた。
import board
import rotaryio
import digitalio
import time
import usb_hid
from adafruit_hid.mouse import Mouse
m = Mouse(usb_hid.devices)
encoder = rotaryio.IncrementalEncoder(board.GP3, board.GP4)
button = digitalio.DigitalInOut(board.GP2)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP
value = 0
last_position = encoder.position
while True:
position = encoder.position
dif = position-last_position
if position != last_position:
m.move(wheel= dif)
last_position = position
if not button.value:
value = 0
time.sleep(0.01)