
PSoC3 PS/2キーボードをつなぐ
投稿日 2012/06/03
PSoC3にPS2キーボード(PS/2 Keyboard)をつないでみました。
マイコンの場合、キーボードは必ずしも必要ということはないのですが、入力デバイスとしてあれば便利で、いろいろ応用が広がります。

写真1 PSoC3にPS/2キーボードをつなぐ SPIの信号線にはレベル変換を通す
幸いCypress社にアプリケーションノートがあったので参考にしました。ただしPSoC3用ではありませんし、サンプルプログラムもちょっと怪しげです。
PS2キーボードの規格については、ここが参考になります。
カナなどの日本語文字のサポートは次回ということにして、今回は基本的なキー入力ができるようにしてみました。
キーボードにはいくつか種類がありますが、一般的なJIS配列のキーボードのスキャンコード表はここが参考になります。
【schematic】

写真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キーボードハンドラ scancodes.h
(JF1VRR)