トラックボール付き Dactyl Manuform を作った

完成品

背景

同僚が Dactyl Manuform を使っていたのが存在を知ったきっかけでした。 話しているとトラックボール付きもあることまでわかり一気に欲しくなりました。

以下のような要件で作っていくことを決めました。

  • Dactyl Manuform
  • トラックボールは右手側
  • 右手は4x7(Dactyl Manuform としては5x7)
  • 左手は4x6(同じく5x6)

やったこと

3Dプリントするためのモデル探し

Dactyl Manuform は、パラメータを調整してスクリプト実行することで3Dモデルが生成されるスタイルになっています。 bullwinkle3000 さんがトラックボールを付けられるようにしたものを公開してくれています。 そのリポジトリまでの fork 関係はこのようになっています。

今回はこれをさらに fork してちまちま設定、コード、モデルに変更を加えました。
https://github.com/mihyaeru21/dactyl-keyboard

コードをそのまま持ってこなくてもオンラインでパラメータの調整ができるサイトもいくつかあります。ただしトラックボールは付けられません。

各種パラメータを変更するとどのような結果になるのかをまとめてくれているところもあります。 ただし dactyl-keyboard は fork が繰り返されており、どれに対するパラメータなのか正確に把握できていません。
https://github.com/yejianfengblue/dactyl-generator-demo

モデルの調整

fork してきてスクリプトを実行しようとしたところ Docker での実行が壊れているようで最初にハマりました。 コード化まではしていませんが、とりあえずコンテナを作って正常に実行ができる環境を作る方法を README に記載してあります。 src/run_config.json を変更して実行することでいろいろ試すことができます。

最初は OpenSCAD 形式で出力する設定になっていました。出力後のモデルを表示、編集するために OpenSCAD にすこし入門もしてみました。 ところが OpenSCAD ではなく OpenCASCADE 形式での出力の方が新しくなっていたことに時間が経ってから気付きました。
出力の確認と編集のために FreeCAD を使い始めてみました。

パラメータの調整と生成コードの変更によって右手のトラックボール周辺は通常の形状に極めて近いレイアウトをがんばって自作してみました(左)。

親指部分を自作したモデル fork 元リポジトリのデフォルトのモデル

良い感じになったので、これで DMM.make にてプリントを発注してみました。 ところが厚さが足りない(最小 1mm)部分があるとサポートから連絡が来てキャンセルになってしまいました。 スクリプトを1回実行するのに地味に時間がかかったり、どう変更するとどこが変わるのかが難しくこの時点でかなり時間をかけてしまっていていたので、とりあえず fork 元リポジトリのデフォルトのモデルで作ってみることにしました。

3Dプリンタを購入

自宅用と会社用と作る練習用で少なくとも3台は作ろうと思っていたのですが、DMM.make では両手合わせて2万円を越える見積りになってしまい「これなら3Dプリンタを買ってしまっても良いのでは?」という気持ちがすこし芽生えていました。 ここくらいのときに盛大に体調を崩してしまい2週間ほど仕事を休んでしまっていました。その休んでいる間はほとんど横になって過しており YouTube で受動的に動画を観るだけの生活をしていました。 そのときに3Dプリンタの動画を観すぎた影響で異常に物欲が刺激されていて、体調が回復してきた祝いにポチってしまいました。

買ったのは Creality Ender-5 S1 です。 Amazon 的にはこれです(アフィ登録できてないのただのリンクです🙄)。 買ったときは10%オフくらいになっていて7万円台前半でした。 同じく10万以下クラスで高速プリントができる AnkerMake M5 と迷ったのですが、YouTube のいろいろな動画を見た限りでは Ender-5 S1 の方が綺麗に出力できているように見えたのでこちらにしました。 値段が3万円弱安かったのもあります。

パーツを作成

Dactyl Manuform ではコントローラー(Pro Micro)や左右を繋ぐケーブルの接続部を格納する方式として取り外し可能なホルダーを選択できます。 このホルダーにリセット用のスイッチを付けたくてホルダー自体を自作することにしました。

