キースイッチテスターを作った

概要

Demo: https://kymok.github.io/keyswitch-tester/

  • 12__はスペース)とタイプすると,専用キーボードの1行2列目にあるスイッチが表示される
  • ランダムボタンを押すと,登録されている中からスイッチをランダムに表示する

f:id:lunar0:20200222030716j:plain
完成したスイッチテスターとサーマルプリンタ

Tsukuba Mini Maker Faire (TMMF) の Self Made Keyboard in Japan (SMKiJ) 展示の一環として,キースイッチテスターを出展した.元ネタは遊舎工房の店頭にあるものだが,TMMF会場では店舗と異なり,気に入ったスイッチが見つかってもその場でスイッチを買えない.そこで,名前のメモを取ったりするかわりにサーマルプリンタでメモを出力する装置を作った.

システムの構成

f:id:lunar0:20200222043157p:plain
ハードウェア構成

  • ハードウェア:
    • デモ用パソコン
    • 専用キーボード(USB)
    • サーマルプリンタ(USB-シリアル変換器経由)
  • ソフトウェア:
    • フロントエンド(押されたキースイッチの表示,キースイッチリストのフォーマット,バックエンドへの送信)
    • バックエンド(http/JSON で受け取った文字列をシリアルポートに流す)

キーボード側

構造

基板を 5mm のアクリルプレートに直接ネジ留めした.これだけだと工夫が何もないので,底面のアクリルプレートに皿ザグリを施すことで,見た目をすっきりさせた.各キーには上からLEDを挿せるようになっており,頑張れば WebHID などを使って作者おすすめのキースイッチを光らせるなども可能だろう.

16x4 を一体で作らずに分割した理由は,基板を安価に作るため.深圳には Web から入稿・注文できる小ロット試作に対応する基板メーカーがいくつかあり,ほとんどの店舗では 100mm 角以内なら 5 ドル程度で基板が 10 枚作れる.サイズが大きくなると途端に高くなる.

f:id:lunar0:20200222032954j:plain
キーボードの全体像

回路

4x4 のキーパッドが4個 IIC で ATMEGA32u4 にぶらさがっている.昔作った細い基板が余っていたので,それを利用した. IOエキスパンダは MCP23017 .これは秋月で DIP 品が買えるので回路の試作がしやすいとともに,1ポート 25 mA まで扱えて LED 直結で動かすのに便利.

ファームウェア

開発には QMK Firmware を利用した.各キーにはマクロが設定してあり,00_ - f4__はスペース,f4はf行4列)までの文字列を送信する.単一のキーコード(aなど)を送る方式と比較して,利点は次の通り.

  • 理論上は際限なくキーが増やせる*1ので,ルブの有無などのバリエーションも画面上に表示させることが可能.
  • モディファイヤキーを送らずに済み,本体のキーボードと共存しても安全.
  • キーマップの入力がファームウェア,フロントエンドともに楽.

逆に,単一キーコードを送る方式の利点は次の通り.

  • 最初のキーの keydown だけ見ればよいので,反応が速い.
  • 実装がシンプル.

今後何かあるたびに使い回すとすれば,キーマップが柔軟に変えられたほうが良いだろうと考え,前者の方式を採用した.

本体側(デモ用パソコン)

フロントエンド

f:id:lunar0:20200222032015p:plain
ユーザインタフェース

ちょうどいい規模のプロジェクトかなと思って付け焼刃の React で書いてみた.勉強という大義名分のもと React + Redux + Redux-Saga という大所帯になったうえ,キーボード入力を読んで該当するデータを表示する部分も自前実装してある(このせいで当日までに物理印刷ボタンを付けられなかった).

キーボード入力を読んで該当するデータを表示する部分では,次のような実装をしている.

  • キーボード入力の履歴を蓄えておく配列を用意する.
  • 新しい入力を配列の末尾に付け加える.
  • 入力があらかじめ用意したパターンと一致したらアクションを発行し,入力履歴をクリアする.

ローカルで動作すればよいので,キースイッチ・キー配列のデータは JSON ファイルを直接読む形式とした.

ソースコードkymok/keyswitch-tester にある.また,元ネタにした遊舎工房店頭にあるキースイッチテスターのものは adeonhy/switch-tester-web にある.

バックエンド

今回利用したサーマルプリンタは Maker には有名なもので, PyPI に専用のライブラリまである.これに Flask で薄いラッパーをかぶせて使った.Python の既製品を組み合わせただけで,ほぼ何もしていないに等しいが,ソースコードはこちら:kymok/thermal-printer-server

