2021年1月31日日曜日

ダイソーの 5.5L 密封容器で横置きフィラメントホルダーを作ってみた

作成した横置きフィラメントホルダー。横滑りしやすいので滑り止め用のゴム足を付けている

2020年の11/11セールの時に、Aliexpress で ANYCUBIC Mega Pro 3D プリンタを購入した。レーザーモジュールが付いているし、モータードライバも始めから静音タイプのようだし、レーザー付きとして最初は snapmaker2 を買おうかと思っていたけどちょっと高かったから、最初に買うならこれかな?と思っていたので、少し安くなったタイミングで思い切ってポチってみた。

ただ、年に一度の大セールで爆売れ中?だったのか、中々発送してもらえず、待っているうちに 11/27(金) から Amazon のブラックフライデーが始まって、そちらの方が送料込みだと安かった・・・。ドンマイ!Aliexpress では既に発送期限を延長していたので、仕方なしにしばらく待っていたら、ちゃんと発送してもらえて、12月半ばに無事届いた。そこで早速開封して組み立てたけど、

あれ?Mega Pro 押しのレーザーモジュールが入っとらんよ!(ハテナ)

調べてみると、保護メガネやレーザー彫刻用の紙と木板も入ってない・・・。何だよそれ〜!と思って Aliexpress アプリとホームページの両方で、レーザーモジュール入ってなかったから送ってね、と問い合わせをした。このやりとり中は、1~2日以内にはちゃんと返事がもらえて、無事足りてなかったパーツを送ってくれることになった。

しかし、そして、だがしかし、今度は中々発送通知が送られてこない・・・。2週間ほどして再度メールを投げてみると、今レーザー系のパーツが在庫切れ中で、工場が移転中?とのこと。でもそれが終わったら優先的に発送するように伝えてくれるとのことで、実際数日したら発送通知が来た。ほどなくして、レーザーモジュールとその関連パーツも無事届けられた!

早速取り付けて動作確認。結構な煙と匂いが出るんだなぁ、火災報知器とか大丈夫かなぁと思って窓全開にしつつも、正常動作を確認した。いや、BMPの横サイズが 8 の倍数じゃないと、印刷した絵がおかしくなっていたか・・・。あと、レーザーモジュールのファンが回りそうで回っていなくて微妙な感じだったけど、これはレーザーの出力に応じてファンが回るみたいで、出力が弱い時は回っていないだけのようだった。

とか何とかやっている間に、3D プリント自体はちゃっかり色々試して遊んでいて、一緒に購入した PLA 1kg フィラメントはほぼ使い切っていた・・・。


縦置きフィラメントホルダー


Mega 系はフィラメントホルダーが筐体に付いているけど、この形状は円筒の軸では無くて、幅数cmの長方形になっている。だから、すごく滑らかにフィラメントホイールが回るというわけでは無い。特に最初は、フィラメントホイールの内側の穴から、フィラメントの最後の端っこがピョロっと出ていて、それが回転するたびに長方形の板に引っかかって回りづらくなっていた・・・。

そこで、フィラメントホルダーを印刷することにした。thingiverse で色々見てみて、結局選んだのがこちら。

608ZZ というベアリングがあるんだ〜、これってスケボー用なんだ〜、とか初めて知ることが多くて新鮮!
Amazon で 608ZZ を探して、割高だけど、今回は 4 個あれば良いのでこちらを購入した。

しかし、その間も thingiverse で色々面白そうなのを見つけては印刷していると、こんなものを発見してひとり大興奮!

えぇっ!?この 608ZZ ベアリングも 3D 印刷してしまうんですかぁっ!?えぇっ!?

いやぁ、実際やってみると、この印刷の難易度はそこそこ高くて、当時の自分には満足のいく精度では印刷できなかった orz... 隙間が大きすぎて中身が全部ボロボロ落ちてくるか、あるいは隙間が少なすぎて印刷時にくっついちゃうかのどちらかみたいな感じ。


ホイール脱輪?


さて、設置してみると、中々よい。ベアリングで支えられた溝の上を、ゴロゴロと滑らかに回っている。

ただちょっと失敗したな、と思ったのは、左右のレールを結ぶものが無いので、何かの拍子にフィラメントホイールがレールから外れてしまうこと。

レールから落ちたホイール
印刷中に、時々プリントヘッドが突然止まって動かなくなり、数秒〜数十秒するとまた動き出す、ということがあったのだけど、どうやらその原因は、このホイール外れだったようだ。ホイールがレールから外れると、引っかかってホイールが回らなくなる。そうすると、エクストルーダーがフィラメントを送り出せなくなるのか、しばらく止まってしまうようだ。

そして、これが起きるとノズルから樹脂がどろ〜っと溶け落ちてきて、結果として印刷物がダマダマになってしまうようだ。

ダマダマのネコのしっぽ
ギアなどの可動部があるものだと、このダマは致命的で、印刷し直しになる・・・。

そして、もう一つの難点が、フィラメントが無くなってくると、ホイールが軽くなって浮いてしまうことだった。ホルダーの意味がほぼがなくなってくる。この状態では、Mega 系のでっぱり板ホルダーがないと、実質ホルダー無しの状態になってしまって困る。


横置きフィラメントホルダー


そこで、横置きにしたらどうだろう?と思って、少し調べてみたら、懐かしの BB 弾を使ったボールベアリングタイプのものがあった!

