2020年11月28日土曜日

ChocV2 で Type-C 左右分離キーパッドを作ってみた

今回制作した左右分離型10キー キーパッドの右手側

前回の Breakout 基板を作ってから色々忙しくなってしまい、なかなか進捗が出せていなかった。 けど、ようやくキーパッドを作れたのでまとめておきたい。しかし、こういう時のために設計した 前回の Breakout 基板 だったはずなのに、今回はキーボードを薄型にしたいと思って、マイコン直載せにしたので使わなかった(汗)

そう、何かを作る準備ばかりしていて、いつまで経っても本番の作業が始まらない・・・。 今も自分なりのキー配置の 60% キーボードを作りたいのだけど、そのための要素技術を 100x100mm PCB で確かめておこうという試み。 でもそういうのは、今回で最後にしたい!ぞ!!

コンセプト


さて、左右分離型の自作キーボードについて、いくつか気になっていて、今回は少し変えてみたいところがある。


ProMicro マイコン2個持ち?


これはファームを変更した時に、マイコン2個とも書き換えないといけないのがいつも面倒だなぁ、と思っていた。 USB ケーブルを外して、TRRS ケーブルも抜いて、USB ケーブルをつないで、ファームを書き込んで、USB ケーブルを抜いて、TRRS ケーブルをつないで、USB ケーブルをつなぐ、みたいなことを毎回している。

いや、自分が知らないだけで、実は楽に書き換える方法があるのだろうか?

と思って今調べてみたら、実は qmk_firmware では、MASTER 側を書き換えるだけでよかったらしい・・・。 そうなの?もう作っちゃったよ?

気を取り直して、今回はマイコンは1つだけにして、反対側のキー状態は、I2C 接続の I/O エクスパンダで読み取るようにしてみたいと思った。 マイコン同士の通信プログラムもいつかは書いてみたいけど・・・。


TRRS ケーブル?


こちらは、オーディオケーブルは信号用だから、電源を送るのはちょっと・・・、と見るたびに思っていた。 キーボードを USB につないだまま TRRS ケーブルを抜き差しするのは NG だと思うから、 時々、必要があって抜き差しする時には、USB ケーブルが抜いてあることを確実にすることを忘れてはいけない。

いつも何となくヒヤヒヤしてしまうので、両側 micro-b コネクタの USB ケーブルを自作して両側をつなごうか? でも micro-b コネクタにケーブルをハンダ付けするの難しいんだよな、・・・。 それとも、keyboardio のように LAN ケーブルでつなぐか。でもコネクタでかいんだよな・・・。

という逡巡の末、今回は左右を USB Type-C ケーブルで接続することを考えてみた。 そこで 24 ピンタイプの Type-C コネクタをお試しで秋月で買ってみたけど、自分のハンダ付け力ではまず無理だと判明・・・。

上がフルの 24 ピンタイプで、裏面にも端子がある。下は 16 ピンタイプ

こういう時、リフロー環境があれば 24 ピンタイプも大丈夫なのだろうか? アイロンでリフローというのもあるみたいだけど、自信無いので、今回は 16 ピンで行くことにする。

必要な線としては、電源の 2 本、I2C の 2 本、そしてフルカラー LED の信号線 1 本で、計 5 本。 16 ピンタイプで使えるのは、

VBUS, GND, D+, D-, CC1, CC2, SBU1, SBU2

の 8 本まで。リバーシブルで使えるように SBU1/2 はつないでしまって、これを LED の信号線にあてよう。 しかし、SBU1/2 を使おうとすると、この端子までちゃんと配線されている Type-C ケーブルは、 映像出力可と書いてあるフルスペックの USB 3.1 ケーブルという、何とも無駄に矛盾した感が満載・・・。


ロープロファイル キースイッチ?


そうこう考えている時に、ChocV2 というロープロファイルのスイッチを Aliexpress で購入してみたのだけど、これがめっちゃ薄い! この薄さは抗い難い魅力がある・・・。今回はこのスイッチを使ってみたい!

届いた Choc V2(左)と Kailh Box Silent Pink (Linear) (右)

でも twitter を見てると、どうもデータシートの推奨 PCB パターンが正確ではないらしい!? そこで、自分でもデータシートの寸法から図面を描いてみて、写メと合わせてみた。まずデータシートはこちら。

これを元に図を描いて、写メの上に重ねてみる。

データシートの寸法と写メを合わせたところ。左下が fix ピン

確かに左下の fix ピンがズレている? そこでノギスでも測ってみたのだけど、やっぱり fix ピンの位置が少し左右に(上下に?)ずれているようだ。

ノギスで測ってみた値(0.05mm 刻み)

しかし、そもそもノギスで正確に測るのがなかなか難しい。挟んで測るわけではなくて、 お尻の細い棒をギュッと当てて測る感じなので、微妙に斜めってしまったりすると、毎回計測値が変わってしまう・・・。

それなら挟んで測れるところを測って、あとは計算だ! というのもやってみたけど、斜めに挟むところと真っ直ぐに挟むところと両方あって、 それぞれでノギスが違う側面に当たっているからか、やっぱり正確には求まらない!?

ピン間の距離から余弦定理などで求める

最終的は、こちらの KiCAD フットプリントを参考にさせて頂きました。



あと、前から気になっていた、キースイッチのスルーホールの径・・・。

MX スイッチのフットプリントの穴って結構大きくて、いつもハンダがどばどばどば〜っと吸い込まれる。 こんなに穴大きくしなくてもいいんじゃね?と常々感じていたので、今回は少し狭目にしてみた。 0.6mm もあればいいんじゃないだろうか?

で、実際そうしてみたらどうなったかというと、キースイッチを取り付ける時にピンが穴にスッと嵌まらず、引っかかってちょっと大変でした・・・。 なるほどこういう理由か〜! スイッチの足って簡単に曲がっちゃうから、嵌めやすいように、大きめの穴にしてあったんだなぁ、と学習。次回は気持ち広げてみよう。


