Arduino Leonardoによる仮想キーボードの利用

追加シフトキーは,現行のキーボードに直接配線することも可能かもしれないが,静電容量キーボードだとどうなるのかよくわからない.
USBのキーボードとして動作するようにする方法として,Arduino Leonardoを利用する方法がある.
http://d.hatena.ne.jp/uosoft/20150127 : Arduino LeonardoでUSBキーボード出力
スイッチを読み取って,一定のキーとして出力するには,以下のようなプログラムをArduino IDEで書いて,ボードに送れば良い.

int key2 = 0;
int key3 = 0; // キー入力フラグ

void setup() {
  pinMode( 2, INPUT_PULLUP); // デジタル2ピンを内部プルアップ抵抗を有効にして出力に設定
  pinMode( 3, INPUT_PULLUP); // デジタル3ピンを内部プルアップ抵抗を有効にして出力に設定
  Keyboard.begin(); // キーボード開始
}
 
void loop() {
  if( digitalRead(2) == LOW ){
    if( key2 == 0 ){
      key2 = 1;
      Keyboard.press(KEY_LEFT_ALT);
    }
  }else {
    if( key2 > 0 ){
      key2 = 0;
      Keyboard.release(KEY_LEFT_ALT);
    }
  }
  if( digitalRead(3) == LOW ){
    if( key3 == 0 ){
      key3 = 1;
      Keyboard.press(KEY_RIGHT_ALT);
    }
  }else {
    if( key3 > 0 ){
      key3 = 0;
      Keyboard.release(KEY_RIGHT_ALT);
    }
  }
}

キーの購入

ハードウェアとしてのキーのスイッチは,いろいろ探したが,http://www.jw-shop.com/P-keyboard-mswitch10/page45/detail.htm : ジェイダブルシステムで扱っているのを発見した.
赤軸.安定させる金具も買ったが,付け方がよくわからなかったのと,加工が面倒そうだったので,省略.

アルミ板にスイッチ穴を開けて,スイッチを固定.久しぶりにハンドニブラを持ち出した.

筐体

筐体として,昔,ハンドレストとして使っていた桜の木をトリマで削って組み込む.




やっと完成.

なお,Karabinerの設定としては,Arduino LeonardoのAltキーは,Optionキーとして認識されるようなので,この設定を作って割り当てている.

親指シフト入力・ハードウェア対策編

親指シフト入力を試してみた.英語配列を常用する私のような者向け親指シフトとして,uso配列なるものを見つけた.
http://qiita.com/mochi/items/5b44169db7b3a76d3da1 : MacのUSキーボードで親指シフト入力する方法
このためのドライバKarabinerを設定して,練習をはじめかけて,左右のシフトキーがとても押せたものでないことに気づいた.
JISかなキーボードだと,左右のシフトキーをスペースバーの左右にある変換キーなどのキーを左右シフトキーに割り当てることで対応できる.
しかし,私の場合,脳と手が英語配列に最適化されてしまっているのと,購入したキーボードやノートパソコンはことごとく英語配列であるため,この方式をとることができない.
このため,ハードウェア的な解決を試みた.
Karabinerの機能として,2つのキーボードにまたがったキーコンビネーションを入力できるという機能があるということを小耳に挟んだので,シフトキーだけを持ったキーボードを追加することとした.もっとも,MacBookなどのノートパソコンなら,タッチパッドをシフトキーとして利用する方法がありうるが,これはパッドをキーボード扱いするということなので,BetterTouchToolとかKarabinerをうまく設定すればうまくいくかもしれない.

Macでergodex DX1

