デジタルコンパス、温度計、タイマーデジタルコンパス
温度計
トンネルタイマー
1,PICについて
2,実験の目的
3,部品調達
4,実験準備
5,実験結果
1.PICって何? 
PICはPICマイコンと呼ばれ自分で開発したソフトをPICマイコンに書き込んでいろんな物を作動させます
PIC-BASIC は、 PIC16F877 を BASIC言語でマイコンを作動させます 。
BASIC言語(このマイコン専用) ならではの習得のしやすさ 簡単にプログラミングすることが可能です。
専用の書き込みハードウェアを必要とせず、デバッグにはICEやICDを必要としません。最小限のコストで最大限の効果を得ることができるのです。 
こんな部品
PIC作ったプログラムはフラッシュROMに記録されます、プログラムの書き換えは1000回程度可能です。
原寸は40mm×26mmと小さく、マイコンの入門や試作に最適です。
 PIC-BASICでの開発
PIC-BASICモジュールには予め、BASICインタプリタ本体が書き込まれています。
最初自分のプログラム領域には何も書かれておらず、専用ソフトを使って、自分のプログラムを書き込みます。
BASICインタプリタ部分は購入時に既に書き込まれていて、自分が新たに書き込んだり、アップデートは出来ません。


PIC-BASICのプログラムはWIN98PC上から行います。開発環境で作成したプログラムは画面からBASICモジュールに転送することができます
PIC-BASICモジュールでは動作電圧の5Vがあれば、書き込み・デバッグなどの一連の作業をRS232C接続で行うことができます。そして、書き込んだBASICモジュールはPCから外して、単独で動作できるようになります。

PIC-BASICモジュールには5Vの3端子レギュレータが内蔵ですので、実際は約8V程度からの動作となります。
2.実験の目的
市販でありそうでない物を作る。
デジタルコンパス(方位磁石) -デジタルの方位磁石を作る -温度計 -デジタルの温度計 -トンネルタイマー -トンネルで消し忘れ防止タイマー

3.部品の調達
■事前調査
パソコンでプログラムを作りケーブルでPICボードにソフトを送り、そこからPICに書き込み,書き込んだPICを動かしたい装置に取り付ける
パソコンWIN98搭載パソコン
PICボードPICボードPIC-BASICはPIC16F877で動作するBASICインタプリタです
このボードはLCDやLED、レギュレーター、セラロック、スイッチがすべて搭載しております、ですからここで簡単な試作機が手軽に短時間でできます。
5Vレギュレーター5Vレギュレーターレギュレーター
型番78M05A
車に搭載する予定なので12V位の電圧を常に5Vに作りかえる部品です
今回PICのレギュレータがありますが4.6Vに制御されているせいかデジタルコンパスを作動させても正確な方位が出てこないので、デジタルコンパスとリレー回路に別電源を供給させています
デジタルコンパスデジタルコンパスデジタルコンパスモジュール
型番RDCM-802
入力電圧5V
モジュールは8つの方角(北、北東、東、南東、南、南西、西、北西)
を表示できます
ボードからは3ビットパラレル出力されます
温度計温度センサー温度センサー 
型番LM35
測定温度範囲:0〜100℃
精度:±1℃
温度係数:10.0mV/℃
電源電圧:DC4V〜20V 低消費電流:60?A
低出力インピーダンス:0.1?

オペアンプ
LM358
タイマーリレー5Vリレー
メーカーオムロン
型番G4F-11123T
電源電圧5VDV入力
たぶん20A対応
そこらへんに転がっていた部品なので詳細が分かりません
 4.実験準備
回路図 実験回路を作成

コネクターA 端子名 機能 コネクターB 端子名 機能 コネクターC 端子名 機能
CNA-01 RE0 タイマー CNB-01 RA0 温度 CNC-01 RB7 LCD
CNA-02 RE1 リレー CNB-07 RC0 SW2 CNC-02 RB6 LCD
CNA-07 RD0 コンパス CNB-08 RC1 SW3 CNC-03 RB5 LCD
CNA-08 RD1 コンパス CNC-04 RB4 LCD
CNA-09 RD2 コンパス CNC-05 RB3 LCD
CNC-06 RB2 LCD
CNC-08 RB0 SW1
CNC-09 Vcc 起電力4.6V
CNC-10 GND グランド0V
CNC-11 リセットSW SW
CNC-14 POWER 電源7〜12V入力

Dim cnt As Word   
Dim temp As Word  
Dim vcc As Word   
Dim v As Word     
Dim mlt As Word   

vcc = 460         
mlt = 101         

Initlcd           
Setpos 0,0       
Putlcd "SW1 オンド SW2 GPS"
Setpos 0,1       
Putlcd "SW3 タイマー SW1スタート"

btn_serch:
              If rb.Bit0 = 0 Then  
                Goto  ondo_job   
              Endif
              If rc.Bit0 = 0 Then  
                Goto  gps_job    
              Endif
              If rc.Bit1 = 0 Then
                Goto  timerr_job
             
Endif

              Goto btn_serch
ondo_job:  
While 1
Initlcd
 Setpos 0,0
 Adc 0,0,cnt
 Putlcd cnt, "cnt."
 Setpos 8,0
 v = (cnt * vcc)/1023
 Putlcd (v / 100),"."  
 Putlcd (v Mod 100)," V"

 temp = (v * 100) / mlt 
 Setpos 0,1              
 Putlcd "ondo=" ,(temp / 10)
 Putlcd "."              
 Putlcd (temp Mod 10),"C", chr$(&hDF)
 Sleep 1000
Wend

gps_job:
Dim    news  As Byte
Dim    drct1 As Byte, drct2  As Byte
Dim    i     As Byte
Dim    code  As Byte, pcg(8) As Byte
Dim    db    As Byte, tmp    As Byte
    Initlcd
    Gosub pcgset
    Clearlcd
    Input  rd.Bit0
   