デバウンス回路?


最後に、去年、初めて作ったキーパッドでデバウンス回路を入れてみたけど、後から考えると失敗回路だった。 今回はその反省を元に、ちゃんと動く回路にリベンジしたい!


設計


外形デザイン


キーパッドの形はどうしよう?とりあえず名刺サイズにするか、Suica サイズにするか?と迷ってたんだけど、 いつもお世話になってる美容師さんとの会話で、「自分は黄金比か、和の白銀比にすることが多いですね〜」 と仰っていたので、100mm サイズの白銀比の長方形にしてみようと考えた。

そしてキーの配置は、今度作ろうと思っているキーボードの最下段を取り出した感じにしたのだけど、 それだと結構 PCB がスカスカなので、フラクタル的に3分の1の相似形を切り欠いたコの字型にして、少しハードルを上げてみた。

コの字型デザイン。角っこの計6箇所のスペーサ用穴は六角形にしてみた


基板構造


一番悩んだのがここ。PCB のサンドイッチ構造にするとして、ChocV2 の寸法をどう収めるか。スペーサーの高さやネジの長さも関係してくる。

最終的には、4mm の六角スペーサーを、1.6mm 厚のトッププレートと、1.2mm 厚のボトムプレートで挟むことにした。 また、部品をハンダ付けする PCB は 1.2mm 厚にして、ボトムプレートはとの隙間は 1.0mm + 1.2mm の PCB 2 枚で埋める。

PCB 5 枚重ね。隙間は 0.6mm なので、もう1枚 PCB を入れられたと後で気付いた

ChocV2 の軸の高さは 3.3mm ある。上の設計だと、3.4mm の隙間に 3.3mm だからかなりギリギリ。

同じようにもう一つ注意が必要だったのが、I/O エクスパンダの MCP23017。 なるべく小さくと思って SSOP パッケージを選択したけど、高さは 2mm あったので、今回の表面実装部品の中では一番背が高い。 これが引っかからないようにするために、メインの PCB は厚み 1.2mm にして、ボトムプレートとの間を 2.2mm 確保するようにした。

あと、これまでは PCB の両面に部品を実装してたけど、今回はトッププレートとの間は 0.6mm しか隙間がないので、片面実装にした。


ネジ


ネジについては、M2 ネジだと締め付け力が不安だったので、M3 ネジを使おうと思った。 1.6mm 厚のトッププレートは 4mm のネジで、1.2mm 厚のボトムプレートは 3mm のネジで止める。 6.8mm の厚みに計 7mm のネジ長で、ちょっと余りそうだけど、まぁたぶん大丈夫?適当だ。

でも低頭の M3 ネジというと、黒のステンレスがよかったんだけど、1本単位で購入できる 3mm のものはなかなか見つからない。 ネジ山の巻数が少なくなるから、締め付け力や強度の点で問題があるのかもしれない。

そこで、間を取って M2.5 / M2.6 の方を探してみると、スペーサーについては、M2.6 だと種類が色々用意されているけど、M2.5 になると急に選択肢が狭まる。 一方で、Aliexpress でネジを探してみると、M2.6 ネジはほとんど見つからず、M2.5 がほとんどのよう。

う〜ん、あちらを立てればこちらが立たず。ここもめちゃくちゃ悩んだけど、結局、3mm 黒の鉄ネジを注文した。 4mm の方は黒ステンレスのものがあったのでそちらを注文。

あと、六角スペーサを通す穴を前回はただの円形にしていたのだけど、六角形にすることで、スペーサーが引っかかってねじ止めし易くしてみた。 これはやってみるとかなり便利でよかった。


回路図


コの字型にすると、そこそこ狭い。片面実装だし、微妙に部品を置くスペースがない!

マイコンのパスコンは、いつもデータシート通りに、デジタルの Vdd, Gnd の2組にはそれぞれ 0.1uF, 4.7uF の計 4 個、 アナログの Vdda, Gnd には 0.01uF, 1uF の 2 個の合計 6 個と取り付けていた。 今回はこれが場所取るなぁ、と思い、NUCLEO-F042K6 ボードの回路図を見てみたら、 0.1uF がそれぞれ 1 つずつの、合計 3 個付いているだけだった・・・。

なんだと?!今回はアナログ入出力はないので、同じく 0.1uF x3 だけでいってみることにした。

左手(マイコン)側の回路図

右手(I/O エクスパンダ)側の回路図

トッププレートとボトムプレート


何か自キ界隈の皆さまは、Gnd ベタに色んな模様を並べたりしてカッコよくて羨ましい・・・。 自分も何かやってみたいとは思うのだけど、やり方が分からない。 それならせめて、配線のないトップ・ボトムプレートには何かデザインを入れてみようと思って考えてみた。

さて、上述の白銀比とは、1:√3 の比のことで、って、あれ?これは白金比=プラチナ比では!? これを書く今の今まで間違えていたらしい。白銀比は 1:√2 でした・・・。 っていうか、美容師さんとのやり取りのくだりは何だったのか(汗)

えっと、気を取り直して、プラチナ比も和柄にはたくさん見られる。麻の葉とか青海波、亀甲などなど(フォロー)。 こういうのもよいなぁとか、コの字型の切り欠きを合わせると綺麗に揃うデザインとか出来ないかなぁとか。 あるいはシェルピンスキーガスケットのような、フラクタルも面白そう・・・。

・・・。

迷走しまくって、シンプルなボーダーに落ち着きました。 エルゴノミックな配置のつもりのキーの角度に平行なボーダー柄にする。 そして、外形やネジ穴にボーダーの線がかぶらないようにしたい。

