左手の小指を救え

Emacs系のエディタを使っていると朝から晩までCTRLキー押しっぱなし。お陰で左手の小指は常に痛い。
あまりにも辛いので、HHK Lite2*1 の CTRLキーをタッチセンサにしてみた。

今回は Cypress の PSoC を使う。横着して FirstTouch のFTMF基板にテキトーに配線して筐体に押し込んだ。

一応 GitHubPSoC 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キーに乗せているだけ。ああ、なんて楽なんだ。
これでまた一歩、普通のキーボードにさわれない体に近づいた。

*1:ちなみに、これは「もらいもん」

*2:CPU_Clock = 24MHz/16だとさすがにダメだった。

*3:粘着テープつき t=0.1mm

*4:緑線は予備