BB 弾なら近所の百均に売っていたはず。ちなみに BB 弾というと、友達と遊び終わって帰る時に自分の BB 弾が減っていると、無くなってしまった喪失感?が嫌で、あまりバンバン打てず、むしろ落ちてる BB 弾をついつい探してしまうような子供だった(苦笑)

さて、1kg のフィラメントをしっかりと支えられるものを探していたので、これはベアリングの径が大きくて良さそうだ。でもネジが付いてる方のパーツは、ネジが大きくて印刷に時間かかりそうだったし、ベアリングのところが全面天井になってしまって、ZigZag, Lines のいずれでも、ブリッジが長〜くなる方向が存在する。ベアリングの下側の印刷なら、Cocentric が転がりが一番滑らかになりそうだけど、上側の天井部分に使うと全周囲ブリッジになって相性が最悪だ・・・。そこで、上側は STL の Z 方向を反転して、ネジ部分はバッサリ切って印刷した。

ネジ部を外して、ベアリング部分だけ印刷して、BB 弾を並べた

BB 弾を並べて組み立ててみると、ジャーと言いながら回るのが面白い!よしよし。


試作版


そこで、この形状をベースに、密封容器に固定するようのネジ穴をつけたものを、OpenSCAD で作成することにした。まず試行錯誤用に、小さい径のものを作る。

(左) 初期版 (右) 色々調整後

次に、底のネジ頭と、蓋側の軸キャップがでっぱらないように、ネジ穴をほり、軸も断面を台形にして、底板と嵌め込みにした(写真右)。隙間や凸凹の具合を色々調整しながら、何度か印刷し直して完成。

軸部分の凸凹を変えたり、フレームの角部分を closing で丸めたり試行錯誤
そして、次はフィラメントホイールに合わせて、大きい径のものを印刷!また、今回は蓋側のアーム部分に切り欠きを作っておき、そこにパチっと嵌めるものを作って、フィラメントホイールのヒダに引っ掛かるようにしてみた。

大きい版ベアリング
ホイールを引っ掛けるパーツ

作ってみると、大きいと転がり摩擦がかなり増えて、滑りがよくない・・・。

引っ掛け部分も機能しなくはないけど、フィラメントホイールが固定される訳では無いので、いつホイールが外れてもおかしくなく、大変に心許ない。


最終版


ということで、ベアリング径はホイールの中央を支えるのにちょうどの小さめにして、ホイールの真ん中の穴径に合わせたアームが延びただけの留め具を作ることにした(右下)。

ベアリングとホイールの留め具

この留め具は蓋側にネジ止めして、ホイールの中央とベアリングの中央が合致するようにする。ただ、ホイールの穴径はフィラメントメーカーごとに違うようなので、その都度作って印刷する必要はある。

TINMORRY のホイール用のベアリングの蓋側


ダイソーの密封容器に入れる


さて、今回のもう一つの目的として、フィラメントは湿度が大敵のようなので、こちらを参考に、今の湿度の低い冬のうちに、ダイソーの密封容器に入れておきたかった。


そこで、Xiaomi の BLE 温湿度計は Aliexpress で注文し、継手とチューブのセットは Amaon で注文した。


あと、継手をケースに留めるための M6, M10 ナットは東急ハンズで買ってきた。

継手にナットを嵌めてみる

黄銅の継手は M6 のナットで問題なかったけど、銀色の継手の方は、PT1/8 というテーパ付きのネジのようで、M10ナットは入らなかった。Amazon の商品説明には M10 と書いてあるところもあるけど、商品画像の方には PT1/8 と記載されていた。

PT1/8 というのは固定用というよりは、気密性を保持するためのテーパ付きネジのようだ。今回はそこまでの気密性は必要なく、密封容器に固定したいので、黄銅の方の継手を使うことにする。

今回のベアリングホルダーは容器にネジ止めするため、ネジが緩んでこないように、ホイールを右回転で設置することにする。

そして、ホイールがなるべく容器の奥になるように位置決めをして、オートポンチで穴位置をマーキングする。オートポンチも今回初めて購入して使ってみた。子供の頃は、父親がポンチをゴムハンマーで叩くのを見ていたものだけど、今回のように M3 の穴に実物合わせするときは、こういう細くてそのまま押すだけでマーキングできるのは便利だ。

ベアリングの中央は容器にネジ止め。容器左下側に継手

5.5L の容器は大きく見えたけど、ホイールを入れてみると、意外にギリギリというか、ちょうどピッタリという感じ。

そして、ホイールの中心から一番距離をかせいだ位置に、継手を取り付ける。フィラメントが100%の時と0%の時の間ぐらいの半径の位置を見て、高さも半分ぐらいのところに、目分量でオートポンチ。でも半径はホイールによって違うから、あまり気にし過ぎても仕方ないかも。

あとは、上記のページに書いてある、継手のナットに被せるキャップを作って取り付ける。このキャップはフィレット部分がうまく印刷できなかったので、面取りにしたものを作って印刷した。今思うと、STL を Z 方向に反転して印刷すればよかっただけかもしれない・・・。


使ってみて


シリカゲルは 20g x 2 をとりあえず入れている。湿度表示を見ていると、今(2021/01/31)は冬だけど、シリカゲルがあると 10% まで湿度が下がる。蓋を開けると結構すぐに湿度は上がり始める。

温湿度変化(1/17 に容器作成)

あと、シリカゲルも湿度計もぺろっと入れているだけなので、もう少し固定できるようにした方がよい。両面テープで付けようかな?

そして、今のところはダマができるようなこともなく、順調に使えている。

フィラメントの最後の方で軽くなってきたときに暴れないかは、今後要確認!





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)