編集履歴一覧に戻る
Nagatukiのアイコン画像

Nagatuki が 2020年05月06日04時57分18秒 に編集

コメント無し

記事種類の変更

+

セットアップや使用方法

本文の変更

# はじめに *投稿しているのは素人です。この記事を参考にしたことによって発生しうるいかなる損害も負いかねます。 電子工作でマイコンを使っていると、何かしらの方法でマイコンに入力をして操作したい時が出てきます。 ちょっとした入力であればタクトスイッチのような簡単なスイッチを用いれば良いですが、それなりに細かい入力を行う場合には若干勝手が良くありません。 個数を増やせばマイコンのピンは占有されますし、値段も上がっていきます。 そんなとき候補に挙がるのがパソコンのキーボードです。 スイッチ数も多いですし、どこの家庭にも使っていないものが2, 3個は転がっているでしょう。 たとえ家になくても、秋葉原などでは経験上100円前後で入手可能です。 # PS/2コネクタのキーボード 世の中に流通しているキーボードは、そのコネクタの形状からざっくり2種類に分類することができます。 1つはUSB。 ただしこれをマイコンから操作するには少々難があります。 そこで今回注目するのがPS/2です。 PS/2キーボードのイメージがわかない方に向けてざっくり説明すると、古いパソコンのキーボードです。 「古い」とは言いましたがこれの端子を持っているデスクトップPCはまだまだ見かけますし、使われているケースも多いかと思います。 ![自宅にあったパソコン内蔵のPS/2コネクタ](https://camo.elchika.com/843c152144e76814ff9ed17c1174fbcedfeddd72/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39666165613738382d636337342d343766612d626335392d3435333465666134363432342f31666338623637302d613832332d346363622d396266352d313932616131383764666131/) Wikipediaによると、コネクタの物理形状はミニDIN6Pコネクタ、通信方式は同期シリアル通信となっています。 コネクタのミニDIN6Pコネクタは秋月電子などで簡単に手に入れられます。 また通信方式も複雑なものでは無いので、8bitマイコン等の非力なマイコンであっても問題なく制御できます。 # コネクタの確認 先の通り、コネクタはミニDIN6Pコネクタです。 ピンは6本ですが、このうち使用するのは4つ。 それぞれVcc, Ground, Clock, Dataとなっています。 Vccでかける電圧は+5 Vなので、マイコンから操作するにも勝手がいい。 ![](https://camo.elchika.com/09b9978c8edb57775a6281700202bf91b462cf54/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39666165613738382d636337342d343766612d626335392d3435333465666134363432342f64363939346532372d396532332d343837652d396438662d636532383635383662366262/) ClockとDataは共に双方向です。 オープンコレクタとなっており、ホスト側とデバイス側両方でプルアップされています。 プルアップ抵抗は1~10 kΩほど。 制御するのに、それほど複雑な回路は必要ありません。 # 通信 ざっくり説明すると、キーボード(デバイス)側がClockにクロックを発生させ、マイコン(ホスト)はそのクロックに併せてデータを送受信します。 ClockのHIGHとLOWの各期間は30 ~ 50 μsになっています。 通信はよくある(?)シリアル通信です。 ## キーボードから受信 ### キーボードからの情報をマイコンで受け取る過程 データの1 byteは`スタートビット (1 bit) + データビット (8 bit) + パリティ (1 bit) + ストップビット (1 bit)`によって構成されます。 パリティは奇数パリティです。 1byte の構成を以下にまとめます。 | ビット数 | 名称 | 内容 | |:---:|:---:|:---:| | 1 | スタートビット | 0 | | 8 | データビット | LSBから送信 | | 1 | パリティ | 奇数パリティ | | 1 | ストップビット | 1 | 全てのデータは1回につきに1 byte送信されます。 各bitの読み込みはClockがLOWの時に行います。 先述の通りClockのLOW期間は30 ~ 50 μsのため、これに収まるタイミングでbitを読む必要があります。 またマイコン(ホスト)はClockを100 μs以上の間LOWにすることで、キーボード(デバイス)の送信を禁止することができます。 この送信禁止を行ったのがデータの11 bit目を送信する前であれば、キーボード(デバイス)は通信禁止が解除された時に全データの再送信を行います。 それ以外のタイミングであれば再送は行わず、単にデータを送ってこないだけになります。 ### データの中身

