PS2キーボードを接続してみます

〔Arduinoの動かせ方入門に戻る〕


USBキーボードが有りますが、これはマイコンがUSBのホスト機能(OTG)が無いと接続できません。
少し前までミニDIN6Pコネクターで接続するPS2キーボードが有りました、これはキーが押されると
ON/OFFのシリアルパルスパターンを送って来ますのでこれをデジタル端子に接続して読み取れば
押されたキーコードが判別します。
ですのでこのPS2キーボードをArduinoに接続して見たいと思います。

ミニDIN6Pコネクター図  左図はミニDIN6Pコネクター(オス:キーボード側)のピン構成図です、
 なのでパソコン側(メス)からだと番号が反転します、注意しましょう。

 出来るならマルツのこちらこちら、或いは秋月のこちら
 メス側コネクターを使った方が良いです。
 私は注文が面倒だったのでコネクタ部分を切断してヘッダピンを
 半田付けしました。
 尚、図の線の色はMyキーボードでの色なので他は異なるかもです。

 電源(VCC)は5Vです、
 キーボードの裏に100mA(物により異なる)、結構電気食いかもね。
 Arduinoには、5:CLK/1:DATAをデジタル入力ピンに接続します、
 CLK/DATAの端子にはプルアップ抵抗(1-10KΩ)が必要です。


キーボードからの送信データフォーマット

1データは11ビットでの構成です。(DATAライン)
送信データのフォーマット

機能 ビット数 内容
スタート ビット 通常はHIGHで、ビットLOWで開始
データ ビット スキャン コードで1byteです、LSBから送信される
"0"キーなら0x45だから”10100010”の順番で送信
パリティ ビット 奇数パリ ティです
データビットのHIGHが奇数なら"0"となり、
偶数なら"1"として常に奇数とする。
ストップ ビット ビットは HIGHで終了

送信データの波形
[0(ゼロ)]キーを押した時の波形です、CLKが赤(上)でDATAが黄色(下)です。
CLKの立下りでデータを読みます、"0 10100010 0 1"となる

"0"のASCII(キャラクタ)コードは0x30ですが、キーボードはスキャンコード0x45で送ってきます。
ですので変換が必要と言う事になります。

"0"を押した時に"0x45"が発生しますが、離した時は"0xF0"と"0x45"が発生します。
又、"↑"を押した時に"0xE0","0x75"が発生し、離した時は"0xE0","0xF0","0x45"が発生、
と言う感じに"0xE0"が付く拡張キーが有ったりします。
詳しくは、こちらのスキャンコード一覧表を参照下さい。

こちらに日本語訳版の"PS/2 マウス/キーボード プロトコルとインターフェース"が有ります。
  因みに、PS2英語仕様書サイトは こちらに有ります。
※ キーボードの状態や設定情報に、"NumLock"等のLED点灯要求データをキーボードに送信可能
  ですが、ここでは行っていません、送信コマンドに対する内容はこちらを参考にして下さい。
※ キーボードに電源が入った時に、"0xAA(Basic Assurance Test)"コマンドが送信されます。

《 配線について 》

実験風景
実験時の写真です。

写真の様に"Arduino Uno"へ直接接続しています。
DATAラインをArduinoの4番ピンに接続、CLKラインを3番ピンに接続しています。
CLKの波形がLOWになると状態変化割り込みを掛けてDATAラインを読みに行っています、
ですのでCLKラインは割り込みが掛けられるピンにする必要が有ります。
また、プルアップ抵抗はArduino内蔵を使っています。

《 スケッチについて 》

PS2キーボードのライブラリなのですが、実はこちらの"Arduino Playground"に有る記事の内容を
利用し、ダウンロードはこちの最新バージョン2.4(2015/05/10現在)を使っています。
ですが、日本語キーボード対応でなかったので対応版に改造しています。
(GNU Software なので改造・配布は大丈夫だと思いますのでぇ....)

改造点は
・ 日本語101キーボード用に追加、又、カナキーも入力可能
・ メモリを節約する為に、"German and French keyboard"のデータを削除
・ [F1]-[F4]キーを入力可能にして、キーコードデータを一部変更

↓ここからArduino用サンプルスケッチファイルをダウンロードして下さい。
PS2Keyboard.zip(Version 2.4.sk001)

