CircuitPythonでキーボードのファームウェアを書く問題点

机上の空論だが

  • インタプリタ言語である
    • サイズが大きくなる
      • Expressでないボードは記憶領域が100kBもない
      • コメントを書くことが制限されるかもしれない
      • 自力で必要なモジュールを選びとる必要がある
    • コンパイル時にエラーを発見することができない
      • エラー内容を見るにはシリアルコンソールが必要
      • RGB LEDを見ればエラーのタイプはわかるが……
  • CircuitPythonのライブラリに依存する
    • 音量調整キーなどの特殊なキーに対応していないかもしれない(未確認)

案ずるより生むが易し!!!

CircuitPythonで制御するキーボードを作りたい

なぜ

  • 接続するとストレージとして認識されるからコードをドラッグ&ドロップするだけで動作させられる
    • 環境構築が不要
    • キーマップの変更がとても簡単になる

実験に必要なもの

本番に必要なもの

  • 基板×2
  • ICソケット×2
  • TRRSジャック×4
  • TRRSケーブル×2
  • Kailhスイッチソケット×40
  • スイッチ×40

まとめ

  • とりあえず一体型キーボードでファームウェアを開発すればいいのでは
  • IOエクスパンダを買ってきてくれると喜びます

追記(2019/02/05)

Trinket M0でLSFT_T, LCTL_Tを実装したあとTAP_DANCEを実装しようとしたらメモリ不足でエラーになった。M4機が必要である。

キーボード部品のコスト

キーボードを自作するときに何に金がかかっているのか気になったので

市販品との違い

  • 基板が剥き出し
  • 光らない
  • 小指外側のキーがない

キーボードのスペック

  • 分割型
  • 40キー
  • 基板サイズ100mm×100mm
  • トッププレート・ボトムプレートなし
  • Kailh Lowprofileスイッチ
  • ソケット使用

コスト(送料含まず)

品名 単価 数量 価格 店名
基板 220 2 440 FusionPCB
キースイッチ 48 40 1920 遊舎工房
キーキャップ 30 40 1200 遊舎工房
ソケット 15 40 600 遊舎工房
ProMicro・スプリングピンヘッダ 1000 2 2000 遊舎工房
リセットスイッチ 10 2 20 秋月
TRRSジャック 50 2 100 秋月
ダイオード 2 40 80 秋月
TRSケーブル 108 1 108 100均
ゴム足 8 23 183 Amazon
合計 6651
  • キースイッチとProMicroにお金がかかることがわかった
  • MX互換スイッチだとキーキャップがもっと高くなりそう

原価厨がキーボードを自作した話

この記事は自作キーボード #3 Advent Calendar 2018の13日目の記事です。

100mm×100mm未満の基板を設計し, 組み立てた話です。

動機

MagicForce smart 49keyへの不満

上海問屋 DN-914809 英語49キー ポケットサイズメカニカルキーボード(中華青軸) |パソコン通販のドスパラ【公式】

ホームポジションから手を動かさなくていいという売り文句に惹かれてMagicForce smart 49keyを使っていましたが, キー配列を変更できず, Fn+Shiftの同時押しが面倒であるなどの不満がありました。

280gのスイッチを試すため

ゆかりさんの投稿を見た友人が280gスイッチに興味を持ったため, 試し打ちできるようにキーボードを作ることにしました。基板サイズが100mm×100mm以内のキーボードとしてはFoobarが有名ですが, ALPS軸に対応していないため自分で設計することになりました。

基板製造が安い

100mm×100mm以内であれば10枚まで$5で製造してもらえます。なんと1枚あたり$1未満です!! 安い!!

また, 当時はFusionPCBで$1で100mm×100mm以内の基板を3枚製造してもらえるキャンペーンをしていたため, ついでに一体型のキーボードの基板も発注しました。

設計

foostanさんの本を読んでください

booth.pm

PCB

