QMK DFU

すでにまとまった記事もあるのですが自分向けのメモとして。Pro Microが2個必要です。

  1. Pro MicroをAVR ISP化する avrdude -p atmega32u4 -c avr109 -P /dev/tty.usbmodem* -U flash:w:util/pro_micro_ISP_B6_10.hex
  2. make qol56:default:productionブートローダ付きのhexファイルを生成する
  3. ISPのPro Microとキーボード用のPro Microを接続する。GND、VCC、14、 15、16はそれぞれ同じピン同士を、ISPの10はRESETへ接続する。
  4. 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
  5. 2回目以降はキーボード用Pro Microを直接USBにつないでmake qol56:default:dfuでOK

QMK Firmware

QOL56

自設計キーボード第二弾です。 二作目だけあって納得のいく出来になったと思います。 crkbdにLEDをつけてみたらウルトラ楽しくて、キーボードは光る派に転向しました。 LEDも埋め込んでレイヤーで色を変えたり、テンキーの位置を光らせたりなどもできました。 一体型としてはエンドゲームな予感がしています。

前作の対称row staggerdは左手が追いつけませんでした。 いきなりずれる方向が逆になったのだから致し方ありません。 そこでOrtholinearで無難にまとめてみました。 Planckがすでにあるわけですが親指キーをさらに内側に追加したいので14x4の56キーです。 親指キーを0.25Uずらすレイアウトは踏襲しました。

詳細はgithubにまとめました。

github.com

自作キーボードANHEDRAL

前のエントリの通り、キーボードを設計して制作した。 翼の形状にちなんでANHEDRALと名付けたが、それほど気に入ってはいないので、変更するかもしれない。 設計の結果についてはgithubにアップしておくが、不具合もあるので、そのまま作らない方が良い(そんな人はいないと思うが)

github.com

実際に作ってみて、概ね思い通りにできて、ちゃんと動作したのは感激である。 ひとえに先人の皆さんが惜しげもなくkicadのデータを公開していただいていたり、自作キーボード関連のノウハウを書籍として販売されていたおかげである。 感謝。 欲張らずにLEDなしなど割り切った設計にしたのも良かったと思う。

SemiErgoキーレイアウトはまだ慣れておらず、打ち間違いが多いが、良くなっていく感覚はあるので、使い続けてみたい。 親指で押すキーが多いのは本当に快適だ。 カーソルや数字キーがないのも今は苦痛だが、慣れるといらないらしいからもう少し頑張ろう。

一方、QMKのみで親指シフトを実現する試みは少し野心的であった。 レイヤーを使ってみたり、combo機能を使ってみたりしたが、どれもうまくいかず、結局ほとんど自分で同時押しのコードを書いたが、結果的にはうまく動作して良かった。サイズ的にも軽量に仕上がったと思う。

github.com

ぜひ今回の不具合を修正し、改善点を盛り込んだrev.2を設計したいと思う。 というか、キーボードの設計はめちゃくちゃ楽しいので、作らずにはいられないと思う。

このエントリはもちろん自作したキーボードで書いた。

自作キーボード設計の覚書

PCBも発注したので、ここ数ヶ月、はまっているキーボードの設計についてまとめておく。end gameに向けた第一歩である。

動機

  • 親指シフトへの最適化
    • WindowsではやまぶきR、MacではLacailleを使って、親指シフトでの日本語入力を始めて2年ほどたった。今では特に支障なく入力できるようになったが、親指シフトキーの位置には常に違和感があって、Orz配列にしたり、Realforce 91Uにしたりしているが、どうも納得できていない。
    • 親指空うちでの誤入力を防ぎたい。専用親指キーが欲しい。
    • Z行と親指キーが近すぎて同時押しがつらい。
  • ファームウェアでの親指シフト実装
    • ソフトでの親指シフトは機能しない場合がある。
    • さらに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く比べても少し肩が開く
  • マイコン
    • 実績のあるPro Microを採用する。ARM化はおいおい。
    • コンスルー対応
    • 変態度を減らすために裸のマイコンが見えないようにする
    • 薄くしたいのでPCBとボトムプレートで挟まず、ボトムプレートを切り欠く
    • USBポートは左上の位置で、上むきまたは左向きにケーブルを出す
  • ファームウェア
  • ミスを避けるためシンプルな設計
    • 始めてのPCB設計。電子工作もまともにしたことがない。そもそもキットのキーボードすら作ったことがない。
    • 最低15ピン必要(8 x 7 = 56 >= 52)。ただし配線が少し複雑になる。配線をシンプルにするために物理レイアウトに合わせて14 x 4 = 56で18ピン使うことにする。Pro Microのピンを全て使い切る。
    • 分割しないので左右の通信不要
    • 光らせない
    • OLED載せない
    • Pro Microをキーと重ねない
  • Kailh PCBソケット専用
    • 処女作なのでその後の改善に備えて、キースイッチを使い捨てにしたくない
    • 最適スイッチを探索したい
  • ダイオードはスルーホール、SMD両対応
  • PCBと別途製作するは面倒なので、トップ、ボトムプレートもPCBで作る

f:id:eswai:20181216171328p:plain
物理キー配列

QMK on Docker

QMKでファームウェアを作るための環境構築はdockerが楽。以下のDockerfileはgcc-avr 4.9.2、gcc-arm 5.4.1の環境が作成される。 debianベースなので少し古いgccですが、gcc 8のような問題はないので、枯れた環境と言えます。

  1. docker build -t=qmk:stretch .でイメージ作成
  2. docker run --rm -v $('pwd'):/qmk:rw -e keyboard=planck/rev6:default qmk:stretchでビルド
  3. ファームウェアの書き込みは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で使う備忘録。

  1. Releases · basecamp/trix · GitHubからtrix.jsをapp/assets/javascripts/へ、trix.cssをapp/assets/stylesheets/へコピーする。
  2. application.jsへ//= require trix追記
  3. application.css.scssへ*= require trix追記
  4. 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