目录
介绍
NEO-6M GPS接收器模块
Global Positioning System (GPS) 利用了通过在地球上的空间和地面站卫星发送来准确地确定其在地球上的位置的信号。
NEO-6M GPS接收器模块使用USART通信与微控制器或PC终端通信。
它以NMEA字符串的形式从卫星接收纬度,经度,高度,UTC时间等信息。需要解析此字符串以提取我们要使用的信息。
连接图
将NEO-6M GPS接收器模块与MSP-EXP430G2 TI Launchpad连接
注意:对于TI Launchpad板,P1.1是Rx引脚,P1.2是使用硬件串口时的Tx引脚。这里,我们使用的是硬件串口,因此P1.1是Rx引脚。
当连接线定位于软件串行时,P1.1作为Tx引脚,P1.2作为Rx引脚。
例
我们将在Energia的串行监视器上显示GPS接收器模块接收的数据(纬度,经度,高度和时间)。
在这里,我们将使用来自GitHub的Mikal Hart的TinyGPSPlus库。该库适用于Arduino,但也适用于MSP -EXP430G2 TI Launchpad。
库下载:
提取库并将其添加到Energia IDE的库文件夹路径中。
在这里,我们使用此库的作者提供的函数和头文件创建了一个简化的程序。
注意:如果您看到*****格式的大部分数据,请将GPS连接到Energia的开放空间(例如阳台)。GPS可能需要一些时间来锁定卫星。给它大约20-30秒,以便它可以开始给你正确的数据。如果您在开放空间中,锁定卫星通常不会超过5秒,但有时可能需要更长时间(例如,如果GPS接收器看不到3颗或更多颗卫星)。
注意: MSP-EXP430G2 TI Launchpad主板具有512字节的RAM,可轻松上传,尤其是在使用不同库时。有时您需要串行缓冲区足够大以包含所需的数据,并且您必须修改串行库的缓冲区大小。在做这些事情时,我们必须确保代码不会使用超过70%的RAM。这可能导致代码以不稳定的方式工作,有时运行良好并且在其他方面失败。
有些时候RAM使用率可能会超过70%并且代码将完全正常工作,并且即使RAM使用率为65%,代码也无法工作。
在这种情况下,可能需要对缓冲区大小和/或变量进行一些试验和错误。
用于在串行监视器上显示GPS参数的程序
#include <TinyGPS++.h>
/* Create an object named gps of the class TinyGPSPlus */
TinyGPSPlus gps;
volatile float minutes, seconds;
volatile int degree, secs, mins;
void setup() {
Serial.begin(9600); /* Define baud rate for serial communication */
}
void loop() {
smartDelay(1000); /* Generate precise delay of 1ms */if (!gps.location.isValid())
{
Serial.print("Latitude : ");
Serial.println("*****");
Serial.print("Longitude : ");
Serial.println("*****");
}else
{//DegMinSec(gps.location.lat());
Serial.print("Latitude in Decimal Degrees : ");
Serial.println(gps.location.lat(), 6);
// Serial.print("Latitude in Degrees Minutes Seconds : ");
// Serial.print(degree);
// Serial.print("\t");
// Serial.print(mins);
// Serial.print("\t");
// Serial.println(secs);//DegMinSec(gps.location.lng()); /* Convert the decimal degree value into degrees minutes seconds form */
Serial.print("Longitude in Decimal Degrees : ");
Serial.println(gps.location.lng(), 6);
// Serial.print("Longitude in Degrees Minutes Seconds : ");
// Serial.print(degree);
// Serial.print("\t");
// Serial.print(mins);
// Serial.print("\t");
// Serial.println(secs);
}if (!gps.altitude.isValid())
{
Serial.print("Altitude : ");
Serial.println("*****");
}else
{
Serial.print("Altitude : ");
Serial.println(gps.altitude.meters(), 6);
}if (!gps.time.isValid())
{
Serial.print("Time : ");
Serial.println("*****");
}else
{char time_string[32];
sprintf(time_string, "Time : %02d/%02d/%02d \n",gps.time.hour(), gps.time.minute(), gps.time.second());
Serial.print(time_string);
}
}
余下程序:
static void smartDelay(unsigned long ms)
{unsigned long start = millis();
do
{while (Serial.available()) /* Encode data read from GPS while data is available on serial port */
gps.encode(Serial.read());
/* Encode basically is used to parse the string received by the GPS and to store it in a buffer so that information can be extracted from it */
} while (millis() - start < ms);
}
//void DegMinSec( double tot_val) /* Convert data in decimal degrees into degrees minutes seconds form */
//{
// degree = (int)tot_val;
// minutes = tot_val - degree;
// seconds = 60 * minutes;
// minutes = (int)seconds;
// mins = (int)minutes;
// seconds = seconds - minutes;
// seconds = 60 * seconds;
// secs = (int)seconds;
//}