きっかけ
どこかの情報源「Arduino Leonardでキーボード作れるらしいぜ」
僕「面白そうなのでやってみましょか」
Arduino Leonardでキーボード?
Arduino Leonardはuno等とは違い、USBポートと搭載マイコンが直結しており(USB-シリアル変換してない)、キーボード自作に重要なHID(Human Interface Device)というものに対応している。
つまり、Arduino LeonardのUSBポートはプログラムの書き込みやシリアルデバッグ出力だけではなく、HIDの一種であるキーボードとしてホストのOSに認識させ、キー情報を出力することが出来るとのこと。
また有志でJIS配列のキー出力を簡単に実装するためのライブラリもある模様。これだけお膳立てがあるならキーボードを一から作れるような気がしてきた。
全体の流れ
キーボード自作の大まかな手順としてはこんな感じ
- 3D cadでキーボードレイアウトと筐体カバーを設計
- キーボードの回路設計
- 3D cadの情報を元に基板設計
- 発注
- 基板実装、組み立て
- プログラミング
Arduino Leonardがあるのに回路設計?基盤設計?と思うかもしれないが、今回はArduino Loanardのマイコン周りの回路をキーボード専用の回路に移植してオリジナルのキーボード用の基板を作製するために行なっている。
手順
3D cadでキーボードレイアウトと筐体カバーを設計
今回はFree CADを使ってレイアウト兼筐体カバーを設計した。
まずは少し下調べをした
(普段キーボードを何気なく使っていたけどキーボード自作自体が初めてで何も知識が無かったので)
- キーボードの標準的なキーピッチは約19mmらしい
- キーの種類(通常キー、SHIFTキー、スペースキー等)によって大きさが違うが、1Uという単位でキーの幅表現することが多い模様(1Uは約19mmとのこと)
- 横幅が長い(2U以上)はキーキャップの端を押してもしっかり反応するようにスタビライザというものがキースイッチと一緒に必要
- JIS配列のキーボードとしてはOADG 109Aという配置が主流らしい
さらに今回採用したキースイッチのデータシートをここから入手した
これらの下調べを元に筐体カバーの3Dモデルを作成した
- 上面カバー
- 底面カバー
キーボードの回路設計
キーボードの制御を行うマイコン周辺の回路はArduino Leonardを流用した
↓ここからArduinoの回路図を入手できる
KiCadで設計した
3D cadの情報を元に基板設計
同じくKiCadで基板設計をした
(キースイッチのフットプリントが標準であったので助かりました)
特にキースイッチのフットプリントやスルーホールの位置等は以下の手順で調整した
- 前の手順で作成した上面カバーの3Dモデルを2DのDXFファイルにエクスポートする
- そのDXFをKiCadにインポートし、フットプリントやスルーホールを合わせ込む
あとは主に以下の点に気を遣いつつ配置配線をした
- USBの差動配線
- 部品の入手性
- 部品の高さ、寸法等(他の部品やカバー等と干渉しないように)
- GNDの取り回し
発注
以下を発注、購入した
- PCB製造発注
- 筐体カバー発注
- 電子部品購入
- ネジ、スペーサー、キーキャップ等購入(組み立てのため)
- その他必要なもの
PCB製造発注
今回、PCBはJLCPCBに発注した(電子工作系YouTuber イチケンさんのスポンサーになっている製造メーカーです)
今回は後述の表面実装部品をホットプレートで実装するやり方に挑戦しようと思ったので、ステンシルもついでに発注した。
以前から使っていたEleCrowなんかと比べるとかなりお得で、そこから更に初回発注ということで割引されて嬉しい限り。
筐体カバー発注
今回は簡単にアクリル板のレーザーカットで加工するサービスを利用した。
遊舎工房にアクリル板のレーザーカットサービスがあるので3Dモデルを元に発注した。
電子部品購入
色々購入先があると思うが、今回は主に以下2つから購入した
- RSコンポーネンツ
- 秋月電子
- 遊舎工房 (キースイッチのみ)
ネジ、スペーサー、キーキャップ等購入(組み立てのため)
こちらは適当にAmazonで寸法に合うものを購入した
その他
表面実装部品を綺麗に実装するために以下を購入した
- ハンダペースト
- ホットプレート
基板実装、組み立て
基板実装は「表面実装部品」→「スルーホール部品」の順に実装した
(先にスルーホール部品を実装するとスルーホールから出た部品のピン等がホットプレートと干渉してしまうため)
表面実装部品を実装する手順は以下の通り
- ステンシルを使ってフットプリントにペーストハンダを塗布する
- ホットプレートをペーストハンダの融点+10〜20℃程度に設定して予熱しておく
- ペーストハンダを塗布したフットプリントの上に表面実装部品を乗せる
- 予熱したホットプレートに基板を乗せてハンダ付けする
(基板パターンにもよるが大体1-2分ぐらい?)
その後、基板をホットプレートから取り出して冷ます。
不安な箇所はテスターで同通チェック等をすると良いかも
その後、スルーホール部品やホットプレートでやりづらい部品はハンダごてで実装する。
プログラミング
前準備
Arduino Leonardで使われているATmega32u4には、USBからのプログラム書き込みを可能にするためにブートローダーの書き込みが初回に必要である。
(市販のArduino Leonardは既にブートローダが書き込まれた状態で売られているので購入後にこのような操作はせずに書き込みができるようになっている)
ブートローダを書き込むにはUSBとは別にSPIのポートを用意する必要がある。
(回路設計、基板設計の段階で市販のものと同じようにSPIのコネクタを作っておく)