反省

  • Amazon で買える安いスペーサを使ったら基板に不陸が生じた.急ぐにしても,レーザーカッタでアクリル板から切り出すなど,より精度よく作る方法はあったはずである.
  • UIについて,アイテムを画面上のリストに入れて,さらに印刷ボタンを押すのは手数が多すぎた.印刷キーを付けて,押すたびに直前に選択したスイッチが印刷される程度に単純なほうが良かっただろうと思われた.TMMF のゆったりした人通りですらこれなので,混雑したイベントでは使い物にならなかった可能性が高い.
  • ちょっとした記念品になるといいなと思ったが,主にプリンタからモノが出てくるということ自体が子供ウケしていた.
  • Web 技術で作ると UI の修正などをその場でデプロイできて便利.

*1:実際はスキャン頻度に響くので限界はある/計算はしていない

キースイッチを撮影する

f:id:lunar0:20200221003649j:plain
撮影したスイッチ (Kailh Pro Light Green)

機材

今回の倍率は大体 1/2 倍付近なので,市販のマクロレンズでも十分にこなせるはずだが,せっかくなのでベローズと引き伸ばしレンズを用いたマクロ撮影を試してみた.ベローズは程度のよいものが1万円程度,引き伸ばしレンズは2-3000円程度で購入できる.引き伸ばしレンズは絞り値の表示窓から光が漏れるものがあるので,黒テープでふさぐ必要があるかもしれない.

カメラ

  • Sigma fp
  • ASAHI PENTAX ベローズユニット II
  • Rafcamera M42→L マウントアダプタ*1
  • FUJINAR-E 75mm F4.5
  • Leofoto ポケット三脚 MT-03

照明

  • 2x 電気スタンド
  • 台座(乳白アクリル板 t=2 スイッチを定位置に置くための治具つき)
  • 1x コピー用紙

セットアップ

  • 台座を壁の付近に置く.
  • 電気スタンドを天井に当ててフィルライトを作る.
  • もう1台の電気スタンドを直後の壁に当ててバックライトにする.
  • 絞りは F8 とした.*2

f:id:lunar0:20200221023139p:plain

評価

  • ベローズの使い心地は思ったほど悪くない.Lマウントは口径が大きいのが利点だが,M42マウントの内径が小さいこともあり結局四隅はケラレる.これを改善するためには大判カメラにアダプタを付けて撮影するなどが考えられるが,画面の四隅まできっちり使う撮影をする予定はないので今のところはこのまま.
  • Leofoto MT-03 は良くできている.そこまで厳密さを求められない小物の撮影なら,ミニ三脚で手軽に撮ってしまっても良いかもしれない.
  • 照明位置の再現性が落ちそうなのが唯一の問題.ミニスタジオ等を使うなどの改善策が考えられる.

*1:最初 Sigma fp に合わなかったので,こちらで寸法を測定して代替品を送ってもらった

*2:パンフォーカスにしても良かったが,多少開けぎみのほうが軸の形が際立つと判断した.フォーカススタッキングは面倒なのでパス

60% キーボードを作った

名前 (Sugi 6x) について

元々キーボードの脚を杉材で作ろうと計画していた(材料だけは買った)ことと,60%レイアウトより少し多いことによる.

コンセプト

デザイン作業もタイピングもできる携帯可能なキーボード.

デザイン作業適性

カーソルキーはHHKB準拠配置に加えて左 Fn + WASD にも割り当てた.これにより,マウス操作とキーボード操作で右手を忙しく往復することなく作業ができる.たとえば Lightroom を使用するとき,マウスカーソルを現像パラメータの上に置いて左手でカーソルキーを操作することができる.数値入力を多用する場合や,テンキーに重要なショートカットが割り当てられている場合に備え,右 Fn には Num Lock を割り当てた.

デザイン作業に使うため,見た目の地味さとさりげなさを最大限重視した外見としている.

f:id:lunar0:20200219235536j:plain
ホームポジションからほとんど手を動かさずに左手カーソルキー,右手マウスが実現できる

モバイル適性

60%というコンパクトな形状*1と側面に配置した USB Type-C コネクタにより,ノートパソコンの上に置いて使用する場合でも楽に使用できる.

f:id:lunar0:20200220003039j:plain
USB Type-C コネクタが側面に付けてあるためラップトップの上で使いやすい

その他

  • このブログで何度か言及した通り,スペースバーが特殊なサイズであるため,入手に難がある.既製品を鋸で切って貼り合わせるのが一番早い.方法や3Dファイル等は4uスペースバーのビルドログを参照.
  • 今回は M2.5 のねじを使用したが,タップの入手が面倒なので次の版から M3 に改める予定.

