本体と5ピンのコネクタがついてます。忘備録として書いておくと、写真の状態で赤から順に+3.3V, GND, Tx, Rx, PPSです。
配線細いので、ピンを圧着します。前の写真から20分ぐらいかかっているけど、そのうち15分はスミチューブを探していました。片付けよう……部屋を……。
で、マイコンと接続。軒下から持ち出せないと不便なので、ディスプレイ付きM5 Stackを使います。GND, 3V3, Txを16, Rxを17に接続します。Hardware Serial 2を使うのでGPIO16はRx, GPIO17はTxになり、相互に通信できるわけです。レシーバーとの通信速度は9600bpsにセットします。
あとはただ受信して $GPRMC が含まれる行を切り取ってM5 StackのLCDに表示するだけ……と思ったら何もでません。
このレシーバー、標準状態ではGNSSなので、$GPRMCではなく$GNRMCにしないといけません。で、めでたくM5の画面上には時刻(UTCなので9時間ずれます)などが表示されるはず……と思いきや、でません。室内だと全然衛星を補足してくれません。まぁ当然ですけども。
で、一度ベランダに出て、衛星を補足したあとは部屋の中でも検知できます。画面上135438=22時54分38秒と出ているのがGNSSから取得した時刻です。
で、衛星情報はモジュール内でバックアップされているはずなので、Vcc - GND間に1Fのキャパシタを入れてみたところ、Vccを抜いて10分間後に再度電源を供給しても時刻の取得が可能でした。一次リチウムバッテリなら小さいのでも数日は楽勝ですね。
ソースはこんな感じ。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <M5Stack.h> | |
HardwareSerial mySerial(2); // RX, TX | |
void setup() { | |
Serial.begin(115200); | |
M5.begin(); | |
M5.Lcd.setTextSize(1); | |
M5.Lcd.setTextColor(WHITE, BLACK); | |
mySerial.begin(9600); | |
} | |
char line[201]; | |
int p = 0; | |
void loop() { | |
if (mySerial.available()) { | |
int c = mySerial.read(); | |
if (c == 13) { | |
mySerial.read(); | |
line[p] = 0; | |
Serial.print(line); | |
if (strstr(line, "GNRMC")) { | |
M5.Lcd.setCursor(0, 30); | |
M5.Lcd.printf(line); | |
Serial.println("<--------------------"); | |
} else { | |
Serial.println(""); | |
} | |
p = 0; | |
} else { | |
line[p++] = c; | |
} | |
} | |
} |
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。