
変なプロジェクト名ですが、このプロジェクトは、PIC16F877という ワンチップマイコンを使用して、ボリューム(可変抵抗)で0V〜5Vに変化させた電圧 をAD変換するというものです。AD変換した値は2桁の7セグメントLEDに表示 します。さらに、BCD出力もしてしまいます(@_@)。(って別に凄くないやん>私)
当ページの情報を利用して生じたいかなる損害についても責任を負いかねます。あしからず ご了承くださいm(_ _)m。あと、回路関係は私の独学なので、その辺を注意してお読みください(^^:。
そもそもこれはとある人に依頼されて作ったものです。 なんか燃料噴射の研究をされていて、それの噴射タイミングをツマミで変化させたかった んだそうです。報酬としてファミコン本体+ソフト多数をもらった (←むろんこれは私の研究材料(謎)ので、断るわけには行きませんでした。 プロジェクト名は依頼者のあだ名が偽○者だったことにちなんでいます (どうでもいいって)。
何せPIC(ぴっく)マイコンのことを良く知らなかった私は、とりあえずADコンバータと I/Oポートが沢山付いてたらできるだろうという感じで、PIC16F877を購入しました。 このワンチップマイコンのメーカーであるMicrochip Technology 社のページからPICマイコンシリーズの資料が手に入ります。英文が苦手だという方は、
あとトランジスタ技術という月刊誌(CQ出版) でもよくPICマイコンが取り上げられています。最近はPICマイコンとある程度の互換性をたもちながら さらに高速化されたアトメル社のAVRマイコンがPICマイコンユーザの注目を 集めているようです。
前置きはこれくらいにして、本プロジェクトの回路図を図1に示します。PDFの資料を3日ほどかけてだらだらと 見た後に作りました。

本プロジェクトの本質は:
RAx, RBx, RCx, RDx, REx (x は数字) はディジタルI/O入出力ポートです。 これらのポートはビットごとに入出力を指定できます。ただし、RA0/AN0 は、ADコンバータの アナログ入力用として使うことにしたので、今回は RA0 はディジタルI/O入出力としては使いません。 しかしこの場合も、RA0 は入力に設定しておく必要があります。
簡単に回路の説明をします。まず VR1 によって、0〜5Vの電圧を作り出します。 これは、図2のように R1 と R2 に分解すれば分かりやすいのではないかと思います。

あとは R3 - R9, Q1, Q2, D1, D2 をまとめて説明します。これらを1つのLEDに置き換えた 回路を図3に示します。

ところで、LEDの+側(RB1側)をアノード(anode)、−側をカソード(cathode)といいます。

大ウソ書いていました(汗。 LEDはダイオードの一種ですが、通常のダイオードの電圧降下が 0.65 [V] 程度なのに対し、 LEDの電圧降下は 2 [V] 程度です。よってLEDに 10 [mA] 流す場合の抵抗値の計算は、 (5[V] - 2[V]) / 0.01 [A] = 300 [Ω] となります。よって手元に 330 [Ω] があるのでコレを使うことにします。(って上と同じやん>私) これで暗いと思う方は1段階低い 270 [Ω] を使うと良いと思います。ちなみに 270 [Ω] を 使ったたときにLEDに流れる電流値は (5[V] - 2[V]) / 270 = 11.1 [mA] です。
図3のトランジスタは、電圧増幅の目的ではなく、スイッチング(と電流増幅) の目的で使用します。 トランジスタのベース(B)−エミッタ(E)間の電圧がおよそ 0.65 [V] 未満であれば、コレクタ(C)− エミッタ(E)間に電流は流れません(スイッチをOFFにした状態)。ところがベース(B)−エミッタ(E)間 におよそ 0.65 [V] 以上の電圧をかけると、突然コレクタ(C)−エミッタ(E)間に電流が流れ始めます (スイッチをONにした状態)。図3の回路はトランジスタのこの特徴を利用したものですが、このことから、 図3の回路でLEDを点灯させるには、RA1 と RB1 を同時に +5 [V] にしなければならない ことが分かると思います。
「LEDのカソードをそのままGNDに接続したらいいやん」と思われるかもしれませんが、 これをやろうとすると、LEDの数だけ RBx 信号線が必要になってしまいます。 この様子を図5に示します。

このように表示を高速に切り替えて表示することで、LED の桁数が増えても RB1 - RB7 は共用 できるのですが、切り替え表示を行うからには、現在表示したい桁だけをセレクトする制御線が 必要です。そこで、この制御線の役割を RAx の信号線とトランジスタに担当させるのです。
「わざわざトランジスタなんか使わんでも、LEDのカソードを RA1 に直接接続して、 RB1 を +5 [V], RA1 を 0 [V] にしたらええんとちゃう?」と思われるかもしれません。 しかし、この場合、7セグメントLEDからの電流を無理なくシンクする(GNDに沈める という意味だと思う^^)ためにトランジスタは必要です。
PIC16F877 の資料を見てみると、各 I/O ピンがシンクすることができる電流の上限値は 25 [mA] となっています。一方、LEDを点灯するには、上に書いたように、普通 10 [mA] 程度 の電流を流します。ということは、各 I/O ピンが直接 LEDをドライブできるのはたかだか2つ までということになります。7セグメントLEDでは、全部のLEDを点灯させた場合(8を表示 した場合ですね^^)、70 [mA] もの電流が流れることになります。これでは I/O ピンが過電流で 破壊されてしまいます。そこで、PIC マイコンの I/O ピンよりはいくらか多くの電流をドライブ できるトランジスタにLEDから流れ出る電流をシンクしてもらうのです。この様子を図6に示します。 (図6では抵抗値が 330 [Ω] であるため、13 [mA] * 7 = 91 [mA] の電流が流れます)

回路の説明はだいたいこんな感じでしょうか。なんかあったらまた付け加えます。 とりあえずこの回路の制御プログラム(MPLABのプロジェクト一式)を ここからダウンロードできるようにして、 いったんここで完了ということにします。 アドバイス、誤り、勘違い等のご指摘・ご報告が ありましたら教えていただければ幸いです。