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

デジタルコンパスの測定値を PIC-BASIC で読み取ります。
センサーの仕様は以下のとおり。(「日本語マニュアル」から抜粋)
精度 ±5°
傾斜許容角 ±10°
セトリングタイム500ms
ヒステレシス ±5°
電源電圧 DC5V±10%
電源電流 12mA max
動作温度範囲 −5℃ 〜 +60℃
保存温度範囲 −25℃ 〜 +75℃
このデジタルコンパスは下表のように8方位を3ビットパラレルで出力します。 マニュアルによっては、この出力表に間違いがあるので注意してください。
N 
北 
NE
北東
E 
東 
SE
南東
S 
南 
SW
南西
W 
西 
NW
北西
D0
D1
D2
このセンサーは秋月電子通商や、 ロボット王国で入手する事が出来ます。

■回路
出力をそのままつなぐだけです。
回路図はセンサーの部品実装面を見た時のピン配置になっています。

電解コンデンサはベースボードからの電源にノイズ成分がのるので取り付けています。
動作確認用にベースボードのLEDを利用しました。だたこのLEDは LOW で点灯です。

■プログラム
PIC-BASIC は文字列を扱う変数を持っていないので、 値に応じて表示する文字列をかえる今回のようなケースはちょっと厄介です。 メモリ消費などで考えた場合、賢い方法ではないかもしれませんが、ここでは「文字列を文字に分解して」 1文字づつ表示する方法を採用しました。
どなたか文字列の扱いについて画期的な方法をご存知でしたらご教授ください(笑)

プログラムを2本掲載しています。
 1つは方角をアルファベットで表示します。
 1つは方角を擬似漢字で表示します。
漢字表示版はCGRAM定義を行う処理が増えているだけで、基本的なつくりはアルファベット表示版と同じです。
CGRAM定義部分は PIC-BASIC 活用ブック に掲載されていたプログラムをほぼそのまんま利用しています。

'   PIC-BASIC でデジタルコンパスを使う
'   方角の表示は英字
'
DIM    news  AS BYTE
DIM    drct1 AS BYTE, drct2  AS BYTE

    '------------- LCD初期設定
    INITLCD
    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, &h53,&h53,&h4E,&h4E,&h53,&h57,&h45,&h4E
        LOOKUP news, drct2, &h20,&h57,&h45,&h20,&h45,&h20,&h20,&h57

        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
 
'   PIC-BASIC でデジタルコンパスを使う
'   方角の表示は漢字
'
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

    '------------- LCD初期設定
    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:
    '---------- 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
 

■測定結果
こんな感じ。

ちなみに東西南北はこう表示されます。
□□■□□  □□□□□  □□■□□  □□□□□
■■■■■  ■■■■■  ■■■■■  □■□■□
□□■□□  □■□■□  □□■□□  □■□■□
■■■■■  □■□■□  ■■■■■  ■■□■■
■■■■■  ■■■■■  ■■□■■  □■□■□
□■■■□  ■■□■■  ■■■■■  □■□■□
■□■□■  ■□□□■  ■□■□■  □■□■□
■□■□■  ■■■■■  ■□■□■  ■■□■■


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


■戻る