11月25日発売 書籍『Arduinoと3Dプリンタでロボットを作ろう』を出させて頂きました!

【電子工作/ PCB】1キーのみの可愛い自作キーボード(1Key Keyboard)の製作!

以前製作を考えていた1キーのみの自作キーボード『1Key Keyboard』が完成しました!

【電子工作 / PCB】1キーのみの可愛い自作キーボードの製作を考えています!

電子工作で自作基板の製作を始めて1年ほどが経ちました!
電子工作で出来ることの幅も大きく広がってきた気がします。

自作基板といってもいろいろとジャンルがあるわけですが・・・自作キーボードやマクロパットといった製作にも興味を持っています。

いずれは自分で設計したものを製作してみたいと考えているのですが、その手始めに1キーのみのシンプルなキーボードを製作してみました。

1キーのみと言ってもMCU(マイコン)の選定や回路設計・PCをUSB操作するHID機能を使ったプログラムの知識などが必要となるので電子工作としてはなかなか面白い題材となり、製作後は小さなキーホルダー感覚で持ち運ぶことが出来る可愛い1キーキーボードとして仕上がったと思います。

1キーのみの可愛い自作キーボード(1Key Keyboard)の製作!

自作キーボードやマクロパッドなどに使われるMCU(マイコン)は、Pro MicroやRaspberry Pi Picoを使ったものがメジャーなようですね!

Pro MicroはマイコンチップにATmega32U4が使われたLeonardo系のArduino、そしてRaspberry Pi PicoはRP2040が使われた開発ボードです。

共に小さなボードでPCとUSB接続してキーボードやマウスといったデバイスを操作するUSB機能、HID(Human Interface Device)を使うことが出来るようになっています。

USB操作で使えるマイコンは他にもいろいろとあるようですが、私の手元にあるものではCH552GやCH552T、またCH32V001/CH32V203といったチップを使えば同様なことが出来そうです!

CADのイメージ

1キータイプのキーボードとして仕上げる場合、メカニカルキーを上に乗せ全体的に30mm角以内のサイズで製作出来れば可愛いサイズ感になりそうです。

しかし仮にPro Microを使うことを想定するとこのサイズに収めることが出来ません!
Raspberry Pi Picoを使った場合も同様です。

また基板表面にピンヘッダーのスルーホールが出てしまうのもあまり見栄えがいいものではありません!

端面スルーホールタイプの小さな開発ボードを実装するという選択肢もあったのですが、これをやるなら電子工作的にはもう自分で回路を組んでしまった方が面白そうで他の機能を追加する余裕も出てきます。

またATtinyシリーズのチップ(ATtiny85など)にQMKファームウェアを書き込んでみては?といったアドバイスも頂きましたが、チップサイズ的にはあまり変わらないので最終的に今回の製作ではATmega32U4を使いました。

ATmega32U4にはQFPタイプとQFNタイプの2種類のパッケージがあるのですが、QFPパッケージのものではキーのスルーホールの干渉を避けると配線が困難となるため、さらにサイズの小さいQFNタイプのもの(ATmega32U4-MU)を使うことにしました。

44ピン7mm角の小さなチップとなり実装は少し難しくなりますが、上手くこのサイズのボードに収めることが出来ました。

ATmega32U4はこれまで製作した自作基板でも何度か使っています。
これならプログラムも慣れたArduinoスケッチで組むことも出来ます。

【電子工作 / PCB】ファミコンのコントローラーをUSBゲームパッド化する基板を作ってみました!
【電子工作 / PCB】スーパーファミコンのコントローラーをUSBゲームパッドに改造する基板を作ってみました!

SNSでは1キーのみの制御でATmega32U4を使うのは・・・
といったご意見をいくつか頂きましたが、今後ここから自作キーボードやマクロパッドなどに発展させていく予定なので今回のMCUの選定はOKということで。(CH552Eあたりでもよかったのですが!)

回路 & 基板設計