色々試行錯誤して、最終的に以下の手順で、まず外形やネジ穴からの距離画像を作成した。
  1. KiCAD で Edge.Cuts を SVG で出力する(輪郭(contour)出力をしないようにすること!)
  2. Python の cairosvg パッケージを使って、254dpi(1ピクセル=0.1mm)の解像度でビットマップの線画に変換する
  3. 閾値 64 で二値化
  4. opencv の cv2.connectedComponents() で中心位置での flood fill =有効領域を取得する
  5. cv2.distanceTransform() を使って、その反転領域から有効領域内への距離変換をする
  6. 距離画像をcsv形式でテキストファイルに書き出す

あとは、このテキストファイルを KiCAD の Python から読み込む。

外形からの距離画像


ボーダーの線は、1~2mm 程度の区分的折れ線に分割して、その線の太さと、この距離画像とを見て、 外形やネジ穴にかぶらないように再分割して引いていく。

トッププレート

ボーダー線は、上から下へグラデーション的に太さを変えてみた。また、表と裏で、太さを逆に変化させている。 なんだけど、意外によく見ないと、この太さのグラデーションはぱっと見では気付かない。

完成後のボトムプレート

組み立て


これまでは PCB は pcbgogo さんにお願いしていたけど、つや消し黒というのを試してみたくて、今回は jlcpcb に発注してみた。 そして、届いたのがこちら。よき!

ミッドプレートは、同じ形で厚みが 1.0mm と1.2mm の2種類

さあ、作るよ〜。と意気込んだけど、最初の Type-C コネクタ 3 個のハンダ付けでいきなり苦戦(汗) 溶けたハンダの表面張力で自動的に位置調整、とかは無理だと悟る。 マステでちゃんと仮止めしてからハンダ付けするようにしたら、何とか付けることができた。

左右両側に Type-C コネクタ

あとのハンダ付けはそんなに難しくはないので、どんどんやっていく。 MCP23017 の SSOP パッケージはそれなりにピッチが狭いので、これもマステで位置決めした方がハンダ付けしやすかった。


LED までハンダ付け完了〜

ミッドプレートは左右共通になってて、左手側は、USB コネクタの部分をノコギリで切り落とす。
ミッドプレート左手側

縦に 3 つ抵抗とコンデンサが並んでいるのが、row 線の終端のデバウンス回路。そして、それに形を合わせたミッドプレート。
ミッドプレートを乗せたところ


ファーム書き


探してみるとやはり、今回使っている STM32F042K6 でも qmk_firmware を動かしている人はいるようだ。

https://github.com/gesinger/qmk_firmware/tree/dragonwell/keyboards/dragonwell
https://github.com/qmk/qmk_firmware/issues/6783

でも今回はデバウンスや I2C に対応したりするし、以前 qmk に emacs モードを実装してみた時に、



qmk が色んなところで register_code() / unregister_code() を呼んでいるのが気になって、 一度 queue ベースで実装してみたいと思っていたので、勉強のために自分で書いてみることにする。

デバウンス用のウェイトは、大体 1ms 程度。一方で、USB のホストからのポーリング間隔も最短で 1ms。 なので、col 線を HI に上げたら、row 線を読み出すまでの 1ms の間は、 例えば LED の計算と PWM 信号送出など、他のタスクをするようにした方がよい。

そうすると、一度に 1 つの col 線のみ HI にするから、col の本数 ms のスキャン時間がかかることになる。 一方 SK6812 の LED は、1 個当たりの設定に 30us かかるので、1ms だと 30 個ぐらいが限度になる。 60%キーぐらいのキーボードを作りたい時は、PWM 出力を 2 系統用意するなどをした方がよさそうだ。

また、キーの押下・解放は queue を使うようにして、メインループが 1 回回る時に、キューから 1 つだけ拾って送るようにする。 NKRO も実装。 今のところ単純なキーパッドとしては動作しているけど、この辺りは今後本格的にレイヤー機能などを実装していくと、また色々楽しめそうだ。


RGB LED


そして、ファームと言えば、RGB LED のエフェクトだ?!

qmk のようにレインボーとか、Knight2000 とかはベタに作って、そのあとは何を作ろう?

押した回数だけ熱拡散的にじわ〜っと広がるもの。

そして、波動方程式的にぴゅ〜っと進むもの。 特にこちらは両端での反射が出ないように、2階の微分方程式を左進波と右進波の1階の微分方程式に因数分解して実装してみた。

あとは、ロウソク風に、1/f 揺らぎでユラユラする感じも作ってみた!!



動作不良?


あれれ、右手側のキーパッドの位置を動かしていると、時々その後右手側が一切反応しなくなってしまう!? USB ケーブルのコネクタ部分で接触が一瞬外れたりして、I2C 通信がその後正しく行えなくなったりしているのだろうか? MCP23017 の NRST をマイコンから制御するか(現在は Vdd に接続)、 あるいはファームウェアで、I2C がタイムアウトした時に、何かできるだろうか・・・?

要検討である!





2020年7月8日水曜日

STM32F042K6T6 のブレークアウトボードを Type-C 化してみた

作成した Type-C, 18ピン, 17.8 x 24.4 mm, STM32F042K6T6 ブレークアウトボード

最近は百均でも USB micro-B ケーブルが減ってきて、Type-C USB2.0のものに置き換わってきている。そこで、そろそろブレークアウトボードも Type-C 化してみたいと思って調べ始めたら、CC1, CC2 という端子に5.1kΩのプルダウン抵抗を1個ずつ付けておけばよいようだ。これなら簡単に出来そうだぞ!?

キーボード用ブレイクアウトボード


左右分割キーボードを作るのに、毎回マイコンを2個ずつ消費するのももったいないし、ハンダ付けがそれなりに大変だ。ハンダ付け自体は好きだけどね。なので、次からは左右にI/Oエキスパンダをひとつずつ配置し、それらをI2Cで接続して、マイコン自体は片方に1つだけ、という構成にしようと考えた。

必須ピン