ユニバーサルキーボード?のhttp://ergodex.com/mainpage.htm:ergodex DX1が部屋の片隅に転がっていたのを思い出したので,ドライバを探してみた.Windows用ドライバしかなかったはずが,Mac用ドライバが出ているという記述を発見.買おうかな!?と思ったら,販売サイトは消滅していた(大丈夫か,ergodex?).
しかし,さらにごそごそ探すとオープンソースドライバのhttp://ergodex.hydraproductions.com/wiki/start:サイトを発見.http://ergodex.hydraproductions.com/wiki/downloads:IntelMac用ドライバがDLできたので,早速試してみる.

ergo-intelmac

というファイルが何かわからず,binaryみたいなので,

$ chmod +x ergo-intelmac

して,DX1を接続して実行してみると,

$ ./ergo-intelmac 
(Unofficial) Ergodex DX1 Config Tool v0.2.1
Copyright 2007 Richard A Burton, released under GPL v2.

Usage:
 ./ergo-intelmac <options> <command>
Options:
 -v verbose (can be specified more than once)
 -d <deviceid> operate on specified device only, valid with -p/-m
Commands:
 -h help
 -l list devices
 -m monitor first or specified device
 -r reset usb interface
 -p <filename> program with keys from file
 -f <1-3> flash LEDs on device
Notes:
 -d can only be used with -p

となる.

$ ./ergo-intelmac -f 1
(Unofficial) Ergodex DX1 Config Tool v0.2.1
Copyright 2007 Richard A Burton, released under GPL v2.

で,LEDが点滅するのを確認.
しかし,-p オプションで指定するファイルをどう書くかに記載が全くなくて探しまわること約1時間あまり.
Linux版のソースコードを展開してみるとkeys.csvというそれらしきファイルを発見.
中身は↓

# File contains comma separated values in the form:
# <key>,<type>,<value>
#
# <key> can be a number for 1-50
# <type> can be '1' (single key) or '2' (modifier key)
# <value> is the usb scan code for single key or modifier code for modifier key
#
# See here for a list of usb key codes:
# http://www.win.tue.nl/~aeb/linux/kbd/scancodes-10.html#ss10.6
# Or see the USB HID Usage Tables, Section 10 - Keyboard, for a full list:
# http://www.usb.org/developers/devclass_docs/Hut1_12.pdf
#
# Valid modifier keys are:
#    1 - left ctrl
#    2 - left shift
#    4 - left alt
#    8 - left win/gui
#   16 - right ctrl
#   32 - right shift
#   64 - right alt
#  128 - right win/gui
# Or any combination, e.g. left-ctrl + left-alt = 5
#
# Numbers must be specified in decimal.
# Blanks lines and lines starting with '#' are ignored.

1,2,5
2,1,30
3,1,31

そのまま,読みこませて3番のキーを叩くとUSBキーコード31="2"が入力されることが確認できた.
キーコードは,上のドキュメントにあるように
http://www.win.tue.nl/~aeb/linux/kbd/scancodes-10.html#ss10.6
からアクセスできる.

関数の中で呼び出し時に与えられた引数の完全なリストを得る方法

ある関数群の実行ログを作りたいので,マクロを埋め込むのだけど,この方法があると別々の引数を再度組立て直す必要がなくなるのだが.
もっともデバッガを作るときぐらいしか必要ないので,実装レベルのコードを見るしかないか..

MacのCommonLISPで3DにはXMLispがおすすめ

eXtreme Media Lisp

XML記法でミニ3Dアプリを簡単に作ったりすることを目指したプロジェクト.AgentSheetのAlexander Repenning氏が開発している模様.
Lisperの立場からすると,XMLのような欝陶しい記法を持ち込む理由はあまりないような気がするのだが,Cocoaなどの3D機能はClozureCLベースで安定に動作しているので,こういったアプリケーションを作りたい場合にはこれを利用すると作り易い.

とりあえず

  • いろいろいじって,OSカーネルまでは落ちなくなった.しかし,アプリケーションレベルでは落ちる.繰り返しで描画コマンドを実行すると落ちるのは相変わらず.(sleep 0.1)を挟むだけで落ちずに描画できるのが不思議.