MicroKeymate


1. ハードウェア編

なんか,Palm 用のキーボード MicroKeymate が投げ売りされてるんで「これ,Swan につながんないかなー」と Palm の開発者サイトをのぞいたら,どうも直結できそうな感じだったのでやってみたらできちゃいました。
[MicroKeymate パッケージ] [MicroKeymate サイズ比較写真]
Palm キーボードの中には 19200bps 接続のものもあるようで MicroKeymate が 9600bps かどうか心配だったのですが,結果オーライでした。
ちゅーことで,www.wonderwitch.com に投稿した記事をベースにちょっと直したものをのせておきます。
最近投げ売りされている Palm 用の MicroKeymate というキーボードですが
コネクタの配線だけで WonderSwan に接続できたみたいです。

Palm 本家の開発者サイトからコネクタの仕様書を GET してみたら
コネクタの電源や信号が +3.3 で直結できそうだったので
さっき,Keyboard の VCC と GND と TX を
WonderWave をばらして基盤からはがした Swan コネクタの VCC, GND, RX と直結し
坂井さんwwterm で 9600bps でつないでみたら
ボタンを押すと(ボタンの表面とは違う文字ですが)文字が
安定して入力されました。
[接続した写真]
工作の難易度も低いし,取り替え可能なコネクタが3種類も付属するので
自分の Palm にあわないコネクタを潰して Swan 用のコネクタが作れます。
キーボード自体コンパクト(折り畳んだ状態で Swan とほぼ同じ厚さ,体積)で
電源も Swan からとれるのでかなり相性がよさそうです。
ただし,ボタンは消しゴムボタンなのでいまいちですが...。

CITIPACK(OEM元?):
http://www.citipack.com.tw/

eZPC(通販で600円):
http://www.ezpc.co.jp

OVERTOP II(秋葉原店頭で1200円)
http://www.messe.gr.jp/ot2/


<配線>
WS コネクタの金属端子を正面にみて
+------+
++1234++  1 VCC +3.3V (to Palm コネクタ 2)
 |5678|   2 RXD       (to Palm コネクタ 3)
 +----+   4 GND       (to Palm コネクタ10)


本来は Palm へ
^
| Keyboard Connector Adaptor for Palm
  (金属端子を上面にして,左から1〜10)
   VCC RXD                 GND
   赤  青                  黒  (変換コネクタ内のケーブル色)
 1  2  3  4  5  6  7  8  9 10
    |  |                    |
    |  |                    |
    |  |                    |
    |  o                    |
    |o   o                  |
    | o o                   |
    | | |                   |
    +-+ +-------------------+
|
v
Keyboard connector
       o
     o   o
      o o
MicroKeymate for Palm

2. ソフトウェア編

キーコードを調べてみたところ,キーリリースで,キープレス+0x80 が来るようなんだけど,なぜか,キーリリースのデータは連続して2回(2バイト)来るようでした。複数のキーを押していて,一つだけはなすとキーリリースは一つのように見えるので,複数キーの同時押し判定に関係した仕様のようです。
で,キーコードの調査結果をベースに,高橋さんとこの pg が動作するように互換の il を作ってみました。

http://www.asahi-net.or.jp/~km5n-tkhs/WW/

pcurs の keyb.c にパッチを当てれば OK でした。
--- ここから ---
*** keyb.c.orig	Tue Sep 10 00:37:20 2002
--- keyb.c	Tue Sep 10 01:00:12 2002
***************
*** 13,54 ****
  #define ALT_FLAG 4
  
  static int code2key[128] = {
!    'a', 's', 'd', 'f', 'h', 'g', 'z', 'x', 
!      'c', 'v', -1, 'b', 'q', 'w', 'e', 'r', 
!      'y', 't', '1', '2', '3', '4', '6', '5', 
!      '=', '9', '7', '-', '8', '0', ']', 'o', 
!      'u', '[', 'i', 'p', ENTER, 'l', 'j', '\'',
!      'k', ';', '\\', ',', '/', 'n', 'm', '.',
!      TAB, ' ', '`', BACKSPACE, -1, -1, -1, ALT,
!      SHIFT, CAPS, OPTION, CONTROL, SHIFT, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1,
!      -1, -1, -1, KEY_LEFT, KEY_RIGHT, KEY_DOWN, KEY_UP, -1
  };
  static int code2key_shift[128] = {
!    'A', 'S', 'D', 'F', 'H', 'G', 'Z', 'X', 
!      'C', 'V', -1, 'B', 'Q', 'W', 'E', 'R',
!      'Y', 'T', '!', '@', '#', '$', '^', '%', 
!      '+', '(', '&', '_', '*', ')', '}', 'O', 
!      'U', '{', 'I', 'P', ENTER, 'L', 'J', '\"',
!      'K', ':', '|', '<', '?', 'N', 'M', '>',
!      TAB, ' ', '~', BACKSPACE, -1, -1, -1, ALT, 
!      SHIFT, CAPS, OPTION, CONTROL, SHIFT, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1, 
!      -1, -1, -1, -1, -1, -1, -1, -1,
!      -1, -1, -1, KEY_LEFT, KEY_RIGHT, KEY_DOWN, KEY_UP, -1
  };
  