本を読んでください。

PCB素材のプレート

PCBと同様にカットアウトやネジのフットプリントを配置します。FusionPCBとALLPCBを利用しましたが, Edge.Cutsに矩形の線を引いておけばそのとおりに穴を開けてくれました。ただし, 向こうでドリルファイルを作るからなのか他の基板より製造に時間がかかります。

アクリルプレート

Kicadから出力したdxfファイルは線が二重になっていたり曲線が(多数の)直線に分割されていたりして修正するのが面倒だったので, DraftSightで新たに線を引きました。

Tip: 四角形をグリッドの中央に配置する

19.05mm間隔のグリッドに14mmのカットアウトを配置する際, グリッドの中央に配置するために工夫が必要です。

(あとで書く)

Tip: 四角形の大きさ

スワップソケット対応のものにはぴったりとはまるトッププレートが必要なためサンプルを作って試したところ, 僕が使ったレーザー加工機では13.4mm角がキツキツでした。そのサイズでカットしたところ, 一部の穴にスイッチがはまらず, 力を掛けすぎてプレートを割ってしまいました。スワップソケットを使う場合はスイッチの爪が噛み合う厚さの素材で作ることをおすすめします。

発注・出費

業者名 内容 価格(送料を含む)[円] 備考
KBDfans キーキャップ, キースイッチ 5668
Aliexpress FatProMicro×1 490
KPrepublic キーキャップ, キースイッチ 10417
Aliexpress ProMicro×6 2418 予備を含む
秋月 電子部品 2355 キーボード用でない物も含む
ヒロスギ ネジ, スペーサー 2290
Aliexpress FatProMicro×6 2251 予備
FusionPCB 基板 3097
遊舎工房 スワップソケット 1134
ALLPCB トッププレート 3014 5枚
ホームセンター ゴム足, アクリル板 1054
100均 ケーブル, はんだ 540
創房 アクリルカット 177 9分
合計 34728

キーキャップ・キースイッチ込みで1台あたり1万円ちょっとで作れました。

組み立て

別の記事にします

完成

hogefuga w/ APC緑軸

f:id:y_sanagi:20181213001805j:plain
hogefugaキーボード

4x4_hotswap

f:id:y_sanagi:20181213001821j:plain
4x4_hotswap

3台目(hogefuga w/ Matias Quiet Click)は組立中です。

反省

  • hogefugaのボトムプレートの基板の片面にだけ銅箔を貼ったところ, 基板が反ってしまった
  • TRRSジャックにPJ-320のフットプリントを使ったところ, 秋月で買ったMJ-4PP-9はプラスチック製のピンが大きく, 実装時に浮いてしまった

まとめ

アルミ製ケースを含めて$150のPlanckは安いとわかりました

使用したライブラリ

GitHub - foostan/kbd: Publish data for Keyboard

GitHub - keebio/Keebio-Parts.pretty: Various KiCAD footprints for mechanical keyboard parts

GitHub - tmk/keyboard_parts.pretty: KiCad modules for keyboard design

成果物

基板

GitHub - yswallow/4x4_hotswap

GitHub - yswallow/hogefuga-kbd

QMKファームウェア

GitHub - yswallow/4x4_hotswap_firmware

GitHub - yswallow/hogefuga_firmware

この記事は 4x4_hotswap(kailh speed copper/eucalyn改配列)で書きました。

ProMicroのブートローダーをQMK-DFUにする

動機

4x4_hotswapには物理リセットボタンがないためキー操作でブートローダーに入れるようにしたいが, (ProMicroに初めから入っている)CaterinaブートローダーではRESETキーを押しても反応しなかった(今は対応しているかもしれない。試していない。)

追記 2018/11/19

config.h#define CATERINA_BOOTLOADERと書くことでCaterinaのままでRESETキーに対応することがわかった。FatProMicroの死が無駄だったことがわかって完全に虚無。

