Sazanami Online

小型キーボードの製作

[その1] [その2] Index に戻る
ノートパソコンのキーボードユニットとPICで
ノートパソコンのキーボードユニットとPICマイコンでPS/2接続のキーボードを製作してみます。
キーボードの解析でPIC16F74にメンブレを接続するところまでは完了しているので、PS/2のインターフェイスの研究からです。この資料はWebにあふれていて、資料として別ページにまとめました。興味のあるかたはご覧下さい。

ハードウェア

ハード設計
設計といっても非常にシンプルなんですが、それなりに試行錯誤しております(汗

PS/2のI/FはI/O節約入出力切替式でできるかなとやってみたのがこの回路
こっちは没!

いろいろいじってみましたが、電流が逆流してあやうくPICを破壊しそうになりました。(滝汗

こっちの回路で普通にやることに決定



回路図
回路図 Rev1.1 です。クリックすると拡大します〜


CN2の100kのプルアップは接触抵抗の小さいキーユニットならPICの内部プルアップが使えるので省略可能です。
CN1の保護抵抗も省略できそうだけど保険のためつけたほうが安心です。
秘密スイッチも省略可能です。


材料
部品表です
品名内容数量値段
PICPIC16F74-I/P1500円
基板蛇の目基板-S160円
ICソケットDIP40P130円
セラロック10MHz140円
LED315円
TR2SC1815230円
抵抗100Ω 1/8W1890円
470Ω 1/8W315円
4.7kΩ 1/8W210円
10kΩ 1/8W315円
100kΩ 1/8W840円
コンデサ0.1μF(104)110円
スイッチタクトSW120円
ケ−ブルPS/2コネクタ付きケ−ブル
ジャンク90円マウスからもぎ取り
190円
コネクタ1mmピッチ 16pと8p
ジャンク100円FDDからもぎとり
1100円
配線材リード線とか抵抗の切れ端少々-
合計975円


↑PageTop

ソフト

実験開始
試作機はLEDの変わりにパソコンと繋いでPICのメモリ内容が見れるようになってます。
ケーブルを保護するために、ボール紙で台が作ってあります。このキーボードは一度分解したので組み立てる時に冶具が必要でした。その時のものをそのまま使っています〜
ミニ基板はPS/2のインターフェイス。トランジスタ2個と抵抗4本だけでシンプルです。

実験中の試作機



壊れても経済的ダメージの小さい構成で


100円のFDDや300円のメモリなどで構成された実験パソ・ダンボーラー1号です。ハニカム構造で剛性を高めたシャーシがイカしてます♪
このマザボはシャトルのME-17小さくてお気に入りです。1500円だったので予備含めて3枚買ってきました。かなり無理な実験もしてるのですが、なかなか壊れません;^_^
素材が粗大だけに、発火が一番怖いです〜


認識までが辛かったです
PC/ATの初期化は以下の手順で行われていました。
デジアナが無いので、お手製のデジタルストロボ(74164を4個で32bit/100MHzまでのCLK同期信号を見るナンだコリャな装置)でLEDでが流れるのを確認するくらいしかなかったので辛かったです〜

PC/ATの初期化コマンドと応答
PC/AT側コマンドキーボード側応答
1FFReset
キーボードリセットコマンド。
キーボードはセルフテストを実行する。
FAAck
コマンドに対する正しく受け取られた応答
AABAT Completion
BAT(Basic Assurance Test)が正しく終了した
2F2ID Read
識別情報を要求
FAAck
コマンドに対する正しく受け取られた応答
ABID(L)
識別IDのLowバイト
83ID(H)
識別IDのHighバイト
3EDSet/Reset Mode Indicator
キーボードのLEDの点灯/消灯要求
00オプションバイト
Bit2:0がLEDに対応する
FAAck
コマンドに対する正しく受け取られた応答
4F2ID Read
識別情報を要求
FAAck
コマンドに対する正しく受け取られた応答
ABID(L)
識別IDのLowバイト
83ID(H)
識別IDのHighバイト
実験環境:シャトル製i810マザー ME-17
BIOS設定:タイプマティックRate設定なし、NumLockなし


やっと画面に文字が!!
キーを押すと文字が出る!


こんなありふれた事がこんなにうれしいなんて(T^T)クッ

まだまだ、やる事がいっぱいです。やっと最初の階段を上りはじめた所でしょうか。。

↑PageTop

スキャンコードの実装
上と前後しますが、文字が出るまでの記述がなかったので補填しておきます。

キーを押した時、離した時にそれぞれコード送信の必要があるので、すべてのキーの押下状態をBit情報で記憶しています。
A,B,Cの順で押して、Bを離すとA,Cが押したままなのがシステム側で解るしくみですね。

2バイト系の一般的なキーを調査して追加しました。窓キーとメニューキーです。
Win1 = E0 1F
Win2 = E0 27
Win3 = E0 2F
また追加ボタン付きの中国製Win98キーからコード採取しました。一般的なのか不明ですがこれも追加しておきます。I/Oが2本余るのでキーがあと16個追加できるのです。
Powoff = E0 37
Sleep = E0 3F
Wakeup = E0 5E

2バイト以上のキーはA0以上の内部コードを割り当てそれぞれキーテーブルを作りました。

内部コードの割り当て
Keyスキャンコード内部コード
62Alt_RE0 11A0
64Ctrl_RE0 14A1
108Ten.EnterE0 5AA2
134Win1E0 1FA3
135Win2E0 27A4
136Win3E0 2FA5
137PowoffE0 37B0
138SleepE0 3FB1
139WakeupE0 5EB2
75Ins E0 70C0
76Del E0 71C1
79E0 6BC2
80Home E0 6CC3
81End E0 69C4
83E0 75C5
84E0 72C6
85PgUp E0 7DC7
86PgDn E0 7AC8
89E0 74C9
95Ten./E0 4ACA
124PrintScreenE0 12 E0 7CE0
126PauseE1 14 77 E1 14 F0 77E1

Libretto 50M用のデータテーブル
	; Libretto 50M
	;    0    1    2    3    4    5    6    7
	dt 046h,009h,00Ah,00Bh,00Ch,006h,076h,00Dh
	dt 044h,078h,001h,083h,003h,004h,005h,016h
	dt 04Bh,04Eh,043h,03Dh,02Eh,055h,01Dh,01Ch
	dt 007h,045h,03Eh,036h,025h,026h,01Eh,015h
	dt 0E1h,06Ah,00Eh,03Ah,02Ah,0A3h,0C6h,0C9h
	dt 0C4h,04Ch,05Ah,03Bh,02Bh,058h,0C0h,05Dh
	dt 0C3h,052h,041h,033h,034h,021h,0C1h,0C7h
	dt 051h,059h,0A0h,064h,0A1h,011h,012h,014h
	dt 013h,04Ah,029h,031h,032h,067h,0C2h,0C8h
	dt 0C5h,054h,05Bh,03Ch,02Ch,023h,022h,066h
	dt 049h,04Dh,042h,035h,02Dh,024h,01Bh,01Ah	

LetsNote AL-N2用のデータテーブル
	; Pana LetsNote AL-N2
	;    0    1    2    3    4    5    6    7
	dt 0C9h,0C0h,0FFh,0C8h,0FFh,0FFh,0FFh,007h
	dt 0C6h,0C1h,0C3h,0C7h,0FFh,0FFh,0FFh,078h
	dt 029h,001h,05Dh,003h,066h,05Ah,0FFh,009h
	dt 0C2h,051h,0C4h,0C5h,0FFh,077h,0FFh,067h
	dt 0FFh,055h,042h,00Bh,05Bh,041h,043h,03Eh
	dt 0FFh,00Ah,04Bh,0FFh,083h,049h,044h,046h
	dt 04Ah,04Eh,04Ch,052h,054h,0FFh,04Dh,045h
	dt 031h,036h,03Bh,033h,035h,03Ah,03Ch,03Dh
	dt 032h,02Eh,02Bh,034h,02Ch,02Ah,02Dh,025h
	dt 0FFh,0FFh,0FFh,011h,0FFh,0FFh,0E1h,0FFh
	dt 0FFh,0FFh,0FFh,0FFh,012h,059h,0FFh,0FFh
	dt 0FFh,006h,023h,00Ch,004h,021h,024h,026h
	dt 0FFh,005h,01Bh,0FFh,058h,022h,01Dh,01Eh
	dt 0FFh,013h,0A3h,0FFh,0FFh,06Ah,0FFh,064h
	dt 0FFh,0A1h,014h,0FFh,0FFh,0FFh,0FFh,0FFh
	dt 0FFh,00Eh,01Ch,076h,00Dh,01Ah,015h,016h	

PC-9801NS/R用のデータテーブル
	; NEC PC-9801NS/R
	;    0    1    2    3    4    5    6    7
	dt 013h,012h,011h,005h,006h,004h,058h,014h
	dt 052h,051h,05Ah,0C5h,0C6h,0C9h,0C4h,05Bh
	dt 04Ch,03Ah,041h,049h,04Ah,055h,0FFh,0FFh
	dt 043h,044h,04Dh,03Bh,042h,04Bh,0FFh,0FFh
	dt 03Dh,03Eh,046h,045h,04Eh,03Ch,0FFh,077h
	dt 032h,031h,067h,029h,064h,0C2h,02Ah,021h
	dt 023h,02Bh,034h,033h,01Ah,022h,01Bh,01Ch
	dt 015h,01Dh,024h,02Dh,02Ch,035h,00Dh,036h
	dt 0C8h,05Dh,06Ah,066h,0C3h,054h,0C7h,0C1h
	dt 00Bh,083h,00Ah,001h,009h,0C0h,003h,00Ch
	dt 076h,016h,01Eh,026h,025h,02Eh,0E0h,00Eh	

98ノートのSHIFTは物理的に結線されていて左右の区別はありません。
下記のキーを割り振りました。
STOP→全角
GRPH→Alt
NFER→無変換
XFER→変換
HELP→End
COPY→PrintScreen

シフト状態に関わらないキーについては実装完了です。

次にコンビネーションキーを実装しました。
SHIFT,CTRL,ALTは2個あるのでカウンタでフラグ化しました。
NUMはトグル動作なのでビットフラグです。
フラグを準備したので、PrintScreenもロジック実装
PauseはMakeコードだけでBreakは発生しませんでした。(富士通106キー調べ)
実装完了♪

↑PageTop

Windows環境で試験
コードもちゃんと出ているようなので、いよいよWindows環境で試験です〜
Windows2000を起動すると、起動中にbeep音が。。
かなりあやしい雰囲気です。
デバイスの状態を見ると101キーに、キーの認識IDが違うのかなぁ?
メモ帳長で漢字入力やSHIFT+カーソルでの範囲選択、コピペなどを試しました。
正常に動作しているようです♪

システムからのコマンドに何でもかんでもACKで応えているのがBeepが出る原因じゃないかと予想してます。
その前にキーリピートを実装しなくては。。


キーリピート
キーディレイとリピートの実装です。キーを押続けるとコードが連続送信されますが、ディレイタイムは2回目の送信開始までの時間、リピートタイムは3回目以降の出力間隔です。

リピートは1秒間に出力される文字数指定なので、mS単位に換算します。
4mSを1単位にすると1バイトで表現できるので内部ではこのテーブルを使います。
最大誤差が3.75%ありますが気にしない事にします(;^_^

換算テーブル
DelayRepeatchr/SmSx4mS
Bit6Bit5Bit4Bit3Bit2Bit1Bit0
xx0000030.0033.38
xx0000126.7037.59
xx0001024.0041.710
xx0001121.8045.911
xx0010020.0050.012
xx0010118.5054.113
xx0011017.1058.514
xx0011116.0062.515
xx0100015.0066.716
xx0100113.3075.218
xx0101012.0083.320
xx0101110.9091.722
xx0110010.00100.025
xx011019.20108.727
xx011108.60116.329
xx011118.00125.031
xx100007.50133.333
xx100016.70149.337
xx100106.00166.741
xx100115.50181.845
xx101005.00200.050
xx101014.60217.454
xx101104.30232.658
xx101114.00250.062
xx110003.70270.367
xx110013.30303.075
xx110103.00333.383
xx110112.70370.492
xx111002.50400.0100
xx111012.30434.8108
xx111102.10476.2119
xx111112.00500.0125
00xxxxx250.062
01xxxxx500.0125
10xxxxx750.0187
11xxxxx1000.0250

プログラムはタイマーを使わず、4mS単位でキースキャンを行いこれをカウントする方式とました。
キー入力があるとチャタリング防止やエンコードで時間がずれますが、リピート解除なのでまったく問題なしです。文字によって送信時間に差があるけど問題ないでしょう。

BIOS設定で10ch/Sにすると10秒間で88文字、32chr/Sだと10秒間で240文字、全体的に遅いです。
Windowsのコンパネで速度変更してみました。こちらもコントロールできました。
ロジックは正しく実装でしたようです。

Waitが4mS+プログラムのループ時間になっているので定数の変更が必要です。
全体のBugfix後で調整する事にします。

↑PageTop

Windows動作時にいろんな問題が発生
Windows起動時にIMEと何かを高速でやりとりしているらしく、タスクバーの表示が激しく変化しつづけています。PICの電源を再投入するとこの現象は治まりました。
また、キーボードコンパネでもトラックバーが勝手にスライドする、OKキャンセル間をフォーカスが高速移動する(TABの送信?)などの多彩な現象が発生中です。(;^_^

昨日のテスト以降にいくつかのシステムコマンドに応答するよう変更したので、このあたりに原因がありそうです。
現象ははっきりしているので、トラップルーチンを入れて送受信されているコードを見ていきたいと思います。


いろんな問題を解決!!
ダンボール号だとWindowsの起動に時間が掛かるので環境を変えてみました。
M/B:ASUS CUSL2-C CPU:Cel633 MEM:384MBです。
するとBIOSで、'Keyboard error or Keyboard present'が出て起動しません;^_^
原因はキーリピートの実装方法でした。安直にメインループにWaitを入れた為、システムからのコマンド応答も4mSおきになってしまっていたのです。とりあえずリピートのルーチンをコメントアウトすると無事にWindowsが起動しました。
さっそくタイマ0を使って4mSをカウントするようプログラム変更しました。
キーのレスポンスなんかも良くなった感じです。
キーのチャタリング防止も50mSのwaitが入っているので、システムから何か送ってきている時にキーを押したり離したりすると応答できない期間が発生しそうです。ここも待ちながらシステムコマンドには応答するようタイマでループ掛けました。

BIOS起動時の受信コマンドは F4,F4,FF
Win2000起動時の受信コマンドは ED,00,F3,0A,FF,F3,00,ED,00,ED,00,F3,20
Win2000ログイン時の受信コマンドは F3,26,ED,02

BIOS起動時の受信コマンドが違いますが、取りこぼしは無くなったように思えます。

キーボードコンパネでトラックバーを操作すると、F3,xxが送られてきます。
F3を受けてACKを返し、次のバイトを受けてACKを返すように変更するとコンパネでの妙な現象は起こらなくなりました。

解決♪

キーリピートしないキーを調べたところ、Pause,Poweroff,Sleep,Wakeupのみで他はすべてリピートしました。4つのキーにこれを反映しました。

NUM lockとCaps Lockはシステム側で管理していて、キーを送るとLED状態変化を必ず返してくるのでそれに従うようプログラムを変更しました。
試作機はパソコンと接続している為、PortE2(CapsLock)のLEDを1個だけ付けました。うまく動作しているようです。そういえば回路図にLEDの名称記入してませんでした。
RE0:ScrolLock, RE1:NumLock, RE2:CapsLock です。

ScrollLockはDOSやWindowsでは点灯する所を見た事がありませんが、たしかLinuxのコンソールで起動メッセージを眺めるのに使用したような記憶があります。Linuxで起動可能なマシンは2台あったと思うので掘り出してこないと。

ほぼ完成です〜

残る課題は3つになりました
1)プローブ無しのLEDが3個付いた試作2号機を製作する。
2)ソースにコンパイルスイッチを埋め込む
3)ScrollLockの動作を確認する

↑PageTop

2号機の製作

またまたフルスクラッチ
回路図の再現性確認も兼ねて、プローブ無しのLEDが3個付いた試作2号機を製作します
当然フルスクラッチです。同じ物を作るのはいつもなら気力メーターがゼロになってしまうのですが、今回は出荷先があるので割と丁寧な作業です。日曜日だし、じっくり時間を掛けて半日がかりで作成しました♪


2号機完成!!
2号機ができあがりました!

PS/2インタフェイスとLED搭載で、抵抗8本省略しました。電源もPS/2からもらって一人立ちです♪
廃品のノート用薄型FDDから26pと11pのソケットが採取できたのでソレ使ってます。液晶工房コ○ネットで買った100円ジャンクの玉砕品でした。小型のステッピングモーターも取れたので、元は取れたと思っておきます〜
LEDの隣に秘密スイッチがあります。秘密なので機能は教えられません




お見せするのが恥ずかしいですが裏側です。
ネジ穴付近確保のためにぎりぎりの位置から配線開始して、案の定穴1個足りなくなって、蛇の目の外側にコの字ジャンパが張り出してしまっています。まあ、いつものコトです〜
PS/2インタフェイスのin/out間違えて配線してしまっていて、修正したため汚くなりました。




2号機は某プロジェクトの為に用意したAL-N2専用品です。(300Ω以下の新しめのキーボードには使えると思うけど..)
リブレットのキーボードと違ってすごく打ちやすいです。AMiTYキーボードよりもキータッチがぜんぜん良いです

Let'sNote AL-N2のメンブレンを繋いだ2号機


しかしこの基板は、どなどなどぉ〜な〜♪と、どこかに送られてゆくのでした。

↑PageTop

完成仕様

仕様
完成したので忘れないうちに仕様をまとめておきます。
出来上がったものが仕様です。お気楽〜♪

ハードウェア仕様
使用マイコンMicroChip社 PIC16F74-I/P クロック10MHz動作
インターフェイスPC/AT仕様 PS/2ポート
インディケーーターLED3灯(Caps Lock/Num Lock/Scroll Lock)
キーボード接続コネクタ8桁×16行 接点マトリクス入力
適合キーボード接触抵抗3kΩ以下 または 13kΩ以下(外部プルアップ時)
ソフトウェア仕様
識別ID83ABh
コードセットスキャンコードセット2のみ
Win98キーのPowoff,Sleep,wakeupに対応
キーマトリクス・スキャンコード対応テーブルにアサインする
NUMキーコンビネーションのスキャンコード対応テーブルなし
入出力バッファなし
自己診断機能なし
実装コマンド ED:Set/reset status indicators.
EE:Echo. Responds with ECHO code (EEh).
F2:Read ID.
F3:Set autorepeat rate/delay.
F4:Enable.
FA:Set all keys typematic/make/break
FE:Resend.
FF:Reset.
未実装コマンド F0:Select scan code set.Responds scan code set in use.but Always(02h)
F5:Default Disable.
F6:Set default.
F7:Set all keys typematic
F8:Set all keys make/break
F9:Set all keys make
FB:Set key type typematic
FC:Set key type make/break
FD:Set key type make

1/27に製作を決意して2/2にUPだから実質6日ですね、体感はもっと長く感じました。今回の製作でPICのノウハウをかなり身に付けることができました、mさん良い経験をありがとうございました。
でもPICもキーボードもかなりおなかいっぱいです。
しばらく何か別のことやって充電です〜

え? これでおしまい? ケースは?

う〜ん、ダンボールでいい?(笑)


↑PageTop

悩めるノートパソコン

2号機の動作報告が
2号機の動作報告が届き「うまく動きません」
使用した機器などの情報はまるで無しだったのでかなりの不安を感じました;^_^
問い合わせすると2日後にLet'sNote CF-S21であったと返答が入りました。4日後にAL-N2でダメ、デスクトップではOKで一部キーが利かないと報告を受けました。
このような事にあまり慣れてらっしゃらないのか、テスト方法や機器などの情報が伝わって来なくて、たくさんのメールをやりとりするハメになりました。こんな調子でプロジェクトが遂行できるかすごく不安です〜


調査〜
ノートパソコンのPS/2はマウスとキーボードの統合コネクタで、挿すと自動判定で使えるようです。
まず分岐ケーブルに相当するものを作成してそのキーボード側に1号機を接続しました。
AL-N2の電源を入れると301キーボードエラーが発生し、F1でBIOSセットアップ画面に入ると画面が
激しく変化しています。カーソルキーを押すとこの動作は止まりました。
カーソルキーやESC,Enterなどは利いているようです。
しばらく放置するとカーソルが勝手に走り出しました。

いくつか問題があるようです。
1)キーボードの初期化と認識が正常に行われていない
2)キーリピートに問題がりそう

