hyousi

  • Home
  • 一覧
  • ZENAIM KEYBOARD TKL 磁気キーボード紹介

     ZENAIMを入手したので紹介します。触ってみて思ったことを書いているので使い込んでの使用感はわかりません。

    分解

     横幅38センチ程度あります。かっこいいですしフローティングデザインは小指の腹でctrlを押す私にとって魅力的です。
     打鍵音が非常に大きいです。
     キーキャップは18.2mm角で1mm厚です。

     滑り止めとチルトスタンドがあります。チルトスタンドは樹脂筐体の強みですね。そうでなくとも私自身はキーボードの樹脂筐体に肯定的です。ちゃんと構成すれば騒音でないですし何より軽いです。
     デザインを感じます。プレートは板金なんでしょうか?

     キーキャップを外しました。choc v1的なのです。手測ですが1.25×2.85mmの軸が5.65mmピッチで配置されています。

     キースイッチを取り外してみました。プレートと基板の間にフォーム等はありません。
     補正値をユーザー側で入れられなかった時期はZENAIMのスイッチを外し異なる箇所にはめることはご法度でしたが、今はユーザーキャリブレーションが実装されたらしいですね。

     キースイッチを分解してみました。直方体の大きな磁石が使用されています。上から挿入するのは非十字ステムならではです。
     ショートストロークでありながらロープロファイルでないスイッチです。逆に一般的なロープロスイッチはストロークが3.3mmとかあってロープロでありながらショートストロークではありません。ロープロとショートストロークをごっちゃにしてはいけません。

     スタビライザーを取り外してみました。プレートマウントでクリップインです。

     15点止めのアルミプレートは1.4m厚です。スイッチをはめた状態でも押すとたわみ感があります。

     プレート裏に一か所だけ柔らかいフォームが張り付けてありました。なんでしょうね。

     小さなスポンジ片はここのスルーホールにあてがわれていました。なんだろね。
     やっぱりホールセンサ上の銅箔パターンは無くした方が良いのでしょうかね。機器がないので実際にどんな影響がどれだけ及ぼされるのかわかっていません。

    プレート裏にはボトムケースにはめるガイドのように固めのフォームがぐるっと貼り付けられていました。

     5点止めの基板を取り外しました。ボトムケースはリブが入っており中央にエプトシーラーが貼り付けられています。ねじ止めはすべてセルフタップです。
     層構成自体は安い中華デバイスのようで、何が言いたいかというとそりゃ音でかいよなということです。

     基板は1mm厚です。やっぱり磁気キーボードは薄いほうがいいですよね。

     コントローラーは170MHzクロック5MSPSADCFPu搭載のSTM32G473です。フラッシュも載せてますね。LDOはでかいものを使用していますが発熱対策でしょうか。
     基板を見ると一目瞭然で、なぜZENAIMのUSBが右出しなのかがわかります。マイコンがでかいからキーがないTKL部に配置する→USBを真っすぐ引っ張る→右側に出た。でしょうか。
     では60%はどうなってるのか?最もスペースがある2.25Ushift裏に配置でしょうか。TKLから列数減って48ピンpkg使えたりもあんのかな。プレートマウントスタビだと使える面積増えるなと思うなどしました。

     磁気キーボードは各社いろいろな部品を使用してキースキャンしています。ZENAIMではFETで行ごとに電源をオンオフして列を読み取るcol2rowのようなマトリクススキャンをしている のではないかと想像します。

     消費電力を見てみるとメカニカルと比べると大きいですがふつう500mA制限と思えば余裕があります。
     fun60proは230mAでした。このチェッカーはアリエンテックのUT70です。

     ホールセンサの電源部にオシロを当ててみました。これを見てどう思うかは人それぞれだと思うのですが、(設計意図は知らないけど勝手に)私はいいなと思いました。

    エアプZENAIM語り

    ・価格改定と新製品発表
    新製品リリースのお知らせ-ZENAIM
     昨日、値下げと60%サイズの販売アナウンスがありました。50,000円は私としては払えなかったですが、30,000円なら検討できる価格と思います。
     一方で製品価値がだいぶ下がったなという残念さもあります。まあそもそも客でない私が言えることではないです。設備投資回収したし稼働率上げるべみたいなことなんですかね知らんですけど。
     色々試して勉強するには大陸系の製品は素晴らしいですが、一方で即値下げ即モデルチェンジ即ディスコンや公称値競争がないだけでも腰を据えた選択肢としてZENAIMというか国産ブランドは強く思います。発売から2年経ってますからね。

     私がなぜZENAIMを買ってこなかったか、貧乏, 配列, 設定自由度, 等の個人的で的外れな理由は置いておいて、
     一般的な実機に触れた感想としてはカチャカチャと騒音打鍵音、キーキャップ塗装劣化、で購入に至りませんでした。とはいえ当時の感覚として打鍵体験がよいよいと言われている磁気キーボードのほとんどが実際のところ全然打鍵体験が悪いしカチャカチャうるさかったということはあります。ゲームに打鍵感も打鍵音も関係ないでしょという人ですがそれでも気になる音の大きさでした。
     ここは価格改定と同時にフォームが追加されるようなのでそれでどれくらい反響を抑えられるのか次第では、またキーキャップの塗装改善次第では、これらの気になっていた欠点がなくなり非常に良い製品になるかもしれませんね。

    ・1.9mmショートストロークスイッチ
     そもそもストローク長くても機敏に反応するのがDynamic入力なわけで、ショートストロークはある種相反する要素であります。しかし現実としてユーザーは理想的な運動ができるわけではないですから実際のところショートストロークというのは理にかなっているのでしょうね。
     例えばノートパソコンのキーボードを考えるとストロークが短すぎ、指をキートップにつけたままだとストローク動作がしにくく感じます。運動には予備動作が必要ですが、過剰なショートストロークは遊びがなく予備動作を許しません。
     私がゲーミングには立体的な形状のエルゴノミクス?キーボードが良いと言うのはそういうことになります。
     するとどうなるかというと、指先をキートップから離してタイピングを行うこととなります。ノパソはモバイルのためのショートストロークもといロープロファイルなのでそれでよいのですが、ゲーミングとなると話は変わります。私は指先はキートップに触れてた状態でプレイするべきという考えなので、予備動作を妨害するようなショートストロークは悪影響というわけです。またその点でいうと予備動作を存分に許しながら機敏に反応するためロングストロークなDynamic入力の方が理論的にはいいと思うわけです。理論的には。
     ではZENAIMの1.9mmはどうかというと短すぎると感じますが慣れればちょうどいいくらいかなと思いました。どの程度口を出したのかは知らないですがプロが監修しただけはある設計値なのかもしれません。

     そんな個人的なことよりも、ショートストロークが磁気スイッチと相性がいいということがシンプルな強みだと思っています。磁石が離れることによる磁力減衰はリニアではなく、より高次で距離減衰します。つまり磁石が離れるほどホールセンサの解像度が悪化し、ラピトリ制御の精度が悪化します。例えば同じ基板同じ磁石で、3.5mmストロークと1.9mmストロークのスイッチを準備したとします。するとショートストロークの方が1.6mm分解像度の悪い領域を使わずに済み、低ノイズで精度のよい領域だけで使え、より短いトリガー距離を謳えると思っています。
     また、MXタイプのスイッチに入っている磁石よりZENAIMスイッチの磁石は太く長い磁石を使用しています。よく知らないですが磁石はでかいほうが強く、磁石固有の磁力の距離減衰を抑えられると思っています。

     減衰が効いてくるのは精度だけではありません。隣のスイッチを押したときに磁気干渉し、キーが誤入力切れされてしまうのではないかと心配することができますよね。キーアイソレーションも強い磁石?の方が有利に働くと思っています。そういうのもうまく補正するように補償していたりするんでしょうかね分からないですが。

     素晴らしきZENAIMスイッチですが気になる点が一つあります。LEDライト用にスイッチに突起が出ていることです。この突起のせいで14mm角の穴にはめることができずMXタイプとプレートが共用できないのです。あとスイッチ単体で販売してくださいお願いします。

    ・省電力
     よく磁気キーボードで電力が足りないなんてことを目にしますよね。その通りで、ホールセンサを60個とか常時起動しながらコントローラーも高速スキャンをし続ける。ただ文字を入力するだけの機械とは思えないほど電力を消費します。

     私は最近はわざわざ磁気キーボード使うんだからそういうものとしてむしろ全力で電力を消費すればいいじゃんと思ってきています。これこそがゲーミングだとむしろ電力バカ食い肯定です。PCが古かったりするとUSBからちゃんと規格通りに電力供給できないとかざらですからパワー全開磁気キーボードにはセルフパワーUSBハブをおすすめします、8k対応=USB2.0でありUSB2.0に対応していないものなど売っていないですからよくわからない謳い文句以前になんでもいいからセルフパワーのハブを使おう。

     それは置いておいて、ZENAIMは優れており500mAに対して大きく余裕のある消費電力です。つまりZENAIMはたかが文字入力デバイスキーボードごときとしての尊厳を保持しているのであります。セルフパワー前提の磁気キーボードは、当然のように300W消費するグラボのような特殊な用途でのみ使用されるデバイスなのであります。私はもはやそのことに肯定的になりつつありますが、ZENAIMは唯一の?良心です

     


  • [自キ]遊舎工房のレーザー加工サービス利用してみた

     最近レーザーカットしたいものが増えてきました。かといって家庭用のレーザー加工機は出力やサイズや値段やでいいバランスのものがなく外で加工するしかないかなあ。
     持ち込みで加工してくれたり貸し出しを行っているfab等がありますが億劫である。
     ということでyushakoboでレーザーカットサービスを利用してみました。

    yushakobo

     yushakoboでレーザー加工サービス (その2)というものが販売されており、今回はPORONの3mm厚を利用しようと思います。お得そうなのでサイズは500x300mmで。
     レーザー加工サービス デザインルールのページを確認します。Adobe Illustrator, Inkscape, Affinity Designer 2あたりのソフトを利用し作成するようです。以前セールで使い道もなくAffinity2を購入していたのでAffinity Designer 2を使用したデータ作成をしたいと思います。

     フォーマットとしては内側の抜きパターンと外形パターンとでRGBの色分け(加工順)と線幅を指定の細さにする必要があります。ここら辺はAffinityでの処理でしょうか。

     図形パスの連結と重複の禁止も行う必要があります。こちらはCADソフトで行おうと思います。Affinityに慣れている人は最初から最後までAffinityで完結したりするのでしょうか?
     無料のCADソフトだと連結機能が無いものも多いのでその場合はAffinityで連結処理を行う必要がありそうです。fusion360なんかもないですよね、そもそもfusionは2D図面作成に向いてなさすぎます。nanoCADという無料ソフトはポリラインを使えてかなりいいソフトだなと思いますおすすめです。重複の禁止は厄介な印象ですがどうなのでしょう。図形のbool演算行えるソフトがあるとmergeしてbreakするだけで楽そうですがそんなもの持っていない。
     KICADはフットプリント活用しつつポリライン作成できてDRCで重複も見れるのでこの用途だと割とバランスがいいのかもしれませんね、2D図面作成に向いているとは思わないですが。

     題材としては先日購入したphoton用のフォームを作ってみようかなと思います。フォームが必要かというと無いほうがらしいのですが試して遊ぼうと思います。

    KICAD

     基板を作るわけではないですがフットプリント活用してデザインできるのでKICADから図面作成してみます。
     スイッチプレート用のフットプリントを配列通りに並べ、図形ツールでスタビとスイッチの間などを調整します。狭すぎるところなど消してしまいます。
     トップケースねじ止め箇所やコントローラー部も抜きパターンとして図形を追加しています。

     スイッチの穴はレーザーカットのパスとしてそのまま四角で一筆書きできるのでいいですが図形が合わさっている所(2U~サイズや外形に接続する箇所)を一筆書きできるようにする必要があります。
     図形ツールにポリゴンという便利なものがあるのでポリゴンを使用して一筆書き図形を作成していきます。KICADのスナップは同レイヤーの各図形の頂点にしかスナップしない(図形同士の交点や中心点にスナップできない)と思うので、スナップしたい点には頂点を配置されるように図形の調整をしておきます。

     ポリゴンで2U~のスタビと外形部を作成し、ガイドとした図形は消しました。
     KICADはedge.cutsの重複があると3Dビュワーが正常に表示されず、一目で重複の確認ができるのが良いですね。DRCで位置もすぐ特定できます。
     3Dビュワー表示されました。よさそうです。

     後から線幅をまとめて変えたりできなさそうなのが不便ですね。そこはaffinityで行います。

     これ一つの作成だけなのでKICADで完結しましたが重い仕事量になるならフットプリント配置してdxf出力→cadで編集の方がイライラは少ないかもしれないですね。
     製造ガーバー出力からedge.cutsをsvg形式で出力します。

    Affinity Designer 2

     KICADから出力したsvgファイルをAffinity Designer 2で読み込みます。
     図形を選択すると上部のリボンから色と線幅を変更できるようです。デザインルールに合わせて変更しますが線幅が指定の細さだと見えなくなってしまったので0.3ptとしています。

     パスの連結はノードツール→カーブの連結で行えますが線の端同士がしっかりくっついていないとずれたり交差したりしそうですがどうなんでしょう。
     KICADで雑に並べたものを持ってきてカーブの連結、図形をまとめてしまってから不要なノードを消してポチポチするのでもいいかもしれないですね。

     svg単体で開いたのち、yushakoboからダウンロードしたテンプレートにコピーし配置しました。画面右下の変形タブで、選択図形の参照点を選んで動かせるので配置作業はしやすいですね。

     この編集した生ファイルをそのまま提出すればいいみたい。
     以前inkscape触ったときは使い方分からんとなって放置していましたがこれなら図面入れて色変えるだけでした。

    注文

     レーザーカットを注文後、受付メールが届くので、データを添付し発注完了でした。時期によるのでしょうが今回は注文から10日程度の納期でした。
     細い箇所も問題なくカットされています。

    おわり

     データのみの用意で注文できるので使いやすいサービスと思いました。0.2, 2, 3, 5mmのフォームであれば気軽に使っていきたいところです。
     他素材や厚みが欲しいこともあると思うので、他社サービスもいろいろ試してみたいと思います。


  • [自キ]磁気キーボードを作りたい。7週目

    ダイジェスト⑦

    磁気スイッチ触り

     photonに購入したり頂いたりしたphylina,kom,jadegaming,tiheをつけて打鍵比較してみました。

    ・トップアウト
    KOMは大きな音。トップアウトでポスポス鳴る。押さずにステムを揺らすとカシャカシャ鳴る
    次いでjadegamingもステムを揺らすとカシャつき、phylinaと続きtiheが良い感じ
    komとjadegamingは濁り、phylinaは高音より、tiheは低音より

    ・ボトムアウト
    ターンと強く押すとkomは濁った音に加えてトップアウトと同様パスっと音が出る。
    jadegamingはパチッと鋭い音が鳴り、phylinaモニタ傾向でやや高めの音
    カチカチ普通に押すとtiheとphylinaはカッカッと小気味よくなり、こちらはtiheの方が高い
    komは全体的にカシャカシャしている
    jadegamingじゃ強く押すとパチッとなるが普通に押すと低い地味で耳触りの良い音が出る

    ・ストローク
    jadegamingは擦れ感が強い。その点tiheとphylinaはスムーズで優秀
    komはばねがすげーカシャカシャする。ばねが強いため安定感はないもののスムーズ
    jadegamingはブレ感が気になる。
    このブレ感やスムーズさは所謂ラピトリ精度とかとはまた別の話です。

    ・返り
    komは押し込みが軽く帰りが早い
    jadegamingは過重変動少なく重め感で普通のリニアな感じ
    tiheは普通の軽めのリニア
    phylinaはなんか、

    tiheが総じて良く感じたがいい音と静音性はまた別の話ではある。
    以前はkomやjade系は全体的に打鍵感や打鍵音が絶賛されていた印象だがよくわからなかった。
    phylinaも絶賛されていた印象で買ってみたがタイピング体験としてもゲーム体験としても正直よくはな気がした。でも安いのでいいと思う。
    なんかでっかいステムのスイッチが多く出ているけれど、でっかいステム族自体がでっかいステム族のスイッチで分類できる気がして、tiheやastrolinkのような普通のタイプの方が好きかもしれない
    astrolinkもtiheと似たような感じだったがトップアウトがちょっとうるさい。

    精度がというのが大きな問題なのかもしれないが1umで動作するキーボードは持っていないのでわからない
    継続的に色々出てるから気が向いたらまた新しそうなの買ってみる

    追記 polar proを買ってみた。top側で軸が緩め。ボトムアウトではタイト。打鍵音はローピッチ目。返りでの指への追従性が良く、明確なメリットがある。打鍵感はクリアだが固め。

    ファームウェア作るぞ

     さて、ハードはいったん置いておいてキーボードとして動かすためのファームウェアにとりかかろうと思います。
     とりかかって大分たったのですが中々備忘録るやる気が出ずずるずると来ている

     結果としては、すべてをqmkに対応させたファームウェアで製作しようという方針になっています。そもそもでいうとゲーム用左手デバイスであればキーマップなどゲーム側でいじればよいのでありラピトリ設定のみいじれればいいのですからarduinoでそのまま作ってしまえばよいのであります。
     そうせずqmkでやろうというのは、自作磁気キーボードが普及すればいいなと思うためです。そのためにはゲームデバイスに限らずタイピングも行えるキーボードが必要で、タイピングを行うということはキーマップのまともな設定ソフトが必要で、それはqmkしかありません。
     なぜ自作磁気キーボードが流行らないのかというと誰も求めていないからというのが私の考えです。だってそうですよね、私自身立体形状筐体に限定して価値があるとして製作しているわけですから。つまりプログラムだの組み込みだのに一切経験も知識もない私には難しいのですが、自キで色々活動されている方からすれば自作磁気キーボードを作るのは緒ちょいのちょいなのでしょうけれど、無意味だからやっている人が少ない、というわけです。
     何もわからないのでハードに引き続き無料ai君頼りで進めます。

     さてではどのような構成でqmkに対応させようとするべきかというと、自作磁気キーボードをやってみようと思えるほど、簡単に準備ができることが必要です。そのためにはホールセンサやマルチプレクサ等のメカニカルにはなじみのない部品こそ使いますが安価で馴染みのあるrp2040を使用することです。rp2040zeroとかだな。もちろんゲーマーの方からすればrp2040でできあがるものにはいろいろな面で性能には足らないでしょうがそれはまた別畑の話でそのはるか先です。

     ゲーム用ならば設定など不要と言いましたが、タイピングも行う60%サイズなどの磁気キーボードを想定したとき、やはりソフトウェアはvial-qmkに対応していなければ使う気が起きません。私のように自作キーボードに取り組む一方ゲーミングデバイスにこだわりがあったりゲームを遊ぶという人は多くなくとも少なくもないと思うのです。
     そういう人、それこそ標準的な配列以外を好んでいる方はそこそこのラピトリ最高の設定ソフトor最高のラピトリそこそこの設定ソフトであれば間髪入れず前者を選ぶのではないかと思っています。

     というわけで誰でも簡単に自作磁気キーボードが作れるようにrp2040でqmkに対応させます。qmkのファイルも極力configをいじるだけで済ませられるようにします。その後、ラピトリ等の設定を行える別途ソフトウェアを作ります。という展望となります。

    qmkでADC入力

     今までqmkではただkeyboardjsonを書くだけのことしかしてきていないですが、ホールセンサでのアナログ出力から判定を行う必要があるのでscanをカスタムする必要があります。
     初めてのカスタムマトリクスです。そしてカスタムマトリクスの中でADC入力を受け取るように設定する必要があります。
     何がだるいってもはや写真など一枚も出てこずしばらく永遠に文字とアルファベットの羅列だけの内容になるのが書くのも見るのもキツイだろなんだこれ

     まずこの前のテスト基板どんな内容なのというところですが⑥から雑図を持ってきます。

     rp2040ボードのADCピンに2つのMUXが接続され、MUXにはホールセンサが複数接続されています。
     またMUXにはrp2040ボードのデジタル出力ピンがつながっています。

     マルチプレクサはrp2040からのデジタル出力により接続されたホールセンサから一つを選択あるいはオフにし、選択されたホールセンサからの電圧出力をrp2040のADC入力に通します。
     つまり使用しているADCピンは一つですがmuxにより今回だと8つのホールセンサ出力を受け取るように拡張されています。

     デジタル出力を制御することで電圧値を読みたいホールセンサを選択し、ADCで電圧を読むだけです。読んだ電圧値から判定を行いキーをオンオフするわけです。

     とりあえずラピトリどうこうでなくカスタムマトリクスの実装とADC入力の確認を行いたいので、まずは読みとったADC値をある閾値でオンオフ判定を行うようなものを作りたいです。

    カスタムマトリクス

     カスタムマトリクスというのはただ指定したピンでcol2rowだとかrow2colだとかdirectpinsじゃない方式でマトリクススキャンしたい時に自分で実装するというやつですね。二乗マトリクスとかなんとかそういうキー数いっぱい増やすやつで馴染みが深い気がしますが私は使ったことがありません。

    ドキュメント

     まずはqmkドキュメントのCustom Matrix項をgoogle翻訳して読んでます。https://docs.qmk.fm/custom_matrix

    QMK は、デフォルトのマトリックススキャン ルーチンを独自のコードで補足または置き換えるメカニズムを提供します。
    この機能を使用する理由は次のとおりです。
    キーボードのスイッチとMCUピンの間に追加のハードウェア
    I/Oマルチプレクサ

     このスイッチ以外のハードウェアを追加というのが今回ですね。

    カスタムマトリックスの実装には通常、追加のソースファイルのコンパイルが必要です。一貫性を保つため、このファイルは という名前にすることをお勧めしますmatrix.c。
    キーボード ディレクトリに新しいファイルを追加します。
    keyboards/matrix.c
    新しいファイルのコンパイルを設定するには、以下を追加しますrules.mk:
    SRC += matrix.c

     keyboard.jsonと同じディレクトリにmatrix.cというファイルを作成しその中に新規マトリクススキャンの中身を書きます。
     それを使用したファームウェアを作成するには一緒にコンパイルされるようにする必要があり、rule.mk内にSRC += matrix.cと書く必要があるようです。

    lite
    様々なスキャン関数のデフォルト実装を提供し、カスタムマトリックスを実装する際の定型コードを削減します。設定するには、以下を に追加します
    Full Replacement
    スキャンルーチンをより細かく制御する必要がある場合は、完全なスキャンルーチンを実装することもできます。設定するには、rules.mkに以下を追加します。

     カスタムマトリクスにはliteとfull replacementの2種類があるようです。
     両者で記述する関数が異なり、例えばfullでは”matrix_scan“ですがliteでは”matrix_scan_custom”となっています。fullの方が自由度が高そうでliteは一部だけ書き換えるような感じですが、調べてみます。
     qmkmsysでgrep -r “matrix_scan_custom”コマンドを実行します。該当するファイルを検索してくれるコマンドで色々調べるのによく使いまいしたので覚えました。

    quantum\matrix_common.cにヒット 見てみます。

    __attribute__((weak)) uint8_t matrix_scan(void) {
      bool changed = matrix_scan_custom(raw_matrix);
    #ifdef SPLIT_KEYBOARD
      changed = debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, changed) | matrix_post_scan();
    #else
      changed = debounce(raw_matrix, matrix, ROWS_PER_HAND, changed);
      matrix_scan_kb();
    #endif
      return changed;
    }

     matrix_scan関数の中でmatrix_scan_customが呼び出されており、その後デバウンス処理らしきものが行われています。
     fullはこのmatrix_scan全体を書き換え、liteはマトリクススキャン部分だけを書き換え、その後自動でデバウンス処理が行われる感じでしょうか。今回はアナログ入力でデバウンス処理は不要あるいは実装するとしても別の形なので、fullでよさそうです。
     attribute((weak))というのは他に同じものが定義していたら上書きする、のようなものらしい。今回のようにmatrix.cを実装する際はそちらを優先する感じでしょうか。

    Full Replacement設定するには、rules.mkに以下を追加します。
    CUSTOM_MATRIX = yes
    matrix.cキーボード フォルダー内のファイル
    に次の関数を実装します。
    matrix_row_t matrix_get_row(uint8_t row)
    void matrix_print(void)
    void matrix_init(void)
    uint8_t matrix_scan(void)

     rule.mkにCUSTOM_MATRIX = yesを書くことでfull replacementのカスタムマトリクスが有効になります。
     またmatrix.c内にはこのような関数を実装すればよいみたい。matrix_printはデバッグような感じなので置いておきます。基本的にはすでにあるデフォルトで読み込まれるものを見れば理解でき得るはずなので、参照しながら関数を一つ一つ見ていきます。マトリクススキャン部は基本的には下記ファイルにありそう

    quantum\matrix.h
    matrix.c
    matrix_common.c

     スキャン以外にも、qmkの機能的な部分はquantumフォルダ内のファイルを探すと情報がみつかりそうです。

    matrix_get_row

     matrix配列のrow番目を取得する関数のようです。

    inline matrix_row_t matrix_get_row(uint8_t row) {
    // Matrix mask lets you disable switches in the returned matrix data. For example, if you have a switch blocker installed and the switch is always pressed.
    ifdef MATRIX_MASKED
      return matrix[row] & matrix_mask[row];
    else
       return matrix[row];
    endif

    matrix_common.c

     matrix[]はというと、行数個の要素を持った配列で、デバウンス後のキー状態が格納されています。現在のキーボードとしての各キー入力状態といったところでしょうか
     先ほど見たmatrix_scanの中でdebounce関数の中にraw_matrix[]が引数となっていますから、きっとdebounce関数で処理されてmatrix[]になっているのでしょう。
     このキー状態配列はmatrix.c内で定義されているのでカスタムマトリクスでも同様に定義する必要がありそうです。

    /* matrix state(1:on, 0:off) */
    extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values
    extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values

    matrix.c

     matrix_get_row[]やmatrix[]の型であるmatrix_row_tはmatrix.hにありました。列数に応じてサイズが変更されていますがこれは単に容量削減でしょうか。
     matrix_row_t型はcolに関係のある型と分かります。これはつまりマトリクスのある行のキー状態を表しているようです。

    if (MATRIX_COLS <= 8)
      typedef uint8_t matrix_row_t;
    elif (MATRIX_COLS <= 16)
      typedef uint16_t matrix_row_t;
    elif (MATRIX_COLS <= 32)

       typedef uint32_t matrix_row_t;
    else
      error “MATRIX_COLS: invalid value”
    endif

    matrix.h

     例えば4行5列のマトリクスを想定したとき、0がオフ、1がオンでこのような状態の時、matrix配列のrow番目にはrow行目の各colの状態がビット列で格納されている感じでしょうか。1次元配列にビット列を格納することで2次元マトリクスのデジタル状態がわかりますね。

    col4col3col2col1col0
    row001000matrix[0]=01000
    row100110matrix[1]=00110
    row200000matrix[2]=00000
    row300001matrix[3]=00001

     話は戻ってmatrix_get_row関数は指定した行のキー状態を渡していることがわかりました。知りませんが、スキャン後のqmkとしてのキーボード入力処理のところでこれを呼び出してキー状態を把握しているのでしょうかね。

     matrix mask?走らないので行わなくてよさそうですしキー状態を渡させるだけなので、ここは流用でよさそうです。

    matrix_init

     スキャンを開始する前にキーボード起動後諸々の初期化を行います。matrix_common.cにひとつ、ありますがこちらはカスタムマトリクスliteで使用するものなので無視します。

     matrix.cの中にもmatrix_initがあります。これが通常使用されるものでしょう。
     キー状態の初期化及び、ピンの初期化を行っています。

     matrix_init_pins関数でピンの初期化を行っています。matrix.c内でを追うと、スキャン方式でif分岐しています。確かにcol2rowとrow2colとdirectpinsとではピンの使い方が異なりますね。分岐するのもあってinitの外で定義されているのでしょうか。
     内容としては使用するピンをinput/output high状態にしています。directpinsは常にinput highにしてスキャンしますし、ダイオードのマトリクスでは任意の行or列をoutput high→lowにして対するinput highした列or行を呼んでlowになっているかどうかで判定するので、その通りですね。

    void matrix_init(void) {
    ifdef SPLIT_KEYBOARD
    ~ //分割用、割愛
    endif
    // ピンを初期化
    matrix_init_pins();
    //マトリクスを初期化、配列内全部0にしてすべてオフに
    memset(matrix, 0, sizeof(matrix));
    memset(raw_matrix, 0, sizeof(raw_matrix));

    //デバウンス初期化
    debounce_init(ROWS_PER_HAND);

    //ユーザー定義用
    matrix_init_kb();
    }

    matrix.c

     カスタムマトリクスする際は入出力ピンの状態と、スキャンする際に使用する配列等に初期状態、すべてオフなどを実装しておけばよさそうですね。
     磁気キーボードの場合はキャリブレーションやラピトリ設定値等のプロファイルを読み込んでおくのもここでしょうか。

    matrix_scan

     こちらもmatrix.c内にあるものを確認します。
     col2rowとrow2colとでif文分岐しています。これはmatrix[row]配列という形でrowごとにまとまりとしてキー状態を保存しているため向きが異なると順序が逆になるためです。

     col2row,directpins・・・行ごとに走査するためmatirx[row]を1桁ずつ埋めていけばよい
     row2col・・・列ごとに操作するため、桁ごとにmatrix[row]を選択し埋めていく

     matrix.c内のmatrix_read~関数を追うと結果としてcurr_matrixに現在のキー状態が格納されています。その後前回のキー状態raw_matrixと比較、変更があったらraw_matrixに反映しデバウンス処理。
     デバウンス処理した結果から帰り値としてのchanged判定とおおもとのmatrix配列更新を行っています。

    uint8_t matrix_scan(void) {
      //一時データを初期化
      matrix_row_t curr_matrix[MATRIX_ROWS] = {0};

    //directpins, col2rowの時
    if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW)
      // matrix_read_cols_on_rowで行ごとにスキャン
      for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) {
        matrix_read_cols_on_row(curr_matrix, current_row);
      }
    //row2colの時
    elif (DIODE_DIRECTION == ROW2COL)
      // matrix_read_rows_on_colでcolごとにスキャン
      matrix_row_t row_shifter = MATRIX_ROW_SHIFTER;
      for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++, row_shifter <<= 1) {
        matrix_read_rows_on_col(curr_matrix, current_col, row_shifter);
      }
    endif

    //raw(前)とcurr(今)を比較しchangedを判定
      bool changed = memcmp(raw_matrix, curr_matrix, sizeof(curr_matrix)) != 0;

    //状態変更があったらraw matrixを更新
      if (changed) memcpy(raw_matrix, curr_matrix, sizeof(curr_matrix));

    //デバウンス処理しmatrixに反映, changedもデバウンス込みで更新ありか判定
      changed = debounce(raw_matrix, matrix, ROWS_PER_HAND, changed);
      matrix_scan_kb();

    //キー状態変更通知
      return (uint8_t)changed;
    }

    amtrix.c

     磁気はデバウンス処理が必要ないので使用するmatrix[]配列は2で済みそうです。キー状態の変更があった場合changedで返すこと、matrix[]をみてその後処理されるので最新のキー状態を反映させること。がやらなければならないことです。

     また、これらのスキャンの中で使用していたgpioの関数は何をしているのでしょうか。次はそこから追ってみます。

    qmk進捗

     とりあえず今回で中身はないですがカスタムマトリクスが少し書けました。

    rule.mk
    rule.mk:
    CUSTOM_MATRIX = yes
    SRC += matrix.c
    matrix.c
    matrix.c:
    #include <stdint.h>
    #include <stdbool.h>
    #include <string.h>
    #include "util.h"
    #include "matrix.h"
    //#include "debounce.h"
    #include "atomic_util.h"
    
    //キー状態
    extern matrix_row_t raw_matrix[MATRIX_ROWS];//scanで更新
    extern matrix_row_t matrix[MATRIX_ROWS];//matrix_get_row受け渡し
    
    //初期化
    void matrix_init(void) {
    //スキャンで使用するピンや配列の初期化
    //キャリブレーションやラピトリ設定の読み込み
    }
    //マトリクススキャン
    uint8_t matrix_scan(void) {
    //スキャンしmatrix[], changedを更新する
    //変更通知
      return changed;
    }
    
    //キー状態受け渡し
    matrix_row_t matrix_get_row(uint8_t row) {
        return matrix[row];
    }
    
    //デバッグ用
    void matrix_print(void) {
    }

    おわり

     カスタムマトリクスが何なのかどうすりゃいいのかよくわからないなりにだらだらやっていますが終わる気配がない。しばらくqmkとかchibiosのコードを何やら追う内容になりそう。

     現時点でqmkのラピトリ実装と動作確認まではできているので、ちょこちょこダイジェスト進めて追いつきたい。
     現時点の考えですがキャリブレーションはソフトウェアの必要ないと思っていて、キャリブレーションモードの切り替わるトグルスイッチを設けてスイッチポチポチするだけでいいじゃんと思います。そのほか、速度精度度、ap,rp,ラピトリ値、スイッチストロークを設定する必要があるのでやはりソフトウェア自体は必要なのですが、それ自体も正直一度好きな値に設定したら正味変え無くね?と思うのです。
     ゲームで使用しないキーは速度重視かつaprpに余裕を持ち、ゲームで使用する部分のみ精度重視かつデッドゾーン0.1mmラピトリ0.05mmとかで十分と思うのだ。ライトゲーマーなので、、
     するとqmkmsysでmakeしてぶっこむことができる人は別途設定ソフトなくても困らないなと思ったり。
     ここら辺は割とすいすい行きそうなので、一番の課題はやはりスキャンの高速化だと思います。私はマウスカーソルみたいなアナログ信号でなく0,1のデジタル入力なのだから8kとか100kスキャンとか別にという人ですが、早いに越したことはないですからね。

     


  • NuPhy Berry Profile キーキャップ紹介

    NuphyのBerry Profile Dye-sub PBT Keycapsを紹介します。

     グレーのOblivionとピンクのPeach Blossomが公式サイト$49で販売されています。Oblivionはdigiartyushakoboyodobashiで国内でも販売されているようです。
     キーキャップは高価なものが多いので手に取りやすい価格ですね。

    NuPhy® x Oblotzky Oblivion
    NuPhy® x Kevin Ma Peach Blossom

     BerryプロファイルはCherryプロファイルを低背化したような形状で、ロープロファイルキーボードでもCherryプロファイルな使い心地を実現するためにデザインされたそうです。

     詳しくないですがロープロファイル向けのキーキャップは単一のプロファイルばかりの認識でしたので、それが苦手だった方には刺さりそうです。
     BerryプロファイルはCherryプロファイルよろしくシリンドリカルなステップスカルプチャーな形状です。シリンドリカルなものはKeychron等々あると思いますがステップスカルプチャーなものは私は初見です。
     低背CherryのようなものなのでロープロスイッチのみでなくMXスイッチで使用しても見栄えは悪くなさそうです。

    https://nuphy.com/products/oblivion?srsltid=AfmBOopr8xrHh_aMnqMmoq_zzFGIDEjW9Nvp5EbFvhO8ka25hsMIBmAJ

     NuphyのサイトからOblivionとPeach Blossomを購入してみました。
     パッケージは箱に3段で入ってました。OblivionはプラがテープでとまってたのですがPeach Blossomはとまってなくてガシャっとしてしまった。シール貼ってあったり貼ってなかったりするのか、

     キー数はぱっと見不自由なさそうで、コンベックスキーも入っている。内容数的には充実しており独自配列な自作キーボードにも対応できそう。
     Peach Blossomの方がでかいキーが多めに入っているのですね。

     Cherryとかと並べて
     ぱっと見Cherryぽい

     トップ高さはCherryより低く、ロープロキーキャップと同じぐらいに抑えられている
     ただしロープロスイッチに使用した際はステムが長い分飛び出し、ロープロキーキャップより高くなります。
     スカート下はロープロキーキャップより低くスイッチを覆いますが、cherryよりは若干高くなっています。
     DSAでかいね

     Cherryと比べるとR4なんかはだいぶ低くなっている。R3も若干低い
     Cherryよりも表面の傾斜が緩やかに
     ステップスカルプチャーであるものの高低差や角度は強くない。
    *斜めに撮ってるのでこれより高低差は少ないですR2がほぼ同じぐらい

     素材はPBTで印刷はdye-subだそうです。表面のテクスチャは触る分には感じずさらっとしてます。

     厚みは1.5~1.7mm、行数の記載があります。

     側面を見るとなるほどロープロ向けキーキャップなのだなと感じます。ステムがスカートから飛び出しています。触った感じだとgateronロープロスイッチやMXの逆向きとの干渉はそんな気にならなそうな感じ、choc v2は底ががっつり当たりフルストローク押し込めません。

     

     私はシリンドリカルステップスカルプチャー好きです。使っていてステップスカルプチャー感があり使いやすいと感じる反面、べったりしてるなと感じる部分もあります。
     個人的にはCherryでいいならCherryやOEMの方がはるかに打鍵しやすい。
     外観的に凸凹感のない見た目に仕上げたいときはよさそうです。

     そもロープロスイッチ用ならかなりよさそうに思います。キーキャップがネックで最近はロープロスイッチ触らなくなっていたので、また触ってもいいかなと思ったり。
     するとgateron lpスイッチは安いしberryで干渉しないのでchoc v2に対し明確な強みが出ますね。それ以外はchoc v2が強いのですけど、、

     単純に内容数十分かつ安価なのでとても使いやすそう。

     


  • CANNONKEYS Photon カスタムキーボード紹介

     ai03さんのデザインされたCANNONKEYSのベアボーン65%キーボードキットPhotonを買ったので紹介します。

    はじめ

     天キーで触って欲しいなと思っていましたが、公式で販売開始されると日本から購入されることを想定されていないような感じだったので断念していました。しかし2025年7月yushakoboで取り扱いが開始されこれはと購入しました。

    Photon-CANNONKEYS

     割と感動していて購入必死だろという気分でいましたが案外在庫残っているようです。触れる機会がイベントしかなかったですし、プラ筐体のガスケットマウントキーボード自体は選択肢豊富だからでしょうか。数年前はgas67なんか感触よくて安かった記憶がありますし、今は似た構成のEAVE65なんかが半額です。
     私自身カスタムキーボードに疎く他も持っていないのでそこらへんは考察できませんが天キーで惚れた意思は揺らぎません。カスタムキーボードが欲しかったのではない。Photonが欲しかったのだ。

    CANNONKEYS Photon-yushakobo

     舎で\16,500で販売されています。半透明黒のSmokeにしました。色が合っているなと思いdurockのスタビも一緒に買いました。

    DUROCK Screw-In Stabilisers V3-yushakobo

    PKG

     USB A2Cケーブルはロゴが入っています。
     ガスケットPORONはLE20でしょうか柔らかいです。
     バッテリーは1500mAhで6か月持つらしい。デスクトップはbt無く使わないので無しで組みます。会社用にするときは無線にしたいですが静音寄りにビルドするのももったいない感じがします。
     シリコンゴム足はハードでグリップもいい。どこかで売ってるかしら。
     両刀のプラ―は初めて手にしたので乗り換えようかと思いましたが、どちらも外しにくかったです、残念。
     プレートフォーク、スイッチはめる時にプレート陥没しないようにするらしい。

     PC射出成型のケース美しい
     基板はフレックスカットの入った1.6mm pcbです。右下のブロッカー下部表面にコントローラーがあります。なるほどいいですね。

     キーボード基板てベタがないことが多いですがなぜなんでしょう基板少しでも柔らかくするとかなんでしょうかね。誰か教えてください。

    組み立て

    Photon Build Guide-CannonKeys Documentation

     従い、viaで基板の動作確認。
     スタビライザールブして取り付けました。MOD等はしていません。

     プレート、キースイッチ、ガスケットを取り付けました。
     スイッチはストックしていたvertex v1を使用しました。
     ガスケットはとりあえず4点にしましたが今は9点すべて張り付けています。

     ケースをばらします。無線は使わないのでバッテリーは取り付けずカバーも外しました。
     フルPCなのでそうでなくては困るのですが、ボトムケースのみで平置きしてガタつきがなくよいです。金属プレートにボトムプラケースをねじ止めして歪みを矯正している製品を多く知っているので射出成型のボトムプレートはそういうもんなのかと思っていました。

     トップケースはガスケットの抑えと側面のカバーをしています。

     ケースのスタンドオフに基板およびプレートの避けたくぼみ部分8点をトッププレートとねじ止めするガスケットマウントです。
     トッププレートとボトムプレートにガスケットマウント用の隙間が空いています。

     ボトムケースに乗せた図

     トップケースに乗せた図

     ケースをねじ止めしキーキャップを付けました。
     キーキャップは色が合いそうで家にあったのでberry profile oblivionを使用しました。

    NuPhy® x Oblotzky Oblivion-NuPhy

     おお

     バックライトがついていますが上の写真はよく見えないです。Frostedだと映えるのかしら。下にクリアなデスクマットを敷く予定もないのでオフにしようと思います、

     左はPhoton, 右はGH60互換です。R0の高さが低くていいですね。リストレスト無しであればこういう方が打鍵体験が良いです。チルト角も少し大きめです。
     互換ケースは若干背が高いのが気に食わないとは思いながら使っているのですがこう比べるとやはり違いは大きいですね。60%サイズはそこらへん考慮した互換ケース作ったほうがQOL高いかもしれないなと感じました。

     押し込み時の開口は十分です。
     打鍵時に底まで押し込むことはあり得ないので何も問題はないですが、奥まで押し込むとセレクトスイッチはコツンと当たります。フカフカに沈み込ませるようなMODを施そうとするときは広げたりする方がいいかもしれない。
     スライドスイッチは有線、無線、デフォルトレイヤーを切り替えるそう。

     zmkstudioでキーマップ設定を行います。初zmkです。ロック解除が必要らしい。
     ロック解除含め初期状態でのショートカットはドキュメントに一覧があります。

    Photon User Guide-Shortcut guide

     ロック解除は右下のFn→Alt→Enterのようです。レイヤーキーでFnレイヤー→Controlレイヤー→Enter部にアンロックキーが登録されているようです。いじれば好きなキーでアンロックできそうです。

     マウスホイールなどは別途追加しないと使えなさそうでさょうか。zmkの中身は公開されてそうなのでカスタム自体はできそうです。zmk触ったことないのでわからん

    zmk-cannonkeys-keyboards/boards/arm/photon

     とりあえずCapsに全角半角だけ割り振って使ってみようと思います。
     65%って右の4キーをどう処理するのがいいのかよくわかっていません。

    おわり

     癖のないフィードバックに澄んだ打鍵音でキーボード側の味付けはあまりない印象です。

     他のプラガスケットに比べると高いけど周りを見ると買いやすい価格で所有欲満たされとてもよい。
     ガスケットマウントですがKeychronみたいな沈み込みのためではなくacousticな意図が大きそうです。今後ちょこちょこカスタムしつつ遊んでいきたいなと思います。機にスイッチやキーキャップもちょこちょこ試してみようかしら。

     一般にキーボードは重さと密度が正義という方が多いです。重さや密度による利点はもちろんありますが正解ではなくそれぞれが異なる方向性であることを軽量でシンプルな構成のphotonが教えてくれます。私自身そういった短絡的な風潮は体験としても否定的でしたし単純に重すぎるのは取り回しが悪いので好きでありませんので刺さった製品です。 まあ高級なカスキは触ったこともないので上を見れば軽量構成に限界があるのかもしれないですけど、