標題の通りですが HHKB を半分に割ってブチ壊すみたいな話ではないのでご安心ください。

  1. HHKBを2台用意します。
  2. HHKB 2台を横に並べます
  3. Karabiner を入れます
  4. 完成です

通常、キーボードを複数繋いでも、修飾キーは各キーボードごとに独立して管理されます。なので、2台キーボードを繋いで並べたとしても右のキーボードでShiftを押しながら左のキーボードのaを押してAを入力するみたいなことができません。

Karabiner を入れるとこの問題が解決します。インストールするだけで、全てのキーボードで修飾キーが共有されるようになり、同一のキーボード2台があれば左右分割のエルゴノミクスキーボードっぽく使うことができるようになります。

PFU Happy Hacking Keyboard Professional2 墨 英語配列 静電容量無接点 USBキーボード Nキーロールオーバー UNIX配列 WINDOWS/MAC両対応 ブラック PD-KB400B -

5.0 / 5.0


背景

ErgoDox を見てから左右分割キーボードに対して興味が沸いたので、簡単に試せる方法を探していました。Karabiner の機能ページを見てみたら修飾キーを共有する機能が書いてあったので「これでできるやん」と思いやってみました。HHKB は自宅用と会社用とかで2台持っている人も多いと思うので、意外と試しやすいのではないでしょうか?

あと ErgoDox って結構高価なので、不安なら価値が安定しているHHKB2台買っても良いのではないしょうか。僕は1台は貰いものなので他人のこと言えませんが……

感想

最初の5分ぐらいは同じキー配列にも関わらず、ちょっと頭が混乱していてうまく打てませんでした。少ししたら全く問題なく打てるようにはなりました。しかしパスワードはかなり複雑で特殊な打ちかたをしていたのでうまく打てません。

とりあえず使うにはこれでもいいんですが、使い続けようと思うと会社用と家用に2台ずつHHKBが必要になって大変コスパが悪そうです。また、修飾キー共有をソフトウェアに頼っているので環境が限定されます。

左右分割すればエルゴノミクスなのか?

知るかよ

  1. トップ
  2. tech
  3. HHKB を左右分割エルゴノミクスキーボードにする (OSX)

I2C がうまく動かなくて調べていたら、どうやら UART を使おうとすると競合するようでした。確かにピン配置を見ると CTS/RTS と SDA/SCL はかぶっています。これは事前に知っていましたが、RXD と TXD とはかぶっていないので、問題なく使えると思っていました。

しかし実際は Serial を使おうとすると問答無用で該当ピンが CTS/RTS が設定されるコードがハードコードされています。

serial_api.c

TXD/RXD は外部から渡せるようになっているのに、CTS/RTS は決め打ちで勝手に機能割当されます。なんやねん。

解決方法

Serial を初期化したあと、CTS/RTS の機能割当をはずせば良いようです。すなわち

NRF_UART0->PSELRTS = 0xFFFFFFFFUL;
NRF_UART0->PSELCTS = 0xFFFFFFFFUL;

というようなコードを main を最初あたりに入れておけば良いです。0xFFFFFFFFUL は Disconnected を表す定数です (NC という定数になっていますが型が違うのでリテラルで書いてます)

  1. トップ
  2. tech
  3. BLE Nano + mbed の Serial の実装がつらい感じだった

マイクロソフト マウス ワイヤレス/5ボタン/人間工学デザイン ブラック Sculpt Ergonomic Mouse for Business 5LV-00004 -

4.0 / 5.0

それほど使っているマウスに不満があるわけではなかったが、マイクロソフトからおもしろいマウスが出ていたので買ってみた。

今まで使っていたマウスは Logicool M310 というやつです。

Logicool ロジクール ワイヤレスマウス M310t シルバー -

4.0 / 5.0

Sculpt Ergonomic Mouse は M310 と比べると

  • 重い (だいぶ重量感がある)
  • 握りやすい
  • 表面テカテカ
  • 単3電池が2本必要 (M310 は1本)
  • 中ボタンが軽い
  • 中ボタンにチルトがある

M310 も単3電池が入っているのでそこまで軽いわけではないですが、 Sculpt Ergonomic Mouse は単3電池2本なのでだいぶ重く感じます。会社では電池とかが入っていない有線の Microsoft IntelliMouse Optical を使っていますが、おそろしく重量が違う。頻繁に持ちあげる場合、重いというのはマイナス要素ですね。

表面テカテカなのは良くないです。ぱっと見はいいんですが、手垢ですぐ汚れて嫌な感じになってきます。

中ボタンが軽いのは良いです。M310 は中ボタンがかなり押しにくいです。

中ボタンにチルトがありますが必要ないかなと思いました。

握りやすさ的にはとてもいいです。気持ちよく使えます。M310 は良くも悪くも形は普通なので、気持ち良く使えるかというとそうでもなくて、普通な感じ。 Sculpt Ergonomic Mouse は気持ちいい。

買いなのか

とにかく重いのが現状の不満点です。とはいえ慣れるかもしれません。

NEW GAME、とにかくキャラクターが可愛いくて、アニメでもマンガと同じぐらい可愛い。ひふみんがとにかく可愛い。可愛い。

.zshrc に勝手に sdkman とやらの設定が入っていて、コワッと思った。しかし sdkman は gradle をインストールするときに確かに自分で入れたのであった。

しかし名前がひどい。Java 関係のツールを簡単に入れれるツールという感じだけど名前に Java 感が一切ない。つらい。

  1. トップ
  2. tech
  3. sdkman を自分で入れておいて…

連休とあわせて6日ほど休んだけど、全く休み足りない。まだまだやりたいことがあった。しかし仕事は忙しくなるし、毎日眠いし、頭の中がすっきりしないし、どうしようもない。

