小学生の頃に半田付けしたくらいの自分が、自作キーボード作成のための仕組み(ハード)を調査した

# 前書き

前の投稿にあった「キーマトリクス」を実現するハードについて具体的に調査した。(といっても「自作キーボード」でググった先駆者たちが、「なぜそんな仕組みにしたのか？」という疑問を解消＆実践したくらい。)

ど素人(自分)が「謎の低層ハードウェア」である汎用ロジックICを利用する際に発生した、疑問点やつまづく点はメモ書き程度で書き残しておく。（もしかして何かしらの教本を買ったら悩まなかったのかもしれない）

今回の収穫は、**汎用ロジックICにも若干の(後述)規格があり、シリーズ化されていること**。特にググったものを買えなくても代替品を探すことが(たぶん)可能であると分かったことである。

# 本題

## 自作キーボード作成の調査に必要なもの

- キーボードコントローラ用：arduino×1
- 汎用ロジックIC：TC74HC595×2(デジタル出力を８つ増やす。ディジーチェーン可。)
- 汎用ロジックIC：TC74HC165×2(デジタル入力を8つ増やす。ディジーチェーン可。)
- ブレッドボード×1
- ジャンパワイヤ×たくさん
- タクトスイッチ(通電できればなんでも)

Amzonで買った「Arduinoを始めようセット」に汎用ロジックIC以外が入っていたため、秋月電子にほぼノープランで買い物に出けることにした。

## 事前準備(汎用ロジックICをアキバで買う)

ノープランで秋月電子に行ったため、かなりドキドキした。(適当にググって調べた汎用ロジックICが売ってなかったらどうしよう、みたいな)

結局自分が買ったのは、TC74HC165APと、TC74HC595の２つ。
(これは、よくわからないまま「arduino 入力　増やす」でググった成果)

### 汎用ロジックICの型番について

型番ルール的なもの調べてみると、実は汎用ロジックICにはデファクトスタンダードがあり、機種が数字で特定できるらしい。
自らが買ったものを調べると、

- TC74HC 165 A P（東芝74系HCシリーズ　機種　規格　実装規格）

という型番だった。
ブレッドボードに刺すような汎用ロジックICの場合は実装規格はDIP(Tihs is マイコン!な形のもの)に限定される（気がする）ので、
`.＊74.＊165.＊[PN]`
と
`.＊74.＊595.＊[PN]`
的な型番の汎用ロジックICを買えばいいんじゃないかなと思った。[^2][^3]


## 74HC595(1bit>8bitシフトレジスタ)

http://toshiba.semicon-storage.com/info/lookup.jsp?pid=TC74HC595AP&lang=ja

先駆者たちが、こぞって使用していたのがこれ。
そもそもこれはなんだ？というと「汎用ロジックIC」の「74シリーズ」の「シフトレジスタ」というものらしい。

- シフトレジスタは、１ビットの入力(SI)を保存(レジスト)しつづけて、合計８つの出力先(QA~QH)に出力(ラッチ/RCK)する。
- ラッチ前には、入力(SI)をどの出力先に配置するかを定める。出力先(A~Q)の切り替え（シフト/SCK）はSCK入力の「立ち上がり(多分電圧がかかった瞬間)」時にする。
- クリア信号(SCLR)を立ち上げると、出力する情報はクリアされる

上記は、ググった知識とリンク先データシートの真理値表をにらめっこするとわかる[^1]

## 74HC165(8bit>1bitシフトレジスタ)

http://toshiba.semicon-storage.com/info/lookup.jsp?pid=TC74HC165AP&region=jp&lang=ja

- こっちのシフトレジスタは、入力を同期信号(S/L)がLOWの時に受付、同期信号(S/L)がHIGHの状態で８ビットの入力(A~H)を出力する。ただし、出力先(QH)には１つの入力元の情報(最初はHから降順で)が１つずつしか出力されないのでQHの情報をマイコン側でプールする必要がある。
- 入力を受け付ける状態はLOWなので、入力を保持したい場合は、同期信号はHIGHのまま。
- 出力先の切り替え（シフト/CK）はCK入力の「立ち上がり(多分電圧がかかった瞬間)」時にする。切り替えると、出力先(QH)には、次の入力であるGの情報が出力される。こちらもマイコン側でプールする。
- CKを7回繰り返すと、すべての入力をマイコンが獲得できるので、８ビットの入力を結果的に受け取ることができる。
- シフト、ズレた値にはSIの値が無条件に入る
- 同期信号(S/L)を再度立ち上げると、入力元の情報が更新される。

## その他疑問と推測

ググっているとマルチプレクサを使っている方もいる。
マルチプレクサというものも、複数の入力を１つにできるらしい。違いは [こう]  (http://members3.jcom.home.ne.jp/zakii/hdl/72_shift_mux.htm)らしい。

「実現ロジック的には等価」らしいけど、データを統合する回路があるマルチプレクサと違い、入力されたデータをそのまま出すシフトレジスタの方が、統合回路を挟まないので処理が早いと解釈した。


### ただし

ただし、キーマトリクス検知のソースロジックにおいては、シフトレジスタの出力をいちいち操作するようなロジックを書かなくて良い気がするのだが、どうなんだろうか。（マトリクスの捜査は１列ずつ行うので、101001001とか出力しなくていいってこと。）

ちなみにシフトレジスタ用の関数としてShiftIn、ShiftOut関数というものもあるらしい。
以下のようなソースを書かなくていいのかもしれない。
以後の汎用ロジックICの調査時に確認してみることにする。

```lang:マルチプレクサ
return 最終的な出力＝マルチプレクサの出力
```
```lang:シフトレジスタ
for(cnt=0;cnt<8;cnt++){
    最終的な出力+=シフトレジスタの出力
}
return 最終的な出力
```


## おわり

次回は汎用ロジックICを動かしてみる。
以下はArduinoのチュートリアルページ
- [Parallel to Serial conversion] (https://www.arduino.cc/en/Tutorial/ShiftIn)
- [Serial to Parallel conversion](https://www.arduino.cc/en/Tutorial/ShiftOut)

### 参考
[東芝のICシリーズ帯](http://toshiba.semicon-storage.com/jp/product/logic/cmos-logic.html)
[東芝の型番付与ルール](http://toshiba.semicon-storage.com/jp/design-support/partnumber/logic-ic.html)
[別会社の型番付与ルール](http://www.chip1stop.com/tutorialContents.do?page=052)


[^1]: ディジーチェーンもできる。３つの制御パルスで、ディジーチェンしまくれば出力数が無限大になる。すごい。
[^2]: ただしこれは、ざっくりした推測で、こんな[シフトレジスタ](http://www.njr.co.jp/products/semicon/PDF/NJU3711_J.pdf)もあった。（なんで型番が違うのか謎。ピン数が違うからかな？)
[^3]: さらに、wikipedhiaだと164という機種が「8ビットシリアル入力/パラレル出力シフト・レジスタ」なのに東芝製は595である。いまいちよくわからない。(そして164番の数字は東芝のHCシリーズのロジックIC一覧になかった。)