I2C の他には、APA102 などの2線式 addressable LED(クロック線とデータ線)を駆動出来るように、SPI が欲しい。 キーボードは光らないとね!?

LC8822 2020 full-color addressable LED

左右のキーボードをつなぐケーブルは、このLED 用に 5V, GND が最低限必要なので、信号線となる I2C, SPI も同じ 5V の単一電源で動かしたい。そのため、信号ピンは 5V 耐圧の FTf ピンから選ぶことにする。

でもこれだけなら、ブレークアウト基板からは I/O ピンはそんなに出てなくてもいいよね、ということで、

  • 3.3V, 5V, GND
  • I2C(プルアップ抵抗付き)
  • SPI
  • UART
  • SWD
  • アナログピン数本

と、これぐらいの最小構成を作ってみたい。SWD と UART はデバッグ用。

周辺部品


周辺部品としては、

  • 電源(VBUS)LED
  • Lチカ用 LED
  • BOOT0 兼用スイッチ
  • WS2812 2020

とする。それほど使用頻度のないリセットスイッチは、ケーブルの抜き差しで代用する事にして、スイッチ入力としても使える BOOT0 のみ基板に実装することにした。

おまけで、WS2812 2020 はコントローラ内蔵のフルカラー LED で、サイズが 2.0x2.2 mm。これならちょうど、1.6mm 厚の PCB の側面にハンダ付け出来ると最近気付いて調子にのって付けてみている(笑)

WS2812 2020

PCB の周囲ギリギリにパッドを作ってもらえるかの確認用としても取り込んでみた。タイマーによる PWM 出力が出来るピンにつないでおく。

小さく?


今回は小さく作ることを目的のひとつにしているので、上述のように、ピン数・部品点数だけでなく、各パーツも見直した。

まず、レギュレータの出力電流を 250mA に下げて SOT-23 パッケージのものにした。

低ドロップアウト電圧レギュレータ 3.3V300mA SOT-23 AP7333(10個入)

キーごとに LED を付けるとかなりの消費電力になるけど、前回の後で気付いたのは、LED は 5V 電源なので、3.3V が必要なのは実はマイコンだけだから、レギュレータが 500mA も流せる必要はない。

タクトスイッチも表面実装のものに変更した。ただ、固定のポッチ用に穴を開けないといけないので、裏面に別のフットプリントを置きにくくなってちょっと不便だけど、大きさで選んでみた。

表面実装用タクトスイッチ TVAF06-A020B-R

あと、ErgoDash の組み立てで知った、パッドにビア打ちを許容することにした。非推奨かもしれないけど、これで場所の節約になるし、大きめのビアを使い易くなる。今回は後学のためにも敢えて試してみた。

小さく。でも、マイコンと Type-C コネクタだけで、結構場所取るなぁ。

タクトスイッチの 3D モデルは使い回し(汗)


ピン表


PCB 上の配置も考えながら、STM32F042K6T6 の 32 ピンのうち、以下で○を付けたピンをヘッダーに出すことにした。

ピン番号 端子名 種類 機能 ヘッダー
1 VDD
2 PF0 FTf I2C1_SDA
3 PF1 FTf I2C1_SCL
4 NRST
5 VDDA
6 PA0 TTa
7 PA1 TTa
8 PA2 TTa USART2_TX
9 PA3 TTa USART2_RX
10 PA4 TTa
11 PA5 TTa SPI1_SCK
12 PA6 TTa SPI1_MISO
13 PA7 TTa SPI1_MOSI
14 PB0 TTa
15 PB1 TTa
16 VSS
17 VDD
18 PA8 FT

19 PA9 FTf USART1_TX, I2C1_SCL ○ I2C pull-up
20 PA10 FTf USART1_RX, I2C1_SDA ○ I2C pull-up
21 PA11 FTf USB_DM
22 PA12 FTf USB_DP
23 PA13 FTf SWDIO
24 PA14 FT SWCLK, USART2_TX
25 PA15 FT USART2_RX
26 PB3 FT SPI1_SCK
27 PB4 FT SPI1_MISO
28 PB5 FT SPI1_MOSI
29 PB6 FTf I2C1_SCL
30 PB7 FTf I2C1_SDA
31 PB8 FTf BOOT0
32 VSS


PCB レイアウト


回路図


これらを踏まえた回路図。

STM32F042K6T6 ブレークアウトボードの回路図

前回からの主な変更点としては、

  • USB コネクタを Type-C に変更
    • CC1, CC2 に 5.1kΩのプルダウン抵抗を配置
  • I2C 用のプルアップ抵抗を 5V でプルアップ(前回は 3.3V)
  • 5V ラインも、ポリスイッチとチップインダクタを通す

など。

PCB


今回も PCB gogo に発注。製造開始から 24 時間以内に発送手続きまで完了していた!

届いた PCB。下端の WS2812 用パッドもギリギリまで出来ている

7x7 ピンに収まれば、ちょうど 1U キーの大きさになってカッコええのになぁ、と思いながらも、手ハンダし易い 2012 サイズで、スイッチや LED、I2C プルアップ抵抗も載せる、というのでは、このあたりが自分には精一杯だった。 これのために2週間ほど寝不足になったよ(笑)

Type-C コネクタの初ハンダ付けはかなり手こずった・・・。フットプリントをデータシート通りに作ったのだけど、そうしたらパッドが端子ギリギリしかなくて難易度高(汗)次回はパッドを手ハンダ用に少し大きくしよう。

動作確認


レギュレータ周りからハンダ付けしていって、テスターで電圧を確認しながら組み立て。

奥の白 LED は電源。手前は WS2812 の side-glow

Side-glow LED も無事光った! 拡大すると、こんな感じの空中ハンダ。何か LED を仮固定する手段がないと、ハンダ付けがかなりふわふわ。

Side-glow のハンダ付け