これを行なっているときは3Dプリンタが手元にあるメリットを最大限享受できまた。 それっぽいサイズで実際にプリントしてから実際に Pro Micro などをはめ込んでみて微調整を行なう流れが良かったです。 実際にプリントしてみると余白具合が想定と違って修正が必要だったりしました。

モデル内側 モデル外側 実際にはめ込まれている図

部品集め

部品集めと組み立てには https://github.com/Schievel1/dactyl_manuform_r_track の情報がとても参考になりました。 ただしトラックボールを配置する側の Arduino Micro は不要で左右両方とも Pro Micro で十分でした。

Pro Micro やホットスワップのソケットなど元々持っていたものは記載していません。 わりと個人的なメモでもあるので今回追加で買ったものを列挙してあります。 全体像を掴むには↑と合わせて見ると良いです。 ちょうど良いものを見つけるのが地味に面倒でした。

センサーモジュールのお試し

本体をプリントする前にセンサーが届いたのでさっと動作確認をしてみようとラズパイに繋いで動かそうとしてみました。 そもそも電子回路の知識もぜんぜんなくて SPI 通信という言葉も初めて聞いたようなレベルだったので雰囲気だけ覚えて撤退してしまいました。 QMK Firmware にトラックボールを動作させる機能があるのでそれだけ動かしてみれば良いことに気付いたのでそちらにてやることにしました。

https://qiita.com/mizuhof/items/0c34308c2d57c9345f3a を参考に最小限のキーボードのファームウェアを用意して、そこにトラックボールの設定を追加することで実現しました。 雑にブレッドボードでそれっぽい感じでキーボード側の動作確認をしつつトラックボールのセンサーが動くことも確認しました。よく見るとスイッチングダイオードがないのでキーの方は挙動があれですがスルーで。

センサーのお試し

本体をプリント

STL ファイルをスライサーに食わせて3Dプリンタ向けの形式に変換します。

スライサーの画面

右手は21時間、左手は19時間かかりました。これでもスライサーに表示されていた予想時間よりそれぞれ3時間ほど早く終わりました。

右手をプリント中 右手のプリント完了
左手をプリント中 左手のプリント完了

プリントされたての状態では大量のサポート材がついているので頑張って除去します。この作業が辛すぎました。先にやった右手はニッパーとペンチだけでだらだら動画を見ながら通話しながらやって合計5時間くらいかかってしまいました。さすがにやばすぎたので左手はドリルを使うようにして1時間半ちょいくらいで除去できました。

プリント直後 すこし除去後 除去完了

参考にしていた https://github.com/Schievel1/dactyl_manuform_r_track ではこの時点でヤスリがけをして表面の積層痕を消したうえで塗装もしていました。元々は同様の手順でやる予定でしたが、サポート材の除去で疲れすぎて今回は諦めてしまいました。2台目を作るときはこれにもチャレンジします。

組み立て

まずセンサーモジュールが取り付けられるのか確認してみました。

この取り付け部分はパーツをすこし改造してねじ止めしやすいようにしたのですが、そのときに前提条件を勘違いしており厚みが1mm足りずセンサーが正常に動作しませんでした。これだけのためにまたプリントするのは無理なので厚紙とプラスチック片でゲタを履かせることでなんとか問題を回避しました。

ビットインサートをつけた 基盤にジャンパーワイヤをはんだ付けした ねじで固定

この後はだいたい以下のような流れで作りました。

  • 蓋用のインサートビットをはんだごてを使って入れる
  • 無限の可能性にスイッチングダイオードとホットスワップソケットをはんだ付けしてバラバラにする
  • 本体にキースイッチを装着する
  • そこに無限の可能性をはめる
  • row, col のうち接続すべき箇所を繋ぐ
    • 左手は普通の Dactyl Manuform と同じ
    • 右手はピンの節約のためにちょっと独特にした
  • キースイッチを抜いたときに位置が固定されるようにホットボンドで接着させる
  • ホルダーに Pro Micro とリセットスイッチとTRRSジャックをセットする
  • 各種ワイヤを Pro Micro の正しいピンに差し込む
  • ホルダーを本体にセットして蓋を閉めて物理的には完成!
