前書き
前の投稿にあった「キーマトリクス」を実現するハードについて具体的に調査した。(といっても「自作キーボード」でググった先駆者たちが、「なぜそんな仕組みにしたのか?」という疑問を解消&実践したくらい。)
ど素人(自分)が「謎の低層ハードウェア」である汎用ロジックICを利用する際に発生した、疑問点やつまづく点はメモ書き程度で書き残しておく。(もしかして何かしらの教本を買ったら悩まなかったのかもしれない)
今回の収穫は、汎用ロジックICにも若干の(後述)規格があり、シリーズ化されていること。特にググったものを買えなくても代替品を探すことが(たぶん)可能であると分かったことである。
本題
自作キーボード作成の調査に必要なもの
- キーボードコントローラ用:arduino×1
- 汎用ロジックIC:TC74HC595×2(デジタル出力を8つ増やす。ディジーチェーン可。)
- 汎用ロジックIC:TC74HC165×2(デジタル入力を8つ増やす。ディジーチェーン可。)
- ブレッドボード×1
- ジャンパワイヤ×たくさん
- タクトスイッチ(通電できればなんでも)
Amzonで買った「Arduinoを始めようセット」に汎用ロジックIC以外が入っていたため、秋月電子にほぼノープランで買い物に出けることにした。
事前準備(汎用ロジックICをアキバで買う)
ノープランで秋月電子に行ったため、かなりドキドキした。(適当にググって調べた汎用ロジックICが売ってなかったらどうしよう、みたいな)
結局自分が買ったのは、TC74HC165APと、TC74HC595の2つ。
(これは、よくわからないまま「arduino 入力 増やす」でググった成果)
汎用ロジックICの型番について
型番ルール的なもの調べてみると、実は汎用ロジックICにはデファクトスタンダードがあり、機種が数字で特定できるらしい。
自らが買ったものを調べると、
- TC74HC 165 A P(東芝74系HCシリーズ 機種 規格 実装規格)
という型番だった。
ブレッドボードに刺すような汎用ロジックICの場合は実装規格はDIP(Tihs is マイコン!な形のもの)に限定される(気がする)ので、
.*74.*165.*[PN]
と
.*74.*595.*[PN]
的な型番の汎用ロジックICを買えばいいんじゃないかなと思った。12
74HC595(1bit>8bitシフトレジスタ)
先駆者たちが、こぞって使用していたのがこれ。
そもそもこれはなんだ?というと「汎用ロジックIC」の「74シリーズ」の「シフトレジスタ」というものらしい。
- シフトレジスタは、1ビットの入力(SI)を保存(レジスト)しつづけて、合計8つの出力先(QA~QH)に出力(ラッチ/RCK)する。
- ラッチ前には、入力(SI)をどの出力先に配置するかを定める。出力先(A~Q)の切り替え(シフト/SCK)はSCK入力の「立ち上がり(多分電圧がかかった瞬間)」時にする。
- クリア信号(SCLR)を立ち上げると、出力する情報はクリアされる
上記は、ググった知識とリンク先データシートの真理値表をにらめっこするとわかる3
74HC165(8bit>1bitシフトレジスタ)
- こっちのシフトレジスタは、入力を同期信号(S/L)がLOWの時に受付、同期信号(S/L)がHIGHの状態で8ビットの入力(A~H)を出力する。ただし、出力先(QH)には1つの入力元の情報(最初はHから降順で)が1つずつしか出力されないのでQHの情報をマイコン側でプールする必要がある。
- 入力を受け付ける状態はLOWなので、入力を保持したい場合は、同期信号はHIGHのまま。
- 出力先の切り替え(シフト/CK)はCK入力の「立ち上がり(多分電圧がかかった瞬間)」時にする。切り替えると、出力先(QH)には、次の入力であるGの情報が出力される。こちらもマイコン側でプールする。
- CKを7回繰り返すと、すべての入力をマイコンが獲得できるので、8ビットの入力を結果的に受け取ることができる。
- シフト、ズレた値にはSIの値が無条件に入る
- 同期信号(S/L)を再度立ち上げると、入力元の情報が更新される。
その他疑問と推測
ググっているとマルチプレクサを使っている方もいる。
マルチプレクサというものも、複数の入力を1つにできるらしい。違いは [こう] (http://members3.jcom.home.ne.jp/zakii/hdl/72_shift_mux.htm)らしい。
「実現ロジック的には等価」らしいけど、データを統合する回路があるマルチプレクサと違い、入力されたデータをそのまま出すシフトレジスタの方が、統合回路を挟まないので処理が早いと解釈した。
ただし
ただし、キーマトリクス検知のソースロジックにおいては、シフトレジスタの出力をいちいち操作するようなロジックを書かなくて良い気がするのだが、どうなんだろうか。(マトリクスの捜査は1列ずつ行うので、101001001とか出力しなくていいってこと。)
ちなみにシフトレジスタ用の関数としてShiftIn、ShiftOut関数というものもあるらしい。
以下のようなソースを書かなくていいのかもしれない。
以後の汎用ロジックICの調査時に確認してみることにする。
return 最終的な出力=マルチプレクサの出力
for(cnt=0;cnt<8;cnt++){
最終的な出力+=シフトレジスタの出力
}
return 最終的な出力
おわり
次回は汎用ロジックICを動かしてみる。
以下はArduinoのチュートリアルページ
- [Parallel to Serial conversion] (https://www.arduino.cc/en/Tutorial/ShiftIn)
- Serial to Parallel conversion
参考
東芝のICシリーズ帯
東芝の型番付与ルール
別会社の型番付与ルール