QMK DFU
すでにまとまった記事もあるのですが自分向けのメモとして。Pro Microが2個必要です。
- Pro MicroをAVR ISP化する
avrdude -p atmega32u4 -c avr109 -P /dev/tty.usbmodem* -U flash:w:util/pro_micro_ISP_B6_10.hex
make qol56:default:production
でブートローダ付きのhexファイルを生成する- ISPのPro Microとキーボード用のPro Microを接続する。GND、VCC、14、 15、16はそれぞれ同じピン同士を、ISPの10はRESETへ接続する。
- ISP経由で書き込む。
avrdude -c avrisp -p atmega32u4 -P /dev/cu.usbmodem142301 -U flash:w:"qol56_default_production.hex":a -U lfuse:w:0x5E:m -U hfuse:w:0xD9:m -U efuse:w:0xC3:m -U lock:w:0x3F:m
- 2回目以降はキーボード用Pro Microを直接USBにつないで
make qol56:default:dfu
でOK
QOL56
自設計キーボード第二弾です。 二作目だけあって納得のいく出来になったと思います。 crkbdにLEDをつけてみたらウルトラ楽しくて、キーボードは光る派に転向しました。 LEDも埋め込んでレイヤーで色を変えたり、テンキーの位置を光らせたりなどもできました。 一体型としてはエンドゲームな予感がしています。
前作の対称row staggerdは左手が追いつけませんでした。 いきなりずれる方向が逆になったのだから致し方ありません。 そこでOrtholinearで無難にまとめてみました。 Planckがすでにあるわけですが親指キーをさらに内側に追加したいので14x4の56キーです。 親指キーを0.25Uずらすレイアウトは踏襲しました。
詳細はgithubにまとめました。
自作キーボードANHEDRAL
前のエントリの通り、キーボードを設計して制作した。 翼の形状にちなんでANHEDRALと名付けたが、それほど気に入ってはいないので、変更するかもしれない。 設計の結果についてはgithubにアップしておくが、不具合もあるので、そのまま作らない方が良い(そんな人はいないと思うが)
実際に作ってみて、概ね思い通りにできて、ちゃんと動作したのは感激である。 ひとえに先人の皆さんが惜しげもなくkicadのデータを公開していただいていたり、自作キーボード関連のノウハウを書籍として販売されていたおかげである。 感謝。 欲張らずにLEDなしなど割り切った設計にしたのも良かったと思う。
SemiErgoキーレイアウトはまだ慣れておらず、打ち間違いが多いが、良くなっていく感覚はあるので、使い続けてみたい。 親指で押すキーが多いのは本当に快適だ。 カーソルや数字キーがないのも今は苦痛だが、慣れるといらないらしいからもう少し頑張ろう。
一方、QMKのみで親指シフトを実現する試みは少し野心的であった。 レイヤーを使ってみたり、combo機能を使ってみたりしたが、どれもうまくいかず、結局ほとんど自分で同時押しのコードを書いたが、結果的にはうまく動作して良かった。サイズ的にも軽量に仕上がったと思う。
ぜひ今回の不具合を修正し、改善点を盛り込んだrev.2を設計したいと思う。 というか、キーボードの設計はめちゃくちゃ楽しいので、作らずにはいられないと思う。
このエントリはもちろん自作したキーボードで書いた。
自作キーボード設計の覚書
PCBも発注したので、ここ数ヶ月、はまっているキーボードの設計についてまとめておく。end gameに向けた第一歩である。
動機
- 親指シフトへの最適化
- ファームウェアでの親指シフト実装
- ソフトでの親指シフトは機能しない場合がある。
- さらにOrz配列にすると、ログイン画面やパスワードフィールドではずれていないので混乱する。やまぶきRではctrlなどのショートカットはOrz対応しない。
- 非対称row staggeredからの脱却
- QWERTY配列からの脱却
- ローマ字日本語入力から親指シフトに移行した今、英字入力も効率的な入力にしたい。折しもdovorak以外に、eucalyn配列なども誕生している。
- 肩を開く
- 分割キーボードの肩を開いて入力するのは魅力的だ。少しでもホームポジションは距離を置いておきたい。
- ホームポジションから離れたキーは不要
- ブラインドで打ちにくいキーは確かに不要かもと思う。
- 分割が最適だと思うが、会社であまり目立つ配列は避けたい
- IT企業に勤めているわけでもなく、会社から与えられたキーボードや、ノートPCのまま使っている人ばかりなので、分割キーボードを持ち込んで変な人に見られたくないw
仕様
- 非分割、一体型キーボード
- 英字3行 + モディファイヤー1行、52キー。数字キー列はなし。
- Cherry MXおよび互換スイッチに対応
- 入手の容易な104キーキャップに対応
- SemiErgoレイアウト
- @mtei氏考案 https://github.com/mtei/SemiErgo_Layout
- 親指キーが多い
- 左右完全対称
- 最下段のモディファイヤー行は0.25U下げて、Z行との同時押しをしやすくする(効果があるか要確認)
- 一見して普通のキーボード、目立たない
- ortholinearやcolumn staggeredく比べても少し肩が開く
- マイコン
- ファームウェア
- ミスを避けるためシンプルな設計
- 始めてのPCB設計。電子工作もまともにしたことがない。そもそもキットのキーボードすら作ったことがない。
- 最低15ピン必要(8 x 7 = 56 >= 52)。ただし配線が少し複雑になる。配線をシンプルにするために物理レイアウトに合わせて14 x 4 = 56で18ピン使うことにする。Pro Microのピンを全て使い切る。
- 分割しないので左右の通信不要
- 光らせない
- OLED載せない
- Pro Microをキーと重ねない
- Kailh PCBソケット専用
- 処女作なのでその後の改善に備えて、キースイッチを使い捨てにしたくない
- 最適スイッチを探索したい
- ダイオードはスルーホール、SMD両対応
- PCBと別途製作するは面倒なので、トップ、ボトムプレートもPCBで作る
QMK on Docker
QMKでファームウェアを作るための環境構築はdockerが楽。以下のDockerfileはgcc-avr 4.9.2、gcc-arm 5.4.1の環境が作成される。 debianベースなので少し古いgccですが、gcc 8のような問題はないので、枯れた環境と言えます。
docker build -t=qmk:stretch .
でイメージ作成docker run --rm -v $('pwd'):/qmk:rw -e keyboard=planck/rev6:default qmk:stretch
でビルド- ファームウェアの書き込みはdockerからはできないようです。
FROM debian:stretch-slim RUN apt-get update && apt-get install --no-install-recommends -y build-essential \ gcc \ unzip \ wget \ zip \ gcc-avr \ binutils-avr \ avr-libc \ dfu-programmer \ dfu-util \ gcc-arm-none-eabi \ binutils-arm-none-eabi \ libnewlib-arm-none-eabi \ git \ software-properties-common \ avrdude \ && rm -rf /var/lib/apt/lists/* ENV keyboard=planck/rev6:default VOLUME /qmk WORKDIR /qmk CMD make clean ; make ${keyboard}
Trix on Rails
richなformエディタであるtrixは便利で、Rails用のgemもあるので使わせてもらっています。しかしgemの更新がとどこおっており、trix gemの制約でRails 5.2にできなくなっていました。そこでgemを使わずにtrixをRailsで使う備忘録。
- Releases · basecamp/trix · GitHubからtrix.jsをapp/assets/javascripts/へ、trix.cssをapp/assets/stylesheets/へコピーする。
- application.jsへ
//= require trix
を追記 - application.css.scssへ
*= require trix
を追記 - viewには以下のように書く。
<%= form_with(model: entry, local: true) do |form| %> <%= form.hidden_field :content, id: "entry_content" %> <trix-editor input="entry_content"></trix-editor> <% end %>
Rubyでデフォルトプリンタの名前を取得
Rubyを使ってWindowsでデフォルトプリンタの名前を取得する方法。Win32OLEはWSHのスクリプトを1:1で書き換えたら動くのが素晴らしい。
require 'win32ole' class Printer def self.defaultPrinter locator = WIN32OLE.new("WbemScripting.SWbemLocator") service = locator.connectServer printers = service.execQuery("select * from Win32_Printer") default_printer = nil printers.each do |prn| default_printer = prn.caption if prn.default end default_printer end end