ATmega32U4-MUチップを使った回路をざっくりと組みパーツを配置してみると、そこそこ余裕があったのでRGB LEDを2つ取り付けることにしました。

1キーだけのキーボードですが、キーを押した際に点灯させたり待機時にレインボーカラーとかに点灯するとキーボードとして雰囲気が出そうです!

そして製作当初はボード表面(スイッチ実装面)にはビスが出ない構成でSMTファスナーを実装する予定でしが、ボトムプレートも追加で製作しスペーサーサイズを用途や好みによって変えられるような構成に変更しました。

アルミスペーサー(スタンドイン)を取り付けてあえてトップのビスを見せることによりいい感じに仕上がったと思います。

ATmega32U4の使えるI/O端子はまだまだ余っているので、オプション的にスピーカーも取り付け出来るようにしています。

CAD設計上、メインボードとボトムプレートをつなぐスペーサーは5mmが最小となりますが、この構成でも3mm厚程度の小さなスピーカー(後述します)を使えば綺麗に収めることが出来ます。

MCUにATmega32U4を使い、1つのメカニカルキーと2つのRGB LED、そしてオプション的にスピーカーを接続し音を鳴らすことも出来るという全体構成にしました。

そしてキースイッチが付くメインボードのトップのベタGNDは今回ハッチングパターンにしてみました。
見た目のイメージがガラッと変わりこのPCBでは非常にマッチしていたので、ボトムプレートもこのハッチングパターンで作り直しました。

同じ色(レジスト)の基板でも通常のベタGNDと比べて大きく雰囲気が変わり、RGB LEDを点灯させた際の反射も綺麗に映るようになりました。

【KiCad / PCB】ベタGNDのハッチングパターンを試してみました!

JLCPCBに基板発注

基板製造は今回もJLCPCBにお願いしました。

メインボード(トップの基板)にスペーサーを取り付けるだけでも使用できますが、ボトムプレートと結合しておけばキーチェーンなどを通しミニキーホルダーみたいに持ち歩く事も出来るのでオススメです!

キーを押した時の動作は任意に設定することが出来るので何か特定のキー操作を割り振るなどしておき、例えば持ち運べるリターンキーとしてカバンなどに取り付けておくと可愛くて面白いと思います。

メインボードとボトムプレートの2枚のPCB構成となっているので面付け基板として発注しようかと思いましたが、2面付けくらいでは料金はほぼ変わらないので個別基板として発注しました。
2枚合わせても送料込みで1000円ちょっとで製作することが出来ます。(送料区分はOCS NEPを選択)

さらに言うとJLCPCBでは1枚目の基板は2ドルオフとなるので、このサイズの基板では個別で1枚ずつ発注した方がトータル料金は少しお安くなるかもしれません!

基板データ(ガーバーファイル)をダウンロード出来るようにしておきます。
何かの参考になればと思います。

また基板製造時に任意の位置に入ってしまう基板製造番号は目立たない位置に入るように指定しています。
メインボードではこの位置に入るようにしています。

基板発注時に以下項目にチェックを入れておくとJLCPCBでは追加料金が発生せず指定位置に製造番号を入れることが出来ます。

これを指定しておかないとキースイッチがある表面に製造番号が入ってしまい見栄えが悪くなる可能性もあるので指定しておく方がいいと思います!

JLCPCBでの基板発注方法に関してはこちらの記事で詳しく紹介しているので合わせて読んで頂ければと思います。

【電子工作】はじめての基板製作!JLCPCBさんに基板を発注してみました。ユーザー登録・データ納品・基板到着までの一連の流れをご紹介!

パーツの実装

発注から8日ほどで手元に届きました!
送料区分は安いOCS NEPを選択してこの早さですから、毎回トータルコストが安くて助かっています。

実装するパーツ点数は少ないのですが0603サイズのパーツをベースにしておりATmega32U4-MUはQFNパッケージと非常に小さなチップ(7mm角)なので慣れていないと少し難しいかもしれません!

