【Raspberry Pi Pico入門 – 11】簡易キーボードを作ってみる

2023年10月16日Raspberry Pi Pico入門,基本編Arduino,Raspberry Pi Pico,自作キーボード

概要

今回はスターターキットのチュートリアルの内容から少し離れて、Raspberry Pi Picoを使って簡易キーボードを作ってみます。
市販のキーボードと全く同じ機能を持たせようとすると複雑になってしまうので、今回はこれまでに勉強した内容だけを使って可能な限りシンプルなコードで作成します。

実行環境

IDE:Arduino IDE 2.1.1
MCU:Raspberry Pi Pico

回路

以下のように配線します。今回は回路をシンプルにするために外付けのプルアップ抵抗を使わず、Raspberry Pi Pico内蔵のプルアップ抵抗を使います。

プルアップ抵抗については以下で説明しています。

ライブラリのインストール

ライブラリについては以下で説明しています。

今回は「Keyboard」というArduino公式のライブラリをインストールします。
ライブラリーマネージャーの検索欄に「Keyboard」と入力し、「by Arduino」となっているライブラリをインストールしてください。

コーディング

新しくスケッチを作成し、以下の内容をコピペしてください。
ボタンを押すと「Ctrl+V」、つまり貼り付けのショートカットが実行されるコードです。

#include <Keyboard.h>

const int KEY_1 = 16;

void setup() {
  pinMode(KEY_1, INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
  if(digitalRead(KEY_1) == LOW){
    delay(20);
    if(digitalRead(KEY_1) == LOW){
      Keyboard.press(KEY_LEFT_CTRL);
      delay(10);
      Keyboard.press('v');
      delay(50);
      Keyboard.releaseAll();
    }
    while (digitalRead(KEY_1) == LOW);
  }
}

動作確認

まずは適当な文章をコピーしてください。メモ帳等にカーソルを合わせてスイッチを押したときにコピーした文章が貼り付けられれば成功です。

解説

内蔵プルアップ抵抗

マイコンを使用した回路ではICの通信やセンサー出力のためにプルアップ抵抗が必要となる場面が多いため、多くのマイコンには10kΩ~50kΩ程度のプルアップ抵抗が内蔵されています。抵抗値のバラつきが大きいため正確な電流を流したいときには使えませんが、今回のように電流値が多少変わっても問題ないような場面ではかなり便利です。

ArduinoではpinMode()でピン設定する際に「INPUT_PULLUP」と設定すると指定したGPIOに内蔵プルアップ抵抗が接続されます。
※試しにGPIOの電圧を測ってみてください。設定したピンだけ3.3Vになっているはずです。

コードの解説

keyboardライブラリはRaspberry Pi Picoが持っているUSB通信機能を使用して、Raspberry Pi Picoをキーボードとして認識させ、どのようなボタンが押されたのかをPCに送信する機能を実装するためのライブラリです。
今回のプログラムで使った関数と、他にも便利そうな関数を解説します。

  • begin()
    キーボード機能の初期設定の関数です。これを実行すると他の関数が使えるようになります。
  • press()
    「引数で指定したキーを押した」という情報をPCに送ります。気を付けないといけないのは、次で解説するrelease()やreleaseAll()を実行するまでボタンが押しっぱなしになることです。
  • release()
    「引数で指定したキーを離した」という情報をPCに送ります。
  • releaseAll()
    「これまでにpress()で指定したキーを全て離した」という情報をPCに送ります。
  • print()
    「引数で指定した文章を打ち込んだ」という情報をPCに送ります。引数の代入方法はSerial.print()と同じです。長文を入力させるのに便利です。
  • println()
    「引数で指定した文章を打ち込んだ」という情報をPCに送ります。print()との違いは、最後に改行を追加して送信することです。

プログラムのところどころでdelay()が入っているのは、delay()を入れないと入力が早すぎて認識してくれないことがあるためです。どの程度のdelay()が必要かは起動しているソフトによって異なるので色々試してみてください。特にスピードを要求しない使い道なら50~100[ms]くらいの人間のタイピングと同じ時間を入れておけば安定動作します。

便利なモジュール

更にクオリティの高いキーボードを作ってみたい方は、以下のモジュールを使うと便利です。

Cherry MXスイッチ

ドイツ・Cherry社の製造するキーボード用メカニカルスイッチです。自作キーボードの界隈ではかなり有名なスイッチです。(ゲーミングキーボードの界隈でも有名らしい?)
押し心地や反応速度の異なる7種類が販売されていて、それぞれ軸の色で呼ばれています。

Cherry MX用変換基板

Cherry MXをハンダ付けできる基板です。
また「キーマトリクス」という回路を組むために必要なダイオードをハンダ付け出来るようになっているので、このモジュールとCherry MXとRaspberry Pi Picoがあればキーボードが自作できてしまいます。更にイルミネーション用のLEDも取り付けられて至れり尽くせりです。

作品例

過去にテンキーを作ってみたときの記事を紹介します。あまりコードの整理をしていないので見にくいかもしれませんが。。。
まだ解説していない「タイマー割り込み」「ダイオードの仕組み」については追々解説していきます。