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

Nagatuki が 2020年05月06日04時34分30秒 に編集

コメント無し

本文の変更

# はじめに

+

*投稿しているのは素人です。この記事を参考にしたことによって発生しうるいかなる損害も負いかねます。

電子工作でマイコンを使っていると、何かしらの方法でマイコンに入力をして操作したい時が出てきます。

-

ちょっとした入力であればタクトスイッチのような簡単なスイッチを用いればですが、それなりに細かい入力を行う場合には若干勝手が良くありません。個数を増やせばピンは占有されますし、値段も上がっていきます。 そんなとき候補に挙がるのはパソコンのキーボードです。スイッチ数も多いですし、秋葉原などでは経験上100円前後で入手可能です。

+

ちょっとした入力であればタクトスイッチのような簡単なスイッチを用いればですが、それなりに細かい入力を行う場合には若干勝手が良くありません。 個数を増やせばマイコンのピンは占有されますし、値段も上がっていきます。 そんなとき候補に挙がるのはパソコンのキーボードです。 スイッチ数も多いですし、どこの家庭にも使っていないものが2, 3個は転がっているでしょう。 たとえ家になくても、秋葉原などでは経験上100円前後で入手可能です。

-

# PS/2コネクタのキーボード

-

転がっているキーボードは、そのコネクタの形状からざっくり2種類に分類することができます。1つはUSB。ただしこれをマイコンから操作するには少々難があります。 そこで今回注目するのがPS/2です。PS/2コネクタのキーボードざっくり説明すると、古いパソコンのキーボードです。

+

世の中流通しているキーボードは、そのコネクタの形状からざっくり2種類に分類することができます。 1つはUSB。 ただしこれをマイコンから操作するには少々難があります。 そこで今回注目するのがPS/2です。 PS/2キーボードのイメージがわかない方に向けてざっくり説明すると、古いパソコンのキーボードです。 「古い」とは言いましたがこれの端子を持っているデスクトップPCはまだまだ見かけますし、使われているケースも多いかと思います。

-

![キャプショを入力できます](https://camo.elchika.com/843c152144e76814ff9ed17c1174fbcedfeddd72/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39666165613738382d636337342d343766612d626335392d3435333465666134363432342f31666338623637302d613832332d346363622d396266352d313932616131383764666131/)

+

![自宅にあったパソコ内蔵のPS/2コネクタ](https://camo.elchika.com/843c152144e76814ff9ed17c1174fbcedfeddd72/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39666165613738382d636337342d343766612d626335392d3435333465666134363432342f31666338623637302d613832332d346363622d396266352d313932616131383764666131/)

-

Wikiによると、コネクタの物理形状はミニDIN6Pコネクタ、通信方式は同期シリアル通信となっています。

-

コネクタのミニDIN6Pコネクタは秋月電子などで簡単に手に入れられます。また通信方式に関して複雑なものでは無いので8bitマイコン等非力なマイコンであっても問題なく制御できます。

+

コネクタのミニDIN6Pコネクタは秋月電子などで簡単に手に入れられます。 また通信方式複雑なものでは無いので8bitマイコン等非力なマイコンであっても問題なく制御できます。

+

# コネクタの確認

-

先の通り、コネクタはミニDIN6Pコネクタです。ピンは6本ですが、このうち使用するのは4つ。それぞれVcc, Ground, Clock, Dataとなっています。Vccでかける電圧は+5 Vなので、マイコンから操作するにも勝手がいい。

+

先の通り、コネクタはミニDIN6Pコネクタです。 ピンは6本ですが、このうち使用するのは4つ。 それぞれVcc, Ground, Clock, Dataとなっています。 Vccでかける電圧は+5 Vなので、マイコンから操作するにも勝手がいい。

-

![キャプションを入力できます](https://camo.elchika.com/068520563a4518dcb29bfa1e93258609ad2c4dbe/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39666165613738382d636337342d343766612d626335392d3435333465666134363432342f39323333333637352d333232632d346632622d383330662d336332373034373830383633/)

+

![](https://camo.elchika.com/09b9978c8edb57775a6281700202bf91b462cf54/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39666165613738382d636337342d343766612d626335392d3435333465666134363432342f64363939346532372d396532332d343837652d396438662d636532383635383662366262/)

-

ClockとDataは共に双方向です。オープンコレクタとなっており、ソケット側とプラグ側両方でプルアップされています。プルアップ抵抗は1~10 kΩ程度らしい

+

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コード**といいます。 多くの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送信されます。」とはこのことですね。 スキャンコードの一覧は、申し訳ないですが自身で調べてください。 いずれページ下部にまとめるかもしれませんが、当面は勘弁願います。 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)