このサイズのパーツ実装に慣れていない方はステンシルも一緒に発注した方が安心かもしれませんね!

【JLCPCB】初めてステンシルを使ったリフローを行ってみました。JLCPCBでステンシルを発注する手順などを紹介!

ATmega32U4チップの向きを間違えて実装してしまうというトラブルがありましたが(上写真の向きは間違っています!)、再リフロー後は一発で完動しました!

パーツ実装はいつも愛用しているリフロー装置MHP30を使いました。
小さなミニリフロー装置となり作業スペースの邪魔にもなりにくく非常に便利なリフロー装置です。

【電子工作】コンパクトボディーで安全設計!ミニリフロー装置『Miniware MHP30』を使ってみる!

メカニカルキーはGateronの青軸のものを使いました。
まだこのあたりは全然詳しくないのですが、静音な赤軸よりカチカチと音が鳴るメカニカルな青軸とかの方が今回の製作コンセプト(キーホルダーサイズの1キーキーボード)には合っているように思います。

キーキャップは海外サイト(AliExpress)にマリオのキャラクターをモチーフにしたものがあったのでこれを使いました。

オプションとして音を鳴らす機能を付けたのですが、後述するサンプルスケッチではキーキャップに合わせマリオトーンを鳴らすことも出来るようにしています。

スピーカー端子は基板のこの部分にあります。
無くても動作はしますが、音も鳴らしたい場合はスピーカを取り付けて下さい。

キーやキーキャップはお好みで選んで下さい!
またスペーサー(M3)は最小で5mm高のものから使えます。
上記写真のものは10mmの円筒形アルミスペーサーを使っています。

パーツ一覧

今回使用したパーツ一覧です。
サイズ等の確認でリンク先ページを参考にして下さい!

使用パーツ定数入手先
コンデンサ
(0603)
C1/C5/C7/C8 0.1μFAmazon / AliExpress
C2/C3 22pF
C4 4.7μF
C6 1μF
C9/C10 15pF
抵抗
(0603)
R1/R2 10kΩAmazon / AliExpress
R3/R4 5.1kΩ
R5/R6 22Ω
MCUU1 ATmega32U4-MU(QFN-44)AliExpress
クリスタルY1 16MHz(3225 4P)AliExpress
端子J1 USB Type-C(16P)AliExpress / 秋月電子
RGB LEDD1/D2 5050(WS2812B)AliExpress
ダイオードD3 D5819(SOD-123)AliExpress
メカニカルキーお好みで!Amazon / AliExpress
キーキャップお好みで!AliExpress
スペーサーM3 5mm以上ーーー
ビススペーサの長さに応じて3~5mm程度ーーー
スピーカー直径28mm以内
(本記事では16mmを使用)
Amazon

ブートローダーの書き込み

パーツの実装が出来たら1キーキーボードとして動作するスケッチの書き込みです。

ATmega32U4は生チップを使っているので、まずブートローダーの書き込みを行います。
ブートローダーを書き込むことにより、以降はUSB端子経由でArduinoIDEを使いスケッチの書き込みが出来るようになります。

MEMO
ATmega32U4はメーカーサイトによると出荷時にDFUブートローダーがあらかじめ書き込まれているようですが、私が確認した限りでは購入先により書き込まれていないものもあるようです。
Arduino Leonardo用のブートローダーをまず書き込み、USB端子からLeonardoとして動作するスケッチを書き込むという流れで進めていきます!

ブートローダーの書き込みには通常AVRライタが必要となります。
Arduinoを書き込み装置として使うことも出来るので、こちらではArduinoを使った書き込み方法で進めていきます。
ArduinoではおなじみのICSPによる書き込み方法ですね!

書き込み装置として使うArduino(UnoやNano、Leonardoなど)に、Arduino IDEの[スケッチ例]の中にある[ArduinoISP]スケッチを書き込みます。
これでこのArduinoを経由して本基板にブートローダーの書き込みが行なえます。