最後に、5V I2C に OLED と MCP23017 経由の 2x2 のスイッチマトリックスをつないでみたところ。

J-Link (SWD), OLED (I2C), MCP23017 (I2C) 経由の 2x2 スイッチマトリックス

また、UART についても、J-Link 経由でシリアルに printf() できるところまでを動作確認している。

感想


とりあえず動いて満足!

でも、ここへきて Choc V2 というスイッチが届き、この低いスイッチでキーボードを作ってみたくなる・・・。でもそうすると、Type-C コネクタの 3.2mm という背の高さがあだになり、このブレークアウト基板では分厚過ぎることが発覚・・・。ミッドマウントのコネクタにしないとだけど、そうすると、コネクタの裏に何も置けなくなるんだよな・・・。ブツブツ。

ということで、このブレークアウト基板は、これはこれでもう少しフットプリント・配置・配線・外形を調整した改善版を作成中~。





2020年5月17日日曜日

ErgoDash を組み立てて Emacs キーバインドにしてみた

組み上がった直後の ErgoDash

新型コロナの影響でテレワークになったのだけど、自宅にはノートパソコンしかなく、小さな画面で目を酷使してしまう日々。2週間程で目の痛さが限界になり、これはイカン!と、環境を整えることにした。作業環境は大切だよね!

まずは、27 インチモニタを購入。お値打ち品は入荷待ちも多く、今回は早く入手したかったので、在庫もあって、色々安心の EIZO を選択した。

次に、MacBook のトラックパッドだけではなかなかつらいので、大きめのトラックボールを購入。

そして、満を持しての初自作キーボードキット購入だ!作業環境は大切だからね!!

え〜っと、じゃあ、どれにしようかな〜(ルンルンらしい)


数字キーは必要でしょう?!


改めて色々自作キーボードのキットを見てみると、数字キーのない 40% ものが多いことに気付く。でも、数字キー無しは玄人過ぎて、ど素人の自分には到底使いこなせるようには思えない・・・。

実際、今度作るとしたらこれ、と思って考えていたキー配置はこんな感じだ。

次作ろうと妄想していたキーボード:数字キー+方向キー

カラム スタガードは外したくなかったので、そうなってくると、Iris か ErgoDash かの2択で最後は迷った。

そして、決めては真ん中の第7列目の存在。片手6列では、どうしても足りないキーがあるよな〜、と思っていたので、人差し指のところに追加列のある ErgoDash に決定!

キースイッチはリニアが好みなので、この際だからと奮発して、滑らかだと書いてあった Turquoise Tealios を買ってみた。今だとお店で触れないから、説明だけ読んで思い切ってみた。

組み立て♪


遊舎工房さんの通販で購入。翌日到着〜♪

ErgoDash キットとキースイッチ

最初は PCB の端を #400 の紙やすりで滑らかにする。PCB が届くといつもやっていることなので、それほどバリは残ってなかったけど、今回もやってみた。

バリ取り完了〜

スイッチ マトリックスのダイオードと、バックライト LED の制限抵抗は、どちらも表面実装のものにした。

最近覚えた、両手でハンダゴテを持って、リフロー風にハンダ付けをする。

予備ハンダを盛って、ペーストを塗って、部品を置いて、両側からジュワッと溶かすと、部品がスルッと収まる。

これを使って、ダイオードと抵抗とフルカラー LED をどんどん付けていく。

両手ハンダごてでリフロー風ハンダ付け

スイッチ マトリックスのダイオードとバックライト LED の制限抵抗のハンダ付け後

ErgoDash の PCB はパッド中央にビアが打ってあるので、裏面にもハンダが出て行く。綺麗に流れて行けばいいんだけど、中途半端なものも多いので、裏面のパッドにもハンダを盛り直す。この作業に意味があるかは分からない。

裏面。パッドのスルーホールから中途半端にハンダが出ている

裏面にハンダを盛り足す

フルカラー LED のハンダ付けも、両手ハンダゴテで行う。マステで仮止めしなくても、大体の位置に入ってくれるので、作業が少し楽、のはず。


こうして、フルカラー LED のハンダ付けまで終わったところで、ピンセットでキースイッチのところをパチパチつないで、動作確認。LED の点灯まで無事 OK だった!

最後はキースイッチとバックライト用 LED のハンダ付けだ。しかし、キースイッチ用のスルーホールは径が大きくて、ハンダをもの凄い勢いで吸い込んでいきますね。

ホットスワップ用のパーツを見てみると、

スイッチ用PCBソケット(10個入り)

端子を挟むところは横穴になってるので、今度 PCB を作る時は、細い横穴にしてみたい。

また、先に右手分を組み立てたのだけど、キースイッチの端子と、バックライト用 LED の端子が出っ張っていて、フラックスの除去掃除がしにくかった。

そこで、左手分を組むときには、キースイッチの端子とバックライト用 LEDの端子を基板表面ギリギリで切断してからハンダ付けしてみた。

キースイッチの端子の切断後(左)と切断前(右)

ゴツゴツが気になる右手側

ハンダ面がなだらかな左手側

あんまり意味無さそうな作業だけど、最後のフラックス除去はしやすかった。


完成!?


アクリル板も取り付け、いよいよ完成かと思って横から見てみると、アクリル板が斜めになっている?よくよく見てみると、スタビライザーのところでスイッチが浮いている。

PCB と上側のアクリルプレートの間隔が一定ではない。

スタビライザーが浮かないように気を付けてハンダ付けしたつもりだったけど、まだ若干浮いていたらしい。

と思っていたら、見ている前で、急に右手側のフルカラー LED の1つの緑が点灯しなくなった!?

不意に LED の1つの緑が壊れた(汗)

早速交換するものの、LED の取り外しにも、ハンダゴテ両手持ちは重宝!

その後1週間ぐらいして、今度は左手側のフルカラー LED がハンダ不良?らしい・・・。

