使用Arduino控制NEO-6M GPS模塊應(yīng)用
本應(yīng)用說明如何將NEO-6M GPS模塊與Arduino一起使用以獲取GPS數(shù)據(jù)。GPS代表全球定位系統(tǒng),可以在旅行時(shí)用于確定位置,時(shí)間和速度。
您將學(xué)習(xí)到如何:將NEO-6M GPS模塊連接到Arduino UNO獲取原始GPS數(shù)據(jù)解析原始數(shù)據(jù)以獲得選定的可讀GPS信息取得位置
推出NEO-6M GPS模塊
NEO-6M GPS模塊如下圖所示。它帶有一個(gè)外部天線,并且不帶有插頭。因此,您需要獲取并焊接一些引腳。
該模塊具有外部天線和內(nèi)置EEPROM。接口:RS232 TTL電源:3V至5V默認(rèn)波特率:9600 bps與標(biāo)準(zhǔn)NMEA語法一起使用
NEO-6M GPS模塊還與其他微控制器板兼容。
引腳接線
NEO-6M GPS模塊具有四個(gè)引腳:VCC,RX,TX和GND。該模塊使用TX和RX引腳通過串行通信與Arduino進(jìn)行通信,因此接線是多么簡單:
NEO-6M GPS模塊 接線到Arduino UNO
VCC 5伏
RX 軟件序列中定義的TX引腳
TX 軟件序列中定義的RX引腳
GND 地線
獲取GPS原始數(shù)據(jù)
要獲取原始GPS數(shù)據(jù),您只需使用”軟件串行口”開始與GPS模塊的串行口通信。繼續(xù)閱讀以了解具體的操作方法。
所需零件
為了測試此示例,您將需要以下部分:ArduinoNEO-6M GPS模塊跳線
原理圖
請按照以下示意圖將NEO-6M GPS模塊連接到Arduino。
模塊GND引腳連接到Arduino GND引腳模塊RX引腳連接到Arduino 引腳3模塊TX引腳連接到Arduino 引腳4模塊VCC引腳連接到Arduino 5V引腳
代碼
將以下代碼復(fù)制到Arduino IDE,并將其上傳到Arduino開發(fā)板。
#include <SoftwareSerial.h>
SoftwareSerial ss(4, 3);
void setup(){
Serial.begin(9600);
ss.begin(9600);
}
void loop(){
while (ss.available() > 0){
byte gpsData = ss.read();
Serial.write(gpsData);
}
}
此電路圖假定您將引腳4和引腳3用作RX和TX串行引腳,以與GPS模塊建立串行通信。如果您使用其他引腳,則應(yīng)在以下行中對其進(jìn)行編輯:
SoftwareSerial ss(4, 3);
另外,如果您的模塊使用的默認(rèn)波特率不同于9600 bps,則應(yīng)在以下行中修改代碼:
ss.begin(9600);
該電路圖偵聽GPS串行端口,并在從模塊接收數(shù)據(jù)時(shí)將其發(fā)送到串行監(jiān)視器。
while (ss.available() > 0){
byte gpsData = ss.read();
Serial.write(gpsData);
}
以9600的波特率打開串行監(jiān)視器。
您應(yīng)該以GPS標(biāo)準(zhǔn)語言NMEA獲得大量信息。您在串行監(jiān)視器中看到的每一行都是NMEA語句。
NMEA代表國家海洋電子協(xié)會(huì),在GPS領(lǐng)域中,它是GPS制造商支持的標(biāo)準(zhǔn)數(shù)據(jù)格式。
了解NMEA句子
NMEA句子以$字符開頭,并且每個(gè)數(shù)據(jù)字段都用逗號(hào)分隔。
$ GPGGA,110617.00,41XX.XXXXX,N,00831.54761,W,1,05,2.68,129.0,M,50.1,M ,, * 42
$ GPGSA,A,3,06,09,30,07,23 ,, ,,,,, 4.43,2.68,3.53 * 02
$ GPGSV,3,1,11,02,48,298,24,03,05,101,24,05,17,292,20,06,71,227,30 * 7C
$ GPGSV, 3,2,11,07,47,138,33,09,64,044,28,17,01,199,19,13,214,* 7C
$ GPGSV,3,3,11,23,29,054,29,29,01,335,,30 ,29,167,33 * 4E
$ GPGLL,41XX.XXXXX,N,00831.54761,W,110617.00,A,A * 70
$ GPRMC,110618.00,A,41XX.XXXXX,N,00831.54753,W,0.078,030118 ,,, A * 6A
$ GPVTG ,, T ,, M,0.043,N,0.080,K,A * 2C
NMEA句子有不同類型。消息的類型由第一個(gè)逗號(hào)之前的字符指示。
$之后的GP表示它是GPS位置。$ GPGGA是基本的GPS NMEA消息,提供3D位置和準(zhǔn)確性數(shù)據(jù)。在下面的句子中:
$ GPGGA,110617.00,41XX.XXXXX,N,00831.54761,W,1,05,2.68,129.0,M,50.1,M ,, * 42110617 –表示采取修復(fù)位置的時(shí)間,UTC時(shí)間11:06:1741XX.XXXXX,N –緯度41度XX.XXXXX’N00831.54761,W –經(jīng)度008度31.54761′W1 –修復(fù)質(zhì)量(0 =無效; 1 = GPS修復(fù); 2 = DGPS修復(fù); 3 = PPS修復(fù); 4 =實(shí)時(shí)運(yùn)動(dòng)學(xué); 5 =浮點(diǎn)RTK; 6 =估計(jì)(航位推算); 7 =手動(dòng)輸入模式; 8 =模擬模式)05 –被跟蹤的衛(wèi)星數(shù)2.68 –頭寸水平稀釋129.0,M –海拔,海拔高度50.1,M – WGS84橢球上方的大地水準(zhǔn)面的高度(平均海平面)空字段-自上次DGPS更新以來的時(shí)間(以秒為單位)空字段– DGPS站ID號(hào)* 42 –校驗(yàn)和數(shù)據(jù),始終以*開頭
NMEA的其他句子提供了其他信息:
- $ GPGSA – GPS DOP和活動(dòng)衛(wèi)星
- $ GPGSV –詳細(xì)的GPS衛(wèi)星信息
- $ GPGLL –地理緯度和經(jīng)度
- $ GPRMC –基本的GPS pvt(位置,速度,時(shí)間)數(shù)據(jù)
- $ GPVTG –速度不錯(cuò)
使用TinyGPS ++庫解析NMEA句子
您可以處理來自GPS的原始數(shù)據(jù),也可以通過將字符序列保存到變量中來將這些NMEA消息轉(zhuǎn)換為可讀且有用的格式。為此,我們將使用TinyGPS ++庫 。
通過該庫,可以輕松獲取有用且易于理解的格式的位置信息。
安裝TinyGPS ++庫
請按照以下步驟在您的Arduino IDE中安裝TinyGPS ++庫:
1. 下載TinyGPSPlus庫。您的下載文件夾中應(yīng)該有一個(gè).zip文件夾
2. 解壓縮.zip文件夾,您應(yīng)該得到TinyGPSPlus-master文件夾
3. 重命名文件夾 到TinyGPSPlus
4. 將TinyGPSPlus文件夾移至Arduino IDE安裝庫文件夾
5. 最后,重新打開您的Arduino IDE
該庫提供了一些有關(guān)如何使用它的示例。在您的Arduino IDE中,您只需要轉(zhuǎn)到 File > Examples > TinyGPS ++,然后從提供的示例中進(jìn)行選擇。
注意:庫中提供的示例假定GPS模塊的波特率為4800。如果您使用的是NEO-6M GPS模塊,則需要將其更改為9600。
使用NEO-6M GPS模塊和TinyGPS ++庫獲取位置
您可以使用TinyGPS ++庫以方便實(shí)用的格式獲取位置。下面,我們提供了一個(gè)代碼來從GPS獲取位置。這是其中一個(gè)庫示例的簡化版本。
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
void setup(){
Serial.begin(9600);
ss.begin(GPSBaud);
}
void loop(){
while (ss.available() > 0){
gps.encode(ss.read());
if (gps.location.isUpdated()){
Serial.print(“Latitude= “);
Serial.print(gps.location.lat(), 6);
Serial.print(” Longitude= “);
Serial.println(gps.location.lng(), 6);
}
}
}
首先導(dǎo)入所需的庫:TinyGPSPlus和SoftwareSerial
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
然后,您定義軟件串行RX和TX引腳,以及GPS波特率。如果將其他引腳用于軟件串行,則需要在此處進(jìn)行更改。另外,如果您的GPS模塊使用其他默認(rèn)波特率,則還應(yīng)該對其進(jìn)行修改。
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
然后,創(chuàng)建一個(gè)TinyGPS ++對象:
TinyGPSPlus gps;
然后在您先前定義的引腳上開始串行連接
SoftwareSerial ss(RXPin, TXPin);
在setup()中,您可以初始化串行通信,以查看串行監(jiān)視器上的讀數(shù)并與GPS模塊通信。
void setup() {
Serial.begin(9600);
ss.begin(GPSBaud);
}
在循環(huán)中,您需要提供信息。為了使TinyGPS ++能夠正常工作,您必須使用encode()方法從GPS模塊中反復(fù)向其添加字符。
while (ss.available() > 0){
gps.encode(ss.read());
然后,您可以查詢gps對象以查看是否已更新任何數(shù)據(jù)字段:
if (gps.location.isUpdated()){
Serial.print(“Latitude=”); Serial.print(gps.location.lat(), 6);
Serial.print(“Longitude=”); Serial.println(gps.location.lng(), 6);
}
分別使用gps.location.lat()和gps.location.lng()即可輕松獲得緯度和經(jīng)度。
將代碼上傳到Arduino,您應(yīng)該會(huì)在串行監(jiān)視器上看到顯示的位置。上載代碼后,請等待幾分鐘,同時(shí)模塊將調(diào)整位置以獲取更準(zhǔn)確的數(shù)據(jù)。
使用TinyGPS ++庫獲取更多GPS信息
TinyGPS ++庫使您不僅可以簡單地獲取位置信息,還可以獲取更多信息。除了位置,您還可以獲得:日期時(shí)間速度課程高度衛(wèi)星高清
下面的代碼示例了如何以一種簡單的方式獲取所有這些信息。
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
SoftwareSerial ss(RXPin, TXPin);
void setup(){
Serial.begin(9600);
ss.begin(GPSBaud);
}
void loop(){
while (ss.available() > 0){
gps.encode(ss.read());
if (gps.location.isUpdated()){
Serial.print(“Latitude= “);
Serial.print(gps.location.lat(), 6);
Serial.print(” Longitude= “);
Serial.println(gps.location.lng(), 6);
Serial.print(“Raw latitude = “);
Serial.print(gps.location.rawLat().negative ? “-” : “+”);
Serial.println(gps.location.rawLat().deg)
Serial.println(gps.location.rawLat().billionths);
Serial.print(“Raw longitude = “);
Serial.print(gps.location.rawLng().negative ? “-” : “+”);
Serial.println(gps.location.rawLng().deg);
Serial.println(gps.location.rawLng().billionths);
Serial.print(“Raw date DDMMYY = “);
Serial.println(gps.date.value());
Serial.print(“Year = “);
Serial.println(gps.date.year());
Serial.print(“Month = “);
Serial.println(gps.date.month());
Serial.print(“Day = “);
Serial.println(gps.date.day());
Serial.print(“Raw time in HHMMSSCC = “);
Serial.println(gps.time.value());
Serial.print(“Hour = “);
Serial.println(gps.time.hour());
Serial.print(“Minute = “);
Serial.println(gps.time.minute());
Serial.print(“Second = “);
Serial.println(gps.time.second());
Serial.print(“Centisecond = “);
Serial.println(gps.time.centisecond());
Serial.print(“Raw speed in 100ths/knot = “);
Serial.println(gps.speed.value());
Serial.print(“Speed in knots/h = “);
Serial.println(gps.speed.knots());
Serial.println(gps.speed.mph());
Serial.print(“Speed in m/s = “);
Serial.println(gps.speed.mps());
Serial.print(“Speed in km/h = “);
Serial.println(gps.speed.kmph());
Serial.print(“Raw course in degrees = “);
Serial.println(gps.course.value());
Serial.print(“Course in degrees = “);
Serial.println(gps.course.deg());
Serial.print(“Raw altitude in centimeters = “);
Serial.println(gps.altitude.value());
Serial.print(“Altitude in meters = “);
Serial.println(gps.altitude.meters());
Serial.print(“Altitude in miles = “);
Serial.println(gps.altitude.miles());
Serial.print(“Altitude in kilometers = “);
Serial.println(gps.altitude.kilometers());
Serial.print(“Altitude in feet = “);
Serial.println(gps.altitude.feet());
Serial.print(“Number os satellites in use = “);
Serial.println(gps.satellites.value());
Serial.print(“HDOP = “);
Serial.println(gps.hdop.value());
}
}
}
TinyGPS ++ 在如何使用其所有功能方面得到了很好的評價(jià)。
寫到最后
希望本指南對您有所幫助。喜歡就記得關(guān)注,后續(xù)會(huì)繼續(xù)分享更多項(xiàng)目示例,敬請期待。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至2161241530@qq.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。如若轉(zhuǎn)載,請注明出處:http://www.sdanke.com/uncategorized/32106/