そこで、初期化時にどのようなコードを受信しているかチェックしました。
以下、AL-N2接続時の受信コマンド EC:未定義コマンド
EC:未定義コマンド
EC:未定義コマンド
EC:未定義コマンド
F2:ID Read
F2:ID Read
F1:未定義コマンド
F3:Set Typematic Rate/Delay
00:Typematic Rate/Delay code
F4:Key Enable start scan
F1:未定義コマンド
F1:未定義コマンド
F1:未定義コマンド
F1:未定義コマンド
F1:未定義コマンド
F1:未定義コマンド
F1:未定義コマンド
F1:未定義コマンド
F1:未定義コマンド
F1:未定義コマンド
F1:未定義コマンド
F1:未定義コマンド
F1:未定義コマンド
F1:未定義コマンド
一定時間ごとにF1コードが送られてきます。
EC,F1? どちらも未定義コマンドなんですけど;^_^


キーリピート問題は解決
まず、プログラムのキーリピート関係をチェックしたところ、受信したコードをパソコンで見れるように入れたデバッグルーチンでFSRレジスタの退避が行われていなかったのを発見しました。また、パソコンからコードを受信するルーチンのパリティビットの反転にバグがあって、ここでキーリピートフラグが立ってしまっていました。一定時間ごとにF1コードを受信してここでリピートがはじまってしまっていたようです。これを修正するとBIOS画面でカーソルが勝手に走り出す現象は治まりました。