製作した基板にはブートローダーを書き込む際に使用するICSP端子を付けています。
スルーホールでは基板表面(スイッチ実装面)に穴が空いてしまい目立つのでパット形状(2.54mmピッチ)にしています。

ポゴピンがあれば便利なんですが、なければケーブルをはんだ付けする必要があります!

ICSP端子の配置はこのようになっています。

以下Arduinoの対応した端子に接続します。

Arduino本基板
5VVCC
GNDGND
D10RESET
D11MOSI
D12MISO
D13SCK

MEMO
上写真ではICSP書き込み機を使っていますが、接続はArduinoを使う場合と同じです!

接続が出来たらブートローダーの書き込みです。
Arduino IDEのボード設定は[Arduino Leonardo]を選択、書き込み装置は[Arduino as ISP]を選択しておきこの状態で[ブートローダを書き込む]をクリックして書き込みを行います。

[ブートローダの書き込みが完了しました]と表示されればOKです。

MEMO
ブートローダーが書き込まれると、以降はUSB端子からスケッチの書き込みが行えるので接続したワイヤーは取り外して下さい!

スケッチの書き込み

最後に1キーキーボードとして動作するスケッチの書き込みです。
先程ATmega32U4にブートローダーを書き込んでいるので、USBケーブルを使いPCと接続すると[Arduino Leonardo]として認識されます。

1キーキーボードのサンプルスケッチは以下からダウンロードして下さい。

上記サンプルスケッチは[Adafruit_NeoPixel.h]と[FlexiTimer2.h]の2つのライブラリを使用しています。

スケッチ書き込みの前に以下GitHubサイトからライブラリをダンロードしてArduino IDEにインストールしておく必要があります。

参考 Adafruit_NeoPixelGitHub 参考 flexitimer2GitHub

ライブラリのインストールが完了したらスケッチの書き込みです。
通常のArduino IDEを使ったスケッチの書き込みを行うことが出来ます。

ボードは[Arduino Leonardo]、接続しているシリアルポートを選択してアップロードという通常の書き込み方法です。

テストスケッチの動作確認

上記テストスケッチではキーが押されると「Hello World!」と文字を入力し、さらに[リターンキー]を1度押す動作となっています。
テキストエディタ等を開き動作確認して下さい。

文字入力が問題なければ完成です。

テストスケッチでは簡単な音も鳴らせるようにしています。
スケッチのモードを切り替えるといくつか音を鳴らすサンプルも入れています。

マリオのキャラクターキーキャップに合わせサンプルスケッチではtone関数を使い短いマリオサウンドを鳴らせるようにしています。

MEMO
サウンド機能はArduinoのピン割り込みではなくメインループ内で鳴らしています。
製作時にスイッチ周りにRCフィルターを入れて・・・など考えたのですが、割り込み中のtone関数を使った時間調整(delay();など)が面倒になるのでサンプルスケッチではメインループで鳴らしています。

任意の文字や動作をさせたい場合(コマンド一覧)

任意の文字を入力したい場合や他の動作(コピーやペーストなど)をキーに割り当てたい場合、スケッチの以下部分(赤枠)を変更すると可能となります。

MEMO
MacとWindowsのキーボードでは[command]キーや[option]キーなど異なる部分があります!

文字を入力

文字を入力したい場合は、Keyboard.print(‘◯◯◯’);を使います。

Keyboard.print(“◯◯◯”);

◯◯◯に好きな文字を入れておくと、キーが押されるとPCに入力されます。

サンプルスケッチではKeyboard.print(‘Hello World!’)で文字を入力し、続いてKeyboard.press(KEY_RETURN);でリターンキーを押す動作を割り当てています。

【キー入力の例】コピー([Ctrl]+[c]) / ペースト([Ctrl]+[v])

キーボードのキーを取得するのは、Keyboard.press(コマンド);が使えます。
コピーやペーストなど複数のキー割り当ても可能となります。

コピー([Ctrl]+[c])を割り当てたい場合はこのような組み合わせで使います。
上記スケッチ赤枠部分を変更すれば、これでキーが押されるとコピーが出来ます。