*1:自キ界では60%でも大きいほうですが

2019年に始めたこと

昨年はいくつか新しいことを始めてみることにした.うまくいったことばかりではないものの,うまくいかないものは大体一月も保たないので,それ以上続いたことをうまくいったとみなして書くことにする.

英語

Financial Times (FT) を毎日読むのは一年続いた.FT は文章が平明なので,ノンネイティブが読むには丁度よい.記事を Google Keep に要約するのを三ヶ月くらい続けたあたりで a とか the の意味が見えるようになってきた.要約は続かなかったが,要約に疲れる頃にはだいたい記事を最後まで読み通せるようになっていた.今年はプライバシーやデータ資本主義,テックジャイアントへの規制の議論に興味をもって読んだ.

一方で The New York Times (NYT) を読むのは相変わらず習慣になっていない.扱う内容に FT ほど興味がもてないうえ,文章も FT より持って回った書き方をしているせいだろうか.

カメラ

厳密には新しいことではなく,10年前に K-7 と DA35 Limited を振り回していたことがある.身のまわりで数人カメラを買っていたので,それに引きずられるようにしてカメラ趣味を再開した.春頃に GR III を買い,ほとんどの撮影をそれでこなしていたが,標準-中望遠の画角が欲しくなったので fp を追加した.

カメラを趣味だと思うと,普段は30点だがここぞというときに120点を叩き出す機材が選択肢に入ってくる.GR も FA77 も基本的にはそういった部類のものだといえる.

f:id:lunar0:20200103003314j:plain
fp にベローズを付けてみた

GR は毎日持ち歩かないと意味のないカメラなので,常時ポケットに突っ込んである.起動も速いし,あとはオートフォーカスがまともなら言うことはない.これが RX100 系だと,万能だが分厚くておさまりが悪く,画質も GR には及ばない.迷ったときはピーク性能を重視すべきだと考えて GR にした.

Julia

現在関わっている研究プロジェクトでは Python が推奨されているが,遅いので速度が必要な部分を Julia で書くことにした.Python にも速いライブラリはあるが,一般にそれらは C で書かれており,書き換えや並列化が大変である.その点 Julia はライブラリの改造が楽で,簡単に並列化できるので都合がよかった.

一方で,まだ新しい言語なので仕様が不安定であり,また Python ほどのエコシステムの厚みがないのでこれ一本で頑張っていくにはつらい部分もある.可能性は感じるので,導入を主張したぶんの責任をとる程度には勉強していきたい.

Sigma fp を買った

f:id:lunar0:20191222010800j:plain
カメラを撮るカメラがない

概要

Sigma fp を買った.買うときに検討した条件は次のとおり.

  • PENTAX の FA77mm f1.8 Limited を本来の画角で使いたい
  • 毎日持ち歩きたいので,コンパクトなものがよい
  • 見た目が薄っぺらくないものがよい
  • 将来性を考えてミラーレスにしたい

万人におすすめできるわけではないが,合理的に考えればα7IIIを買うべきところをこちらにダイバートさせるだけの独特な魅力があったのも事実.

それにしても,カメラが売れていないらしい.顕示的消費と気軽な撮影の座をすっかりスマホとインスタグラムに明け渡してしまったということだろう.カメラを買っても写真は上手くならないが,スマホを新しくすれば良い画像が作れるわけで,むべなるかな.

使用感

一月ほど使ってみた感想.基本的には発展途上のシステムで,完成された安心感というようなものはない.かなり我慢をして使うことになる.もし本体を売却して別の機種に乗り換えるとしたら,静止画撮影におけるローリングシャッターの強さが一番の理由になるだろうと思う.

f:id:lunar0:20191221232411j:plain
何気ないものを撮るには非常によい

手元にあるレンズは 45mm f2.8 DG DN と FA 77mm f1.8 Limited. 後者はマウントアダプタ経由なのでマニュアルフォーカスかつ絞り込み測光になる.広角側は GR III があり,非常に満足しているのでよほどのことがない限り買い足さないだろう.

Pros

  • コンパクト.
  • SDカードでも FullHD 12bit Cinema DNGが撮れる.
  • レンズキットの 45mm f2.8 DG DN が期待していた以上に良い.
  • 本体がいかにもモダンデザインという感じで好感が持てる.
  • 静止画モードでも波形表示ができる.使ってみると案外便利.

