デジタルコンパスの測定値を 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 |
1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
D1 |
1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
D2 |
0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
このセンサーは秋月電子通商や、
ロボット王国で入手する事が出来ます。
■回路
出力をそのままつなぐだけです。
回路図はセンサーの部品実装面を見た時のピン配置になっています。
電解コンデンサはベースボードからの電源にノイズ成分がのるので取り付けています。
動作確認用にベースボードの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
|
■測定結果
こんな感じ。
ちなみに東西南北はこう表示されます。
□□■□□ □□□□□ □□■□□ □□□□□
■■■■■ ■■■■■ ■■■■■ □■□■□
□□■□□ □■□■□ □□■□□ □■□■□
■■■■■ □■□■□ ■■■■■ ■■□■■
■■■■■ ■■■■■ ■■□■■ □■□■□
□■■■□ ■■□■■ ■■■■■ □■□■□
■□■□■ ■□□□■ ■□■□■ □■□■□
■□■□■ ■■■■■ ■□■□■ ■■□■■
|