フォト
2017年5月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ

« 書籍「ボクのLPC810工作ノート」届きました | トップページ | IchigoJamで疑似グラフィックを使った画像の表示 »

2015年4月23日 (木)

arduinoでPS/2キーボードのエミュレーションを行う その2

前回の続きです。

全てのキーについて対応しました。

Windows上のキー入力を全てキャプチャーしてそのキーに対応する
スキャンコードを送信するアプリをVBで作成しました。



IchigoJamのスクリーンエディタでのカーソルキーやBackSpace、ファンクションキー、
等の利用が出来ます。

Windows上でキャプチャー画面を見ながら、windowsのキーボード操作で
IchigoJamの全ての操作が可能です。

20150423

キー入力キャプチャーはこんな感じです。フォーカスが無くてもWindows上の全ての
キーボード操作をキャプチャーし、キーボードに対応するスキャンコードを
arduinoに送信します。

01

arduinoは受信したスキャンコードをPS/2インタフェースにてIchigoJamに送信します。
IchigoJamは、キーボードが繋がっていると思い込んで、キー入力に対応する処理を
行います。

これは、結構よい感じです。ちょっと大がかりな感じがしますが...

入力キーに対応するスキャンコードの変換をWindows側で行うようにしたので、
arduinoのプログラムは前回よりもシンプルになりました。
#include "ps2dev.h"

PS2dev keyboard(3,2); 
int enabled =0; 
int code;

void ack() {
  while(keyboard.write(0xFA));
}

int keyboardcommand(int command) {
  unsigned char val;
  switch (command) {
  case 0xFF:  ack();
    while(keyboard.write(0xAA)!=0);
    break;
  case 0xFE: // Reset: キーボードリセットコマンド。正しく受け取った場合ACKを返す。その後キーボードはセルフテストを実行する。
    ack();
    break;
  case 0xF6: // set defaults: 起動時の状態へ戻す
    //enter stream mode
    ack();
    break;
  case 0xF5: //disable data reporting: 起動時の状態へ戻し、キースキャンを停止する
    //FM
    enabled = 0;
    ack();
    break;
  case 0xF4: //enable data reporting : キースキャンを開始する
    //FM
    enabled = 1;
    ack();
    break;
  case 0xF3: //set typematic rate/delay : 
    ack();
    keyboard.read(&val); //do nothing with the rate
    ack();
    break;
  case 0xF2: //get device id : 
    ack();
    keyboard.write(0xAB);
    keyboard.write(0x83);
    break;
  case 0xF0: //set scan code set
    ack();
    keyboard.read(&val); //do nothing with the rate
    ack();
    break;
  case 0xEE: //echo :キーボードが接続されている場合、キーボードはパソコンへ応答(ECHO Responce)を返す。
    //ack();
    keyboard.write(0xEE);
    break;
  case 0xED: //set/reset LEDs :キーボードのLEDの点灯/消灯要求。これに続くオプションバイトでLEDを指定する。 
    ack();
    keyboard.read(&val); //do nothing with the rate
    ack();
    break;
  }
}

void setup() {
  Serial.begin(115200);
  // send the keyboard start up
  while(keyboard.write(0xAA)!=0);
}

void loop() {
  unsigned char c;  // PCからの送信データ
  uint8_t inkey;    // シリアルポートからの取得文字コード

  if( (digitalRead(3)==LOW) || (digitalRead(2) == LOW)) {
    while(keyboard.read(&c)) ;
    keyboardcommand(c);
  } else {
    if (Serial.available()>0 ) {
      inkey = Serial.read();
        keyboard.write(inkey);     
    }
  }
}

キー操作キャプチャーはちょっと危険(犯罪に利用できるという意味で)なので、
ソースは公開出来ません。

今回の実験で、
  「PS/2インタフェースの入力デバイスを簡単に製作できそうだ」
いう感覚をつかむことが出来ました。

関連記事

« 書籍「ボクのLPC810工作ノート」届きました | トップページ | IchigoJamで疑似グラフィックを使った画像の表示 »

arduino」カテゴリの記事

IchigoJam」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/61481081

この記事へのトラックバック一覧です: arduinoでPS/2キーボードのエミュレーションを行う その2:

« 書籍「ボクのLPC810工作ノート」届きました | トップページ | IchigoJamで疑似グラフィックを使った画像の表示 »