cocot38mini v2ビルドログ
はじめに
cocot38miniは前々から気にはなっていたキーボードではあったのですが、キットとは別にケースやパーツを自分で手配する必要があり、これまでに買って組んだキーボードキットよりも難易度が高そうと感じ手を出すのを躊躇していました。
小さいもの好きの自分としては、普段使っている40%キーボードよりも小さめの30%キーボードを試したい気持ちがくすぶり続けており、namikaze_40pさんの詳細なビルドログを何度も読み返しているうちに、自分でも何とかなるんじゃないかとだんだん思えてきて、重い腰を上げることができました。(背中を押してもらえました。感謝!)
方針決め
3DPサービスでのケース発注や部品の選定など、はじめてのことが多く不安があるため、基本はnamikaze_40pさんのビルドログに沿って、パーツの選定だけ自分でもやってみることにしました。
- tadpole mount、8001 Resin、ベアリングローラー、マグネットカバーの構成にする
- ロータリーエンコーダーは付けない(あとで付けたくなったら考える)
- キットとtadpoleはGREENKEYSで注文する
- ケースはJLCPCBで注文する
- キースイッチ、キーキャップ、コンスルーは手元にあるものを使う
- その他のパーツはモノタロウとAmazonで自身で探し直してみる
ケース発注(JLCPCB)
ケースのデータを見ると、ファイルが二つ増えており、由来を探すとaki27kbdさんの
というポストが見つかりました。Lsnapと付いているのがnamikaze_40pさんのビルドログにあったトップケースの爪の件の対策がされたものかなと思い、まずは
- cocot38mini_v2_ballcover.stp
- cocot38mini_v2_tadpole_bottom.stp
- cocot38mini_v2_tadpole_plate.stp
- cocot38mini_v2_tadpole_top_magnet_Lsnap.stp
の組み合わせでJLCPCBのレビューに出すと、ボールカバー以外について画像の赤いところが薄すぎてプリント時にひび割れたりするリスクがあるよというレビュー結果がメールが届きました。

