|
電子工作etc
【PIC12F683】
■温度データロガー
★概要
温度センサーからのデータを一定周期で読み取り、RS232C(TTLレベル)として出力
します。周期は、1秒間隔、1分間隔、5分間隔、10分間隔の4モードから選ぶ事が出来
ます。
また、PIC12F683内部に温度データを蓄積(EEPROMに記録)する機能も備えています。
その記憶容量は、128データ(1データは10ビットなので2バイトを使用)となります。
★温度センサーについて
温度センサーには、高精度温度センサーS8100B (SEIKO)を使用しました。
このセンサーの主な特長は、
:センサ・定電流回路・オペアンプを内蔵
:電源:5V10μAtype(低消費)
:測定温度範囲:-40〜+100℃
:リニア出力電圧:-8.1mV/K(-8.1mV/℃) →今回は8mVで計算しています。
Ta=-20℃:1.900V
Ta=+30℃:1.497V
Ta=+80℃:1.085V
:リニアリティ(直接性):1.0(-20℃〜+80℃)
:再現性:±0.3%
:Vssを寒準とした温度電圧出力
:低消費電流:10μA(25℃)typ
となっています。
★ハードウエア構成
@S8100Bによって温度を電圧に変換します。
Aこの出力電圧をオペアンプ(LMC662CN)を利用して2倍に増幅します。
BPICでは、A/D変換機能を使ってデータを取り込みます。
PICのA/D変換(10ビット=1024)で使用する、基準電圧(TL431)を、
1024×4=4096 → 4.096V
にして、1ビットあたりの精度を、4mVとします。
CPICで補正されたデータをRS232C(TTLレベル)として出力します。
D記録SW(REC)と読出SW(READ)を設けています。
![]()
★回路図
![]()
★処理説明
@周期的に、A/D変換して温度データを得ます。
・周期設定 (立ち上げ時...GPIO.F4、GPIO.F3)
:4通りの設定ができる。
:1秒間隔【GPIO.F4="1"、GPIO.F3="1"】 128秒(約2分)
:1分間隔【GPIO.F4="0"、GPIO.F3="1"】 128分(約2時間)
:5分間隔【GPIO.F4="1"、GPIO.F3="0"】 640分(約10時間)
:10分間隔【GPIO.F4="0"、GPIO.F3="0"】 1280分(約20時間)
A得られたデータに4mVを掛けます。
B最も電圧が高くなる、-40℃では、4.120mVとなります。
(1.900mV×2倍)+(8mV×2倍×(40℃−20℃)) → 4.120mV
C補正します。(小数点第1の位まで求めます)
(((4120 - temp) * 10) / 16) - 400
D結果をRS232C出力します。
E記録と読出
・記録モード(GPIO.F4)
:データをEEPROMに記録します。
:記憶容量は128データ(1データは2バイト)
・読生モード (GPIO.F3)
: EEPROMより読出してUSARTに出力します。
★ソースリスト
★動作確認
PCのハイパータミナルを使って動作確認をしました。
※PCとの接続は、レベル変換が必要となります。
別途作成しましたRS232Cレベル変換ユニットを利用してPCと接続します。
![]()
【PIC12F683】
とても簡易(ハードウエアもソフトウエアも共に)なデータロガーです。
アナログデータ(2チャンネル)を約1秒周期で収集しRS232C経由ででPCに送るものです。
アナログデータは、10ビット(1024)の精度でA/D変換されます。
尚、1ビットあたりは約5mVの精度となります。(5V÷1024)
PCに送る際には、バー表示で送るモードと数値表示で送るモードの選択がSWで出来ます。
バー表示はちょっとしたレベルメータ代わりに使えるのではと考えました。
![]()
★回路図
![]()
★ソースリスト
ソースリストはここです。
★動作確認
PCのハイパータミナルを使って動作確認をしました。
<数値表示>
![]()
<バー表示>
![]() 【PIC16F88】
RS232C(±12V)経由でデータを受信しLCDに表示します。
TTLレベルでも可能ですので、PICと直接接続することが出来ます。
以下の制御コードを受け付けます。
% : ブザーを100msec間だけ鳴らせる。
& : 画面をオールクリアする。
< : 1行目にカーソルを移動させる。
> : 2行目にカーソルを移動させる。
![]() ![]() ![]()
★回路図
![]()
★ソースリスト
ソースリストはここです。
★動作確認
PCのハイパータミナルよりデータを入力し動作確認をしました。
![]()
【PIC16F88】
単純なAC電力の制御は、トライアックを使って簡単に実現できます。
今回は、PIC16F88を使用して、制御を行います。そして電力量をバーグラフおよび%表示でLCDに表示させる
ようにしました。
こうすることにより、今まではボリュームの回転角度または感のみで制御していたものがデジタル的に制御でき
るようになりました。
★制御方法
トライアックはゲートを、ONにすると後はゲートをOFFにしても電流が流れ続けます。
そして交流のサイクルで0Vになったところで電流がOFFになります。
非ゼロクロス型では、電源の位相にあわせて短いパルスでONにします。
すると次にくる0Vの時間まで電流が流れます。
この短いパルス(トリガ)を半サイクルの立ち上がり直後にすると100%近い時間電流が流れます。
逆に半サイクルの終わり近くでトリガすると0%に近い時間だけ電流が流れます。
つまり半サイクルごとに通電時間を決めることにより電力を制御できることになります。
![]() 30°分カット 90°分カット 150°分カット
★ハードウエア構成
主要な機能は
▽正弦波の正(+)の開始および負(−)の開始を検出するために全波整流した直後に電圧でフォトカプラ
を駆動する部分。これにより60Hzの2倍での120のパルスを得ることが出来る。
▽東芝のTLP560Gというフォトトライアック(非ゼロクロス)とトライアックにより電力を最終的に制御する。
フォトトライアックへのトリガ信号は、PICよる出力される。
▽設定する制御値は、VRおよび二つのプッシュSWによりUP/DOWNされる。
▽VR設定するか、SWで設定するかの切り替えはトグルSWにより行う。
▽PIC16F88では、全体制御(フォトトライアックの制御やLCDへの表示等)を行う。
★回路図
![]()
★処理説明
処理は以下のブロックより構成されます。
▽ポート、クロック、タイマー、PWM、LCD等を初期化する。
▽LCDへタイトルを表示する。
▽制御をVRで設定するかSWで設定するかをチェックする。
▽VRであれば、AD変換した値を制御値(sleepTime)とする。
▽SWであれば、更にUP/DOWNをチェックし、制御値をUP/DWONする。
▽電力をバー(12個)で表示する。
▽電力を%で表示する。
▽割り込み処理では、以下の3つの処理をする。
・TIMER1割り込み(約200msec周期)では、LEDをON/OFFさせる。(パイロットランプ)
・60Hzのトリガ信号割り込み(全波整流なので秒あたり120回)では、制御値を一時変数にセットする。
・TIMER0割り込み(約60usec周期 )では、制御値経過後にトライアックをONする。
★ソースリスト
ソースリストはここです。
★ケース加工
ドリル、リーマ、ニブリングツール等を利用してケース加工をしました。一番苦手な作業です。
★動作確認
本装置を使用して、豆電灯を制御してみました。
バーグラフと%表示が出来るので直感的でとてもわかりやすいです。
LEDの穴は、後で気がついてハンドドリルで急遽穴あけしました。
【PIC12F683】
■簡易周波数カウンタ
★概要
とても簡易(ハードウエアもソフトウエアも共に)な周波数カウンタを作成しました。
最高2.5Mhzまで1Hz単位で、または最高20Mhzまで8Hz単位で計測できる周波数カウンタです。
ゲートタイムは、1秒と0.1秒の切り替えが出来るようにしました。
基準となるクロックは、手持ちの16.0000Mhz(京セラ製)を使用しました。
これは以前にジャンク袋で大量に購入したものです。
先ずは、ブレッドボードで実験(HWもSWも)してから蛇の目基板に実装しました。
![]() ![]()
★処理説明
先ず、入力信号は、トランジスタ(2SC1815)で構成されたアンプで増幅されます。
増幅された信号は、GP2(T0CKI)端子に接続されTIMER0でカウントされます。
TIMER1とCCP1を使って正確な0.1秒または1秒を得ます。
・TIMER1を内部クロックで1/8プリスケーラで動作させます。
・するとTIMER1のクロックは、16MHz÷4÷8=500kHzとなります。
・CCP1をTIMER1とのコンペアモードで使い、一致する値を50000とします。
・すると10Hz周期で一致割り込みが発生し、正確な0.1秒を得ることが出来ます。
・更にこれを10回カウントすると、正確な1秒を得ることが出来ます。
プリスケール値は1/1、1/8を選択できるようにしました。
最終的にカウントした値を文字列に変換して、RS232Cで送信します。
★回路図
![]()
★ソースリスト
ソースリストはここです。
★動作確認
PCのハイパータミナルを使って動作確認をしました。
![]()
【PIC16F88】
■周波数ロックユニット(じっとしてなさい君V2)
★概要
ラジオの周波数(局部発振周波数)をロック(固定)するためのものです。
真空管ラジオなどの時間の経過と共に周波数が変動するような場合に便利です。
★周波数ロックユニットの構造原理
![]()
・CCPモジュールを2個使用するためPICを2個使用しました。
・PIC12F683では、正確なクロック(0.1秒)を出力します。
・PIC16F88では、周波数をカウントし、その値によって出力電圧を制御します。
・出力電圧は、可変容量ダイオード(バリキャップ (variable capacitance diode)、バラクタ (varactor diode))
1S2683によって、コンデンサ(容量)へと変換されます。
・カウントした周波数は、USART(RS232C)経由で送信可能です。(9600,8,N)
※SW1とSW2を同時に押しながら起動すると送信モードになります。
・周波数の精度は、最大2.5Mhz(1Hz単位)、最大20Mhz(8Hz単位)が可能です。
・ゲートタイムは、1秒、0.1秒が可能です。
・ロック精度は、±100Hzとします。(プログラム上で変更可能です)
・出力電圧は、0V〜5Vで精度は約5mV(5÷1024)になります。
・この電圧をバリキャップに加えます。
・使用するバリキャップによって可変可能な容量(キャパシタンス)は異なってきます。(要注意)
★実験
PIC12F683とPIC16F88を使用した、基本的な周波数カウンタとしての機能は確認できました。
これに後は、ロック機能を付加するだけです。
![]()
★回路図
![]()
・LOCK_LED(緑色)
・UPPER_LED(橙色)
・LOWER_LED(赤色)
★処理説明
<PIC12F683の処理>
0.1sec(10Hz)の正確なクロックを出力するだけの単純な機能です。
CCPをコンペアモードで使用して、0.1秒周期で割り込みを発生させ、短いパルスを出力します。
:クッロクを16Mhzとする。プリスケーラを8とする。CCPの設定値を50000とする。
:0.1 = (1÷16000000)*4*8*50000
<PIC16F88の処理>
@内臓モジュールやポート等の初期化をします。
APWMのdutyを50%(1024/2)にします。
BLOCK_SWとUNLOCK_SWが共に押されていたらRS232C送信モードとします。
CLEDを点滅させます。(特に意味のある処理ではありません)
DRS232C送信モードであれば、タイトルを送信します。
E割り込みを許可します。
Fプリスケーラの設定を行います。
GGate Timeの設定を行います。
Hタイマ値や周波数値をクリアします。
I設定されたGate Timeの間だけ計測を行います。
J計測された周波数を補正します。
KRS232C送信モードであれば、周波数を文字列に変換して送信します。
LLOCKするかUNLOCKするかをチェックします。
Mもしもロックモードなら、
:現在の周波数の値を基準値(f1)として保存します。
:計測した周波数(f2)と基準値(f1)を比較し許容範囲ならロックと判断します。
:(f2)<(f1)であれば、PWMのdutyをプラスして電圧を上げます。
:(f2)>(f1)であれば、PWMのdutyをマイナスして電圧を下げます。
Nもしもアンロックモードなら、
:PWMのdutyをデフォルト値(50%(1024/2))に設定します。
O少しディレイ(10msec)してからFへ戻ります。
★ソースリスト
PIC12F683のソースリストはここです。
PIC16F88のソースリストはここです。
★動作確認
確認用に急遽作成したFETを使用した簡易発信器です。
![]() ![]()
全体の接続の様子です。
![]() ![]()
ロックした状態です。右上の黄色い小さなLEDはクロックのモニター用です。
![]()
周波数が高くなった状態です。
![]()
周波数が低くなった状態です。
★取り扱い説明
![]()
<接続>
茶色:全てGNDです。
黄色:周波数を入力します。
白色:周波数を制御します。
橙色:+5V(安定化電圧)を入力します。
<スイッチ>
左のスライドSW:GateTime切り替え:上側[0.1SEC]、下側[1SEC]
右のスライドSW:Prescale切り替え:上側[1/1]、下側[1/8]
赤色プッシュSW:ロック
黄色プッシュSW:アンロック
<LED>
黄色(小)LED:クロックのモニター用(0.1SEC点灯、0.1SEC消灯を繰り返す)
赤色LED:周波数が低い
橙色LED:周波数が高い
緑色LED:ロック状態
<その他>
電源を投入すると、緑色LED→橙色LED→赤色LEDの順に点灯します。
赤色プッシュSWと黄色プッシュSWを同時に押しながら電源を投入すると、
以降の処理で計測した周波数をUSARTへ出力します。
【PIC16F819】
■昇圧型B電源ユニット
★概要
私はよく、PICやオペアンプやトランジスタや真空管等をハイブリッド 【hybrid】 的に使うことが多いです。
そんな時に、真空管を使って何かを作ると、どうしても高価で重たい電源トランスが必要となるのですが、
そこで、これが何とかならないものかといろいろと思案していました。
理想的には、ヒーター電源(普通は6.3V)くらいの電圧のみでラジオが動作してくれれば良いのになあ...
そこで今回は、DC6.3V(1A以内)のみを供給して、真空管のラジオを動作可能な電源に挑戦してみました。
5球スーパーはちょっと無理ですが、再生式の1球ラジオくらいなら何とか出来そうです。
![]()
★動作原理
基本的な回路で説明します。
![]()
・最初にスイッチ(SW)がON状態になるとコイル(L)にエネルギーが蓄えられます。
・このとき、コイル(L)の入力側はプラス、出力側はマイナスの電位になります。
・次にスイッチ(SW)がOFF状態になるとコイル(L)は電流を流し続けようとして
(レンツの法則)、蓄えたエネルギーを放出します。
・この時コイル(L)の出力側がプラス、入力側がマイナスになります。
・スイッチ(SW)はOFFなので電流はダイオード(D)を通してコンデンサ(C)および負荷(R)に流れます。
※レンツの法則
電磁誘導の起電力の向きに関する法則です。
「誘導起電力はそれを生ずる原因をさまたげる向きに生じるという法則」
1834年にドイツのレンツが発見しました。
★回路図
![]()
コイル(L)には、TOKINのSN8D-500を使用しました。
FETには、FAIRCHILDセミコンダクタのIRFW540A(秋月電子で4個200円でした)を2個並列にして使用しました。
★処理説明
PWM方式によって、FETをON/OFFさせます。
PWMの周波数は約10Khzとし、デューテイは1024ステップで設定します。
制御には、次の2つのモードを持たせました。
【固定モード】
:コイルに流れる電流値を400mA固定にする。
:抵抗が0.3Ω、ADコンバータの精度が約5mVなので、0.3×400mA=120mV
:120mV÷5mV=24
:つまり、AD変換した値が24になるように制御します。
【可変モード】
:UP/DOWNのスイッチによってデューテイの幅を増減させる。
尚、モードの切り替えは回路図のSW1によって行います。
★ソースリスト
ソースリストはここです。
★動作確認
以下の画像は、本ユニットを利用して、6.3Vの電圧を昇圧し、負荷をかけている所です。
出力電圧は、約100Vで18kΩの負荷(5.5mA)をかけています。
制御部です。0.3Ωは電流検出用です。
昇圧部です。FETは2個並列にして使いました。
負荷をかけます。
出力電圧は約100Vです。
FETの制御信号です。デューティ(duty)比によって出力される電圧を制御できます。
【PIC12F683】
■タッチセンサーユニット
★概要
私の場合には、このユニットをどんな用途に使っているかと言いますと...
朝が早いので、その時に暗い玄関で靴を履くときに使います。
先ず、センサーにタッチするとLEDが点灯します。
その間に玄関の蛍光灯を消灯して靴を素早く履いて鍵をかけます。
暫くすると自動的にLEDが消灯します。
如何ですか? 省エネ用に...
応用としては、無線機のPTT(送信)スイッチの代わりにも使えると思いますよ。
用途はいろいろ考えられると思います。{^_^}!
![]()
★動作原理
我々の周りにはノイズ(主には商用電源のノイズ)が一杯です。
人体もこのノイズを通す媒体となりますので、これを検出してLEDをコントロールしようというものです。
指でセンサー(1cm角の銅板)に触った時のノイズをアンプで増幅します。
そしてタッチ前のノイズ量とタッチ後のノイズ量の差によりタッチしたか否かを判断します。
★回路図
![]()
★処理説明
・センサーにタッチする前のノイズ(主には商用電源のノイズ)を検出する。(これを基準値(offset)とする)
:感度を上げるためにPICの前段に2SK241によるアンプを入れる。
:ノイズの量は、10回サンプリングしてその間の最大値と最小値の差としています。
・タッチした時の値(ad0)と基準値(offset)を比較する。
・もしもoffset値よりもad0の値が大幅に大きければタッチしたものとみなす。
・タッチしていれば一定時間(10秒程度)LEDをONする。
・タッチしたことをブザー音で知らせる。
※夜だけ動作させるために光センサーも追加したいのですが、現時点では考慮していません。
★ソースリスト
ソースリストはここです。
★動作確認
タッチする箇所です。銅板(1cm×1cm)に線を半田付けしただけです。
![]()
とても簡単な回路なので部品数も少ないですね。写真の緑のLEDは単なるパイロットランプ代わりです。
![]()
タッチ前は高輝度LEDが消灯しています。
![]()
タッチすると高輝度LEDが一定時間点灯します。
![]()
【PIC16F88】
■周波数表示ユニット(真空管ラジオ用)
★概要
標準的な真空管ラジオ(5球スーパー)に接続して、受信周波数および受信レベルを表示するものです。
受信周波数は、局部発振(前段の7極管のカソードより)の周波数より、中間周波数分(455Khz)をマイナス(-)
したものを表示します。
受信レベルは、検波後のAGC電圧(マイナス)を反転(プラス)変換したものを表示します。
最大25Mhzくらいまでカウントできますので短波帯でも十分使えると思います。
![]()
★動作原理
標準的な5球スーパーラジオでは、前段の7極管で局部発振と混合を行っています。
局部発振ではラジオ放送の周波数よりも中間周波数(455Khz)分だけ高い周波数で発振しています。
そこでこの周波数をカウントし、その値から455Khzだけ引いてやればよいことになります。
受信レベルはAGCに利用されるのでこれを使用します。
参考までに、標準的な5球スーパーへの本ユニットの接続例を回路図上に示します。
★回路図
![]()
★処理説明
先ず、入力信号は、FET(2SK241)およびトランジスタ(2SC1815)で構成されたアンプで増幅されます。
増幅された信号は、T0CKI端子に接続されTIMER0でカウントされます。
TIMER1とCCP1を使って正確な0.1秒を得ます。(この間だけゲートを開けてカウントします)
・TIMER1を内部クロックで1/8プリスケーラで動作させます。
・するとTIMER1のクロックは、16MHz÷4÷8=500kHzとなります。
・CCP1をTIMER1とのコンペアモードで使い、一致する値を50000とします。
・すると10Hz周期で一致割り込みが発生し、正確な0.1秒を得ることが出来ます。
プリスケール値は1/8に設定してあります。これで最大約25Mhzまでカウントできますので短波を含む2バンド
ラジオへも対応可能となります。
カウントした値から中間周波数(455Khz)分だけを差し引いた値を文字列に変換して、LCDへ表示します。
受信レベルは、AGC電圧を利用しますが、これはマイナス(-)電圧なので倍率は変えずに反転します。
・最初のオペアンプは、ボルテージフォロアで高い入力インピーダンスで変換します。(増幅はしない)
・次のオペアンプでは反転増幅します。但し増幅率は1倍とします。
この電圧をA/D変換で取り込んでバー表示します。
★ソースリスト
ソースリストはここです。
★動作確認
今回、動作確認用に使用したラジオです。多分ビクター製だと思います。
![]()
NHK第1放送(666Khz)を受信してみました。
![]()
こんな感じでLCD液晶表示部に表示されます。感度が上がると”*”が多く表示されます。
![]()
【PIC18F2320】
■10チャンネルデータロガー
★概要
初めてPIC18シリーズを使用しました。PIC18F2320を使用して、単純にAD変換したデータをRS232C経由でPC
に送るだけのものを作成しました。
尚、計測モードは次の2種類としました。
:1秒間に1回、AD変換(10チャンネル分)してPCにデータを送る。
:1秒間に15回、AD変換(10チャンネル分)してPCにデータを送る。
AD変換の精度は10ビットです。なので最小単位は約5mvとなります。
精度を高めるには、電源電圧VCCを1023*5mv=5115mvと安定化する必要があります。
★回路図
![]()
★ソースリスト
ソースリストはここです。
★動作確認
今回は部品点数がとても少ないのでブレッドボードに組んで確認しました。
PCとの接続には以前に作成したRS232Cレベル変換ユニットを使用しています。
![]() ![]()
Windowsに標準で付いているターミナルソフト(ハイパーターミナル)を使用してデータを表示します。
一番左のデータは、単なるカウント値です。その右からCH1〜CH10の順番です。
![]()
取り込んだデータをExcelを使用してグラフ表示させてみました。
入力端子をオープン状態にして計測しましたのでノイズ(商用の60Hz)が乗っています。
入力端子を100kΩ位の抵抗でプルダウンすると良いと思います。
![]()
電子工作etc
|