+

#### スキャンコード

キーボードは各ボタン(キー)に**スキャンコード**という番号が割り当てられています。 キーボードから送られてくるデータはこのスキャンコードです。 マイコン(ホスト)は送られてきたスキャンコードを見ることで、どのキーが押されたかを知ることができます。 (スキャンコードにもいくつか種類があるらしいのですが、基本使われているのはスキャンコード2とのこと。) もしキーに印字されている文字を使いたいのであれば、マイコン内にスキャンコードと文字コード(asciiコードなど)のテーブルを作り、スキャンコードを読み替えていく必要があります。 また我々が普段ShiftキーやCtrlキーを押した時の様な挙動を使いたい場合にも、マイコン側で対応してあげる必要があります。 一般に、キーボードの`a`が印字されているキーとShiftキーを同時押しすると画面には`A`が表示されますよね。 ですがキーボードから送られてくるのは「スキャンコード○○のボタンが押された / 離された」といった情報なので、上記のような動作を期待する場合にはShiftキーが押されているかどうかによって`a`キーが押されたときの挙動を変える必要があるのです。

+

#### MakeコードとBreakコード

キーボードからはキーが押された時と離された時のそれぞれでデータが送られてきます。 押されたときに送られてくるものを**Makeコード**、離されたときに送られてくるものを**Breakコード**といいます。 多くのBreakコードはMakeコードの前に`0F0h`を加えたものになります。 ただ幾つかのキーはこの通りになっていないので、必ず確認することをお勧めします。

+

#### スキャンコードの例

スキャンコードをいくつかピックアップして以下に示します。 スキャンコードの例 | キー(印字) | スキャンコード(押す) | スキャンコード(離す) | |:---:|:---:|:---:| | a | 1C | F0, 1C | | 1 | 16 | F0, 16 | | F1 | 05 | F0, 05 | | PgUp | E0, 7D | E0, F0, 7D | 例えば`a`が印字されたキーを押すと、キーボードからは`1c`が送られてきます。 スキャンコードが2つ以上ある場合では、1個ずつ順番に送られてきます。 例えば`PgUp`が印字されたキーのスキャンコード(Makeコード)は`E0, 7D`ですが、これはまず`F0`が送信され、次に`1C`が送信されるということを意味します。 先ほどの「全てのデータは1回につきに1 byte送信されます。」とはこのことですね。

+

#### スキャンコードの一覧(なし)

スキャンコードの一覧は、申し訳ないですが自身で調べてください。 「PS/2 キーボード スキャンコード」などと調べればヒットします。 いずれページ下部にまとめるかもしれませんが、当面は勘弁願います。 100個以上ボタンがあるので、表にまとめるのは辛いんです... ## マイコンからキーボードへ送る 主題と外れるため詳細は省きますが、マイコンからキーボードへ情報を送信することもできます。 どんな情報が送られるかというと、たいていのキーボードについているLED(CapsLock時に点灯するあれ)の操作に関するものなどです。 詳細は記事下部の「参照」にあるサイト(他サイト)をご覧ください。 # 使用例 上記の知識を使ってキーボードからマイコン(ATmega328P)に文字情報を送り、それを音声合成LSI「AquesTalk pico LSI」に送って発声させる装置を作りました。 いずれ公開できればと思います。 # まとめ このように、PS/2コネクタのキーボードはUSBのキーボードにくらべて単純で制御しやすいものとなっています。 皆さんもぜひマイコンの入力として、PS/2キーボードを使ってみてください。 # 参照 以下はこの記事を書くうえで参照したサイトです。 [PS/2プロトコルについて](http://miettal.hatenablog.com/entry/20120319/1332137072) [PS/2 マウス/キーボード プロトコルとインターフェース](http://ioiodesu.web.fc2.com/PS2/PS2.HTML) [PS/2 インターフェイスの研究](http://hp.vector.co.jp/authors/VA037406/html/ps2interface.htm) [スキャンコード (Scan Code)](https://so-zou.jp/pc/keyboard/scan-code.htm)