書き込み方法は他の方の記事で詳しく書かれているので割愛
(もう一つArduino UNOが必要)
上記の手順で書き込みが完了すると、Arduino IDE上でArduino Leonardとしてプログラムを自由に書き込むことが出来るようになる
プログラミング
キーサーチ回路は以下の通りになっており、マトリックス状になっているキースイッチに対しては"電圧を印加する出力側"と"(スイッチが押されたことによる)電圧変化を検出する入力側"の2種類の配線がある。
キーサーチ回路の動かし方は以下の通り
- 出力側は最初に0番目の配線をHighに切り替えて他の配線はLowにする
- 1の状態で入力側のHigh/Low状態を読み取る
- この時何もキーが押されていなければ入力側の配線はすべてLowになる
どれかキーが押されていれば入力側の配線のどれかがHighになる
例:入力側の一番左の配線がHighになった場合、下図のマトリックスの一番左上のスイッチ(SW3:CapsLock)が押されていることになる。また、一つ隣の左から2番目の配線がHighになった場合は下図マトリックスのSW4:ZenHankakuが押されていることになる
3の手順まで実行したら1.に戻って今度は出力側の1番目の配線だけをHighにして繰り返す
抽象的にまとめるとこんな感じ
- 出力側のn番目の配線だけをHighにして他はLowにする
- 1の状態で入力側のHigh/Low状態を読み取る
- この時の状態で入力側でHighになっている配線がm番目だった場合、
押されているキーはマトリックス状のn行m番目となる
Arduinoのソースコード上ではdigitalWriteを使って出力側のHigh/Low側を高速で切り替えつつ、digitalReadで状態を読みながら1.〜3.を繰り返して押されているキーを検出していく。
スイッチ系で他に気を遣いたいこととしてはチャタリング対策である。
HW側にローパスフィルタを入れるという手もあるが、今回はソフト側で対策を実装した。
とりあえず簡単に押された回数をカウントし、一定回数以上になったら確実にキーが押されたと見なしてキーコードをホストに送信するアルゴリズムを実装した。
↓フローチャートで示すとこんな感じ
押されたキーを検出した後に、ホストにキーコードを送信してOSに文字を入力するにはHIDのライブラリを使う。
↓有志の方がJIS配列にも対応した使いやすいライブラリを作ってくれている
実際の画像
参考にしたサイト
使っているマイコンや回路はほとんど違うと思うが、コンセプトやアイディアをかなり参考にさせて頂きました