BLE Nano とは

http://redbearlab.com/blenano/

技適が通ってる小さい BLE 組込みの ARM SOC です。

開発環境

とりあえず mbed のオンラインコンパイラを使っています。というのもライブラリのリンクとかでハマるのが嫌だったからです。が、そのうち platformio で gcc ベースの開発はしたいところです。

BLE Nano + ブレッドボード

(この写真は MK20 のピンヘッダのうち、USBコネクタ側のピン2つが立っておらずスルーホールのままなので見間違えないように気をつける必要があります。MK20 + BLE Nano のセットを買ったら最初からピンヘッダはんだ付け済みでこうなっていたので、セットで買ってる限りは問題ないと思いますが…)

MK20 という書きこみ装置に亀の子的に挿して開発ができるんですが、これだと単に書きこめるってだけで周辺回路が作れないので、ブレッドボードに接続します。

必要な接続がいまいちわかりにくいですが、以下を接続すれば良さそうです。

  • SWCLK
  • SWDIO
  • VDD または VIN
  • GND

加えて、デバッグするなら

  • TXD
  • RXD

VDD は 1.8〜3.3V、VIN には 3.3V〜13V となっています。要は VIN にはレギュレータがついていて、VDD は直接入力になっているようです。

GPIO の入力範囲は?

VDD + 0.3 が絶対定格。5V トレラントとかではないので注意が必要そう。MK20 は裏面のジャンパで 1.8V モードにできる。低い外部電圧を使いつつ開発したい場合は 1.8V モードにする必要がある。

定格とかはnRF51822のダウンロードページから、nRF51822-PS (nRF51822 Product Specification) をダウンロードして見ればわかる。

レジスタ一覧とかは同じくnRF51822のダウンロードページから、nRF51 RM (nRF51 Series Reference Manual) を見れば書いてある。

オンラインコンパイラでもvimで開発したい

moco 使うといいです!!! https://github.com/hotchpotch/moco

以下のようにするとよさそう

  • ~/.mocorc に mbed のアカウント情報を書いておく
  • mbed オンラインコンパイラでプロジェクトの雛形を作ってpublish
  • hg 経由で手元にもってくる
  • プロジェクトルートに .mocorc を置いて、platform とかを指定する
  1. トップ
  2. tech
  3. BLE Nano の開発 - ブレッドボード配線

BLE Nano + mbed で HID over GATT しようとして1日ハマっていたので記録しておきます。HID の問題というよりペアリングの問題です。

前提

OS X El Capitan 10.11.5(15F34)

HID over GATT は Battery Service と DeviceInformationService と HIDService を提供します。

Battery Service と DeviceInformationService は mbed の BLE_API に含まれています。これはどちらのどの characteristics も open link (ペアリングなしで全ての情報を得られる) で公開しています。

HIDService は BLE_HID というライブラリに含まれています。これの characteristics は暗号化必須になっています。

問題

OS X でどうしてもペアリングが行なわれず、HID サービスが全く見えない状態でした。

Anrdoid や Windows 10 では問題なくペアリングできました。

OS X での挙動を詳細にすると

  • Bluetooth 機器一覧にでる
  • 「ペアリング」ボタンがでる
  • デバイスとの接続はできる
  • 「接続中」のまま止まり、パスコードなどを訊かれない

デバイス側のデバッグログ的には

  • onConnect は呼ばれる
  • セキュリティ関係のコールバックは一切呼ばれない

で、かなりお手上げでした。

解明と解決

OSX ではどうやら、何らかの条件で open link な characteristics があると bonding を行おうせず限定的なアクセスになり、HID サービスが見えないようでした。

仕方ないので BatteryService.h と DeviceInformationService.h をコピーして中身を書きかえて、requireSecurity(SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM) するように変えました。外部から変えるAPIがないので辛い感じです。

  1. トップ
  2. tech
  3. OSX + BLE で HID over GATT でペアリング(bonding)ができなくてハマった

BLE Nano + mbed での ADC の基準電圧は VDD の 1/3 になっています。当然ながら VDD が変動するケースではこの基準は受け入れられません。BLE Nano は性質的に電池駆動するケースも多々あるでしょうから、デフォルトでVDD基準なのは解せない仕様です。

mbed には基準を変更する API などがないので、自力で設定します。BLE Nano には内部バンドギャップリファレンスの 1.2V もあるので、これを使うようにします。

	NRF_ADC->CONFIG =
		(ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
		(ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
		(ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
		(ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);

ADC_CONFIG_REFSEL_VBG がバンドギャップリファレンスを使うようにする部分です。あとの部分は元のままです。なお、アナログ入力側には1/3の分圧が入っています。

mbed のライブラリ側ではこれらのオプションを保持して ADC を行うようなコードに(今のところは)なっているので、AnalogIn 初期化後に一度設定すればずっと有効です。

備考:VDD の電圧を測りたい場合

VDD の電圧をADCしたい場合は、外部接続しなくとも INPSEL を ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling にすればできそうです。mbed 側では対応していませんが、現状の実装だと、CONFIG を書きかえてから、AnalogIn (なんでもいい) を read すればいけそうな雰囲気です。

備考:mbed 側の実装

TARGET_MCU_NRF51822 の analogin_api.c に実装があります。

    NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
                      (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
                      (ADC_CONFIG_REFSEL_SupplyOneThirdPrescaling << ADC_CONFIG_REFSEL_Pos) |
                      (analogInputPin << ADC_CONFIG_PSEL_Pos) |
  1. トップ
  2. tech
  3. BLE Nano + mbed の ADC の基準電圧