獣医さんの電子工作とパソコン研究室
 
 58.古いテンキーボードをUSB化する。
(トラ技付録 78K0 USBマイコンの活用)
  
 

 

 ■ 2008年8月号 トラ技付録 78K0 マイコンボード
 以前から、ジャンク箱の中にテンキーが2個眠っているのが気になっていました。なんとか活用の方法はないものかと・・・・。ふと、Webを見ていると、78K0マイコンのUSB HIDについての記事を見かけました。トラ技付録基板も余っていることだし、これを使ってテンキーをUSB化してみようと計画しました。
  
 ■ ジャンク 98用 テンキーボード 
こんかい改造に使用したのが、古ーい98用テンキーボード NEOS MTK-500 です。
キートップの形状も全て同じで、キー入れ替えも問題なさそうです。
中身はTMP8C49Aという東芝のマイコンと74HC14でした。
キースイッチはマトリクスではなく、全てのキーが一本ずつマイコンにつながっている構造でした。
 
 ■ トラ技付録基板を試してみる 
昨年トラ技を購入した時に、一度実験して使ってみたのですが、そのまま目的も無くしまわれていました。
記事の通りにブレッドボードに組んで実験です。
 
トラ技BIOSがあるので、RS232C通信でRAMにプログラムを書き込んでおいて実行することができ、なかなか開発環境としては使いやすい感じです。
特集の解説もわかりやすかったですね。
 
NECの統合開発環境PMもまずまずの使い勝手ですね。
テンキーの部品を全て取り除き、基板のパターンを切ったり、つなげたりして4×5のキーマトリクスを作りました。
 
キーマトリクスのプログラミングは初めてでしたので、まずはトラ技BIOSを利用して、RAM上にキーマトリクスをセンスするプログラムを作ってみました。
   
 ■USB接続のキーボート その1 シリアルキー ・・・ 動くには動くが 
 
 下のサイトでWindowsのシリアルキー機能というものがあることを知り、USBの知識も要らないので、これを試してみました。
→ テクニカルライター後田 敏の部屋 ブログ内検索で「シリアルキー」で検索してみてください。
 Windowsにはシリアル接続でキーボード機能を使えるオプションがあります。「コントロールパネル」「ユーザー補助のオプション」−「全般」−シリアルキーデバイスを使うのチェックボックスにチェックしておくだけで、COMポートからキーコードをテキスト形式で送るだけです。同様にしてマウス操作もできます。
 プログラミングも簡単だし、テンキーのNumLock問題もなかろうかと思い作ってみましたが、確かに動作はするのですが、次回Windosを立ち上げるとそのままでは動作しないことがわかりました。一度チエックボックスにチェックすれば次回立ち上がった時にもこのチェックがあるにもかかわらず動作しないのです。いろいろ設定をしてみましたが、有効な解決策は得られませんでしたので、定番どおりのUSB機能を使うことにしました。
 
 ■USB接続のキーボート その2 HIDクラス ・・・ 動いた! 
 
 USB接続についての知識はまったく皆無でしたので、こちらのサイトを参考にさせていただきました。
USBの規格や通信方法は他のサイトで調べてもらうとして、私も詳しく理解しているわけではなく、要するに、USBファンクションHIDクラスドライバ(NECが提供している)を使えば、78K0マイコンでUSBヒューマンインターフェース機器が作れるというものらしいです。
 
 さっそくNECのサンプルを利用してプログラムを作ってみました。
今回は、HIDクラスドライバだけで2KBを超えてしまうので、RAM上へ転送して実行というわけには行きませんでしたので、ROM上にプログラムを転送して動かしました。 
  
 ■回路図とプログラム 
 