方法

  1. 余っているProMicro(Caterina)にArduinoISPを書き込む
  2. QMK Firmwareを書き換え, makeする
  3. ISP化したProMicroにブートローダーを書き換えるProMicroを繋ぐ
  4. 書き込む

余っているProMicroにArduinoISPを書き込む

Arduino IDEから ファイル>スケッチ例>11.ArduinoISP>ArduinoISP を選択し, そのままProMicroに書き込む。ArduinoにあるピンがProMicroにはないと言われているが, 動くものは動く。既にQMK Firmwareを書き込んでいる場合はリセットする必要があるかもしれない。

QMK Firmwareを書き換え, makeする

config.h

#define QMK_ESC_OUTPUT F1 // usually COL
#define QMK_ESC_INPUT D5 // usually ROW
#define QMK_LED B0

を書き足す。

rules.mkBOOTLOADER = qmk-dfuと書く。

make keyboard:keymap:productionを実行する。

ProMicroをつなぐ

ArduinoISPを書き込んだProMicroとブートローダーを書き換えるProMicroのVCC, GND, 14番, 15番, 16番 を繋ぐ。ISP側の10番は書き換える側のRESETに繋ぐ。

Pro Micro(クローン)を文鎮化から復活 - Qiita

書き込む

ArduinoISPを書き込んだProMicroのポートが/dev/ttyACM0の場合,

avrdude -c avrisp -p m32u4 -P /dev/ttyACM0 -U flash:w:"keyboard_keymap_production.hex":a -U lfuse:w:0x5E:m -U hfuse:w:0xD9:m -U efuse:w:0xC3:m -U lock:w:0x3F:m

を実行する。メモリ全域を書き換えるため, やや時間がかかる。

動作

リセットしたときにTX LEDが点滅するようになった。

ファームウェア書き込み時には make keyboard:keymap:avrdudeではなくmake keyboard:keymap:dfuとする必要がある。

分割キーボードで使うとRESETキーを押したときに両手ともリセットされ, そのままコンピュータでファームウェアを書き込むとmicroUSBケーブルが挿さっているほうにだけファームウェアが書き込まれる。挿さっていないほうはTX LEDが点滅したままになる。

QMK_ESC_OUTPUTQMK_ESC_INPUTが何なのかはわからない。

続き

本来の目的である4x4_hotswap用のFatProMicroに書き込もうとしたところ, 接触不良でFuse bitが全て0に書き換えられ, 何もできなくなった。買い直す必要がある。ブートローダーが壊れても同様にArduinoISPで直せるし, モゲMicroもArduinoISP経由でファームウェアを書き換えれば(分割キーボードの右手側であれば)使えるが, こうなってしまうと全くダメだ。(高電圧を掛ける装置を使えば直せると聞いたこともあるが, そんな装置は手元にない。) 接触不良には注意しよう!

なお, 文鎮化したFatProMicroは強いと言われるmicroUSB端子の耐久試験に使うつもりだ。

参考

Replace Pro Micro bootloader with QMK DFU : olkb

qmk_firmware/flashing.md at master · qmk/qmk_firmware · GitHub

現在進行中の自作キーボードプロジェクト

EndGameを求めるだけが自作キーボードじゃないなんて言ったら沼の人に怒られそう

hogefuga keyboard

設計理念

  • 100mm×100mmに収めることで製造費を抑える
  • フルキーキャップセットをROWを違えることなく使えるようにする
  • 280gキースイッチを使うためにALPSマウント
  • ProMicroを交換できることと薄さを両立するために隣に置く

できたもの

github.com

4x4x3

設計理念

  • 基板を1枚あたり100mm×100mmに収め, 3枚繋げて使う
  • モゲ対策のためFatProMicroを使う
  • Kailhホットスワップソケット対応

できたもの

未公開

予定

  • アクリルでボトムプレートを, アルミ基板でトッププレートを作る