データを差し替えるかリスク受容するかと問われていたので、トップ、ボトムはリスク受容とし、プレートは厚さを増したデータの方に置き替えて提出したら問題なしとなり、最終的に
- cocot38mini_v2_ballcover.stp
- cocot38mini_v2_tadpole_bottom.stp
- cocot38mini_v2_tadpole_plate_thick.stp
- cocot38mini_v2_tadpole_top_magnet_Lsnap.stp
の組み合わせで発注しました(このタイミングで代金を支払い。初回クーポンが適用されました)。
パーツ発注
以下のパーツを発注しました。
| 品目 | 数量 | 発注先 | 備考 |
|---|---|---|---|
| 25mmトラックボール | 1個 | モノタロウ | エレコム トラックボールマウス用交換ボール |
| 平行ピン | 1パック(7個) | モノタロウ | 必要数:3 |
| シリコンチューブ | 1巻 | モノタロウ | |
| ベアリング | 3個 | モノタロウ | NSK SMR63ZZ |
| マグネット | 10個セット | Amazon | 必要数:8 |
平行ピン(トラックボールを支持するベアリングの軸)については、ビルドガイドにある「ステンレス棒」で検索しても見付けられず、namikaze_40pさんの記事にあるキーワード「平行ピン」で検索して見つけることができました。
ファームの動作確認
センサー基板をPCに接続して、Vialで認識されることを確認。部材が届くまでに keymap.c をいじって自分用のキーマップを準備していたので、ファームをビルドし書き換えの確認も実施。
この時点でキー割り当てが想定とずれていることに気付き、デフォルトファームに戻しても同様でした。ひとまず手元では info.json の "matrix": [3, 4] の行を "matrix": [1, ●] の並びの真ん中に移動してやって想定通りになることを確認。
"layouts": {
"LAYOUT": {
"layout": [
{ "matrix": [0, 0], "x": 0, "y": 0 },
{ "matrix": [0, 1], "x": 1, "y": 0 },
{ "matrix": [0, 2], "x": 2, "y": 0 },
{ "matrix": [0, 3], "x": 3, "y": 0 },
{ "matrix": [0, 4], "x": 4, "y": 0 },
{ "matrix": [0, 5], "x": 5, "y": 0 },
{ "matrix": [0, 6], "x": 6, "y": 0 },
{ "matrix": [0, 7], "x": 7, "y": 0 },
{ "matrix": [0, 8], "x": 8, "y": 0 },
{ "matrix": [0, 9], "x": 9, "y": 0 },
{ "matrix": [1, 0], "x": 0, "y": 1 },
{ "matrix": [1, 1], "x": 1, "y": 1 },
{ "matrix": [1, 2], "x": 2, "y": 1 },
{ "matrix": [1, 3], "x": 3, "y": 1 },
{ "matrix": [1, 4], "x": 4, "y": 1 },
{ "matrix": [3, 4], "x": 4, "y": 3 },
{ "matrix": [1, 5], "x": 5, "y": 1 },
{ "matrix": [1, 6], "x": 6, "y": 1 },
{ "matrix": [1, 7], "x": 7, "y": 1 },
{ "matrix": [1, 8], "x": 8, "y": 1 },
{ "matrix": [1, 9], "x": 9, "y": 1 },
基板の切り離し
メイン基板の枠の切り離しについては、以前組んだkeyballのビルドガイドにあるようにミシン目に何度かカッターを当てて切り込みを入れた後で折り、サンドペーパーでやすりがけをしました。センサー基板にもミシン目を折った跡があるのでそちらも同じ様にやすりがけ。
マウスセンサーのハンダ付け
ビルドガイドに沿ってPMW3360の向きを間違えないよう注意してハンダ付けしました。センサーの向きを示すシルクの●印が見えなかったので、老眼鏡をかけてピン脇の小さな凹みを見て向きを合わせました。が、あとで写真撮って見るとちゃんと●印はありましたね。印刷が薄くて光の当たり具合で見逃してしまっていたのだと思います。

コンスルーの切断と固定
センサー基板とメイン基板を接続するため、コンスルー(もしくはピンヘッダ)をコの字型にする必要があります。

ビルドガイドでは7pinを2つ、6pinを1つで説明されていますが、手元にあったのが12pinコンスルー2つでした。本数や向きの組み合わせは任意とのことだったので、12pinの1つを半分にして6pinを2つ取り、もう1つを切断して8pinを1つ取ることにしました。側面の穴に沿って定規を当ててカッターを繰り返し当てて切断し、サンドペーパーで切断面を軽くやすりがけしました。
あと、ビルドガイドには書かれてなくて自己判断でやったこととして、コンスルーの片側をハンダで固定して抜き差しの際に片側だけが外れるようにしました。手順としては、コンスルーの両側をセンサー基板とメイン基板に挿した状態にして、センサー基板側のみをハンダ付けしました。
手元のコンスルーの余剰がなくなったので、「コンスルーどこで買ったんだっけ?」と調べたら、Amazonの遊舎工房ストアで10本セットを買っていました(そちらは今は買えなくなっている)。遊舎工房の商品ページを見ると高さが複数あり、高さを気にせず進めていたので間違えてないか心配になりましたが、ビルドガイドを見ると要求も高さ2.5mmだったのでセーフでした
キーのテスト
この時点でケースがまだ届いてなかったので、キースイッチだけ嵌めて軽く試し打ちをしました。すると何故かqを押すとqazと入力され(一番上の行の他のキーも同様でした)確認したらコンスルーのハンダ付け箇所がブリッジしてしまっていました。熱したハンダゴテを当て、コテ先に吸着させてブリッジ除去したら直りました。他は問題なし。
LEDが虹色にキラキラしているのを愛でていたらケースが発送された通知がきていたので、届くのを待ちます
ケースへの組込み
数日後にケースが届きました。綺麗!

シリコンチューブを切り、平行ピンに被せ、ベアリングの穴に通します。小さくて難しかったですが何とかできました。


マグネットをトップケースと蓋の穴に入れる必要があるのですが、押し込もうとしても入らない。namikaze_40p さんの記事ではやすりで何とかしたとあったのでやすりを注文。届くまでの間は暫定措置としてマスキングテープを丸めたものを挟んでくっつけて、ひとまず使い始めてみることにしました。
マウスカーソルが動かない
ケースに入ったので使い始めようとしたら早速問題が発生。マウスカーソルが動かない😭。せっかく組み立てたのに使えなかったらどうしようと気持ちが沈みかけましたが、ビルドガイドに沿ってセンサーのはんだ付け後に指をかざしてカーソルが動くのを見ていたことを思い出し、ボールを外してレンズに指を近づけると動く。距離の問題かトラックボールの相性の問題かと少し希望が見えてきて、kazy さんの記事で同じような状況を回避されているのを発見。
kazy さんの対処を参考に、ボトムケースのセンサーチップの穴をマスキングテープで埋めてみたらカーソルが動くようになりました!わずかな底上げで済み、副作用もなさそうです。[1]

マウスカーソルの移動方向の調整
マウスカーソルは動くようになったのですが、向きが思ったのと違っていて、調べていくと ROT_R15, ROT_L15 で切り替えられる範囲が時計回りに90度ずれてたので修正しました。
なお、負の角度を unsigned の変数に入れている問題もありますがそちらはひとまず放置してます(15度単位で切り替えられるのに対し16度のずれなので、-90度にしたくならない限りはあまり困らない。cocot46plus で気づいたときの修正PR)
ちなみにデバッグしようとしたときに rules.mk に CONSOLE_ENABLE = yes と書いても dprintf の出力が QMK Toobox に出てこないなと思ったら builddefs/build_vial.mk で -DNO_DEBUG がビルドオプションに入っていて dprintf が無効化されてました。dprintf の代わりに uprintf を使えばOK。
スクロール方向が保存されない問題
でpicot_O44について報告されているのと同様に、トラックボールによるスクロール方向を反転させても再起動で戻ってしまう問題があります。現状の実装では、EEPROMに保存する対象になっている cocot_config.raw の Low DWORD (= struct の先頭32ビット)から scrl_inv がはみ出てしまう構造になっているため、以下のようにビットフィールドを使って範囲内に収めれば保存されるようになります。(自分は最終的にOS検出の結果を見て起動時に動的に設定変更するようにしたので適用してないですが)
typedef union {
uint64_t raw;
struct {
uint8_t cpi_idx;
uint8_t scrl_div;
uint8_t rotation_angle;
bool auto_mouse : 1;
bool scrl_inv : 1;
uint8_t /* reserved */ : 6;
bool scrl_mode;
report_mouse_t last_mouse;
};
} cocot_config_t;
マグネットの装着
やすりが届いたので、穴を削りつつマグネットを入れていきました。先にボールカバーの方にマグネット4つを押し込み、次に極性に注意しつつトップケースの方にもマグネットを押し込んでいったのですが、ボールカバーに装着済みのマグネットの上に一旦マグネットを積み上げて、ずらしてニッパーの側面にくっつけ、それをトップケースの穴のところに持っていって押し込むとうまくやれました。

まとめ
組み立て終わりました。左右の端からの相対位置で指がキーを覚えているのか、今のところ誤入力が多いですが、キーマップの調整をしつつ徐々に30%に慣れていこうと思います。

-
これによる副作用というわけではないですが、USB端子の抜き挿しをしているとセンサー基板のコンスルーが抜けかけていて、一部キーが効かなくなって気付くというのが何度か起きているので、センサー基板の逆側も押し上げるようにしたほうがいいかもと考え中。 ↩︎
Discussion