前回レトロアーケードでPICを使うときに、バーツを入れているボックスに各種センサーが入っていました。これらはPICと同じ秋月電子のお楽しみ袋のものです。今までセンサーを扱ったことがなく少し興味が湧いてきたので、まずは簡単そうな温度センサーMCP9700-E/TOを使ってみることにしました。
ただ、ArduinoやAVRで利用するのは簡単そうなので、ADコンバーターを使ったことのないPICで挑戦してみます。
手持ちのPICにはADコンバータがあるものとコンパレータという電圧の比較を行う回路しか持っていないものがあり、今回は温度センサーに必要なADコンバータがあるPIC16F819を使いました。このPICを内蔵クロック8MHzで動かします。
せっかくなので、温度表示にはお楽しみ袋に入っていた2桁の7セグメントモジュール(アノードコモン)を2個使ってみます。
こんなふうにLEDを2個横に並べて表示させます。左の2桁が温度の整数部で右2桁が小数部になります。
PICと7セグメントLEDの配線は7セグメントの正面左のピンを1としたとき、次のようにしました。
左側の7セグメント←→PIC
1 − RA7
2 − RB1
3 − RB2
4 − RB3
5 − RB4
6 − RB5
7 − RB6
8 − RB7
9 − RA6
右側の7セグメント←→PIC
1 − RA4
2 − RB1
3 − RB2
4 − RB3
5 − RB4
6 − RB5
7 − RB6
8 − RB7
9 − RA1
ダイナミック点灯を行うので、左右の7セグメントLEDの2~8ピンはPICの同じピンにつなぎます。2つの7セグメントの1と9のピン合計4つのコモンピンへの通電を高速に切り替えて4桁の数字を表示しているように見せます。
コモン以外のピンには1KΩの抵抗を挟んでPICにつなぎます。つなぐピンはPORTBのRB1~RB7です。
LEDに流せる最大電流は不明ですがPIC16F819に流せる電流を考えてみると、POARAのピン全体とPORTB全体への最大電流は100mAで1ピンあたり25mAなので、7つのセグメントが全て点灯すると単純計算で7×5(V)÷1(KΩ)=35mAとなります。全部のセグメントが点灯するとコモン端子をつないだPORTAの1つのピンに最大35mA流れそうですが、実際にはLEDの抵抗もあるのでそこまでの電流は無いと思います。試してみたら問題なく動作していたのでこのまま使うことにしました。
温度センサーとPICの接続は以下のようにしました。
MCP9700-E/TO←→PIC
VDD − VDD
VOUT − RA0(AN0)
GND − VSS
温度センサーのVDDとGNDの間にはコンデンサーを挟んだほうが安定動作するそうなので、0.1μFのコンデンサーも入れました。
スケッチはこちらです。
newmain.c
PICによる7セグメントLEDの制御は以前に行ったのとほぼ同じです。ダイナミック点灯を行うために、割り込みを利用して4つの7セグLEDを順番に点灯しています。
このタイプのPICのAD変換はArduinoに比べて少し面倒です。
まずPICの動作クロックをもとにAD変換のクロックをレジスタに設定します。次に、AD入力端子の選択を行ってAD変換用のコンデンサを充電します。
充電が終了するまで待ってからAD変換を開始して、AD変換が終了するまで更に待ちます。割り込みもしくはレジスタの値を読み取ってAD変換終了を確認します。
変換結果は2つのレジスタに入っていますので、これらを合わせて10ビットの値を取り出すとAD変換のデータを利用することが出来るようになります。
AD変換を行うたびにこれらの処理を繰り返す必要があります。AD変換の内部動作を知ることが出来て勉強にはなりますが、全てをプログラムに記述しければならないのは面倒ですね。Arduinoも内部では同じような処理を行っているのでしょうが、それを全く見せないのでお手軽ですね。
PIC16F819にはAD変換のときに基準にする定電圧リファレンス回路(FVR)が内蔵されていないようです。外部からリファレンス電圧を与えられますが、今回はお試しの回路なのでVDDとVSS間の電圧を利用しました。
センサーから取得したデータから温度を計算するときに誤差を(多少?)少なくする計算方法もあるようですが、それほど効果なさそうなので一般的に使われている計算式で求めました。これで実際に計測した温度を求めてみると、かなり誤差があるものでした。一番少ない場合で1℃前後、多いときで5~6℃違うこともありました。もともとこのセンサーの精度が±4℃なので仕方ないのかもしれませんけど。
今回はリファレンス電圧にVDDとVSSを利用したので、電源によってもかなり測定結果が異なりました。電力を使わないアナログの気温計と比較したとき、いちばん誤差が少なかったのはPICライターのPICkit4から電源を取ったときでした。この場合ほぼ1℃程度の誤差でした。
このセンサーは温度計に使うにはあまり実用的ではなさそうです。赤外線LEDなどと組み合わせて、ある温度を超えたらエアコンのスイッチをいれるとかいう使い方ならいいかもしれませんね。
ところで今回使った部品は、抵抗以外のセンサーやコンデンサなど全て秋月電子のお楽しみ袋に入っていたもので賄いました。いや〜お楽しみ袋いいですね。
※コメント投稿者のブログIDはブログ作成者のみに通知されます