- ノートパソコンのキーボードユニットとPICで
- ノートパソコンのキーボードユニットとPICマイコンでPS/2接続のキーボードを製作してみます。
キーボードの解析でPIC16F74にメンブレを接続するところまでは完了しているので、PS/2のインターフェイスの研究からです。この資料はWebにあふれていて、資料として別ページにまとめました。興味のあるかたはご覧下さい。
- ハード設計
- 設計といっても非常にシンプルなんですが、それなりに試行錯誤しております(汗
PS/2のI/FはI/O節約入出力切替式でできるかなとやってみたのがこの回路
こっちは没!
いろいろいじってみましたが、電流が逆流してあやうくPICを破壊しそうになりました。(滝汗
こっちの回路で普通にやることに決定
- 回路図
- 回路図 Rev1.1 です。クリックすると拡大します〜
CN2の100kのプルアップは接触抵抗の小さいキーユニットならPICの内部プルアップが使えるので省略可能です。
CN1の保護抵抗も省略できそうだけど保険のためつけたほうが安心です。
秘密スイッチも省略可能です。
- 材料
- 部品表です
品名 内容 数量 値段 PIC PIC16F74-I/P 1 500円 基板 蛇の目基板-S 1 60円 ICソケット DIP40P 1 30円 セラロック 10MHz 1 40円 LED 緑 3 15円 TR 2SC1815 2 30円 抵抗 100Ω 1/8W 18 90円 470Ω 1/8W 3 15円 4.7kΩ 1/8W 2 10円 10kΩ 1/8W 3 15円 100kΩ 1/8W 8 40円 コンデサ 0.1μF(104) 1 10円 スイッチ タクトSW 1 20円 ケ−ブル PS/2コネクタ付きケ−ブル
ジャンク90円マウスからもぎ取り1 90円 コネクタ 1mmピッチ 16pと8p
ジャンク100円FDDからもぎとり1 100円 配線材 リード線とか抵抗の切れ端 少々 - 合計 975円
- 実験開始
- 試作機はLEDの変わりにパソコンと繋いでPICのメモリ内容が見れるようになってます。
ケーブルを保護するために、ボール紙で台が作ってあります。このキーボードは一度分解したので組み立てる時に冶具が必要でした。その時のものをそのまま使っています〜
ミニ基板はPS/2のインターフェイス。トランジスタ2個と抵抗4本だけでシンプルです。
実験中の試作機
壊れても経済的ダメージの小さい構成で
100円のFDDや300円のメモリなどで構成された実験パソ・ダンボーラー1号です。ハニカム構造で剛性を高めたシャーシがイカしてます♪
このマザボはシャトルのME-17小さくてお気に入りです。1500円だったので予備含めて3枚買ってきました。かなり無理な実験もしてるのですが、なかなか壊れません;^_^
素材が粗大だけに、発火が一番怖いです〜
- 認識までが辛かったです
- PC/ATの初期化は以下の手順で行われていました。
デジアナが無いので、お手製のデジタルストロボ(74164を4個で32bit/100MHzまでのCLK同期信号を見るナンだコリャな装置)でLEDでが流れるのを確認するくらいしかなかったので辛かったです〜
PC/ATの初期化コマンドと応答
実験環境:シャトル製i810マザー ME-17
項 PC/AT側コマンド キーボード側応答 1 FF Reset
キーボードリセットコマンド。
キーボードはセルフテストを実行する。FA Ack
コマンドに対する正しく受け取られた応答AA BAT Completion
BAT(Basic Assurance Test)が正しく終了した2 F2 ID Read
識別情報を要求FA Ack
コマンドに対する正しく受け取られた応答AB ID(L)
識別IDのLowバイト83 ID(H)
識別IDのHighバイト3 ED Set/Reset Mode Indicator
キーボードのLEDの点灯/消灯要求00 オプションバイト
Bit2:0がLEDに対応するFA Ack
コマンドに対する正しく受け取られた応答4 F2 ID Read
識別情報を要求FA Ack
コマンドに対する正しく受け取られた応答AB ID(L)
識別IDのLowバイト83 ID(H)
識別IDのHighバイト
BIOS設定:タイプマティックRate設定なし、NumLockなし
- やっと画面に文字が!!
- キーを押すと文字が出る!
こんなありふれた事がこんなにうれしいなんて(T^T)クッ
まだまだ、やる事がいっぱいです。やっと最初の階段を上りはじめた所でしょうか。。
- スキャンコードの実装
- 上と前後しますが、文字が出るまでの記述がなかったので補填しておきます。
キーを押した時、離した時にそれぞれコード送信の必要があるので、すべてのキーの押下状態を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 スキャンコード 内部コード 62 Alt_R E0 11 A0 64 Ctrl_R E0 14 A1 108 Ten.Enter E0 5A A2 134 Win1 E0 1F A3 135 Win2 E0 27 A4 136 Win3 E0 2F A5 137 Powoff E0 37 B0 138 Sleep E0 3F B1 139 Wakeup E0 5E B2 75 Ins E0 70 C0 76 Del E0 71 C1 79 ← E0 6B C2 80 Home E0 6C C3 81 End E0 69 C4 83 ↑ E0 75 C5 84 ↓ E0 72 C6 85 PgUp E0 7D C7 86 PgDn E0 7A C8 89 → E0 74 C9 95 Ten./ E0 4A CA 124 PrintScreen E0 12 E0 7C E0 126 Pause E1 14 77 E1 14 F0 77 E1
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キー調べ)
実装完了♪
- Windows環境で試験
- コードもちゃんと出ているようなので、いよいよWindows環境で試験です〜
Windows2000を起動すると、起動中にbeep音が。。
かなりあやしい雰囲気です。
デバイスの状態を見ると101キーに、キーの認識IDが違うのかなぁ?
メモ帳長で漢字入力やSHIFT+カーソルでの範囲選択、コピペなどを試しました。
正常に動作しているようです♪
システムからのコマンドに何でもかんでもACKで応えているのがBeepが出る原因じゃないかと予想してます。
その前にキーリピートを実装しなくては。。
- キーリピート
- キーディレイとリピートの実装です。キーを押続けるとコードが連続送信されますが、ディレイタイムは2回目の送信開始までの時間、リピートタイムは3回目以降の出力間隔です。
リピートは1秒間に出力される文字数指定なので、mS単位に換算します。
4mSを1単位にすると1バイトで表現できるので内部ではこのテーブルを使います。
最大誤差が3.75%ありますが気にしない事にします(;^_^
換算テーブル
DelayRepeat chr/S mS x4mS Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 x x 0 0 0 0 0 30.00 33.3 8 x x 0 0 0 0 1 26.70 37.5 9 x x 0 0 0 1 0 24.00 41.7 10 x x 0 0 0 1 1 21.80 45.9 11 x x 0 0 1 0 0 20.00 50.0 12 x x 0 0 1 0 1 18.50 54.1 13 x x 0 0 1 1 0 17.10 58.5 14 x x 0 0 1 1 1 16.00 62.5 15 x x 0 1 0 0 0 15.00 66.7 16 x x 0 1 0 0 1 13.30 75.2 18 x x 0 1 0 1 0 12.00 83.3 20 x x 0 1 0 1 1 10.90 91.7 22 x x 0 1 1 0 0 10.00 100.0 25 x x 0 1 1 0 1 9.20 108.7 27 x x 0 1 1 1 0 8.60 116.3 29 x x 0 1 1 1 1 8.00 125.0 31 x x 1 0 0 0 0 7.50 133.3 33 x x 1 0 0 0 1 6.70 149.3 37 x x 1 0 0 1 0 6.00 166.7 41 x x 1 0 0 1 1 5.50 181.8 45 x x 1 0 1 0 0 5.00 200.0 50 x x 1 0 1 0 1 4.60 217.4 54 x x 1 0 1 1 0 4.30 232.6 58 x x 1 0 1 1 1 4.00 250.0 62 x x 1 1 0 0 0 3.70 270.3 67 x x 1 1 0 0 1 3.30 303.0 75 x x 1 1 0 1 0 3.00 333.3 83 x x 1 1 0 1 1 2.70 370.4 92 x x 1 1 1 0 0 2.50 400.0 100 x x 1 1 1 0 1 2.30 434.8 108 x x 1 1 1 1 0 2.10 476.2 119 x x 1 1 1 1 1 2.00 500.0 125 0 0 x x x x x 250.0 62 0 1 x x x x x 500.0 125 1 0 x x x x x 750.0 187 1 1 x x x x x 1000.0 250
プログラムはタイマーを使わず、4mS単位でキースキャンを行いこれをカウントする方式とました。
キー入力があるとチャタリング防止やエンコードで時間がずれますが、リピート解除なのでまったく問題なしです。文字によって送信時間に差があるけど問題ないでしょう。
BIOS設定で10ch/Sにすると10秒間で88文字、32chr/Sだと10秒間で240文字、全体的に遅いです。
Windowsのコンパネで速度変更してみました。こちらもコントロールできました。
ロジックは正しく実装でしたようです。
Waitが4mS+プログラムのループ時間になっているので定数の変更が必要です。
全体のBugfix後で調整する事にします。
- 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の動作を確認する
- またまたフルスクラッチ
- 回路図の再現性確認も兼ねて、プローブ無しの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号機
しかしこの基板は、どなどなどぉ〜な〜♪と、どこかに送られてゆくのでした。
- 仕様
- 完成したので忘れないうちに仕様をまとめておきます。
出来上がったものが仕様です。お気楽〜♪
ハードウェア仕様 使用マイコン MicroChip社 PIC16F74-I/P クロック10MHz動作 インターフェイス PC/AT仕様 PS/2ポート インディケーーター LED3灯(Caps Lock/Num Lock/Scroll Lock) キーボード接続コネクタ 8桁×16行 接点マトリクス入力 適合キーボード 接触抵抗3kΩ以下 または 13kΩ以下(外部プルアップ時) ソフトウェア仕様 識別ID 83ABh コードセット スキャンコードセット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もキーボードもかなりおなかいっぱいです。
しばらく何か別のことやって充電です〜
え? これでおしまい? ケースは?
う〜ん、ダンボールでいい?(笑)
- 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を接続すると途中からでも認識するし普通に使えます
安物マウスの回路に頼ったヤドカリ作戦(笑)
エラーを出さず使用できるレベルになったのでノート対応はここまでにします。
なんとなくくやしい気もしますが。。。
次へ →