プログラム(PM+プロジェクトファイル一式)   HID_KB.lzh
※基本的業務で使うキーのみ(0〜9,/*-+Enter)を対象として考えましたので、本当のテンキーの機能とは異なります。
 
 ■やはりNumLock問題が・・・ 
 
 USBで送出するキーコードは USB.org の中の USB Usage Table という文書の中 53ページから書いてあります。テンキー(KeyPad)部分は同数字でも違うキーコードだということを初めて知りました。
 
最初はUSB Usage Tableで規定されいるキーコードのうちKeyPadのコードを送るようにプログラムしたのですが、やはりNumLockの問題が起こりました。
実際にテンキーボードを使用するのは数字キーですので、Keyboardのキーコードを送るようにしました。
そうしますと、+、*、はシフトキーを押しながらですから、この辺も含めてプログラムを作りました。
 
とりあえず、実用になるものはできたので、元のICが載っていたところへ、トラ技付録78K0基板を載せ、無事完成いたしました。
 
 
 ■USBコネクタ(Aタイプ)の小型化 
ノートパソコンの側面にUSBコネクタを刺すと、結構出っ張ってうっとうしい場合があります。
私は、写真のように改造して、L型のUSBコネクタにして使っています。
 
作り方は こちらのページ で解説しています。
 
 ■ ちよっとプログラム解説
 解説するほどのプログラムでもないですし、専門家ではないのですが、気がついたことを書いておきます。言葉遣いもおかしいかもしれません。
 
main.cとインクルードファイルはNECのHIDサンプルをほとんどそのまま使用しています。 
トラ技BIOSでの動作時は#pragma sfrでポートの指定がP3.1と言う感じで指定できるのですが、NECのサンプル中のRegDef.hを使用すると、この指定方法だとエラーになってしまうため、RegDef.hの一部分をコメントアウトしてあります。
 
 RegDef.h の一部部分です
 赤字のポートレジスタ宣言部をコメントアウトすることで、いままで通の書き方ができます。

/* Special function registers(uPD78F0730) */
//#define P0 *((t_78k0_reg08*)(0xFF00)) /* Port register 0 */
//#define P1 *((t_78k0_reg08*)(0xFF01)) /* Port register 1 */
// #define P13 ((t_78k0_reg01*)(0xFF01))->b3 /* Port register 1(bit3) */

#define UF0E0R *((t_78k0_reg08*)(0xFF02)) /* UF0 EP0 read register */
//#define P3 *((t_78k0_reg08*)(0xFF03)) /* Port register 3 */
// #define P30 ((t_78k0_reg01*)(0xFF03))->b0 /* Port register 3(bit0) */
//#define P6 *((t_78k0_reg08*)(0xFF06)) /* Port register 6 */

#define RXB6 *((t_78k0_reg08*)(0xFF0A)) /* Receive buffer register 6 */
#define TXB6 *((t_78k0_reg08*)(0xFF0B)) /* Transmit buffer register 6 */
//#define P12 *((t_78k0_reg08*)(0xFF0C)) /* Port register 12 */
// #define P120 ((t_78k0_reg01*)(0xFF0C))->b0 /* Port register 12(bit0) */

 
 キーボードのチャタリング対策ですが、単純なウエイト(30ms)で2回同じキーが押されていることで判断します。ウエイトは単純ループでも良かったのですが、タイマTMR00を使用してタイムアップ時の割り込みフラグを監視するタイプのものをつくりました。
タイマの設定とウエイト部分

// waitルーチンで使うTMR00の設定
 PRM00 = 1;      // プリスケーラ設定 16MHz→4MHz
 CR000 = 0x9C40;   // 割り込み周期 10ms
 TMC00 = 0x00;    // カウント停止
 MK0H.6 = 0;      // TM000割り込み許可


//-------------------------------------------------------------------
// WAIT TMR00で10ms
//-------------------------------------------------------------------
void wait_10ms(unsigned int p){
 unsigned int i=0;
 TMC00 = 0x0C;    // TMR00カウント開始
 for(i=1; i<=p; i++){
  while(1){
    if( IF0H.6 ){    // 割り込みフラグを監視
     IF0H.6 = 0;   // 割り込み要求フラグクリア 
     break;
    }
  } 
 }
TMC00 = 0;        // カウント停止
}

 
USBでキーコードの送信ルーチンは、8バイトの配列(keycode[8]の3バイト目にキーコードを代入し、送信ルーチン(usbf78k_data_send)を呼び出すというものです。
キー押し下げ時と、キーリリース時送信します。キーリリース時は変数keycode[]の各バイトを0にしたものを使います。
//-------------------------------------------------------------------
// USBでキーコードを送信
//-------------------------------------------------------------------
void key_check(void)
{
 if( keydata ){
  LED = LO;
  keycode[KEY1_SCAN_CODE] = keydata;        //キー押し下げ時キーコード
  usbf78k_data_send(keycode, sizeof(keycode), BKI1); //キーコード送出
  while( (ROW & 0x1F) == 0x1F){}             // キー リリース待ち
  memset(keycode, 0, sizeof(keycode));         //keycode配列を0で埋める(キーリリースコード)
  usbf78k_data_send(keycode, sizeof(keycode), BKI1);//キーリリースコード送出
  wait_10ms(10);
  LED = HI;
 }
}
 
シフトキーを押しながらのキー(今回の場合+,*,=)は、配列keycode[]の1バイト目に0x02、3バイト目にキーコードを代入してusbf78k_data_sendを呼び出します。
//-------------------------------------------------------------------
// USBでキーコードを送信(シフト+ の場合) 
//-------------------------------------------------------------------
void key_check_shift(void)
{
 if( keydata ){
  LED = LO;
  keycode[SPL_KEY_SCAN_CODE] = 0x02;        //シフトキー+の場合
  keycode[KEY1_SCAN_CODE] = keydata;        //キー押し下げ時キーコード
  usbf78k_data_send(keycode, sizeof(keycode), BKI1);  //キーコード送出
  while( (ROW & 0x1F) == 0x1F){}              //キー リリース待ち
  memset(keycode, 0, sizeof(keycode));           //keycode配列を0で埋める(キーリリースコード)
  usbf78k_data_send(keycode, sizeof(keycode), BKI1);  //キーリリースコード送出
  wait_10ms(10);
  LED = HI;
 }
}
  
※参考にさせていただいたサイト
  古典コンピュータ愛好会♪ ・・・ PC-9801キーボード→USB 変換器
  USB.org ・・・ USB Usage Table
  テクニカルライター後田 敏の部屋 ブログ内検索で「シリアルキー」
  USBファンクションHIDクラスドライバ(NECが提供)
 
Last up date 2009/11/24

 

This page count Total:17397 / Today:3 / Yesterday:5  

 本業のページ