- 
  extern unsigned *il_get_ds();
  extern void far *il_to_far(void near *p);
--- 13,54 ----
  #define ALT_FLAG 4
  
+ #define DELETE 0x7f
+ 
+ #define DATE	-1
+ #define APPS	-1
+ #define PHONE	-1
+ #define MENU	-1
+ #define TODO	-1
+ #define CALC	-1
+ #define MEMO	-1
+ #define FIND	-1
+ #define FN	-1
+ #define SPACE	-1
+ #define NEW	-1
+ #define DONE	-1
+ #define CANCEL	-1
+ #define OK	-1
+ 
  static int code2key[128] = {
! '5','6','7','8', 'g','h','i','j',     DATE,PHONE,TODO,MEMO,               -1,-1,-1,-1,
! '9','0','a','b', 's','t','u','v',     CONTROL,FN,SHIFT,ALT,               'w',-1,-1,-1,
! 'o','p','q','r', 'w','x','y','z',     KEY_UP,KEY_DOWN,KEY_RIGHT,KEY_LEFT, -1,-1,-1,-1,
! '-','=','[',']', '/',TAB,CAPS,OPTION, DONE,DELETE,BACKSPACE,ENTER,        -1,-1,-1,-1,
! 'c','d','e','f', '\'','`',' ',SPACE,  -1,-1,-1,-1,                        -1,-1,-1,-1,
! '1','2','3','4', 'k','l','m','n',     '\\',';',',','.',                   -1,-1,-1,-1,
! -1,-1,-1,-1,     -1,-1,-1,-1,         -1,-1,-1,-1,                        -1,-1,-1,-1,
! -1,-1,-1,-1,     -1,-1,-1,-1,         -1,-1,-1,-1,                        -1,-1,-1,-1,
  };
  static int code2key_shift[128] = {
! '%','^','&','*', 'G','H','I','J',     APPS,MENU,CALC,FIND,                -1,-1,-1,-1,
! '(',')','A','B', 'S','T','U','V',     CONTROL,FN,SHIFT,ALT,               'W',-1,-1,-1,
! 'O','P','Q','R', 'W','X','Y','Z',     KEY_UP,KEY_DOWN,KEY_RIGHT,KEY_LEFT, -1,-1,-1,-1,
! '_','+','{','}', '?',TAB,CAPS,OPTION, CANCEL,DELETE,BACKSPACE,OK,         -1,-1,-1,-1,
! 'C','D','E','F', '\"','~',' ',NEW,    -1,-1,-1,-1,                        -1,-1,-1,-1,
! '!','@','#','$', 'K','L','M','N',     '|',':','<','>',                    -1,-1,-1,-1,
! -1,-1,-1,-1,     -1,-1,-1,-1,         -1,-1,-1,-1,                        -1,-1,-1,-1,
! -1,-1,-1,-1,     -1,-1,-1,-1,         -1,-1,-1,-1,                        -1,-1,-1,-1,
  };
  
  extern unsigned *il_get_ds();
  extern void far *il_to_far(void near *p);
***************
*** 62,66 ****
     "Keyb", 
       "keyb", 
!      "0.0",
       "Keyboard IL",
       (char far* far*)0,
--- 62,66 ----
     "Keyb", 
       "keyb", 
!      "0.1",
       "Keyboard IL",
       (char far* far*)0,
***************
*** 91,95 ****
    switch(c2k[c&0x7f]) {
     case SHIFT:
!     if (c & 0x80)
        p->key_flag |= SHIFT_FLAG;
      else 
--- 91,95 ----
    switch(c2k[c&0x7f]) {
     case SHIFT:
!     if (!(c & 0x80))
        p->key_flag |= SHIFT_FLAG;
      else 
***************
*** 98,102 ****
     case CONTROL:
     case CAPS:
!     if (c & 0x80)
        p->key_flag |= CONTROL_FLAG;
      else 
--- 98,102 ----
     case CONTROL:
     case CAPS:
!     if (!(c & 0x80))
        p->key_flag |= CONTROL_FLAG;
      else 
***************
*** 104,108 ****
      break;
     case ALT: 
!     if (c & 0x80)
        p->key_flag |= ALT_FLAG;
      else 
--- 104,108 ----
      break;
     case ALT: 
!     if (!(c & 0x80))
        p->key_flag |= ALT_FLAG;
      else 
***************
*** 110,114 ****
      break;
     default:
!     if (c & 0x80) {
        ch = (p->key_flag & SHIFT_FLAG) ? 
  	c2k_s[c&0x7f]: c2k[c&0x7f];
--- 110,114 ----
      break;
     default:
!     if (!(c & 0x80)) {
        ch = (p->key_flag & SHIFT_FLAG) ? 
  	c2k_s[c&0x7f]: c2k[c&0x7f];
--- ここまで ---

Back to projects
Back to home

Copyright (C) 2002 by wwcube