キーボード制作

キーボード制作

  1. 環境構築・構想
  2. 基板設計・発注
  3. 制作

はじめに

マイコンを使ってキーボードを自作できることはよく知られている。しかし、「Arduino ProMicro が必要?」、「コードが難しそう」といった理由から制作に踏み出せずにいた。

しかし2025年12月、EEprotocol氏がキーボード制作をはじめ、便乗する形で取り掛かった。

構成

この工作ではRasberryPi Picoを使用する。AliExpressで400円ほどで入手可能。 そして開発はC言語ではなくPythonを選択した。

なのでこの企画は「CircuitPythonを使ってみた」というのが正しい気がする。

準備

2025/12/06

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に置く。 circuitpy

あとは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)

2026/03/01

キーボード用のライブラリを使ってみよう。今回はadafruit_hidを使う。まずはライブラリをリンクからダウンロード。

https://circuitpython.org/libraries

ダウンロードできたらadafruit_hidを探してコピー、CIRCUITPY(:D)の中のlibadafruit_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)

ここまでで文字の入力が成功した。次回はマトリクス状にキーを並べてキーの読み取りをしたい。あるいは、ロータリーエンコーダーを試してみたい。

2026/03/07
circuitpy

ここで新しいボードが登場。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)

1ページ 2ページ 3ページ

References

  1. Pi Picoに、CircuitPythonを入れてみた
  2. RP2040*CircuitPythonワンボタンで Ctrl+C / V / A!ショートカットマクロを自作する
  3. API Reference (adafruit_hid)
  4. KiCad9.0で設計した基板をJLCPCBに発注する