今度は左手側の LED がちゃんと光っていない

でも意外に、フルカラー LED は普段はオフにしているので、まだ直してない(爆)


もげ対策


あと、ProMicro のもげ対策も初めてしてみた。こちらのマステ使う版でエポキシ接着剤を盛る。

マスキングテープを使って、安全にProMicroのモゲ対策をする

マステのくっ付きが不十分で、エポキシが若干コネクタ内に盛り上がっていて、最初 USB コネクタが刺さらなかったけど、1.2φの細い丸ヤスリで削って対応。

これだけ盛っておけば、大丈夫でしょう!?

使ってみて


左右分離型 70 キー


最初に驚いたのは、手首をそれほど動かさなくても、全部のキーに指が届くこと!これは衝撃的だった。

左右分離型であることも、背筋が丸まらず、肩への負担が減ってよかった。

手首をあまり動かさずに、手の中で指をカタカタするだけで打てることに歓喜してくると、今度はもっと小さくしたくなってくる・・・。40% キットが多いのは、こういう理由だったのだろうか!?

それなら、今度自分が設計する時のために、今からどんな配列がよいか試しておこうと思い、試行錯誤中の現在の様子はこんな感じだ。

44キーとトラックボール(と、高さ調整用の定規w)


親指キー


親指が忙しい。それに痛い。親指キーは、おそらく省スペースのために残りのキーに寄っている。しかし、それだと親指の指先でキーを押すことになる。ところが、親指は横に向いているので、押下時に第一関節に力がかかる。仕事で1日もキーボードを叩いていると、第一関節が痛くなってくる。なので、親指キーは少し下に離して、第一関節でガスッと押せるようにしたい。

真ん中の人差し指用の2キー(Del と Enter)は、無しにもしてみたけど、無いとやっぱり結構不便。Ctrl-M で Enter にしているので、Ctrl-Enter が押せない。

う〜ん、Lower+M も Enter にするか?いや、そこは ¥ マークか。結局、この真ん中の2キーが記号にも要るし、Fn にも要るんだよな。ブツブツ。


狭ピッチ?


そしてなにより、数字の入力がまだまだ慣れない。余裕のある時は、Raise や Lower を押しながらホーム列で数字入力、というのは楽で全然良いのだけど、大文字や記号や中かっこが混じったものを入力する時は、Lower と Shift と Lower+Shift で頭の中が大混乱(汗)

でも上段に数字キーを置いても、指が遠いしなぁ。SA をさらに推し進めて、指ごとに形の異なる 3D キーキャップにすれば、遠さは軽減するか?

さらに、キーキャップを 18x17 などの狭ピッチにすれば、もっと軽減出来るかな?

以前、クレバリーさんで触ってみた μTRON キーボードは、「キーちいさっ!」と思ったけど、あれは 17x17 だったようだ。慣れたらなかなかよいかもしれない。でも、市販のキーキャップが使えなくなるのも、それはそれで色々大変そうだなぁ。

というところで、現在うだうだ中〜。


リニアスイッチ


今回使った Turquoise Tealios というリニアスイッチがすごく滑らかで、キーキャップを SA 風に置き換えた(DMM.make で印刷したキーキャップでシリコン型を取ってみた)後の打鍵感が正直たまらない。打鍵音と打鍵感にコトコト重みが出るだけでなく、数字行も近づいて押しやすくなった。

これまで RealForce の打鍵感が最高と思って、静電容量無接点スイッチ キーボードの製作をしていたけど、今のところの自作キーパッドでは、どうにもこの Tealios スイッチには敵わない。円錐バネがビョンビョン鳴るのと、軸がカシュカシュしていて、ガタつきもある。なので、次は MX スイッチで作ろうと方針転換を検討中・・・。


QMK で Emacs キーバインド


学生時代に Emacs に慣れてしまったばかりに、いまだに抜けられないでいる。当時は「窓使いの憂鬱」というソフトで、Windows 上でも Emacs のキーバインドにしていた。現在もその後継の yamy を使っている。

でも、そもそもキーボード側で Emacs のキーバインドを実現してしまえば、毎回こういうソフトを使わなくても、いつもの自分の設定に出来る。

そこで QMK での Emacs キーバインド実装を探してみたけど、ありそうで見つからなかったので、自分で書いてみた。

https://github.com/orihikarna/qmk_ergodash_emacs_keymap

書いてみて意外だったのは、例えば C-a C-e C-a C-e ... と打ち続けているとき、直前の a キーが離れる前に、次の e キーを押している時がある。最初うまく動かない時があって、あれ?と思ったら、こういうケースに対応が必要だった。

あと、Windows では、Alt を単独で押下すると、メニュー項目にフォーカスが移ってしまう。そのため、M-f などを拾って代替シーケンスを送っても、まだメニューにフォーカスがあるままになっていて、うまく動かない。

この Windows の Alt メニューを抑制するために、AutoHotKey を使って、Alt 押下時に存在しない仮想キーコードを送るというテクニックがあるようだ。

しかし、QMK では仮想キーコードは送れないので、色々試してみた結果、Ctrl を押しながら Alt を押下して Ctrl を離すと、Alt メニューにフォーカスが行かないようだった(Windows10)。そこで、今のところは Alt 押下時にそういうキーシーケンスを送るようにしている。

これで現在のところは、yamy を使わずに Emacs ライフ?を過ごしている。欠点としては、cygwin のようなもともと Emacs キーバインドのソフトには、むしろ逆効果なところもある。これを yamy のように、プロセスごとにキーバインドを切り替えるということは出来ない。


感想


自作キットは使わずに全部自分で作りたい!って思っていたけど、自作キットを作ってみると、すごく参考になり、色々と考えも深まり、作業も進んで、とてもよかった。

しかし、重め滑らかリニア軸+SA、よき(また言っているw)






2020年5月6日水曜日

