■ PIC-BASIC でデジタルコンパスを使う ■

デジタルコンパスの測定値を PIC-BASIC で読み取ります。
2個使用して16方位を検出します。

■回路
出力をそのままつなぐだけです。
回路図はセンサーの部品実装面を見た時のピン配置になっています。
電解コンデンサはベースボードからの電源にノイズ成分がのるので取り付けています。
動作確認用にベースボードのLEDを利用しました。だたこのLEDは LOW で点灯です。

センサー1が基準で、センサー2が補正用です。 センサー2は矢印の向きがセンサー1よりも左を向くように取り付けます。 右に向ける場合は、プログラムの16方位用の LOOKUP に修正が必要です。

■プログラム
プログラムの中身はデジタルコンパスを1つ使ったものの応用です。
個人的趣味から漢字表示です。英字表示への改造は簡単なので各自で挑戦してください。

'   PIC-BASIC でデジタルコンパスを使う
'   方角の表示は漢字(16方位)
'
DIM    news  AS BYTE, news2  AS BYTE
DIM    drct0 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

    '------------- LCD初期設定
    INITLCD
    GOSUB pcgset
    CLEARLCD
    '------------- ポート初期設定
    db = rd
    db = ( db & &B11000000 ) | &B111111
    rd = db

    WHILE(1)
        GOSUB GetDirection

        '--------- 方角表示
        IF news < 8 THEN
                                 '0:S   1:SW  2:NE  3:N   4:SE  5:W   6:E   7:NW
            LOOKUP news,    drct0, &h20, &h02, &h03, &h20, &h02, &h20, &h20, &h03
            LOOKUP news,    drct1, &h02, &h20, &h20, &h03, &h20, &h01, &h00, &h20
            LOOKUP news,    drct2, &h20, &h01, &h00, &h20, &h00, &h20, &h20, &h01
        ELSE
                                 '0:SSE 1:SSW 2:NNE 3:NNW 4:ESE 5:WSW 6:ENE 7:WNW
            LOOKUP news -8, drct0, &h02, &h02, &h03, &h03, &h00, &h01, &h00, &h01
            LOOKUP news -8, drct1, &h02, &h02, &h03, &h03, &h02, &h02, &h03, &h03
            LOOKUP news -8, drct2, &h00, &h01, &h00, &h01, &h00, &h01, &h00, &h01
        ENDIF
        SETPOS 1,0 : PUTLCD chr$(drct0)
        SETPOS 2,0 : PUTLCD chr$(drct1)
        SETPOS 3,0 : PUTLCD chr$(drct2)
        SETPOS 5,0 : PUTLCD "VALUE1:",( news & &H7), ":", (news >> 3)
        SETPOS 5,1 : PUTLCD "VALUE2:",  news2
        SLEEP 500
    WEND

GetDirection:
    '---------- デジタルコンパス値取得
    db = rd
    news  =  db & &B00000111
    news2 = (db & &B00111000) >> 3

    IF news <> news2 THEN news = news + 8
    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:
    '---------- CGRAM設定
    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
 

■測定結果
こんな感じ。
センサー2はセンサー1より22.5°左を向けています。
CADで台紙を作って、そこに両面テープで接着しました。


あらゆる被害についてオイラは一切の責任を負いませんのでご了承を。
記載漏れや間違いなどありましたらご指摘よろしくお願いします。


■戻る