無限の可能性をはめた 配線を終えた Pro Micro と接続してホルダーをはめた

問題

ホルダーにはでっぱりを、本体側には溝を用意して前後がずれないようにしてみたのですが、その幅が1mmで小さすぎたためにそのままでははまりませんでした。これはかなり頑張ってヤスリで調整しました。

あとで発覚したものですがホットスワップソケットのはんだ付け不良が5箇所くらい見つかりました。本体にセットする前に1つずつチェックしておくべきでした。

ジャンパーワイヤが内部で断線しているケースも1つだけありました。

ファームウェア

QMK Firmware については他のところでも情報があるしさらっとしておきます。 ここに今回作ったやつを置いてあります。
https://github.com/mihyaeru21/qmk_firmware/tree/mihyaeru/keyboards/handwired/dactyl_manuform/mb_v1

トラックボールというかポインティングデバイスについてはこのドキュメントを参照します。
https://github.com/qmk/qmk_firmware/blob/master/docs/feature_pointing_device.md

以下ができるので通常のマウスというかトラックボールでできることは全部できるはずです。

  • 左・中・右クリック
  • 上下・左右のスクロール
  • 戻る・進むボタン

完成してみて

雑にいろいろ書き出し

(メモしていたところからコピペ)

  • controller holder にすると半田付けが辛すぎた
    • TRRS とタクトスイッチは基盤つきのやつにした方が良い
    • そうなると holder ではなく直接つける方式でも良さげ
  • 無限の可能性に半田付けした時点で電気的な疎通確認をしておいた方が良い
    • ワイヤーの疎通確認も必要
  • WILD の下2つのボタンは押しづらすぎる
  • 右小指が遠い
    • 人差し指内側にもう1列追加する方が良いのかも
    • 小指は内側に反らせるとか良いかも
  • マウス用途にレイヤーをトグルするケースを想定するとディスプレイがあるのも良い気がしてきた
  • パームレストを接続したい
  • 左右の位置を固定するソリューションが欲しい気がする
  • 蓋はプリントしてすぐ剥がすと反ってしまうので冷めてからにする
  • 蓋を固定するためのネジ穴が小さかった
  • ヤスリがけと塗装はやりたい
  • 逆さまにしてもボールが落ちないようにしたい
  • トラックボールモジュールを固定する部分の厚さがダメだった
  • ハンドワイヤリングが辛すぎ
  • 固定用ボンドは動作確認が完了してからの方が良かった
  • トラックボールはベアリングだと微妙
  • ダイオードは表面実装の方が望ましい
  • キーピッチはもうちょい狭くしたい

感想

けっこう遠回りしていろいろやった気がします。 そのおかげで道具もいろいろ揃えたし経験も積めました。 実際に完成したものを使ってみて改善したい点がたくさんあるのでゴールは遠そうですし、いろいろ作ってみたい気持ちになっています。

ちょうど1週間、仕事含めて実際に使っています。湾曲していたり配列が普通と違う部分があってまだまだ体が慣れないです。冒頭の写真は左右を1枚に収めるためにすぐ近くに置いていますが実際には肩幅くらい離しています。これによって肩が丸まらないようになってきたような……🤔

一番の目的だったトラックボールは理想的な触り心地ではないもののめちゃくちゃ便利です。図形描画のような細かいマウス操作を多様するもの以外はほぼすべてキーボードに付属のトラックボールで余裕でやっていけています。PC に向かっている間、両手はほぼ常にキーボードのところにあります。ここについては想定通りになって安心しました。

この記事を書きつつ今回プリントしたモデルを Elecrow の自動見積りに投げてみたら一番安いレジンで$60くらい(送料別)であることがわかってしまいました。 3Dプリンタを買った理由の一部がなくなってしまいましたが試作パーツを手元でプリントできるようになったのは想像以上に良かったので気にしないことにします。