解凍すると下の様に展開されます。
(赤文字部分が改造及び追加したファイル、他はオリジナルのままです)
[PS2Keyboard]──────────┬─[utility]───int_pins.h
      ├ PS2Keyboard.cpp  └─[examples]─┬─[International]--- International.pde
      ├ PS2Keyboard.h                     ├─[Simple_Test]----- Simple_Test.pde
      └ keywords.txt                      └─[JPKB_Test]------- JPKB_Test.ino
ライブラリの登録方法は、ここのページの登録方法1を参照してインストールしましょう。

JPKB_Test.ino  ・・・・・本体のサンプルスケッチ(日本語キーボードテスト用)
PS2Keyboard.cpp ・・・・PS2キーボード用関数ライブラリソース(Version 2.4の改造版)
PS2Keyboard.h ・・・・・・ヘッダファイル(Version 2.4の改造版)
keywords.txt ・・・・・・・・キーワードファイル

JPKB_Test.ino

JPKB_Test.inoを開くには、
IDEを起動して、メニューバーの「ファイル」→「スケッチの例」→「PS2Keyboard」→[JPKB_Test]
をクリック操作すればファイルが開かれます。

実行結果画面  次に、IDEツールバーの「Upload」ボタンを
 クリックしてコンパイルとarduinoボードに
 書込みを行います。
 シリアルモニターを起動させて下さい。

 左がキー入力テスト画面の例です。
 [Enter]キーを入力すれば、改行されます。
 [Shift]キーを押しながらは大文字入力です。
 [ALT]+[カナ/かな]キーON/OFF入力で
 カナ文字入力切替です、画面は改行され、
 "KANA ON/OFF"が表示されます。


PS2Keyboard.h

PS2キーボード用関数のインクルードファイルです。
関数ライブラリを利用する場合は、メニューバーの「スケッチ」→「ライブラリを使用」→「PS2Keyboard」を
クリック操作すれば、"#include <PS2Keyboard.h>"がスケッチに追加されます。
まぁ、手動でキー入力しても良いんですけどね。

拡張キーを入力したい場合はこのファイルに変換コードを記述します。

PS2Keyboard.cpp

キーマップのデータは、日本語と英語キーボードのみ記述してあります。
[F1]-[F4]のファンクションキーのみキーコードが記述してあります。
101キーのテンキー部は数字(NumLockON状態)で入力となっています。

利用する場合は下記行をスケッチの最初に記述します。
#include <PS2Keyboard.h>

PS2キーボード用関数の使い方を説明します。

PS2Keyboard
 PS2キーボード用関数ライブラリを使用する為に必要な宣言を行います。
 PS2Keyboard keyboard ;
 "keyboard"の名前は任意に変更可能です。

keyboard.begin( dataPin, irq_pin, &map)
 PS2キーボードの初期値設定を行う処理です。
 デフォルトは日本語キーボードなので"&map"は記述しなくても良いです。
 CLK/DATAのArduinoピンは内蔵プルアップ抵抗ONで設定されています。
  dataPin:キーボード端子"DATA"に接続しているデジタルピン番号を指定します。
        但し、pinMode( )は行わなくてもいいです。
  irq_pin :キーボード端子"CLK"に接続しているデジタルピン番号を指定します。
        但し、状態変化割り込みを行うので、割り込み可能なピンを指定します。
 日本語キーボード以外を利用する場合は

 const int DataPin = 4 ;  // PS2キーボードのDATAピンに接続
 const int IRQpin  = 3 ;  // PS2キーボードのCLKピンに接続

 keyboard.begin(DataPin, IRQpin, PS2Keymap_US) ;
ans = keyboard.available( )
 キーバッファにキーデータが有るかチェックを行う処理です。
  ans :戻り値、true=キーデータ有り false=キーデータ無し

ans = keyboard.read( )
 キーバッファからキーデータを取り出す処理です。
  ans :1byteのキャラクタコードを返します、−1ならエラーです。
 例)
 int c ;

 if (keyboard.available()) {
      c = keyboard.read() ;
       if (c > 0) {
            if (c == PS2_ENTER) Serial.println() ;
            else Serial.write(c) ; // カナ文字を表示させる場合"Serial.print"は使わない
       }
 }

《その他》

キーボードにデータを送信してキーボードのLED点灯を行う事は、
デジタルピン2本追加と外付け部品が必要なあんばいなので今回見送りました。

PS2テンキー辺りを購入してマイコンの入力デバイスとすれば良さげぇ。
なんてたって2本線のみでスイッチがいっぱい接続ですよぉ。
(ただぁ、スイッチの様に入力させるにはスケッチを作らないとダメですがぁ...)




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2015 Shigehiro Kimura All Rights Reserved.