CAD上での設計は楽しい。砂場で遊ぶ子供のように無邪気に作っては壊しを繰り返して少しずつ要領を掴んでいきました。そのまま3Dプリントでボディを作ろうかと思いましたが値段がかなり掛かるので今回はアクリルとスペーサーを使いましたが複雑な造形を作ろうとすれば3Dプリントが必須になるでしょう。傾斜のつき方が上方向には十分取れたのですが、内側方向には不十分となってしまいました。プレートの設計を妥協したのでしょうがないね。そんな具合に仕上がりました。次はPCBの設計にでもチャレンジしてみようかな。microとUnix系OSの使用を前提として話をすすめる。cloneしてnew_project.shでテンプレートを作る。keyboard/your_keyboard_name次にconfig.hを編集。MATRIX_ROWSとMATRIX_COLSをそれぞれ数合わせ。CATERINA_BOOTLOADERを追加しておくとRESETキーが使えるようになる。ファイルに追加しましょう。MATRIX_ROW_PINSとMATRIX_COL_PINSは以下の画像の紫色の背景のP〇〇がポート番号なのでそれらを列挙。次はお好きにkeymaps/default/keymap.cを定義。microを2つ使ったりして、その2つを通信する必要があるわけです。それらがめんどくさいという方はteensyを使うといいかもしれない。数が多くて事足りるかもしれない。Expanderを使うのであればまずはi2cかSPIの実装が必要です。Expanderの使い方を覚えなくてはいけません。Expanderを使うのであれば、こちらの実装を借りると良いかもです。splitの実装が参考になるかもしれません。your_keyboard_name:default:avrdudeqmk_firmwareのディレクトリトップに戻ってmakeします。Firmwareに対応させるTweet広告を非表示にするもっと読むコメントを書く2017-09-26自作キーボードができるまで他の写真ババーンこれ、私が作りました。batmanっぽいのでbatkeysと名付けました。デザイン的にはkeyboardioとnisseを模範している。それらをさらにコンパクトかつ高さを低く抑えた形となった。使い勝手としては、タイピング速度測定サイトで記録を更新することができたのでいい方と言ってもいいだろう。気になると思うのは親指キー周り。率直なところ親指に役割を持たせすぎると辛い。自分では3キーくらいがベストだと思う。キーを少なくしすぎたのでどうしても親指をフル活用せざる追えない。そのうち慣れてくるでしょう。回顧録さて自作キーボードという世界がある。世の中に普及しているキーボードは人間工学的に好ましくないものが多い。これでも満足しない人たちがいる。いう人たちが足を踏み入れるのが自作キーボードという世界。言いたいがそうでもなく、ただ作って見たかったというだけでそもそもプログラマですらなければデスクワーカーでもない。本当に趣味で、好奇心で、作りたかっただけなのでした。始まりは、twitterでキーボードを作り始めている方を見かけたから。その方はないんさんと言う方でキーボードのモックアップを最初に作られていた。そのキーボードは当時自分が使っていたergodoxと比べてとても小さく、さらに左右分離式で、親指をうまく活用できるようキーを配置してあった。それはとてもかっこよくてSNS引きこもりな自分がついコメントしてしまうほど魅力的だった。その方は、さらに基盤やケース、ファームウェアも自分で作られていて、とても自分が真似できるようなことでは無いとも思った。思いつつも電子工作に子供の頃から漠然とした興味があったので、少しずつ初めてみることにした。unoを買って簡単なプログラムを動かした。highとlow、vccやgnd、抵抗やLEDやタクトスイッチ。簡単なところから一つずつ試していってゆっくり体で覚えて言った。正直なところ、それがなぜそうなるのか、もっと根本的な原理はなんなのか、までは知らない。すればそう動くと覚えていった。慣れていき、次第にキーボードに焦点を当てていった。キーボードの根本はキーマトリックスというものとそれをPC側へキー入力として伝えるマイコン。この二つを覚えればキーボードの仕組みはほぼ覚えたようなものだった。あとは具体的にどのように実用的な形にしていくか。ここが自分にとっては難しいところだった。デザインはどうすればいいのか。デザインをどう形にすればいいのか。そんなこんなしてる間に、他の方のキーボードが出てき始めていた。ゆかりさんやhrhgさん言った方々のとてもかっこ良いものがさらに自分を刺激した。このお二人に共通しているのは3DPrinterを使って媒体を作られていること。これで簡単にケースが作れると知って、fusion360という3DCadソフトを覚えることにした。このソフトとても高機能ではあるがそのぶん難しい。自分のデザインが形となっている様はとても楽しく、それに身を任せてすぐに使い方を覚えることができた。デザインをする上で参考としていたのがesrilleのnisse。それを作られている方のブログ。この方のブログを読み、左右分離型を前提としていた考えを変え、一体型にすることにした。技術的にも一体型の方が楽だというのもある。dmm.makeで3DPrintしてもらうことができたのでそこに注文した。40キーしかないこのサイズだからこの値段で済んでるとも言える。あとはスイッチやキーキャプ、マイコンなどを用意しケースの出来上がりを待つだけ。届いたらあとは根気よく半田付け。今回配線に使ったポリウレタン銅線は少し半田付けにコツがいるようで、最初は苦労したがtwitterでゆかりさんにコツを教えていただいたら、すぐにできるようになったのでありがたい。ハードが出来上がればあとはソフト。キーマトリックスを読み、それを元にキーコードを発行していく。コンパクトなキーボードに欠かせないのがレイヤー。これもすんなり実装できた。tapと呼ばれる機能で一つのキーに修飾キーと普通の文字キーの二つを役割を与える機能。これの実装に手間取った。firmwareに対応させることにした。これも前述のないんさんが記事にされているのでそれにしたがって進めて言った。途中わからないところがあったがすぐにないんさんにフォローしていただいた。おかげでqmk対応もすんなりできたのでキーボードとして満足に機能させることができた。@matsPodさんにRedditにポストしていただいので海外の方からの反応もいただくことができた。英語わかんないので雰囲気だけだけどね。reddit先人たちのアドバイスのおかげで自分もキーボードというものを作り上げることができた。lifegameelmリアクティブプログラミングを軸にした関数型言語であり、Javascriptへ変換されるいわゆるAltJS。Architectureと呼ばれる。worldの代わりにLifegameを書いているので、例によってelmでもライフゲームから始める。ライフゲームお堅い呼び名はセルオートマトン。実態は単細胞シミュレーション。あるセルの状態とその周囲の状態からルールを元に次の状態を決定していく。そのルールは、あるセルの状態1であり、周囲に2つの状態1があれば、次のセルの状態は1。あるセルの状態1であり、周囲に3つの状態1があれば、次のセルの状態は1。あるセルの状態0であり、周囲に3つの状態1があれば、次のセルの状態は1。それ以外は、セルの状態は0となる。コードhttps://github.com/kmtoki/lifegame-elmレコードと呼ばれる、JSのオブジェクトのようなものでまとめて状態管理。Bool)と2次元配列。}上記のルールを関数化したものがこれ。False周囲の状態を調べるのがenv。ルールと周囲の状態を元にセルを更新するのがnext。}ライフゲームの実態は以上のコードで済む。そのライフゲームをブラウザ上でアニメーションすることがelmでは簡単にできる。Viewを基本とし、Subscriptionsでタイマーなどの副作用のある操作などをすることができる。Modelを各関数で引き回し、それを元にViewがHtmlを生成し、ブラウザ上のイベントをMsgという形でupdateへ送信し、各操作へ振り分けていく。面白いのが副作用の扱い方。Architectureが裏側でよしなにしてくれる。OCamlやHaskellとも違うながらも純粋関数的な程を保っている。今回のコードではランダムとタイマーしか使っていないが、この仕組みでWebsocketなども扱える豊かな表現力ある。Architectureとやらのおかげでずいぶん簡単に入門できた。パターンマッチばかりで関数合成が少なくなってしまったが語彙の問題なので覚えればすぐ簡潔にかけるようになるだろう。elm-formatにはちょっと趣味と合わない部分があるが、まあ人様に見やすく編集しやすいコード書式という意味でelm-formatで統一的に合わせていくのは良いと思う。HTMLイベントの発火の分、Msgを追加していかないといけないのは面倒なのでどうにかまとめたいが方法がまだよくわからない。あとTaskという概念もあるらしく、非同期通信などを使う場合は必要になってくるらしい。Haskellで関数型の思考には慣れているので書き味は程よく気持ちのいいものであったが、Haskellと比べ、型安全なライブラリ設計なので冗長的な部分も多々ある。型クラスの導入も議論されているらしいがHaskellの標準ライブラリの型クラス化などを見ている限り、なかなか型クラスも面倒なところがありそうなので、無いなら無いで良いのかもしれない。データ操作が明示的なのも、書くときは面倒だが、読むときに楽できるので良い部分もある。フロントエンドの知識はまるでないので、これを機会に少し覚えていけたらと思うだけで特に勉強しない結末。*/keymap.c最初にqmk_firmwareとは多様なキーボードに対応するための汎用ファームウェアであり、自分でキーマップを変えることができる。普通のキーボードにはない機能があり、レイヤー、タップ/ホールド、タップダンス、マクロなどがある。split、48のキーをどう効率よく使えるか、は悩ましく楽しい問題。48キーで十分と言えるのは一重に「レイヤー」と呼ばれる機能のおかげ。このレイヤーをうまく使い各々のキーマップを作り上げていける。私の場合、4つのレイヤーを作っている。アルファベットやスペース、エンターなどの基本キーを配置したトップレイヤー、記号を散りばめたLowerレイヤー、ほぼ使われないFnキーのRaiseレイヤー、マウスカーソルやクリック、アローキーや音楽再生と音量調整ができるMediaレイヤー。Qwertyトップレイヤーはコード上ではQwertyレイヤーと読んでいる。今時わざわざQwerty配列なんぞ使わんでもよかろうと言う気もしなくはないが、新しい配列を覚えるコストは非常に高く、さらに既存のQwerty配列を前提に設計されたソフトウェアを多用する身としてはなかなか抜け出せない。Qwertyレイヤーの肝は親指にある。親指スペースは当たり前だが、さらにエンターを持ってきた。この2キーはスペースとエンターとして機能すると同時にシフトとしても機能する。これはキーをタップした場合とホールドした場合で挙動を分けられる機能。これによって一つのキーに二つの役割を与えることができる。よって親指シフトを実現することができている。英数とかなの位置はなかなか難しく、当初はQwertyレイヤーに置いていたが誤入力した場合に非常に煩わしいのでLowerレイヤーに置くことにした。多用するキーを入力するのに2つのキーを押さなければならないと言うのは少し納得が行かない面もある。`で全角/半角ができるLower次にLowerレイヤーについて。プログラミングするので記号は全て多用する。その中でもさらによく使う記号を良い位置に置いておきたいがある程度既存の配列と互換性を持たせて置くと、配列を覚えやすいのでそれを優先した結果が上記の配列になっている。defaultの配列ではLowerとRaiseに記号を分けているので少々覚えるのにコストがかかるのではないかと思い、Lowerのみに記号を詰め込んだ。NEXTTABとPREVTABとは、文字どうりタブ移動を一つのキーにまとめたもの。Ctrl+Tab+Shiftで同様のことができる(多分。KC_LCBR)RaiseRaiseレイヤーはファンクションキーを割り当てている。そもそもレイヤー切り替えは脳に負担がかかるものだと思うので、少ないほど良いと思う。Mediaレイヤーはなかなか便利なもので、ホームポジションから手を動かさずマウス操作ができるのでかなり便利。キーボードからマウス操作もできるのもqmk_firmwareの機能。矢印上と右か左を同時押しででカーソルがロックと言うか動かなくなるのでどうにかならないかな。splitというキーボードをみんなで作ろう的な企画が@matsPodさん主催で開催されていたので参加して作ってみることにした。ストレートネックと肩こりに悩まされていたのでエルゴノミクスキーボードへの興味は強くあった。splitのコンセプトにはとても共感した。今回のために半田ごてを買うような電子工作初心者だったので組み立てには手間取った。正確には組み立て自体はすんなりいった。乗りで完成!くらいの勢いで。分離している左右のキーボード同士の通信と左側の一部キーが機能しなかった。Twitterで親切な自作ガチ勢の皆様(敬称)にアドバイスをいただきながら、あれこれ試してみたがうまくいかず、結局一度解体することに。この解体作業中にも問題があったのだろう。それはPCBのランド剥がれ。microを取り外した時にランドが剥がれてしまった。それもピンポイントでシリアル通信に使うピンのところが。それを知識不足から確認せず、なんども分解と組み立てを繰り返していたので無駄な労力が発生した。micro4つ犠牲に。分解に問題があるとはわかったが、何故最初はダメだったのかイマイチわからずじまい。半田付け漏れか、半田が足りてなかったのだろう。micro取り付け前にその裏にくるスイッチを取り付けて置かないと後からつけられない。microは半田吸い取りしても取れない。無理に取ろうとするとランドも一緒に剥がれてしまう。microを用意した方が早いかもしれない。ダイオードの向きをなんども確認した上で次の工程に進む。micro初回書き込みはリセットボタンの押し方やタイミングなどでOS側に認識されるかどうか変わってくるので、諦めず試行錯誤。/dev/tty.usb*などで認識されているかどうかを確認できる。連打が良いという記載もあったが、OS側に認識されたことを確認したら連打をやめること。ないと書き込み中にリセットされてしまうので注意を。左右をつなぐケーブルは4極であるかどうか。3極でも少しハックするば動くらしいが4極が無難。microに書き込む。2017年7月11日(歓喜の瞬間)さて、そんな苦労を重ねて作り上げた通称レツプリ、どれほどのものなのか。キーマップキーマップについてはまだまだ試行錯誤中。英数、かなについては今は小指の斜め下の位置に設定しているが打ち間違いが多い。KC_LANG1/2)で親指位置に持っていけるかと思ったが、どうもLTのレイヤー切り替えが遅いので使い物にならない。MO(layer)なら問題ないのだけども。他にもbackspaceとpの打ち間違い。あとはcの打ちにくさ。cについてはレツプリは完全な格子型配列なので最適な位置よりも少し位置が下にあるように思える。これは自分が小さい頃左中指を怪我して指の形が少し変形していることに由来する。キーマップについては随時変更していくのでレポジトリを参照。firmwareにはキーボードからマウスカーソルを操作する機能があり、それを多用している。デフォルトではカーソルの動きがカクカクだったので、config.hに以下を追加したら解決した。0リストレストあとはリストレストもどうするか。ez純正の物を使っているが、レツプリで十分ergodoxを置き換えられているので、ezは売りに出したい。その時リストレストもセットである必要があると思うので代価のものが必要になる。ゴム素材Ergodox向けまとめ実用性としては結局のところ、なれ。タイピングは身体で覚えるものであると思うので、練習が必要なものであるのは間違いなく、それを使いこなすには労力が必要な物。それでもなお、これを使いこなしたいと思える魅力溢れた美しいキーボードであり、それを作り上げていく過程はとても良い体験だった。お世話になった皆様へ改めて感謝したい。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。