初期化問題も解決
EC,F1にどんなコードを返すのかわからなかったので、簡単なDOSプログラムを書きました。パソコンからキーボードにECコードを送って返答を表示するものです。DOSのC環境はもう無かったのでLSI-Cを落としてきてセットアップしました。ひさびさにpathとか設定しましたよ;^_^
AL-N2にHITACHI-89キーボードを接続してこのプログラムで反応を見ると、FE!
なるほど未定義なのでこの反応なのですね〜
さっそくプログラムに反映してスイッチオン!
やはり301エラー
でも受信コードが変わっています。
EC,F1,FF,...
ECの受信が1回になってFFが登場しています。いろいろ試行錯誤の上、FFを受信してAAを返すまでに
50mSのWaitを挿入すると301エラーは出なくなりました。やった〜!
ついでにこの時間の間LEDを全点灯させるようにしました。
完成度が上がったように思えます♪


でも認識しない
コードさえ返せば認識してくれると思っていたのですが、甘かったです。
HITACHI-89キーボードはダイレクトに挿しても、起動中に一旦抜いて挿しなおしても使えるのに、SZ-Keyは使えません。たぶん回路のインピーダンスが違うので自動認識されないとかそんな感じっぽいです。
分岐ケーブルに2ボタンの安物マウスとSZ-Keyを接続すると途中からでも認識するし普通に使えます
安物マウスの回路に頼ったヤドカリ作戦(笑)
エラーを出さず使用できるレベルになったのでノート対応はここまでにします。
なんとなくくやしい気もしますが。。。

 次へ → 
↑PageTop

E-mail : saza00@mail.goo.ne.jp [その1] [その2] Index に戻る