Emacs系のエディタを使っていると朝から晩までCTRLキー押しっぱなし。お陰で左手の小指は常に痛い。
あまりにも辛いので、HHK Lite2*1 の CTRLキーをタッチセンサにしてみた。
今回は Cypress の PSoC を使う。横着して FirstTouch のFTMF基板にテキトーに配線して筐体に押し込んだ。
一応 GitHub に PSoC Designerのプロジェクト一式を置いておく。
手書きで汚いけど、接続はこんな感じ↓。
下はソフトウェア部分。PSoC はハードウェア初期化を書かなくていいから楽だ。
//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
BYTE out_p1;
void main(void)
{
M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
// Insert your main routine code here.
M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);
CSD_1_Start();
CSD_1_InitializeBaselines() ; //scan all sensors first time, init baseline
CSD_1_SetDefaultFingerThresholds() ;
out_p1 = 0x40;
while(1) {
BYTE val_p1 = out_p1;
CSD_1_ScanAllSensors();
CSD_1_UpdateAllBaselines();
if(CSD_1_bIsSensorActive(0)) {
val_p1 |= 0x04; // BLUE LED HI (touch sw indicator)
val_p1 &= ~0x40; // SENSEOUT LO
} else {
val_p1 &= ~0x04; // BLUE LED LO
val_p1 |= 0x40; // SENSEOUT HI (Hi-Z)
}
out_p1 = val_p1;
}
}
#pragma interrupt_handler GPIO_INT
void GPIO_INT(void)
{
// P0_2: keyboard matrix drive signal (active-lo)
PRT1DR = (PRT0DR & 0x04)? 0x40 : out_p1;
}
メインループでセンサを読んどいて、キーボードマトリクスのドライブ周期をエッジ割り込みで捉えて乗せるだけ。ソフトで出力してるから若干遅れるけど、CPU_Clock = 24MHz/2 くらいなら問題なく読み取ってくれるようだ*2。
下はセンサの電極部分。CTRLキーのキートップの裏側に銅板*3を貼って、ホットボンドで止めとく。センサの配線は黄色の1本のみ*4。
USBハブ基板を取り去って、代わりに書込器用のヘッダをつけとく。これでCapSense の感度を後で調整できる。
左手小指はCTRLキーに乗せているだけ。ああ、なんて楽なんだ。
これでまた一歩、普通のキーボードにさわれない体に近づいた。