トライステートバッファ
何かしらのタイミングで理由もなく、秋月電子で購入した部品のひとつに、トライステートバッファがあった。電子回路におけるトライ(3)ステートバッファとは、"0"、"1"以外の状態として"Z"(ハイインピーダンス)を持つもの。この説明が端的である。
なぜ購入したのかわからず(名前に惹かれたか?)、しばらく放置していた。が、最近、これを用いて何ができるのか、素人なりに調べると、1つの信号線に複数の論理回路が物理(電気)的に接続されている状態で、どれか1つの回路を接続することに使われることを知った(他はハイインピーダンスにして接続しない)。コンピュター内の利用例として、次のサイトの「スリー・ステート・バス・バッファ」のところの説明がナイスと感じている。
何をするか
信号線の選択をする例として、デジタル回路のWikiの「スリーステートバッファ」のデータセレクターの記載がわかりやすく、かつ、簡単であったので、これを少々modifyすることにした。
回路イメージ
後述する、実際にトライした回路とは多少異なるが、イメージ的には下記のようなもの(回路シミュレーター「falstad」利用)。
中央2つがトライステートバッファ、片方に"1"を、もう片方には"0"を入力し、片方は導通がある状態を、もう片方にはそれがない状態を作り出す。LEDの点灯により、その状態を視覚化する。回路シミュレーターでは、矩形波及びNOT回路により、"1"および"0"を交互に作り出している(後述する実回路では、矩形波の代わりにPCからの入力を用いた)。
用いたトライステートバッファ
秋月電子で購入した「4回路3ステートバッファ SN74HC125N」。ただし、本記事執筆時点では販売されていないようだ。データシートは、ここに見つかる。
ピンアサイン
トライステートバッファ
OEにより制御(ハイインピーダンスをつくるかどうか)する。
ソースコード
#define CONTROL 7
bool tgl;
void setup() {
tgl = false;
Serial.begin(9600);
pinMode(CONTROL, OUTPUT);
digitalWrite(CONTROL, ((tgl == true)? HIGH: LOW));
}
void loop() {
if (Serial.available() > 0) {
(void)Serial.readStringUntil('\n');
tgl = !tgl; Serial.println(tgl);
digitalWrite(CONTROL, ((tgl == true)? HIGH: LOW));
}
}
PCからのシリアル入力があると、変数tglを反転させ、その状態をGPIOピンに反映させる、単純なもの。
実験
中央にあるICがトライステートバッファ、その右にあるICがNOTである。ここでは、GPIOからのHigh出力があるときに右下のLEDを点灯させることとした。下記写真は、GPIO出力Lowのときのもの。左上のLEDが点灯する。
下記写真は、GPIO出力Highのときのもの。左下のLEDが点灯する。
単純ではあるがわかりやすい。
EOF