Cons

  • 静止画でローリングシャッタが強く出る.
  • 手ぶれ補正がセンサシフト式ではないので,何も考えずに構図に集中するというわけにはいかない.
  • EVFもチルトディスプレイもない.AFレンズならそこまで困らないが,MFレンズとの組み合わせでは不便なことがある.ビューファインダーの見え味は良いが,かさばって使いづらい.
  • UIは発展途上感がある.
    • TAvモード(絞りとシャッタスピード,露出補正からISO感度を自動で変更してくれる機能)がない.せっかくデジタルで撮っているのだからそれくらい装備しておいてほしい.
    • GR III と比べてタッチパネルやUIの反応が鈍い.
    • ビューファインダーがすばやく取り外せないわりに,フォーカス移動にデフォルトでは2手必要.

マウントアダプタとFA77

FA77 を Sigma fp で使う場合,マウントアダプタが必要.当初中国メーカーの安いアダプタを使っていたが,絞り環と混同しやすい形のローレットが刻んであり,手の感触でわからず不便だなあと思っていたら Novoflex のアダプタ LET/PENT が一瞬安くなったので購入.たぶんアルゴリズムで値付けをしているのだろうが,時々変な値動きをする.

FA77 は古いレンズであるせいか,軸上色収差によるフリンジはかなりひどい.Nikon Z マウントの 85mm はかなり良いらしいので,システムごとそっちでも良かったかなと思うこともあるが,たまにこういう油絵みたいなボケ方の写真が撮れると PENTAX なかなかやるなという気分になる.

f:id:lunar0:20191222000748j:plain
独特の油絵のようなボケ方

せっかくフォーカスリングとフォーカシング機構が機械的に直結されたボケのきれいなレンズがあるので,そのうち三脚に載せて映像に使ってみたい.

f:id:lunar0:20191222024442j:plain

自作キーボードの仮組み

f:id:lunar0:20190911015857j:plain

必要なパーツを半分ほど注文し,組んでみたところでスペーサの位置を間違えて設計していたことがわかった.元々スペーサは過剰ぎみに作ってあるので一本抜いたところで問題ない.とはいえ,間違いのある設計でアルミケースを発注する気にもならなかったので,一旦仮でアクリルサンドイッチケースの形に組んだ.

Pro Micro の位置取り

f:id:lunar0:20190911022045j:plain

Pro Micro の位置取りにはいろいろな流派があるが,単純に縦置きすることにした.この置き方により,60%キーボードの利点である奥行きの短さを保ったまま,ケーブルのルーティングに自由度が生まれる.ついでに,いかにもな自作感を演出することもできる.気に入ったので,この配置でテンキーパッドなども作ってみようかと思った.

トッププレートへのねじ切り

スイッチプレートにM2.5のタップをたて,底面からスイッチプレートに向けて12mmのねじで留めている.これにより,上から見たときにネジ頭が見えない構造が実現できると考えたが,実際はそもそもキーキャップの陰になってほとんど見えないのでどうでも良かった.結局,ナット分のスペースが節約できた程度である.

LEDからの光漏れを減らす

f:id:lunar0:20190911020101j:plain

自作キーボードといえば明るく光る LED である.小型のキーボードではひとつのキーに複数の機能を割り当てる(レイヤ)ことが多く,現在の状態を表示したいという要請はそれなりにある.

本機では透明のスイッチを採用したので,何も考えずにLEDを取り付けると盛大にスイッチが光ってしまう.抑制のきいたデザインにしたかったので,光る部分を最小限におさえたい.そこで,次のような構造を考えた.

f:id:lunar0:20190911021151j:plain

布の上に乗っている白いパーツはライトパイプ*1である.手前にある黒いパーツは,光漏れの起こりそうな箇所に熱収縮チューブを被せた状態.

*1:全長が短いことと,3Dプリントを使用したことで実際にはパイプというより拡散板としてはたらいているが,部品名称の慣例にしたがいライトパイプとする

キーボードのプレートが届いた

Laserboost でキーボードのプレートを注文した.翌々日くらいに出荷されて2週間くらいでバルセロナから手元に届く.

Laserboost は穴へのねじ切りを Web ページでは受け付けていないので,自分でねじ切りをすることにした.レーザーの寸法精度は +/-0.1 くらいだと仮定してレーザー下穴は Φ2.0 で注文した.

案の定輪郭は値段なりだったので,2.1 のドリルで穴をさらって M2.5 のタップをたてた.一般鋼材用のタップとミシン油で適当にやったら見事に歯がひとつ欠けてしまった.多少穴の見た目が悪くなったが,クリティカルな力のかかる部分ではないのでそこまで影響はない.

f:id:lunar0:20190822163745j:plain
Laserboost から届いた板

f:id:lunar0:20190823123656j:plain
ルブ済みのスイッチを組みつけたところ