- 先日マイコンなしで回路だけの導通チェッカを自作したんですが、これが初めてのフルアナログ製作でござった。トランジスタって「増幅」とか言うからなんか意図せず増幅しちゃって他の素子とかマイコンとか壊したりしないのかと思ってたけど何てことはない、蛇口を開けて繋いでる電源の可能な範囲で電気を通すということなのね。先にそう言えよ。っていうかNPNとPNPの使い分けも全然わかんなかったけど前者は正論理で後者は負論理ってそれも先に言え。
- というわけで今日はデジタル回路のお話です。枕はアナログの話だったが⋯。
- デジタル回路とはどのようなものでしょうか。電気を使う以上電子回路というものは全てアナログでしかあり得ないので、その上に乗っかってる階層として「電源電圧(例えば5V)近辺をHIGH、0V近辺をLOWと定義して、擬似的にデジタル的な挙動を実現する」ものをデジタル回路と呼ぶと思います。たぶん。
- そもそもどうしてデジタルを使いたいのかというと理由は主に3つくらい考えられますね。まずは何かを「1個2個という風に数えたい」*1 ということ。それから論理演算つまりNOTやANDやORといったゲートを通すことで数値を操作したいから。そしてコンピュータとの親和性が高いから、といったところでしょう。
- さて、我々がコンピュータを操作するとき、たいていはソフトウェア(プログラム)を経由し、論理的、言語的、あるいは概念的にそれを行います。例えば、周辺が明るければ5Vの信号を出す(暗かったら何も出さない)センサと、それからLEDが1個、コンピュータに繋がっているとしましょう。暗いときに自動点灯する(明るいときは消える)LEDというものを実現したい場合、例えばこんな風にプログラムを書きますよね。言語は何でもいいのでよりにもよって日本語で書きます。w
もし センサからの5Vを検知したら LED を OFF に。 もし センサからの5Vを検知できなければ LED を ON に。
- この「センサからの5V」というのはつまり何でしょうか。電子回路をやっているとピンとくるのですが、5VというのはそれはすなわちHIGHという状態であり、もう少しコンピュータの立場寄りに書くとしたら⋯⋯センサからの信号はD1というピンに繋がってるとして、こんな風に書きます。
もし D1がHIGHなら LED を OFF に。 もし D1がHIGHでなければ LED を ON に。
if ( digitalRead(D1) ) { ledOff(); } else { ledOn(); }
- 言うまでもなくHIGHは真、LOWは偽として扱われます。digitalRead() は指定したピンの状態を見てHIGHかLOWを返すArduinoの標準関数です。
- なおLEDをつけたり消したりするのも、LEDが繋がってるピンの状態を変えることによって実現します。LEDはD2というピンに繋がってるとしましょう。関数にするまでもないので直接書き加えることにします。
if ( digitalRead(D1) ) { digitalWrite(D2,LOW); // LED OFF } else { digitalWrite(D2,HIGH); // LED ON }
- digitalWrite() というのは、指定したピンの状態をHIGHにしたりLOWにしたりするArduinoの標準関数です。
- なんとなく、Arduinoのスケッチとして成り立つところまでやっとこう。Arduino言語は、マイコンを起動した直後に1度だけ実行する処理を setup() に書き、それが終わったあと永久に繰り返す処理を loop() に書きます。
void setup() { pinMode(D1,INPUT); pinMode(D2,OUTPUT); } void loop() { if ( digitalRead(D1) ) { digitalWrite(D2,LOW); // LED OFF } else { digitalWrite(D2,HIGH); // LED ON } delay(1); }
- これでちゃんとマイコンが動きます。pinMode() は見りゃわかると思いますがそのピンを入力用とするのか出力用とするのか決める関数、delay() は指定した時間(ミリ秒)何もしないで待つという関数です。
- delay(1); みたいなのを入れたくなるのはマルチタスクOSに毒されてるような気もするんですが、まあ多少こういうのがあった方が熱とかに関しても有利なんじゃないかと思います。短いループでプロセッサをめいっぱい回すのってなんか怖くない?
- ⋯ということなんですが、マイコン視点ではなくて電子回路視点で言うと、あんまりこういう実装はしません。これだけなら、マイコンを用意するのが面倒なくらいです。どうするかわかりますか? わかりますよね?
- センサから出てくる5Vというのはマイコン的には「HIGH」という単なる値なのですが、これって普通に電気なので、この電力でLEDを光らせることができるはずです。
- ⋯が、今やりたいのは逆ですね。HIGHのときはLEDが消えて、LOWのときはLEDをつけたいのです。こういうときはNOTゲートを使います。NOTゲートというのは、入力がHIGHならLOWを出力し、入力がLOWならHIGHを出力するという天邪鬼な装置のことで、電子回路業界ではよく「インバーター」という別名で呼ばれています。
このような回路で、上で書いたプログラムと同じことが実現できます。 - 詳しく説明しときますと⋯⋯明るい場合、
- 暗い場合は、
- センサの出力は0V
- それがインバーターを通ると反転する
(0V=LOW なので HIGH=5Vになる) - 5VなのでLEDが光る
- 実際はインバーターはこんな風にポンと置けばいいような素子ではなくICだったりデジタルトランジスタ*3だったりするので電源とかコレクタへの配線とかでちょっとだけ複雑になりますし、そもそも光センサ(の役割をするフォトトランジスタ)をベースつきのPNP型にすれば逆の動作(暗いと電圧が発生して明るいと止まる)をするのでNOTはいらないとか色々あるのですがここでは雑に割愛しつつ⋯。
- 要は、コンピュータ内でしか使わなそうな2進数「HIGHとLOW」というのはすなわち電気の状態なので、HIGHそのものが持っているエネルギーによって電気機器を駆動させることができる(LOWそのものでは駆動しない)ということが言いたかったのです。
- これがソフトにはない電子回路の面白さのひとつだと思っています。こういった電気の仕組みというか自然現象の綾をとんちみたいにして問題を解決することが電子回路の世界ではよくあります。ソフト方面では「アルゴリズム」と呼ばれるようなやつですね。
- ちなみに電子回路業界では、特定の機能を有する独立したひとかたまりの回路を「アプリケーション」と呼びます。その部分だけを取り外して別の回路に接続しても同じ機能を持つ回路としてちゃんと動くみたいなイメージです。なるほど、昔よく聞いた(最近はあんまり聞かない)「アプリケーションソフト」というのはこれと区別するためにソフトってついてるんだなあと。今ではもう「アプリ」って呼ぶことに決まっちゃったみたいだけど⋯。