Windowsの場合

Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(‘c’);

Macの場合

Keyboard.press(KEY_LEFT_GUI);
Keyboard.press(‘c’);

またペースト([Ctrl]+[v])機能を割り当てたい場合はこうなりますね。

Windowsの場合

Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(‘v’);

Macの場合

Keyboard.press(KEY_LEFT_GUI);
Keyboard.press(‘v’);

MacとWindowsで特定のキーが異なるため、Windowsの[Ctrl]キーのコマンド[KEY_LEFT_CTRL(KEY_RIGHT_CTRL)]はMacでは[KEY_LEFT_GUI]となります。(Macのcommandキーの操作です)

コマンド一覧

他にもキー操作で使えるコマンドはたくさんあります。
テストスケッチで使用しているArduino標準の”Keyboard.h”ライブラリはキーボード全てのキーを取得する事が出来ます。

詳しくはこちらのページを参考にして下さい。

参考 Keyboard Modifiers and Special KeysArduino

よく使いそうなコマンドをいくつか抜粋しておきます。

キー操作コマンド使用例
Ctrl
(Macはcommand)
KEY_LEFT_CTRL
KEY_RIGHT_CTRL
※MacはKEY_LEFT_GUI
Keyboard.press(KEY_LEFT_CTRL);
ShiftKEY_LEFT_SHIFT
KEY_RIGHT_SHIFT
Keyboard.press(KEY_LEFT_SHIFT);
ALT
(Macはoption)
KEY_LEFT_ALT
KEY_RIGHT_ALT
Keyboard.press(KEY_LEFT_ALT);
ESCKEY_ESCKeyboard.press(KEY_ESC);
TABKEY_TABKeyboard.press(KEY_TAB);
BackSpaceKEY_BACKSPACEKeyboard.press(KEY_BACKSPACE);
RETURNKEY_RETURNKeyboard.press(KEY_RETURN);
InsertKEY_INSERTKeyboard.press(KEY_INSERT);
DeleteKEY_DELETEKeyboard.press(KEY_DELETE);
HomeKEY_HOMEKeyboard.press(KEY_HOME);
ENDKEY_ENDKeyboard.press(KEY_END);
PageUPKEY_PAGE_UPKeyboard.press(KEY_PAGE_UP);
PageDownKEY_PAGE_DOWNKeyboard.press(KEY_PAGE_DOWN);
KEY_UP_ARROWKeyboard.press(KEY_UP_ARROW);
KEY_DOWN_ARROWKeyboard.press(KEY_DOWN_ARROW);
KEY_LEFT_ARROWKeyboard.press(KEY_LEFT_ARROW);
KEY_RIGHT_ARROWKeyboard.press(KEY_RIGHT_ARROW);
F(F1/F2….)KEY_F1(KEY_F2….)Keyboard.press(KEY_F1);

最後に!

非常に可愛い1キーキーボードが出来たと思います。

実用性は?と言われると1キーのみなので限定されますが、上手く仕上がったので別の色の基板も発注しています。
基板の色やキーキャップを変えるとガラッとイメージも変わるので面白いと思います。

会社に持っていったのですが女子ウケが非常に良く、[RETURN]キーと[ESC]キーのオーダーも頂きました。
同僚からお金を取るわけにもいかず・・・時間がある時にもう2枚実装を頑張ろう・・・!

今後自作キーボードやマクロパッドなどの製作もやってみたいと考えているので、その一環として今回1キーのみのシンプルな自作キーボードを製作してみました。

簡単に製作過程をご紹介しましたが、テスト段階ではRP2040やCH552などを使った回路設計やそのプログラム、また自作キーボードのファームウェアのことなどに触れることが出来たので電子工作としての題材としては非常に面白く得るものが多かった製作になりました。

また別記事でこれらのことも詳しくご紹介出来ればと考えています。

【電子工作】CH552をArduino環境で使ってみる!

コメントを残す