概要
8051互換のマイコン (CH552) を使って、コンパクトでシンプルでありふれたUSBテンキーパッドを作った話。
親指シフト関係ではないのだけど、CH55xシリーズを使った開発は初めてだったので記録 (記憶) のためも兼ねて以下のような項目をまとめた。
- テンキーパッドの概要
- CH552の特長など
- 回路構成、キースイッチなど
- EasyEDA を使ったPCB設計と発注
- プレート用アクリル板の設計とElecrowへの発注
- CH55xDuinoを使ったプログラムのこと。
テンキーパッドのプログラムやハードウェアの各種データは、https://github.com/okiraku-camera/ch552_numkeyPad に載せました。日本ではふつうに「テンキー」と呼ぶものの、海外では “Number Pad”や”Numeric Keypad” なので、国際性に鑑みて?そのようにしました。ただ、テンキー部分のないキーボードを TKL (TenKeyLess) キーボード と呼ぶのだから、テンキーという用語もふつうなのかも。
今回は、プレートの設計と発注、組み立ての話まで。
今回のテンキーパッドについて
シンプルでコンパクトなテンキーパッドを手早く作ろうと思い、以下のような思いつきで作業を進めた。
- キーボードのレイアウトはフルキーボードのテンキー部分と同じにする。
- 薄くするためロープロファイルのキースイッチを使う。キーキャップのバリエーションを考慮して、MXスイッチ用キーキャップが使える Gateron Low Profile Switch 2.0 (KS-33) を使うことにした。
- KS-33は3ピンのスイッチなのでスイッチの固定や整列のためにスイッチプレートを使いたいのだが、ふつうのMX用キーキャップとこのスイッチを組み合わせたとき、スイッチのすそがプレートに当たって押し込めないかもとか心配してスイッチプレート無しとした。
- 2Uのキーが3つあるのでスタビライザーも使いたい。しかしながら、ロープロファイルスイッチ用のPCBマウントスタビライザーは探しても見つからないから省略した。針金細工で作ってみたい気はするが。
- キーパッドの構造は、PCB(1.6mm厚)、ミドルプレート(5mm厚のアクリル板)、ボトムプレート(2mm厚のアクリル板)の3枚をねじ止めして構成する。ボトムプレートの裏には、滑り止めを兼ねて3Mのシリコンゴムの足を貼り付ける。
- PCBのサイズは、キーキャップをはめたときそっくり隠れる程度とするため、横が76.2mm (19.05 x 4)、縦が98.25mm ( 19.05 x 5 + 3.0)とした。縦方向の +3mm は、ブートローダーモードの開始やリセット操作用のスルーホールなどを用意するために追加。
- USBキーボード(USBデバイス)を作るにあたっては、今までATMega32U4やRP2040を使ってきたが、今回は安く上げたかったこともあって、南京沁恒微电子股份有限公司 ( https://wch-ic.com/ ) が WinChipHead (WCH)ブランドで販売している CH552G を使うことにした。
以下、各項目について。
CH552の特長など
CH552は、Intelの8051互換の命令セットをもつワンチップマイコン (あるいはMCU) で、データシートによれば以下のような特長がある。データシート ( CH552DS1.pdf ) はこちらのページからダウンロード。
- MCS51 命令セット互換のCPUコアをもち、約80%の命令を単一サイクルで実行するので、標準的なMCS51よりも8~15倍高速。
- プログラムやブートローダー用の16KBytesのプログラムROM領域(コードフラッシュ) はUSB経由で内容の更新が可能。ただし、書き換え回数は200回まで。
- EEPROM的な不揮発メモリとして使える128バイトのデータフラッシュ領域は10,000回の書き換えが可能。
- 256Bytesの内部RAM (iRAM)と1KBytesの拡張RAM (xRAM)をもつ。iRAMはおもにスタック領域(およびデータ領域) に、xRAMはデータ領域として使う。
- GPIO、UART、SPI、タイマー、PWM、ADCといった一般的な機能のほか、USBデバイスを実現するためのコントローラーを内蔵している。
- +5Vの外部電源動作、24MHzクロックソース内蔵、USB用に+3.3VのLDOも内蔵。必要な周辺デバイスはデカップリングコンデンサ程度で済むため、回路がシンプルになる。
- デバイス単体の価格は$0.5程度と安価 (JLCPCBで1個たのんだとき)。
CH552には4種類のパッケージがあり、ピンの本数や構成が異なる。今回は、テンキーパッドを作るのにちょうどいいCH552G (SOP-16パッケージ) を用いた。
なおCH551GはCH552Gの兄弟製品で、コードフラッシュ(10KBytes) とxRAM(512Bytes) が小さい。その分安価なのだがプログラムやRAMの必要量がわからない時点では、大きい方のCH552Gを選択するのが無難と思った。
これらは、大昔に使っていたIntelの8051のマスクROMバージョンとPROMバージョン。
CH552用のプログラム開発は、CH55xシリーズをArduino のように開発できる、CH55xDuino を用いた。これについては後述する。
キーボードレイアウト、回路、PCB
レイアウト
フルキーボードのテンキーパッド部分と同じレイアウトとした。これは、Keyboard Layout Editor (KLE)を開いたときに最初に表示されるのと同じレイアウト。
KLE用のjsonデータ (numkeyPad.json) は以下のとおり。
1 2 3 4 5 |
["Num Lock","/","*","-"], [{f:3},"7\nHome","8\n↑","9\nPgUp",{h:2},"+"], ["4\n←","5","6\n→"], ["1\nEnd","2\n↓","3\nPgDn",{h:2},"Enter"], [{w:2},"0\nIns",".\nDel"] |
回路構成
テンキーパッドには17個のキーがあるので、キースイッチマトリックスは 5行 x 4列の最大20キー構成とする。これを実現するために必要なGPIOの本数は9本ということになる。
CH552Gの16ピンのうち、電源が3ピン(VCC, V33, GND)、USBが2ピン (UDM, UDP)、リセットが1ピン(RST) となっている。残りの10ピンはすべてGPIOとして使えるから、NumLock LED用に1つ使ってちょうどぴったり。以下のような回路にした。
回路上は5 x 4 のスイッチマトリックスだが、実際にPCBに配置するのは17キーなので、SW12, 18, 20 およびD12,18,20は、PCBやBOMに含めないようにした。
スイッチの選択
Gateron Low Profile Switch 2.0 (KS-33) は、通常のMXスイッチ(ノーマルプロファイルスイッチ)よりも高さが低いが、MXスイッチ用キーキャップをはめるための軸を備えている。
※ 以下に示す図およびグラフは、Gateronスイッチのデータシートから抜粋しました。
背が低い
以下の図は、左側がノーマルプロファイルのKS-3で、右の2つがKS-33。PCB表面を基準に並べた (KS-3は Gateron Milky Pro などの型番)。
スイッチの高さが低いから、キーキャップをはめたときの高さも当然低くなり、全体を薄くすることができる。
押下量が少ない
押下のために必要な力と押下量の関係。赤軸スイッチのデータを並べてみた。
- KS-33は、スイッチの押し始めからオンになるまでの距離は1.7mmで、終点は3.0mm。
- KS-3の場合、スイッチの押し始めからオンになるまでの距離は2.0mmで、終点は4.0mm。
KS-33の方が0.3mmほど先にオンになる。Gateronによると、押し込む距離が短い方が高速にタイピングできますよとのことである。https://www.gateron.co/blogs/news/low-profile-vs-normal-profile-mechanical-switches-things-you-should-know を参照。
個人的には高速にタイピングできるということより、ノーマルプロファイルスイッチと打鍵感覚がさほど変わらなくてよし、という印象をもった。
今回はタクタイル感のあるテンキーもいいかなと思って茶軸のスイッチを使うことにした。
スイッチプレートとキーキャップ
別のキーボード用に作ったMXスイッチ用プレート(FR-4 1.6mm厚)にKS-33をはめ、いくつかのキーキャップをはめてみた。
左から、Cherry (OEM?) プロファイル、XDAプロファイル、DSAプロファイル、Lowプロファイルのキーキャップで、それぞれテンキーに使いそうなキーを選んだ(XDAとDSAはどれでも同じと思うが)。
XDAのキーキャップを押し込むと、当初の懸念どおり、ほぼプレートに接触してしまう。左端のCherry(あるいはOEM)プロファイルのキーキャップも同様。
右端のロープロファイル・キーキャップは、押し込んでも隙間が十分に残っている。DSAプロファイルについてもプレートへの接触の心配はないようだった。
今回の製作では、プレートは使わないもののロープロファイルキーキャップを選択することにした。 すぐに気が変わった。
スタビライザーはあったほうがいい(特にロープロファイルのキーキャップ)
スタビライザーを省略した2Uのキーについては、ロープロファイルのキーキャップより、OEMやXDAプロファイルのキーキャップの方が安定的に使える。これらのキーキャップならば、キートップの端に近いところを叩いても、キーキャップが極端に傾いたりすることはない。
ところがロープロファイルのキーキャップでは、意識してキートップの中央部(キースイッチの軸の上のあたり)を叩かないと、キーが傾いてスイッチの軸から外れそうになってしまう。
その理由は、キーキャップ裏側のスイッチの軸を差し込む十字が掘られた円柱(ステム)の高さが低いことだろう。ロープロファイルキーキャップでは3mmしかないが、他のキーキャップでは4~5mmはある。このロープロファイルキーキャップは、薄いキートップの裏側に、ステムごと成型した樹脂を貼り付けて作られているようだ。
わざわざ薄く作ったキーキャップなのだから当然の特性なのかもしれないし、今回入手したロープロファイルキーキャップ特有の問題かもしれない。 ブログ用の写真はロープロファイルのキーキャップをはめて写したが、すぐにOEMまたはCherryプロファイルのキーキャップに変えて使っている。スイッチプレートを使わない構成なので、キーキャップの背の高さはあまり問題にならない。
プレートについて
上記のFR-4プレートのスイッチ穴は14mm x 14mm の矩形になっているがKS-33は薄いせいかとてもハメにくく、なおかつ外れやすい。KS-33とKS-3の比較図で分かるように、KS-33のプレートは1.2mmより薄い方がハマりがよさそうである(MXスイッチの場合1.5mm±0.1mm ということになっている)。
アクリル板では無理なので、あえて作るならFR-4でということになるだろうか。よさそうなスタビライザーが手に入ったら、作る機会もあるかもしれない。
PCBの設計
EasyEDA
JLCPCBにPCBの製造やデバイスの実装を発注するのであれば、EasyEDAで回路とPCBを設計してブラウザでポチポチしてるだけでJLCに製造の依頼ができるし、クーポンももらえるから節約になる(別に宣伝ではないんですが)。というわけでPCBの設計から製造発注までEasyEDA側で行った。
注: クーポンが発行されるのは5枚まで。
今回のテンキーパッドは、EasyEDAのオンライン版(WEB版)のStd Edition を使って設計した。個人的にはKiCADの方がまだまだ使いやすく感じるが、EasyEDAでPCBを数枚設計しているうちに、なんとなく慣れてしまった。BOMやPCLについても自動的に作成してJLCに送ってくれるから、妙な緊張感もなく、気楽にPCBAを発注できる(してしまう)。
EasyEDAでプロジェクトを公開済
今回作ったテンキーパッドのプロジェクト(回路図、PCB図、BOM)のコピーは、 次のURLから参照できます。 https://oshwlab.com/takeshihigasa/ch552_tenkeypad_copy
回路やPCBに変更を加えたり製造したりするようなときは、このプロジェクトを自分のワークスペースにクローンすることで、自分のプロジェクトとして作業できる(、のだと思うがやったことがない)。
自分自身は「いーじーいーでぃーえー」と読んでいるが、どうやら「いーじーだ」が正しいらしい。たしかにイージーなんだけど。
KS-33用フットプリント
適当なKS-33用フットプリントが見つからなかったので、自分で作ることにした。作成にあたっては KS-33データシートにある以下の図にしたがった。
注意点として、この図はスイッチを底から見たときの足や端子、SMDLED用の窓の配置を表している。つまり、PCB表面のフットプリント図とは左右が逆になっている。また、接点用の穴を3mm径としているのは、スイッチソケットを使う前提と思うのだがKS-33用のスイッチソケットってあるんだろうか。
この図に基づいて作成したハンダ付け用のフットプリントは以下のようになった。
スイッチ接点については、1.5 x 2.4mmの長円形のパッドに0.8 x 1.8mmの長円形の穴を指定した。
完成したPCBにスイッチをはめてみたところ、スイッチ接点、LED窓、穴の位置などに問題はなかった。ただ、中央の穴は5.25mm径では大きすぎるようだ。
推奨図では5.25mmとなっているがスイッチの足の仕様上の径は5.05±0.05mmなので、5.1mmくらいでよさそうな感じ。なお、購入したKS-33 茶軸での実測値は4.9mmだったから、5.1mm径で作ってもゆるゆるだったかもしれない。
EasyEDA側でも同様のフットプリントを作成してあり、プロジェクトとともに公開扱いになっている(と思う)。
完成したPCB
PCBのレジスタは白にした。
特に難しいことのないPCBだったので、5ピンのMXスイッチとKS-33スイッチを共用できようなPCBにすればよかったかも、と今思う。
PCBAの費用
PCBの製造枚数は5枚とし、すべてにパーツの実装も依頼した。実装したパーツリスト(BOM)については、EasyEDAに公開した一式に含まれている。なお、キースイッチやSMD LEDについては手ハンダしたのでBOMには含まれていない。
費用の詳細については触れないが、送料を含めて 25ドル以下だったので、PCB1枚あたり5ドル弱といったところ。
プレートの設計と発注
PCBの裏側を保護するため、ミドルプレートとボトムプレートの2種類を設計し、いずれもElecrowのアクリル板レーザーカットサービスに発注した。
ミドルプレートは、PCB裏側の突起物(USB Type-Cレセプタクル、スイッチの足、ダイオードやコンデンサなど)を避けつつ、それらの高さよりも十分に厚みのあるアクリル板を使う。
ボトムプレートは、ミドルプレートの下側をふさぐことでゴミなどの侵入を防ぐ。また、滑り止めのゴム足などを接着するための面にもなる。
プレート設計について
プレートの設計は、KiCADのPCBエディタを使って以下の手順で行った。
- まず、外形も含めてPCBの設計を完成させる。スイッチの位置やエッジからの距離を考慮してネジ穴の位置を決める。PCBのネジ穴はM2用(2.2mm径)としておく。
- PCBのプロジェクトを別名で保存し、PCBエディタでミドルプレート用、ボトムプレート用それぞれの設計を開始する。ミドルプレートとボトムプレートのネジ穴はM3用(3.2mm径)とする。
- レーザーカットの切り代は0.1mmあるので、3.2mm径の穴がほしいときは直径3.0mmの円をEdge.Cutsレイヤーに描く。なお、Edge.Cutsレイヤーに描画する線や円の線幅は0.1mmとしている。
- ミドルプレートは、以下に示すようにPCBと同じ外形のアクリル板から内側を切り抜いたような形状となる。PCB裏面にあるデバイスや出っ張っている接点、USBコネクタ等を避けながらEdge.Cuts レイヤーに線を引いていく。ネジ穴の周囲はアクリル板があまり細くならないようにした。
- ボトムプレートは、PCBと同じ外形に3.2mmのネジ穴が開いている形状で、PCB裏面のブート用プッシュスイッチを押すための穴を開けた。
- DRC (デザインルールチェッカー)で Edge.Cuts の線がうまくつながっていることを確認しながら進める。
- Elecrowに発注する際には、加工の基本材とする矩形の外形寸法が必要になるので、すべてのプレートを作図するとき外形を表す矩形と寸法線を Userレイヤーに描画しておく。
- 最終的に、PCBエディタの ファイル/製造用出力/ガーバーで プロットウィンドウを開いてファイルを出力する。
出力フォーマットとして DXF を選択し「含めるレイヤー」は Edge.Cutsレイヤーのみとして出力する。このとき、エクスポート単位を mm にするのを忘れがち。 - 次に出力フォーマットとしてPDFを選択し、外形や寸法を描いたUserレイヤーを「含めるレイヤー」で指定する。「Edge.Cutsをすべてのレイヤーにプロット」をチェックしておくことで、外形および寸法を含んだ図がPDFファイルとして出力される。
DXFファイルを正しく出力できているかどうかは、Inkscape (1.2.2) に読み込んで確認している。
ミドルプレートとボトムプレート
2種類のプレートのPDFファイルから切り出したものを以下に示す (別々のPDFとして出力したものを、掲載のために貼り合わせている)。
PDF図には、忘れないようにアクリル板の厚さも指定している。長手方向が0.005mm違うが、切り代が0.1mmもあるのだから気にする必要はないだろう。
完成したアクリル板
アクリル板には両面に保護用のシートが貼り付けられているのではがして利用するが、なかなかはがしにくい。
5mm厚でマットホワイトを指定したミドルプレートの厚さが4.7mm、2mm厚の透明を指定したボトムプレートは1.8mm厚だった。今まで指定より厚かったことはないので、だいたい10%弱は薄いと見込んでおくのがいいのかも。
アクリルカットのためのDXFファイルとPDFファイルは、最初に載せたGitHubの中にpcbディレクトリに格納してある。
PCBとアクリル板のネジ止め
2種類のM2ネジとM2の雌ネジが切られているスペーサーを使ってネジ止めする。上下からM2のネジでアクリル板が割れない程度に締め込むことで、PCBとアクリル板を固定している。
以下のような構成になっている。
取り付けの手順
- 3mm長のネジをスペーサー(6mm)にしっかりとねじ込む。このスペーサーには、反対側に3mm分の雌ネジが残っていることになる。
- 2枚のプレートとPCBを位置合わせして、このスペーサーをボトムプレート側のネジ穴から差し込む。スペーサーの上端は、ミドルプレート下面から4mm、上面から1mmに達することになる。
- PCB側から5mm長のネジを入れていく。PCBの厚さを引いた3.4mm分がミドルプレート内に入っていき、スペーサーに約2.4mmネジ込めるはず。
2枚のプレートの厚さの合計が7mmなので、7mmのスペーサーでも良さそうなのだが、先にも書いたがElecrowのアクリルカットサービスでは厚さが10%程度薄いことが多い。スペーサーが下から出っ張るのも困るので、6mm長のスペーサーとした。
また、M2の雌ネジが切られた真鍮スペーサーの外形は約3mmなので、プレート側のネジ穴としては余裕を見て3.2mm径を意図し、切り代を考えて3.0mm径を指定している。
きょうのまとめ
CH552Gを使った何か作ってみようと思ったのが発端で、今回のようなテンキーパッドを作ってみた。
JLCPCBへのPCBAの発注から受け取りまでが約1週間、Elecrowへの発注から受け取りまでが約2週間だった。
KS-33 ロープロファイルスイッチ自体はとてもいいのだけど、安くて簡単に使えるスタビライザーが入手できないと、キーボードに使うのはためらわれる。また、PCBマウント用に固定用の足を追加した5ピンのバリエーションがあるといいかもしれない。
すでにGithubには公開しましたが、次回はCH55xDuinoを使ったプログラムの話になる予定です。