Post date: Feb 2, 2014 2:04:33 AM
前回、「テンキーを解体して改造する」でテンキーをマイコンから扱いやすい形に変更した.今度はこれを使用してarduino leonardoとつなげてみる.
leonardoには自身をキーボードとして認識させることができる.
void setup{
Keyboard.begin();
}
void draw(){
Keyboard.print("hello ");
Keyboard.println("world!!");
delay(100);
}
これを利用する.
ここで注意しておいて欲しいのは,leonardoでは入力したアスキーコードのままに出力はされないということだ.
例えば,次のコードを実行して欲しい.
void setup{
Keyboard.begin();
}
void draw(){
Keyboard.print( "}" );
delay(100);
}
このコードで出力されるのは「}」ではなく「{」のはずだ.詳しいことは分からないが,多分シフトを押しながら打つキーだと打てなかったりするらしい.
また,leonardo自身はusキーボードになっているらしく,「¥」「_」が完全に打てない.
ちなみに自分が知るかぎりの対応表を下に記しておく.(これがすべてではない)
これらに注意して,プログラムを書いた.
#define KEY_NUM 8
#define CHATTERING 5
const boolean DEBUG=false;
byte key[8];
boolean button_pushed;
boolean button;
int val=0;
void setup(){
for(int i=0;i<KEY_NUM;i++){
pinMode(2+i, INPUT_PULLUP);
key[i]=0;
}
pinMode(2+KEY_NUM, INPUT_PULLUP);
button=false;
button_pushed=false;
void loop(){
val=digitalRead(KEY_NUM+2);
if(button_pushed&&val==LOW){
button_pushed=true;
button=!button;
}
else if(val==HIGH){
button_pushed=false;
}
for(int i=0;i<KEY_NUM;i++){
val=digitalRead(i+2);
if(key[i]==0&&val==LOW){
keypush(i);
key[i]=CHATTERING;
}
else if(val==LOW){
key[i]=CHATTERING;
}
else if(val==HIGH&&key[i]>0){
key[i]--;
}
}
}
void keypush_debug(int i){
Keyboard.print(i);
}
void keypush(int i){
if(DEBUG){
keypush_debug(i);
return;
}
switch(i){
case 7:
Keyboard.print("for*int i_0;i<length;i::(");
break;
case 5:
Keyboard.print("for*int j_0;j<length;j::(");
break;
case 2:
Keyboard.print("for*int i_length-1;i>_0;i--(");
break;
case 0:
Keyboard.print("for*int j_length-1;j>_0;j--(");
break;
case 6:
Keyboard.print("ArrayList<> _ new ArrayList<>*(");
break;
break;
case 4:
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('c');
Keyboard.releaseAll();
case 3:
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('x');
Keyboard.releaseAll();
break;
case 1:
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('v');
Keyboard.releaseAll();
break;
}
}
チャタリング対策がビミョーな気がするのであとで変更する.
全体像はこんなかんじになった.