Input  rd.Bit1

    Input  rd.Bit2
    While(1)
        Gosub GetDirection
                           '0:S  1:SW 2:NE 3:N  4:SE 5:W  6:E  7:NW
       
Lookup news, drct1, &h02,&h02,&h03,&h03,&h02,&h01,&h00,&h03

        Lookup news, drct2, &h20,&h01,&h00,&h20,&h00,&h20,&h20,&h01
        Setpos 2,0 : Putlcd chr$(drct1)
        Setpos 3,0 : Putlcd chr$(drct2)
        Setpos 5,0 : Putlcd "VALUE:",news
        Sleep 500
    Wend
GetDirection:
       
news = 0

    If rd.Bit0 = 1 Then news = news + 1
    If rd.Bit1 = 1 Then news = news + 2
    If rd.Bit2 = 1 Then news = news + 4
    Return
pcgset:
   
    code = 0
    pcg(0) = &B00100
    pcg(1) = &B11111
    pcg(2) = &B00100
    pcg(3) = &B11111
    pcg(4) = &B11111
    pcg(5) = &B01110
    pcg(6) = &B10101
    pcg(7) = &B10101
    Gosub cgramset
    code = 1
    pcg(0) = &B00000
    pcg(1) = &B11111
    pcg(2) = &B01010
    pcg(3) = &B01010
    pcg(4) = &B11111
    pcg(5) = &B11011
    pcg(6) = &B10001
    pcg(7) = &B11111
    Gosub cgramset
    code = 2
    pcg(0) = &B00100
    pcg(1) = &B11111
    pcg(2) = &B00100
    pcg(3) = &B11111
    pcg(4) = &B11011
    pcg(5) = &B11111
    pcg(6) = &B10101
    pcg(7) = &B10101
    Gosub cgramset
    code = 3
    pcg(0) = &B00000
    pcg(1) = &B01010
    pcg(2) = &B01010
    pcg(3) = &B11011
    pcg(4) = &B01010
    pcg(5) = &B01010
    pcg(6) = &B01010
    pcg(7) = &B11011
    Gosub cgramset
    Return
cgramset:
    Low  rb.Bit2
    db = &B01000000 | ( code << 3 )
    Gosub lcddir        'CGRAM CODE
    High rb.Bit2
    For i = 0 To 7
        db = pcg(i)
        Gosub lcddir    'CGRAM DATA
    Next i
    Low  rb.Bit2
    Return
lcddir:
    tmp = rb
    tmp = tmp & &B00001111
    tmp = tmp | ( db & &B11110000)
    rb = tmp
    High rb.Bit3
    Sleep 1
    Low  rb.Bit3
    Sleep 1
    tmp = rb
    tmp = tmp & &B00001111
    tmp = tmp | ((db << 4 ) & &B11110000)
    rb = tmp
    High rb.Bit3
    Sleep 1
    Low  rb.Bit3
    Sleep 1
    Return
timerr_job:
              Dim j,ad,min,sec
              Initlcd
loop_data_input:
              Clearlcd    
              Homelcd                     
              Adc 5,0,ad                
    ad  = ad / 4                
              min = ad / 60             
              sec = ad - ( 60 * min )
              If min >= 10 Then
                Putlcd  min, " min / "      
              Else
                Putlcd  " ", min, " min / " 
              Endif
              If sec >= 10 Then
                Putlcd  sec, " sec / "
              Else
                Putlcd  " ", sec, " sec / "
              Endif
              For j = 0 To 20
               Sleep 10
               If rb.Bit0 = 0 Then timer_job
              Next j
              Goto loop_data_input
timer_job:
  If rb.Bit0 = 0 Then High re.Bit1
              For j = ad To 1 Step -1
              Homelcd                     '
              Clearlcd
              Putlcd "Time= ", j       
              Sleep 1000   
              Next j
    Toggle re.Bit1  
              Goto loop_data_input     
 プログラムリストです、温度計のみタイマーのみコンパスのみで使えるように、変数をそれぞれの場所に配置してあります適当に3分割すれば、単品で使えます。

5.実験結果
メニュー画面
メニュー画面電源を入れるとメニュー表示が表れる
温度計
温度計スイッチ1を押すと温度計が表示、左上 からカウント、右上 センサー電圧、下側 現在温度計が表示される
デジタルコンパス(方位)
デジタルコンパススイッチ2を押すと 左側 現在方位が表示され、右側 デジタルコンパスの3ビット入力情報が表示される
タイマー
タイマースイッチ3を押すとタイマーが現れボリュームで0分から5分まで任意にタイマーを調節できる、調節が終わったらスイッチ1を押す、するとタイマーのカウントダウンが始まり、リレーがタイマー時間分オンになり最後切れる、トンネルに入ったときライトを付けるがよく消し忘れてバッテリー上がりで困った事があり作りました 
車に搭載
車に搭載裏側
フロントガラス部分に設置
完成
左側写真 左から液晶モジュール、真中縦4つが制御スイッチ、右側 黒く丸いのがタイマー用ボリューム、タイマーは固定しておけば、毎回同じ分数うで作動するので便利
右側写真 右上PICマイコン、ここから制御信号がI/Oされます、右上基盤がコンパスモジュールここで東西南北を出力してPICに送る、左下5Vレギュレーター、車のバッテリーは12V、そのままマイコンに接続すると焼けて故障します、ここで12Vから5Vまでに降下させます、右下四角いのは2回路入りオペアンプ、その更に右側が温度センサー、温度センサーは精度が悪いので温度数値をオペアンプで増幅して正確な温度を割り出しています
ホームに戻る