PSoC3 PS/2キーボードをつなぐ

投稿日 2012/06/03

PSoC3にPS2キーボード(PS/2 Keyboard)をつないでみました。

 

マイコンの場合、キーボードは必ずしも必要ということはないのですが、入力デバイスとしてあれば便利で、いろいろ応用が広がります。

PSoC_PS2Kbd_1.jpg

写真1 PSoC3にPS/2キーボードをつなぐ SPIの信号線にはレベル変換を通す

 

幸いCypress社にアプリケーションノートがあったので参考にしました。ただしPSoC3用ではありませんし、サンプルプログラムもちょっと怪しげです。

 

PS2キーボードの規格については、ここが参考になります。

 

カナなどの日本語文字のサポートは次回ということにして、今回は基本的なキー入力ができるようにしてみました。

 

キーボードにはいくつか種類がありますが、一般的なJIS配列のキーボードのスキャンコード表はここが参考になります。

 

【schematic】

PSoC_PS2Kbd_2.jpg

写真2 SPIスレーブとI2Cコンポーネントを使用 SDA、CLKは初期レベルはHigh。MODE 1 LSB First 11bit

 

キーボードとPSoc3との接続にはSPIスレーブ・コンポーネントを使用します。

 

キー入力に関しては、キーボードは送る側なのでマスタ。PSoCは受ける側なのでスレーブとなります。

 

キーボードは、キーを打つとクロックを発生し、それに同期してスキャンコードを送ってきます。

 

クロックとともにLSB Firstで計11ビットが送られてきます。スタートビット、ストップビット、パリティービットを除くデータ部分8ビットがスキャンコードです。ビットはLOW TRUEですから、SDAとCLKピンの初期レベルはHighにしておきます。SPIのクロックは内部クロック使用で10KHzとしました。

 

クロックの立下りエッジでデータを読み込むのでSPIスレーブ・コンポーネントはモード1で動かします。

 

入力されたキーは、I2C LCDにエコーバックします。このためにI2Cコンポーネントを使用します。

 

アプリケーションノートでは、LCDのコントラスト調整のためにPWMを使用していますが、今回は使用しません。LCDのコントラストはハード(半固定抵抗)で行います。

 

プログラムはアプリケーションノートのサンプルプログラムをベースにしていますが、かなり変更しています。LCDのコントラスト調整のためのPWMやF1,F2キーなどの処理は組み込んでいません。

 

今回はカナをサポートしてませんが、スキャンコード-文字対応表を拡張すれば可能ではないかと思います。(LCDにはカナは表示できる) また、テンキーもサポートしていません。

 

PS/2キーボードの電源は5Vです。このため信号レベルも5Vであるため、PSoC3を3.3V動作させている場合は、レベル変換が必要です。今回は秋月で販売されているI2Cバス用の変換モジュールを使いました。信号2本分しかないので、SDAとCLKで使用し、/CSは常にLOW TRUEとしました。

 

キー入力された文字列を蓄えるバッファは、LCDの一行分16文字としました。16文字以上は受け付けないようにしています。LCDにエコーバックするため、このようにしてますが、バッファ自体はもっと大きくてもかまいません。

 

ESCキーで文字バッファをクリアするとともに、LCDの表示を消します。

 

BackSpaceは、押すたびに1文字消します。

 

押されたキーのスキャンコードを表示します。ファンクションキーや矢印キー、その他文字を持たないキーについては、スキャンコードで判断できます。

 

ブレーク、つまりキーから指を離したときに発生するスキャンコードは無視しています。

 

今後の予定:

 

カナサポート
テンキーサポート


 

[ ソースコード]

 

[PSoC3 PS/2キーボードハンドラ main.c

 

PSoC3 PS/2キーボードハンドラ scancodes.h




 

(JF1VRR)