DMM.make で印刷したキーキャップでシリコン型を取ってみた

右端の4個が DMM.make で印刷したキーキャップ。その左側の着色キャップが UV レジンで複製したもの

KeyV2 をカスタマイズして逆 SA 風のキーキャップを作成し、3Dプリンタで印刷して、型を取ってUVレジンで複製し、キーボード1つ分のキーキャップを作ろうとしている。前々回

おゆまるでキーキャップを作ってみた

では、3D プリンタで出力したキーキャップの型取りをしてみた。だけど、FDM 方式の 3D プリンタだと、そもそもキートップ部分に積層痕が残ってしまい、指ざわが凸凹してしまう。側面はかなり綺麗に出来上がるんだけどね。

そこで DMM.make の出品を検索してみると、キーキャップセットもそこそこ出されていて、「MJF の PA12GB ブラック磨き」という素材がお薦めされていた。・・・と思っていたら、2020年の 3, 4月は、DMM.make で MJF の 20% オフキャンペーンが行われていたので、今がチャンス?!と思って試してみた。


1.親指用鞍型キートップ+いつものサイズで出力


KeyV2 では、キートップを凸に盛り上げるか、凹にくり抜くかを選べる。人差し指から小指までの4本については、キートップを凹ませておくと、指の位置が指先の感覚で分かってちょうど良い。

一方で、親指キーについては、キートップが凹んでいると、親指の横側面がへりの角に当たって、長時間使っていると少し痛くなってくる。そこで、親指キーキャップには、凸に盛り上げたものも試してみた。でも実際に使ってみると、親指への当たりは確かにかなり柔らかくなったんだけど、今度は、親指がキーの上でどこにいるのか、横方向の位置が分からなくなってしまった。

う〜ん、両者のいいとこ取りをして、鞍型がいいんじゃないか?!と思って OpenSCAD のドキュメントを探してみたけど、そのものズバリの関数はないようだ。


鞍型キートップ


そこで、鞍型面は二次曲面なので、円を並べて 凸包を取ることで、近似的に鞍型を実装してみた。

鞍型キートップ
OpenSCAD のソースコードはこちら。
https://github.com/orihikarna/KeyV2/blob/master/src/dishes/saddle.scad

gist-it.appspot.com の埋め込みでは綺麗に入らなかったので、コピペ(汗)

module saddle_dish(width, height, depth, inverted) {
    $fa = 4;
    direction = inverted ? 1 : -1;
    hdepth = depth / 2;
    radius = height * height / (8 * hdepth) + hdepth / 2;
    xdivs = 16;
    dx = 1 / xdivs;
    intersection() {
        translate( [-width, -height, depth * (direction - 1)] )
            cube( [2 * width, 2 * height, 2 * depth] );
        translate( [0, 0, - direction * radius] )
            union() {
                for (nx = [-1:xdivs-1+1]) {
                    x0 = -0.5 + dx * nx;
                    x1 = -0.5 + dx * (nx + 1);
                    hull() {
                        translate( [width * x0 - 0.01, 0, direction * hdepth * ((x0 * x0) * 4 + 1)] )
                            rotate( [0, 90, 0] ) cylinder( dx / 8, radius, center = true );
                        translate( [width * x1 + 0.01, 0, direction * hdepth * ((x1 * x1) * 4 + 1)] )
                            rotate( [0, 90, 0] ) cylinder( dx / 8, radius, center = true );
                    }
                }
            }
    }
}

これは何をしているかというと、まず Google Calculator で \(z=x^2-y^2\) という鞍型面を表す関数を描画してみる。

z=x^2-y^2 の鞍型面

ここで各 \(x=x_0\) を固定して y-z 面で見てみると、\(z=x_0^2-y^2\) という放物線になっている。

この放物線を円に置き換えて、x 軸方向に dx 間隔で並べて配置し、隣同士を hull() で閉じている。100円玉のような円板をたくさん重ねて、放物線の形に少しずつずらして並べたようなもの。あえて式で書くなら、\((z-x^2)^2+y^2=1\) となる。この上半分を同じようにプロットすると、

z=sqrt(1-y^2)+x^2

と、ここだけ見れば、鞍型面に近いものになっている。

あとは、幅と奥行きと高さの設定に合わせて、円の大きさや放物線の係数を調整すると、先ほどの scad コードになる。


DMM.make へ発注!


普段の 3D プリントでは軸のプラス穴のサイズ決めに一番苦労したので、DMM.make でも、まず、1.25mm、1.35mm、1.45mm の3種類で出してみた。違いが分かるように、キートップに、無印、○、ー、の刻印を入れておく。

発注した STL

PA12GB ブラック磨きで、1uが8個と1.25uが3個で3,403円。送料込みの固定費を除くと、1キー当たり100円前後のようだ。

1週間ちょいで到着したけど、到着前に、細いところが再現出来ませんでした、とのメールを受け取る。ふむ?と思ったら、普段の 3D プリンタ用のサポートが残ったままだった。でもこれはニッパーで切れば、問題なし!というより、こういう風に再現されるのかぁ、という感じ。細くてもそこそこ強度がある。

細すぎてクニャリと曲がったサポート

そして、出来上がりの全体像。

逆SA風なので、左側が上段キー

鞍型面の仕上がりはこんな感じ。

親指用 1.25u 鞍型キートップ

既に試していた通りの形だけど、キートップに積層痕がないので、より滑らかな指触り。


軸穴のサイズ


さてさて、では、キースイッチに取り付けてみると!?

どれもこれも軸穴がガバガバのスカスカで、まったく使い物になりませんでした(涙)

だけど、硬さがあり、重みもあり、肌触りも悪くなく、これで1つ当たり 100 円なら、全然アリだと思える仕上がり。この素材感には大満足!

ちなみに、軸穴のサイズをノギスで 0.05mm 単位で測ってみると、こんな感じだった。R0 と書いてあるのは親指キー。プラス穴の縦横幅を3パターン変えている。

  • 4.3mm x 1.25mm

キー長幅短幅
R04.401.35

  • 4.4mm x 1.35mm
キー長幅短幅
R04.501.40
R14.451.45
R24.501.45
R34.501.45
R44.451.45

  • 4.5mm x 1.45mm
キー長幅短幅
R04.551.50
R14.551.50
R24.551.55
R34.601.50
R44.601.50


軸部分は薄いからか、穴のサイズは常に広がる方向で、最大でも0.1mm 程度の広がりのようだ。


2.軸穴を攻める


ということで、次は軸穴サイズを変えてやり直し。プリンタが変わると調整やり直しなのは、まぁ仕方ないですね。

前回、1.25mm でも結構緩かったので、今回は、1.05mm、1.10mm、1.15mm、1.20mm の4パターンで出してみた。違いが分かるように、キートップに、無印、ー、=、≡ の刻印を入れておく。

上下向かい合わせにして空間費を節約(刻印は見えない)

今回も1週間ちょいで到着。

軸穴4パターン

軸穴はどうかと言うと、1.20mm と 1.15mm は、前回の1.25mm 程ではないけど、やはり緩い。1.10mm だとちょうど嵌るけど、若干緩いかも。1.05mm だと、ぐぐっと力を入れて押し込まないと入らない。

意外にも、1.10mm まで軸穴を細くしないと、緩かったようだ。スイッチによっても違いがあり、手元の Gateron の静音赤軸にはきつ目で、Kailh 系のスイッチには緩めのようだ。


初シリコン型取り!


そして今回は、このキーキャップを使ってシリコンで型取りし、UVレジンで複製を試してみた!初シリコンで、ブロックとか精密スケールとか真空容器とか色々手間取って面白い。

でも、その結果は・・・。

「PA12GB ブラック磨き」のブラック塗装がシリコン型にもレジンにも色移りして、薄紫色のキーキャップになりました(涙)

左下が DMM.make、上が黒が色移りした透明シリコン、中央下は緑着色レジン、右下はクリアレジン

あと、軸穴は 1.10mm で出したものを使ったのだけど、最終的にレジンで複製したものだと、かなり緩々の軸穴になってしまった。型取りには 1.05mm ぐらいが良さそうだ。


2.5.3月中にもう一つ!


MJF の 20% オフキャンペーンは、最初は3月だけだったので、駆け込みで 2u 親指キーキャップを作って発注してみた。(実際は、4月もキャンペーン継続になった。)

KeyV2 では、2u 以上だと、スタビライザー用の軸も出るようだ。スタビライザーの間隔はちょうど 12mm になっている模様。

普段使い用に実用品として駆け込み発注(2uは右奥)

でも写真撮るの忘れていた・・・。キーキャップ自体は職場のキーボードに付いていて、ただいま新型コロナのリモートワーク中なので、実物が手元にない・・・。


3.それなら塗装無しナイロンで!


そして、諦め切れない型取り用キーキャップ。いやしかし、DMM.make で出したモデルなら、複製に耐えうるだろうと思って始めたのに、まさか塗装でこけるとは・・・。

う〜ん、それなら次は、塗装無しを試そう!

と言うことで、より安価のナイロン素材を試してみた。型取りにしか使わないのなら、軽い素材で出しても問題ないしね。

こちらの素材での軸の出方も分からないので、1.05mm から 1.12mm まで、0.01mm 刻みで8バリエーション作ってみる。刻印はドットとコロンで点の数を入れてみた。

ナイロン40キー

届いたもの。

キートップに積層痕・・・。

キートップに積層痕がある?!

ガツカリ・・・(よく調べてから注文しようね)

振り出しに戻る。

キーキャップ自体は軽い感じで PA12GB のような重厚感はない。だけど、とりあえず普段使いして、高さや傾きを確認するのには使えそう、といった感じ。

軸穴サイズについては、1.05mm、1.06mm、1.07mm の辺りはきつくて入らない。1.08mm から使える感じだった。

MJF ほどのトキメキは無かったので、早々に次へ・・・。


4.そしてグラファイトへ


さらに他の素材と言っても、やっぱりナイロンと MJF が一番お手頃っぽい。それなら、最後に PA12GB で、塗装無しのナチュラルと、グラファイト磨き、というのを試してみることにした。

シンプルに8キーを、ナチュラルとグラファイト磨きで発注

軸穴は 4.05mm x 1.05mm に設定。

ナチュラル

ナチュラルは、表面がザラザラとしている。あまり型取りには向かなそうだ。

グラファイト磨き

一方のグラファイト磨きは、表面はブラック磨きとあまり変わらない滑らかさ。色はブラックからダークグレーになるけど、自分としてはあまり気にならない。

ただし、軸穴の中に鉛筆の粉みたいなもの(これがグラファイト?)が残っていたので、実際に使うには、まず、つまようじとかで軸穴内を掃除した方がよさそうだ。今回のように型取りするならなおさら。

そして、グラファイト磨きの方をシリコンで型取りし、UV レジンで複製してみた。

シリコン型の硬化後

太陽光で硬化中〜

硬化完了〜

右手分量産完了〜

感想


グラファイトでも、多少の黒い粉がシリコン型に入り込む。それでもブラックの塗装が移り込む度合いよりはかなりましだった。あらかじめキーキャップにシリコン離型剤を塗っておくと、グラファイトの入り込みがより少ない。また、同じキーキャップで複数回型取りすれば、2回目以降はより入り込みが減った。

あと実は、毎回キーキャップの高さとか角度を微妙に調整していたのだけど、今回の最後のを使ってみると、最上列はもう少し高めにして、角度も急にした方が指が届きやすくて押しやすそうだと分かった。

しかし、カチャカチャいわずに、コトコトした感じの、

この重めの打鍵感と打鍵音、よき。