概述
我們在Adafruit商店中提供了幾種不同的GPS模塊,但是沒有一個能夠滿足我們的所有愿望-這就是為什么我們設計了這個小小的GPS接線板。我們認為這是 Ultimate GPS模塊,因此我們將其命名為。它具有您想要的一切以及更多的功能:
-165 dBm靈敏度,10 Hz更新,66個通道
5V友好設計和僅20mA的電流消耗
易于使用的木板+兩個安裝孔
兼容RTC電池
內置數據記錄
PPS固定輸出
固定狀態LED
此突破圍繞MTK3339芯片組構建,這是毫無疑問的,高質量GPS模塊,可以在66個頻道上跟蹤多達22顆衛星,具有出色的高靈敏度接收器(-165 dB跟蹤!)和內置天線。它每秒最多可以進行10個位置更新,以進行高速,高靈敏度的記錄或跟蹤。功耗非常低,在導航期間僅為20 mA。
最終GPS分線板
面包板突破板隨附::超低壓降3.3V穩壓器,因此您可以使用3.3-5VDC輸入,5V電平安全輸入和ENABLE引腳為其供電,從而可以使用以下方式關閉模塊:任何微控制器引腳或開關,可選CR1220紐扣電池的占位面積,以保持RTC正常運行并允許熱啟動和微小的亮紅色LED。搜索衛星時,LED指示燈以大約1Hz的頻率閃爍,找到可節省電量的解決方案時,它每15秒閃爍一次。如果您一直希望有一個LED,我們還會在引腳上提供FIX信號,以便您可以將一個外部LED點亮。
最終GPS USB板
USB Breakout板隨附: 4針USB Break板,用于直接焊接或連接到USB主機,兩個黃色的接收/發送LED指示燈可讓您知道何時將數據發送到GPS模塊串行接口或從GPS模塊串行接口發送數據;可選的CR1220紐扣電池的占用空間可保持RTC的運行并允許熱啟動,并且還有一個很小的亮紅色LED指示燈。搜索衛星時,LED指示燈以大約1Hz的頻率閃爍,找到可節省電量的解決方案時,它每15秒閃爍一次。如果您一直希望有一個LED,我們還會在引腳上提供FIX信號,以便您可以將一個外部LED點亮。
天線使用情況
基于版本3 MTK3339的模塊真正突出的兩個功能是外部天線功能和內置的數據記錄功能。該模塊具有標準的陶瓷貼片天線,可提供-165 dB的靈敏度,但是如果您想要更大的天線,則可以通過uFL連接器扣緊任何3V有源GPS天線。模塊將自動檢測活動的天線并進行切換!大多數GPS天線使用SMA連接器,因此您可能需要使用我們的uFL到SMA適配器之一。
基于MTK3339的新模塊(我們已經成功測試)的另一個很酷的功能是內置的數據記錄功能。由于模塊內部有一個微控制器,帶有一些空的閃存,因此,最新的固件現在允許發送命令以對該閃存進行內部記錄。唯一的事情是您確實需要讓微控制器發送“開始記錄”命令。但是,發送該消息后,微控制器可以進入睡眠狀態,并且無需喚醒即可與GPS通話以降低功耗。時間,日期,經度,緯度和高度每15秒記錄一次,并且僅在有修正時記錄。內部閃存可以存儲大約16個小時的數據,它將自動追加數據,因此您不必擔心斷電會意外丟失數據。無法將記錄的內容和記錄的頻率更改為已硬編碼到模塊中,但是我們發現這種安排涵蓋了許多最常見的GPS數據記錄要求。
今天在Adafruit商店提貨一個!
規格:
模塊規格:
衛星:跟蹤22條,搜索66條
貼片天線尺寸:15mm x 15mm x 4mm
更新速率:1至10 Hz
位置精度:1.8米
速度精度:0.1米/秒
暖/冷啟動:34秒
采集靈敏度:-145 dBm
跟蹤靈敏度:-165 dBm
最大速度:515m/s
輸入電壓范圍:3.0-5.5VDC
MTK3339工作電流:25mA跟蹤,導航時消耗20mA電流
輸出:NMEA 0183,默認9600波特率
支持DGPS/WAAS/EGNOS
符合FCC E911和支持AGPS(離線模式:EPO,有效期最長為14天)
多達210個PRN頻道
干擾檢測和減少
多徑檢測和補償
突破b詳情:
重量(不包括紐扣電池或支架):8.5g
尺寸(不包括紐扣電池或支架):25.5mm x 35mm x 6.5mm/1.0“ x 1.35” x 0.25“
如果您在2012年3月26日之前購買了模塊,并且絲網印刷版上顯示MTK3329,則您可以使用MT3329芯片組獲得此突破的PA6B版本。 MTK3329沒有內置的數據記錄。如果您的模塊有沙皮筆標記劃掉了MTK3329文本或沒有文本,則您的PA6C MTK3339具有數據記錄功能。如果名稱旁邊帶有“ v3”的版本,則說明PA6H具有PPS輸出并支持外部天線。
本教程假定您使用的是‘3339類型的模塊。
插腳
普通的GPS分組接口旨在與具有3/5V UART且所有GPIO引腳暴露在底部0.1“接頭上的微控制器一起使用
USB版本沒有這些突破,而是只有一個USB串行端口。當您要將其直接焊接到USB主機傳送器時,右側有4個焊盤是USB引腳。
斷路器電源引腳
這些是與GPS供電有關的引腳。在右側是必需的電源引腳:
VIN -電源輸入,連接到3-5VDC。連接到干凈安靜電源很重要。 GPS非常敏感,因此您需要一個安靜的電源。如果可以避免的話,請不要連接到開關電源,否則LDO的噪音會減少!
GND -電源和信號地。連接到電源和微控制器接地。
然后,在左側是一些可選的電源引腳:
VBAT 輸入引腳-連接到GPS實時時鐘備用電池。我們建議使用背面的電池點,但是如果您有一個項目要使用紐扣電池或其他類型的電池(且其電壓低于3.3V),則可以將其連接至VBAT引腳。 對于V1和V2模塊:如果要執行此操作,請確保在RTC焊盤之間切掉背面的走線
EN 是啟用引腳,通過一個10K電阻將其拉高。當該引腳接地時,它將關閉GPS模塊。這對于非常低功耗的項目可能非常方便,在這些項目中您想輕松地長時間關閉模塊。如果禁用GPS,將會丟失修復程序;如果未安裝備用電池,則修復過程也將花費很長時間。
3.3V 是輸出來自板載3.3V穩壓器。如果您需要干凈的3.3V輸出,可以使用它!它可以提供至少100mA的輸出。
中斷串行數據引腳
接下來要使用的引腳是串行數據引腳:
TX -傳輸數據的引腳從GPS模塊到您的微控制器或計算機。它是3.3V邏輯電平。默認情況下,數據以9600波特的速率輸出
RX -您可以使用該引腳向GPS發送數據 。您可以使用使用3.3V或5V邏輯,有一個邏輯電平轉換器。默認情況下,它期望9600波特數據,并且記住您需要向其發送校驗和的NMEA句子
中斷其他引腳
FIX 是輸出引腳-它與驅動紅色LED的引腳相同。如果沒有解決辦法,FIX引腳將每秒上下脈沖一次。修復后,大部分時間該引腳處于低電平(0V),每15秒鐘將脈沖高電平200毫秒
PPS 是一個新的引腳輸出在V3模塊上。其“每秒脈沖數”輸出。多數情況下,它處于邏輯低電平(地),然后每秒脈沖高電平(3.3V),持續50-100ms,因此,微控制器應該很容易地與之同步
備用電池
GPS具有內置的實時時鐘,即使掉電且尚未修復,它也可以跟蹤時間。如果您希望使用火焰狀電源連接(例如,您使用的是太陽能或類似產品),它還可以幫助減少修理時間。要使用RTC,我們需要安裝電池。 CR1220 尺寸的電池座背面有一個斑點。我們提供支架,但不包括電池。您可以使用任何12毫米硬幣電池-這些硬幣電池很受歡迎,我們也可以在Adafruit商店中使用它們。
通常,如果GPS斷電,它將恢復到出廠默認的波特率,配置等。備用電池將意味著這些默認值不會丟失!
備用實時時鐘電路消耗7 uA(0.007 mA),因此CR1220的使用壽命為40mAh/0.007mA = 5,714小時= 240天連續。備用電池僅在GPS沒有3V主電源時使用,因此,只要偶爾使用一次,就可以使用幾年
如果僅具有v1或v2模塊:在將電池插入電池盒之前,請先切割背面兩個焊墊之間的走線,標記為RTC(這將VIN引腳與電池輸入斷開連接)使用萬用表進行連續性檢查,以確保兩個焊盤不再連接在一起。
V3模塊沒有切割痕跡,它們具有內置二極管!
請記住, GPS不知道您處于哪個時區(即使知道您所在的位置,沒有大量查找表也無法輕松確定時區),因此所有日期/時間數據都采用UTC(又稱格林威治標準時間)-你會必須編寫將其轉換為您當地時區的代碼,并在需要時記入夏令時!由于這很復雜,因此大多數人都堅持將所有內容保留在UTC
外部天線
版本3中的新功能在Ultimate GPS突破中,我們現在支持可選的外部天線!該功能在v1或v2中不可用,因此,如果看不到uFL連接器,則說明該模塊的版本較舊,不支持天線
所有Ultimate GPS模塊具有內置貼片天線-該天線提供-165 dBm的靈敏度,非常適合許多項目。但是,如果要將項目放在盒子中,則可能無法使天線指向上方,或者可能位于金屬屏蔽中,或者可能需要更高的靈敏度。在這些情況下,您可能需要使用外部有源天線。
有源天線會吸收電流,因此它們確實可以提供更大的增益,但會降低功耗。檢查天線數據表中的確切電流(通常為10-20mA)。大多數GPS天線使用流行且易于使用的SMA連接器。但是,SMA接頭在GPS突破口上會相當大,因此我們選擇了uFL接頭-重量輕,體積小且易于制造。如果您不需要外部天線,則不會增加重量或空間,但是易于連接uFL-》 SMA適配器電纜。然后將GPS天線連接到電纜。
uFL連接器小巧,纖巧,沒有額定應變或大量的連接/斷開。一旦您連接了uFL適配器,請使用應力消除以避免剝落uFL
Ultimate GPS將自動檢測到已連接外部有源天線并“切換” -您不需要發送任何命令。
有一個輸出語句可以告訴您天線的狀態。 $ PGTOP,11,x ,其中 x 是狀態號。如果 x 為 3 ,則表示它正在使用外部天線。如果 x 為 2 ,則使用內部天線,如果 x 為 1 ,則表明天線短路或出現問題。
在較新的防護罩和模塊上,您需要告知要輸出此報告的固件,可以通過在同一時間添加 gps.sendCommand(PGCMD_ANTENNA)來做到這一點。設置更新率/句子輸出。
直接計算機接線
GPS模塊很棒,因為打開它們的那一刻,它們將開始吐出數據,并嘗試獲取“修復”(位置驗證)。就像現有的幾乎所有GPS一樣,Adafruit Ultimate GPS使用TTL串行輸出發送數據,因此首先測試GPS的最佳方法是通過Arduino上的TTL串行到USB轉換器將其直接連接到計算機。您也可以使用FTDI Friend或其他TTL適配器,但在本演示中,我們將使用經典的Arduino。
Leonardo用戶:本教程步驟不適用于Leonardo。繼續下一步,“ Arduino接線”,但是請回到這里進行有關GPS數據的討論!
首先,將“空白”草圖加載到Arduino中:
下載:文件
復制代碼
// this sketch will allow you to bypass the Atmega chip
// and connect the Ultimate GPS directly to the USB/Serial
// chip converter.
// Connect VIN to +5V
// Connect GND to Ground
// Connect GPS RX (data into GPS) to Digital 0
// Connect GPS TX (data out from GPS) to Digital 1
void setup() {}
void loop() {} // this sketch will allow you to bypass the Atmega chip
// and connect the Ultimate GPS directly to the USB/Serial
// chip converter.
// Connect VIN to +5V
// Connect GND to Ground
// Connect GPS RX (data into GPS) to Digital 0
// Connect GPS TX (data out from GPS) to Digital 1
void setup() {}
void loop() {}
這將釋放轉換器,因此您可以直接接線并繞過Arduino芯片。上傳該草圖后,請按照以下步驟連接GPS。您的模塊外觀可能略有不同,但是只要您連接到正確的引腳名稱,它們在該部分的工作原理都是相同的
現在插入USB電纜,然后從Arduino IDE打開串行監視器,并確保選擇 9600波特 中。您應該看到如下文本:
這是模塊輸出的原始GPS“ NMEA語句”。 NMEA句子有幾種,人們最常用的是 $ GPRMC (( G lobal P 定位 R 推薦 M 至少 C 個坐標或類似內容)和 $ GPGGA 語句。這兩個提供時間,日期,緯度,經度,高度,估計的陸地速度和定位類型。修復類型表示GPS是否已鎖定到衛星數據上并接收到足夠的數據來確定位置(2D修復)或位置+高度(3D修復)。
有關NMEA語句以及它們的數據的更多詳細信息包含,請查看此站點
如果您在上面的窗口中查看數據,您會發現其中有很多逗號,而中間沒有數據。這是因為此模塊在我的桌子上,室內,并且沒有“修復”功能。要解決此問題,我們需要將該模塊放在外面。
GPS模塊將即使沒有修復程序,也始終發送數據!為了獲取“有效”(非空白)數據,您必須將GPS模塊直接放在外面,方形陶瓷天線指向上方,并享有晴朗的天空。在理想條件下,該模塊可以在45秒內得到修復。但是,取決于您的位置,衛星配置,太陽耀斑,附近的高樓大廈,RF噪聲等,修復可能最多需要半小時(或更長時間)!這并不意味著您的GPS模塊已損壞,GPS模塊將始終盡可能快地工作以獲取修復。
如果您能獲得很長的USB線(或將GPS天線連接到v3模塊),然后將GPS伸出窗口,使其指向天空,最終GPS將得到修復,窗口數據將轉換為傳輸有效數據,如下所示:
查找以下內容: $ GPRMC,194509.000,A,4042.6142,N,07400.4168,W,2.03,221.11,160412 ,,, A * 77
該行稱為RMC(建議的最低要求)句子,所有最有用的數據。每個數據塊都用逗號分隔。
第一部分 194509.000 是當前時間 GMT (格林威治標準時間)。前兩個數字 19 表示小時(1900h,也稱為7pm),后兩個數字是分鐘,后兩個數字是秒,最后是毫秒。因此,截取該屏幕截圖的時間為7:45 pm和9秒。 GPS不知道您所在的時區或“夏令時”,因此您必須進行計算才能將GMT轉換為您的時區
第二部分是“狀態代碼”,如果它是 V ,表示數據是 V oid(無效)。如果它是 A ,則表示其 A 功能(GPS可以獲取鎖定/修復)
接下來的4個數據是地理位置數據。根據GPS,我的位置是 4042.6142,N (北緯40度,北42.6142分鐘)和 07400.4168,W 。 (西經74度,西數0.4168,十進制分鐘)要在Google地圖中查看此位置,請在Google地圖搜索框中輸入 +40 42.6142’,-74 00.4168‘。不幸的是,gmaps要求您使用+/-而不是NSWE表示法。 N和E為正,S和W為負。
人們經常會感到困惑因為GPS正常工作,但“距5英里遠”-這是因為GPS不能正確解析經緯度數據。盡管有外觀,但是地理位置數據并非以十進制度為單位。格式為度和分鐘,格式如下:緯度:DDMM.MMMM(前兩個字符為度。)經度:DDDMM.MMMM(前三個字符為度。)
下一個數據是地面速度(以節為單位)。我們要 2.03 結
在此之后是跟蹤角度,這意味著根據過去的行程來近似我們要駛向的“羅盤”方向
此后的一個是 160412 ,它是當前日期(2012年4月16日)。
最后是 * XX 用作數據傳輸校驗和的數據
使用GPS模塊獲得修復后,請使用Google地圖(或某些其他地圖軟件)驗證您的位置。請記住,GPS通常只能精確到5-10米,如果您在室內或被高大的建筑物包圍著,則更糟。
中斷Arduino接線
一旦您通過直接接線對GPS模塊進行了測試,我們就可以將其接線到微控制器上。我們將使用Arduino,但您可以將我們的代碼改編為能夠以9600波特接收TTL串行的任何其他微控制器。
將 VIN 連接到+ 5V, GND 接地, RX 至數字2, TX 至數字3。
下一步,下載Adafruit GPS庫。該庫完成了從GPS模塊接收數據所需的許多“繁重工作”,例如在后臺中斷中讀取流數據并自動對其進行魔術解析。要下載它,請訪問GitHub存儲庫,或單擊下面的
從github下載Adafruit GPS庫
重命名未壓縮的文件夾 Adafruit_GPS 。檢查 Adafruit_GPS 文件夾是否包含 Adafruit_GPS.cpp 和 Adafruit_GPS.h
移動 Adafruit_GPS 到您的Arduino/Libraries文件夾,然后重新啟動Arduino IDE。庫安裝是一個經常遇到的障礙……如果您需要幫助,我們的《關于Arduino的所有圖書館指南》將其詳細說明!
萊昂納多和Micro用戶:我們在Adafruit_GPS庫中有特殊的示例草圖,可與Micro/Leo配合使用!
打開文件→示例→Adafruit_GPS→echo 草圖并將其上傳到Arduino。然后打開串行監視器。該草圖僅從軟件串行端口(引腳2和3)讀取數據,并將其輸出到連接到USB的硬件串行端口。
打開Arduino IDE串行控制臺,并確保將串行波特率設置為 115200
您可以在 setup()過程中通過注釋/取消注釋行來配置所看到的GPS輸出。例如,我們可以要求GPS發送不同的句子,并更改其發送數據的頻率。最大速度為10 Hz(每秒10次),并且是大量數據。您可能無法以該速度輸出“所有數據”,因為9600波特率不夠快。
下載:文件
復制代碼
// You can adjust which sentences to have the module emit, below
// uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
// uncomment this line to turn on only the “minimum recommended” data for high update rates!
//GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
// uncomment this line to turn on all the available data - for 9600 baud you’ll want 1 Hz rate
//GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_ALLDATA);
// Set the update rate
// 1 Hz update rate
//GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
// 5 Hz update rate- for 9600 baud you‘ll have to set the output to RMC or RMCGGA only (see above)
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_5HZ);
// 10 Hz update rate - for 9600 baud you’ll have to set the output to RMC only (see above)
//GPS.sendCommand(PMTK_SET_NMEA_UPDATE_10HZ); // You can adjust which sentences to have the module emit, below
// uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
// uncomment this line to turn on only the “minimum recommended” data for high update rates!
//GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
// uncomment this line to turn on all the available data - for 9600 baud you‘ll want 1 Hz rate
//GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_ALLDATA);
// Set the update rate
// 1 Hz update rate
//GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
// 5 Hz update rate- for 9600 baud you’ll have to set the output to RMC or RMCGGA only (see above)
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_5HZ);
// 10 Hz update rate - for 9600 baud you‘ll have to set the output to RMC only (see above)
//GPS.sendCommand(PMTK_SET_NMEA_UPDATE_10HZ);
通常,我們發現僅大多數項目需要RMC和GGA NMEA,因此除非您需要了解衛星位置,否則您不需要ALLDATA。
突破性的Arduino解析
由于所有GPS的輸出NMEA語句(通常對于我們的項目,我們都需要從中提取實際數據),因此在使用Adafruit GPS庫。通過使庫在后臺中斷中讀取,存儲和解析數據,可以輕松地查詢庫并獲取最新的更新信息,而無需進行任何麻煩的解析工作。
打開文件→示例→Adafruit_GPS→解析草圖并將其上傳到Arduino。然后打開串行監視器。
在此草圖中,我們在主循環中不斷調用 GPS.read()(如果可以的話,請使其在中斷中運行一毫秒)。然后在主循環中,我們可以通過調用 GPS.newNMEAreceived()來詢問是否已接收到新的數據塊,如果返回的結果是 true ,那么我們可以要求圖書館使用 GPS.parse(GPS.lastNMEA())解析數據。
我們確實必須在主循環中保持查詢和解析-不可能在中斷,因為那樣的話我們會意外丟失GPS數據。
一旦解析了數據,我們就可以從庫中獲取數據,例如 GPS.day , GPS .month 和 GPS.year 作為當前日期。 GPS.fix 如果有修復,將為1,如果沒有,則為0。如果我們有解決辦法,那么我們可以要求 GPS。緯度, GPS。經度, GPS。速度(以節為單位,而不是mph或k/hr!), GPS.angle , GPS.altitude (以厘米為單位)和 GPS.satellites (衛星數)
這應該使基于位置的項目更加容易。我們建議將更新速率保持在1Hz,并要求GPS僅輸出RMC和GGA,因為解析器始終無法跟蹤其他數據。
CircuitPython和Python設置
除Arduino外,您還可以輕松地將GPS模塊與Python或CircuitPython代碼一起使用。 Python代碼非常適合解析和處理從GPS模塊輸出的文本,此Adafruit CircuitPython GPS模塊可以為您處理大部分工作!
CircuitPython微控制器接線
首先請確保將GPS模塊連接到CircuitPython板,以便使用硬件UART引腳。這是Metro M0 Express的示例:
table》
Python計算機接線
由于您可以使用數十種Linux計算機/板,因此我們將顯示Raspberry Pi的接線。對于其他平臺,請訪問Linux上的CircuitPython指南,以了解您的平臺是否受支持。
這里有兩個選項:外部USB到串行轉換器,或Pi的TX/RX引腳上的內置UART。下面是連接USB到串行轉換器的示例:
板5V 或 3.3V 到 GPS模塊VIN 。
板GND 到 GPS模塊GND 。
板串行TX 到 GPS模塊RX 。
板載串行RX 到 GPS模塊TX 。
GPS Vin 至 USB 5V 或 3V 》(USB控制臺電纜上的紅色電線)
GPS地面到 USB接地(黑線)
GPS RX 到 USB TX (綠線)
GPS TX 到 USB RX (白線)
如果是Raspberry Pi以外的單板計算機,則串行端口可能已綁定到控制臺,或者對用戶不可用。請參閱主板文檔以了解如何使用串行端口
您也可以跳過USB控制臺電纜,只需將Micro B電纜直接從計算機插入最終GPS USB
下面是使用Pi內置UART的示例:
GPS Vin 至 3。 3V (紅線)
GPS接地到地面(黑線)
GPS RX 至 TX (綠線)
GPS TX 至 RX (白線)
如果要使用內置UART,則需要禁用串行控制臺,并在 raspi-config 中啟用串行端口硬件。有關如何執行此操作的詳細說明,請參見《 Raspberry Pi上的CircuitPython指南》的“ UART/串行”部分。
CircuitPython安裝GPS庫
接下來,您需要在CircuitPython板上安裝Adafruit CircuitPython GPS庫。請記住,該模塊用于Adafruit CircuitPython固件,而不是用于MicroPython.org固件!
首先,請確保您的電路板正在運行最新版本的Adafruit CircuitPython。
下一步,需要安裝必要的庫才能使用硬件。仔細按照以下步驟從Adafruit的CircuitPython庫捆綁包中查找和安裝這些庫。例如,Circuit Playground Express指南上有一個很棒的頁面,介紹了如何為Express和非Express板安裝庫包。
請記住Trinket M0,Gemma M0和Trinket M0等非Express板。 Feather/Metro M0 basic,您需要從捆綁包中手動安裝必要的庫:
adafruit_gps.mpy
您還可以從Adafruit CircuitPython GPS版本頁面下載 adafruit_gps.mpy 文件。
在繼續之前,請確保您開發板的 lib 文件夾中的 adafruit_gps.mpy 文件復制過來。
GPS庫的Python安裝
您需要安裝 Adafruit_Blinka 庫,該庫在Python中提供了CircuitPython支持。這可能需要驗證您正在運行Python3。由于每個平臺都有一些不同,并且Linux經常更改,請訪問Linux上的CircuitPython指南以使您的計算機準備就緒!
完成后,從命令行運行以下命令:
下載:文件
復制代碼
sudo pip3 install adafruit-circuitpython-gps sudo pip3 install adafruit-circuitpython-gps
CircuitPython和Python UART的用法
為演示在使用UART的CircuitPython中GPS模塊的用法,我們來看一個完整的程序示例 gps_simpletest.py 文件中的示例。
CircuitPython微控制器
使用CircuitPython微控制器,將該文件另存為 code.py 在您的板上,然后打開串行控制臺以查看其輸出。
具有Python的Linux/Computer/Raspberry Pi
如果您在Raspberry Pi(或任何計算機)上運行gps_simpletest.py,則必須進行一些更改。
在Raspberry Pi上,注釋掉uart = busio(。..)行,并取消注釋import serial和uart = serial.Serial(。..)行,將/dev/ttyUSB0更改為適當的序列號港口。現在,您可以使用以下命令運行該程序:
下載:文件
復制代碼
python3 gps_simpletest.py python3 gps_simpletest.py
示例解析代碼
下載:Project Zip 或 gps_simpletest.py | 在Github上查看
復制代碼
# Simple GPS module demonstration.
# Will wait for a fix and print a message every second with the current location
# and other details.
import time
import board
import busio
import adafruit_gps
# Create a serial connection for the GPS connection using default speed and
# a slightly higher timeout (GPS modules typically update once a second)。
# These are the defaults you should use for the GPS FeatherWing.
# For other boards set RX = GPS module TX, and TX = GPS module RX pins.
uart = busio.UART(board.TX, board.RX, baudrate=9600, timeout=10)
# for a computer, use the pyserial library for uart access
#import serial
#uart = serial.Serial(“/dev/ttyUSB0”, baudrate=9600, timeout=10)
# If using I2C, we’ll create an I2C interface to talk to using default pins
#i2c = busio.I2C(board.SCL, board.SDA)
# Create a GPS module instance.
gps = adafruit_gps.GPS(uart, debug=False) # Use UART/pyserial
#gps = adafruit_gps.GPS_GtopI2C(i2c, debug=False) # Use I2C interface
# Initialize the GPS module by changing what data it sends and at what rate.
# These are NMEA extensions for PMTK_314_SET_NMEA_OUTPUT and
# PMTK_220_SET_NMEA_UPDATERATE but you can send anything from here to adjust
# the GPS module behavior:
# https://cdn-shop.adafruit.com/datasheets/PMTK_A11.pdf
# Turn on the basic GGA and RMC info (what you typically want)
gps.send_command(b‘PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’)
# Turn on just minimum info (RMC only, location):
#gps.send_command(b‘PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’)
# Turn off everything:
#gps.send_command(b‘PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’)
# Tuen on everything (not all of it is parsed!)
#gps.send_command(b‘PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0’)
# Set update rate to once a second (1hz) which is what you typically want.
gps.send_command(b‘PMTK220,1000’)
# Or decrease to once every two seconds by doubling the millisecond value.
# Be sure to also increase your UART timeout above!
#gps.send_command(b‘PMTK220,2000’)
# You can also speed up the rate, but don‘t go too fast or else you can lose
# data during parsing. This would be twice a second (2hz, 500ms delay):
#gps.send_command(b’PMTK220,500‘)
# Main loop runs forever printing the location, etc. every second.
last_print = time.monotonic()
while True:
# Make sure to call gps.update() every loop iteration and at least twice
# as fast as data comes from the GPS unit (usually every second)。
# This returns a bool that’s true if it parsed new data (you can ignore it
# though if you don‘t care and instead look at the has_fix property)。
gps.update()
# Every second print out current location details if there’s a fix.
current = time.monotonic()
if current - last_print 》= 1.0:
last_print = current
if not gps.has_fix:
# Try again if we don‘t have a fix yet.
print(’Waiting for fix.。.‘)
continue
# We have a fix! (gps.has_fix is true)
# Print out details about the fix like location, date, etc.
print(’=‘ * 40) # Print a separator line.
print(’Fix timestamp: {}/{}/{} {:02}:{:02}:{:02}‘.format(
gps.timestamp_utc.tm_mon, # Grab parts of the time from the
gps.timestamp_utc.tm_mday, # struct_time object that holds
gps.timestamp_utc.tm_year, # the fix time. Note you might
gps.timestamp_utc.tm_hour, # not get all data like year, day,
gps.timestamp_utc.tm_min, # month!
gps.timestamp_utc.tm_sec))
print(’Latitude: {0:.6f} degrees‘.format(gps.latitude))
print(’Longitude: {0:.6f} degrees‘.format(gps.longitude))
print(’Fix quality: {}‘.format(gps.fix_quality))
# Some attributes beyond latitude, longitude and timestamp are optional
# and might not be present. Check if they’re None before trying to use!
if gps.satellites is not None:
print(‘# satellites: {}’.format(gps.satellites))
if gps.altitude_m is not None:
print(‘Altitude: {} meters’.format(gps.altitude_m))
if gps.speed_knots is not None:
print(‘Speed: {} knots’.format(gps.speed_knots))
if gps.track_angle_deg is not None:
print(‘Track angle: {} degrees’.format(gps.track_angle_deg))
if gps.horizontal_dilution is not None:
print(‘Horizontal dilution: {}’.format(gps.horizontal_dilution))
if gps.height_geoid is not None:
print(‘Height geo ID: {} meters’.format(gps.height_geoid))
# Simple GPS module demonstration.
# Will wait for a fix and print a message every second with the current location
# and other details.
import time
import board
import busio
import adafruit_gps
# Create a serial connection for the GPS connection using default speed and
# a slightly higher timeout (GPS modules typically update once a second)。
# These are the defaults you should use for the GPS FeatherWing.
# For other boards set RX = GPS module TX, and TX = GPS module RX pins.
uart = busio.UART(board.TX, board.RX, baudrate=9600, timeout=10)
# for a computer, use the pyserial library for uart access
#import serial
#uart = serial.Serial(“/dev/ttyUSB0”, baudrate=9600, timeout=10)
# If using I2C, we‘ll create an I2C interface to talk to using default pins
#i2c = busio.I2C(board.SCL, board.SDA)
# Create a GPS module instance.
gps = adafruit_gps.GPS(uart, debug=False) # Use UART/pyserial
#gps = adafruit_gps.GPS_GtopI2C(i2c, debug=False) # Use I2C interface
# Initialize the GPS module by changing what data it sends and at what rate.
# These are NMEA extensions for PMTK_314_SET_NMEA_OUTPUT and
# PMTK_220_SET_NMEA_UPDATERATE but you can send anything from here to adjust
# the GPS module behavior:
# https://cdn-shop.adafruit.com/datasheets/PMTK_A11.pdf
# Turn on the basic GGA and RMC info (what you typically want)
gps.send_command(b’PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‘)
# Turn on just minimum info (RMC only, location):
#gps.send_command(b’PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‘)
# Turn off everything:
#gps.send_command(b’PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‘)
# Tuen on everything (not all of it is parsed!)
#gps.send_command(b’PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0‘)
# Set update rate to once a second (1hz) which is what you typically want.
gps.send_command(b’PMTK220,1000‘)
# Or decrease to once every two seconds by doubling the millisecond value.
# Be sure to also increase your UART timeout above!
#gps.send_command(b’PMTK220,2000‘)
# You can also speed up the rate, but don’t go too fast or else you can lose
# data during parsing. This would be twice a second (2hz, 500ms delay):
#gps.send_command(b‘PMTK220,500’)
# Main loop runs forever printing the location, etc. every second.
last_print = time.monotonic()
while True:
# Make sure to call gps.update() every loop iteration and at least twice
# as fast as data comes from the GPS unit (usually every second)。
# This returns a bool that‘s true if it parsed new data (you can ignore it
# though if you don’t care and instead look at the has_fix property)。
gps.update()
# Every second print out current location details if there‘s a fix.
current = time.monotonic()
if current - last_print 》= 1.0:
last_print = current
if not gps.has_fix:
# Try again if we don’t have a fix yet.
print(‘Waiting for fix.。.’)
continue
# We have a fix! (gps.has_fix is true)
# Print out details about the fix like location, date, etc.
print(‘=’ * 40) # Print a separator line.
print(‘Fix timestamp: {}/{}/{} {:02}:{:02}:{:02}’.format(
gps.timestamp_utc.tm_mon, # Grab parts of the time from the
gps.timestamp_utc.tm_mday, # struct_time object that holds
gps.timestamp_utc.tm_year, # the fix time. Note you might
gps.timestamp_utc.tm_hour, # not get all data like year, day,
gps.timestamp_utc.tm_min, # month!
gps.timestamp_utc.tm_sec))
print(‘Latitude: {0:.6f} degrees’.format(gps.latitude))
print(‘Longitude: {0:.6f} degrees’.format(gps.longitude))
print(‘Fix quality: {}’.format(gps.fix_quality))
# Some attributes beyond latitude, longitude and timestamp are optional
# and might not be present. Check if they‘re None before trying to use!
if gps.satellites is not None:
print(’# satellites: {}‘.format(gps.satellites))
if gps.altitude_m is not None:
print(’Altitude: {} meters‘.format(gps.altitude_m))
if gps.speed_knots is not None:
print(’Speed: {} knots‘.format(gps.speed_knots))
if gps.track_angle_deg is not None:
print(’Track angle: {} degrees‘.format(gps.track_angle_deg))
if gps.horizontal_dilution is not None:
print(’Horizontal dilution: {}‘.format(gps.horizontal_dilution))
if gps.height_geoid is not None:
print(’Height geo ID: {} meters‘.format(gps.height_geoid))
在代碼運行時,它將每秒打印一條消息,或者更新它仍在等待GPS修復:
注意:由于與內置天線相比,PA1010D微型GPS模塊可能需要比其他帶有永恒天線的GPS模塊更通暢的天空視野。對于任何GPS模塊,如果您在獲取修復程序時遇到問題,請嘗試將其移動到更理想的位置。
一旦建立了修復程序,它將打印有關當前位置和其他GPS數據的詳細信息:
讓我們更詳細地看一下代碼,以了解其工作原理。首先,該示例需要導入一些模塊,例如用于訪問串行端口和其他硬件的內置busio和board模塊:
下載:文件
復制代碼
import board
import busio
import time import board
import busio
import time
接下來導入GPS模塊:
下載:文件
復制代碼
import adafruit_gps import adafruit_gps
現在已創建了串行UART,并將其連接到GPS模塊將使用的串行端口引腳,這是用于與GPS模塊通信:
下載:文件
復制代碼
# Define RX and TX pins for the board’s serial port connected to the GPS.
# These are the defaults you should use for the GPS FeatherWing.
# For other boards set RX = GPS module TX, and TX = GPS module RX pins.
RX = board.RX
TX = board.TX
# Create a serial connection for the GPS connection using default speed and
# a slightly higher timeout (GPS modules typically update once a second)。
uart = busio.UART(TX, RX, baudrate=9600, timeout=3000)
# for a computer, use the pyserial library for uart access
#import serial
#uart = serial.Serial(“/dev/ttyUSB0”, baudrate=9600, timeout=3000) # Define RX and TX pins for the board‘s serial port connected to the GPS.
# These are the defaults you should use for the GPS FeatherWing.
# For other boards set RX = GPS module TX, and TX = GPS module RX pins.
RX = board.RX
TX = board.TX
# Create a serial connection for the GPS connection using default speed and
# a slightly higher timeout (GPS modules typically update once a second)。
uart = busio.UART(TX, RX, baudrate=9600, timeout=3000)
# for a computer, use the pyserial library for uart access
#import serial
#uart = serial.Serial(“/dev/ttyUSB0”, baudrate=9600, timeout=3000)
一旦連接的GPS模塊可以使用UART對象,您就可以創建GPS解析類的實例。您需要將此類傳遞給UART實例,它將從內部從與其連接的GPS模塊讀取新數據:
下載:文件
復制代碼
gps = adafruit_gps.GPS(uart) gps = adafruit_gps.GPS(uart)
GPS示例代碼已解釋
在讀取GPS數據之前,該示例通過發送一些自定義的NMEA GPS命令來配置模塊數據量和速率。閱讀評論以查看一些用于調整數據速率和數據量的選項,但是通常您希望默認使用每秒一次的核心位置信息默認值:
下載:文件
復制代碼
# Initialize the GPS module by changing what data it sends and at what rate.
# These are NMEA extensions for PMTK_314_SET_NMEA_OUTPUT and
# PMTK_220_SET_NMEA_UPDATERATE but you can send anything from here to adjust
# the GPS module behavior:
# https://cdn-shop.adafruit.com/datasheets/PMTK_A11.pdf
# Turn on the basic GGA and RMC info (what you typically want)
gps.send_command(b’PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‘)
# Turn on just minimum info (RMC only, location):
#gps.send_command(b’PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‘)
# Turn off everything:
#gps.send_command(b’PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‘)
# Tuen on everything (not all of it is parsed!)
#gps.send_command(b’PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0‘)
# Set update rate to once a second (1hz) which is what you typically want.
gps.send_command(b’PMTK220,1000‘)
# Or decrease to once every two seconds by doubling the millisecond value.
# Be sure to also increase your UART timeout above!
#gps.send_command(b’PMTK220,2000‘)
# You can also speed up the rate, but don’t go too fast or else you can lose
# data during parsing. This would be twice a second (2hz, 500ms delay):
#gps.send_command(b‘PMTK220,500’) # Initialize the GPS module by changing what data it sends and at what rate.
# These are NMEA extensions for PMTK_314_SET_NMEA_OUTPUT and
# PMTK_220_SET_NMEA_UPDATERATE but you can send anything from here to adjust
# the GPS module behavior:
# https://cdn-shop.adafruit.com/datasheets/PMTK_A11.pdf
# Turn on the basic GGA and RMC info (what you typically want)
gps.send_command(b‘PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’)
# Turn on just minimum info (RMC only, location):
#gps.send_command(b‘PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’)
# Turn off everything:
#gps.send_command(b‘PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’)
# Tuen on everything (not all of it is parsed!)
#gps.send_command(b‘PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0’)
# Set update rate to once a second (1hz) which is what you typically want.
gps.send_command(b‘PMTK220,1000’)
# Or decrease to once every two seconds by doubling the millisecond value.
# Be sure to also increase your UART timeout above!
#gps.send_command(b‘PMTK220,2000’)
# You can also speed up the rate, but don‘t go too fast or else you can lose
# data during parsing. This would be twice a second (2hz, 500ms delay):
#gps.send_command(b’PMTK220,500‘)
如果需要,可以使用上面顯示的send_command功能將其他自定義命令發送到GPS模塊。您也不必擔心在命令中添加NMEA校驗和,該函數將自動執行此操作(或者不自動將add_checksum=False設置為參數,并跳過校驗和的添加)。
《現在,我們可以進入一個主循環,該循環不斷更新來自GPS模塊的數據并打印出狀態。此循環最重要的部分是調用GPS更新功能:
下載:文件
復制代碼
# Make sure to call gps.update() every loop iteration and at least twice
# as fast as data comes from the GPS unit (usually every second)。
# This returns a bool that’s true if it parsed new data (you can ignore it
# though if you don‘t care and instead look at the has_fix property)。
gps.update() # Make sure to call gps.update() every loop iteration and at least twice
# as fast as data comes from the GPS unit (usually every second)。
# This returns a bool that’s true if it parsed new data (you can ignore it
# though if you don‘t care and instead look at the has_fix property)。
gps.update()
就像注釋中提到的那樣,您必須在每次循環迭代中調用update,理想情況下必須多次調用次。每次調用update時,它都會允許GPS庫代碼從GPS模塊讀取新數據并更新其狀態。由于GPS模塊始終在發送數據,因此您必須注意不斷讀取數據,否則可能會由于緩沖區已滿而丟失數據。
您可以檢查has_fix屬性,看看是否該模塊具有GPS定位功能,如果有,則可以讀取許多屬性,如latitude和longitude(以度為單位):
下載:文件
復制代碼
if not gps.has_fix:
# Try again if we don’t have a fix yet.
print(‘Waiting for fix.。.’)
continue
# We have a fix! (gps.has_fix is true)
# Print out details about the fix like location, date, etc.
print(‘=’ * 40) # Print a separator line.
print(‘Fix timestamp: {}/{}/{} {:02}:{:02}:{:02}’.format(
gps.timestamp_utc.tm_mon, # Grab parts of the time from the
gps.timestamp_utc.tm_mday, # struct_time object that holds
gps.timestamp_utc.tm_year, # the fix time. Note you might
gps.timestamp_utc.tm_hour, # not get all data like year, day,
gps.timestamp_utc.tm_min, # month!
gps.timestamp_utc.tm_sec))
print(‘Latitude: {} degrees’.format(gps.latitude))
print(‘Longitude: {} degrees’.format(gps.longitude))
print(‘Fix quality: {}’.format(gps.fix_quality))
# Some attributes beyond latitude, longitude and timestamp are optional
# and might not be present. Check if they‘re None before trying to use!
if gps.satellites is not None:
print(’# satellites: {}‘.format(gps.satellites))
if gps.altitude_m is not None:
print(’Altitude: {} meters‘.format(gps.altitude_m))
if gps.track_angle_deg is not None:
print(’Speed: {} knots‘.format(gps.speed_knots))
if gps.track_angle_deg is not None:
print(’Track angle: {} degrees‘.format(gps.track_angle_deg))
if gps.horizontal_dilution is not None:
print(’Horizontal dilution: {}‘.format(gps.horizontal_dilution))
if gps.height_geoid is not None: if not gps.has_fix:
# Try again if we don’t have a fix yet.
print(‘Waiting for fix.。.’)
continue
# We have a fix! (gps.has_fix is true)
# Print out details about the fix like location, date, etc.
print(‘=’ * 40) # Print a separator line.
print(‘Fix timestamp: {}/{}/{} {:02}:{:02}:{:02}’.format(
gps.timestamp_utc.tm_mon, # Grab parts of the time from the
gps.timestamp_utc.tm_mday, # struct_time object that holds
gps.timestamp_utc.tm_year, # the fix time. Note you might
gps.timestamp_utc.tm_hour, # not get all data like year, day,
gps.timestamp_utc.tm_min, # month!
gps.timestamp_utc.tm_sec))
print(‘Latitude: {} degrees’.format(gps.latitude))
print(‘Longitude: {} degrees’.format(gps.longitude))
print(‘Fix quality: {}’.format(gps.fix_quality))
# Some attributes beyond latitude, longitude and timestamp are optional
# and might not be present. Check if they‘re None before trying to use!
if gps.satellites is not None:
print(’# satellites: {}‘.format(gps.satellites))
if gps.altitude_m is not None:
print(’Altitude: {} meters‘.format(gps.altitude_m))
if gps.track_angle_deg is not None:
print(’Speed: {} knots‘.format(gps.speed_knots))
if gps.track_angle_deg is not None:
print(’Track angle: {} degrees‘.format(gps.track_angle_deg))
if gps.horizontal_dilution is not None:
print(’Horizontal dilution: {}‘.format(gps.horizontal_dilution))
if gps.height_geoid is not None:
注意,在讀取之前,已將某些屬性(如altitude_m)檢查為None。這是插入代碼的明智選擇,因為有時GPS模塊不會發送這些屬性。如果模塊未發送屬性,則會為該屬性提供None/null值,并且在Python中嘗試打印或讀取該屬性將失敗。 latitude,longitude和timestamp的核心屬性通常總是可用的(如果您按原樣使用示例),但是如果您使用以下命令關閉了這些輸出,則它們可能不可用一個自定義的NMEA命令!
這是用CircuitPython代碼讀取GPS位置的全部內容!
CircuitPython數據記錄
數據記錄示例
GPS的另一個便捷任務是將GPS模塊的所有原始輸出記錄到文件中。如果要將GPS數據導入到可以處理原始NMEA句子的工具(如Google Earth)中,這將非常有用。您可以使用CircuitPython非常輕松地執行此數據記錄。
要存儲數據,您需要選擇以下兩個選項之一:
將SD卡固定器連接到主板的SPI總線,或者使用內置SD卡座的板,例如Feather M0 Adalogger。推薦的方法,因為它為您提供了很多存儲數據的空間,并且您可以輕松地將數據復制到
將數據存儲在電路板的內部文件系統中。這需要更多的設置,但是允許您保存到CircuitPython板的內部文件系統上的文件中,緊挨代碼和其他數據文件的駐留位置。這是較為有限的,因為根據您的主板,您可能只有幾個千字節或幾兆字節的可用空間,并且GPS句子將迅速累加(在記錄幾個小時內輕松填充幾兆字節)。
安裝SD卡庫
如果要在SD卡上存儲數據,您必須確保SD卡已連接至開發板上,并且已安裝Adafruit SD卡庫。幸運的是,有完整的指南可供您學習,以了解連接SD卡和安裝必要的庫的過程。請務必仔細按照指南進行操作,以使卡已連接并已安裝了磁帶庫,并且可以確認能夠從Python提示符下手動將數據寫入卡。
啟用內部文件系統寫入
如果要在內部文件系統上存儲數據,則必須仔細按照CPU溫度記錄指南中的步驟進行操作,以允許寫入內部存儲。如果要寫入SD卡,請跳過這些步驟,然后繼續查看下面的數據記錄代碼。 在板上編輯 boot.py (如果不存在則創建它)并添加以下行:
下載:文件
復制代碼
import digitalio
import board
import storage
switch = digitalio.DigitalInOut(board.D5)
switch.direction = digitalio.Direction.INPUT
switch.pull = digitalio.Pull.UP
# If the D5 is connected to ground with a wire
# you can edit files over the USB drive again.
storage.remount(“/”, not switch.value) import digitalio
import board
import storage
switch = digitalio.DigitalInOut(board.D5)
switch.direction = digitalio.Direction.INPUT
switch.pull = digitalio.Pull.UP
# If the D5 is connected to ground with a wire
# you can edit files over the USB drive again.
storage.remount(“/”, not switch.value)
記住,一旦重新掛載(“/”),您將無法再通過USB驅動器編輯代碼!這意味著您無法編輯 boot.py ,這有點難題。因此,我們將 boot.py 配置為基于開關或什至只是鱷魚夾接地而選擇性地將內部文件系統安裝為可寫狀態。就像CPU溫度指南顯示的一樣。在此示例中,我們使用 D5 ,但選擇任何可用的引腳。
此代碼將在電路板啟動時以及是否將其接地時查看D5數字輸入。鱷魚夾或電線,例如,將其從D5連接到電路板接地),它將禁用內部文件系統寫操作,并允許您照常通過USB驅動器編輯代碼。卸下鱷魚夾,重置板,然后 boot.py 會切換為以可寫方式安裝內部文件系統,以便您可以再次將映像記錄到該文件系統(但不要編寫任何代碼!)。
請記住,當您啟用USB驅動器寫入(通過在啟動時將D5接地)時,您無法將文件寫入內部文件系統以及您的 main.py 中的任何代碼嘗試這樣做(如下面的示例)將失敗。編輯代碼時請記住這一點-修改代碼后,您需要刪除鱷魚夾,將板重置為重新啟用內部文件系統寫操作,然后查看程序的輸出。
如果遇到困難,可以按照https://learn.adafruit.com/cpu-temperature-如果需要返回并編輯代碼,請使用電路日志記錄python/write-to-the-filesystem從REPL中刪除boot.py!
數據記錄示例代碼
GPS庫示例具有數據記錄。 py 文件,您可以將其編輯并另存為 main.py 在板上:
下載:Project Zip 或 gps_computer_datalogging.py | 在Github上查看
復制代碼
Temporarily unable to load content:
Temporarily unable to load content:
默認情況下,此示例希望將GPS NMEA句子記錄到內部存儲系統上的文件中,該文件位于/gps.txt 。每次示例開始運行時,新句子都會添加到文件末尾。
如果您想改為寫入SD卡,請注意不要注釋注釋中提到的相應行:
下載:文件
復制代碼
# Path to the file to log GPS data. By default this will be appended to
# which means new lines are added at the end and all old data is kept.
# Change this path to point at internal storage (like ’/gps.txt‘) or SD
# card mounted storage (’/sd/gps.txt‘) as desired.
#LOG_FILE = ’/gps.txt‘ # Example for writing to internal path /gps.txt
LOG_FILE = ’/sd/gps.txt‘ # Example for writing to SD card path /sd/gps.txt # Path to the file to log GPS data. By default this will be appended to
# which means new lines are added at the end and all old data is kept.
# Change this path to point at internal storage (like ’/gps.txt‘) or SD
# card mounted storage (’/sd/gps.txt‘) as desired.
#LOG_FILE = ’/gps.txt‘ # Example for writing to internal path /gps.txt
LOG_FILE = ’/sd/gps.txt‘ # Example for writing to SD card path /sd/gps.txt
以及下面的內容:
都應取消注釋,并與上面相同。這將配置代碼以將GPS NMEA數據寫入/sd/gps.txt 文件,并將新數據追加到文件末尾。
示例運行方式為板上的 main.py 打開串行REPL,您應該看到原始的NMEA語句已打印出來:
檢查 gps.txt 文件(位于根目錄下或/sd路徑,具體取決于您如何設置示例)在文本編輯器中,您將看到相同的原始NMEA語句:
太棒了!這就是使用GPS模塊和CircuitPython對NMEA句子進行基本數據記錄的全部內容!
內置日志記錄
MTK3339的優點之一是內置的數據記錄器。這種基本的數據記錄功能可以將日期,時間,緯度,經度和高度數據存儲到內部的64K閃存芯片中。它不是高分辨率記錄器-修復后僅每15秒記錄一次-但對于99%的想要跟蹤位置的項目,這可能是一種低功耗的數據記錄方式-無需SD卡或其他EEPROM需要!它最多可以存儲16個小時的數據。
GPS模塊確實要求微控制器通過請求啟動記錄儀來“啟動”記錄儀。如果斷電,則需要重新啟動。如果閃存中已經有一些數據,則將創建新的跟蹤(這樣就不會丟失舊數據),如果空間用完了,它只會停止并且不會覆蓋舊數據。盡管有這種煩惱,但它仍然是一個非常不錯的附加功能,我們提供了一些庫支持來幫助您使用它。
有關更多詳細信息,請查閱LOCUS(內置數據記錄系統)用戶指南
首先,我們應該嘗試運行記錄器。打開文件→示例→Adafruit_GPS→locus_start 草圖。這將演示如何啟動記錄器(稱為LOCUS)
關鍵部分在這里:
下載:文件
復制代碼
Serial.print(“STARTING LOGGING.。..”);
if (GPS.LOCUS_StartLogger())
Serial.println(“ STARTED!”);
else
Serial.println(“ no response :(”);
delay(1000); Serial.print(“STARTING LOGGING.。..”);
if (GPS.LOCUS_StartLogger())
Serial.println(“ STARTED!”);
else
Serial.println(“ no response :(”);
delay(1000);
,您應該啟動記錄儀,然后檢查響應:
記錄狀態
GPS可以記錄日志,您可以加載狀態草圖,這還將為您提供更多數據。上載文件→示例→Adafruit_GPS→locus_status
此輸出為您提供了更多信息。第一個條目是日志號。這是內存中有多少日志跟蹤。每次啟動并保存數據時,都會創建一個新日志。完全停止意味著記錄器一旦內存用完,它將停止。接下來的輸出表明我們僅在修復數據期間并以設置的間隔進行記錄,間隔延遲為15秒。我們不是根據距離或速度進行記錄。當前狀態為LOGGING(活動),還有我們存儲的記錄數。每條記錄都是帶有時間戳的位置。我們每15秒記錄一次,您可以在此處看到記錄從344增加到345的過程。最后,我們可以看到內部閃存的使用量,目前只有4%
在實際使用中,您可能希望開始記錄,然后讓微控制器進入睡眠狀態保留電源,有時會醒來以檢查日志記錄狀態。
下載數據
最后,完成記錄后,我們需要提取數據。為此,我們需要首先從閃存中獲取原始數據,然后對語句進行解碼。將文件→示例→Adafruit_GPS→locus_dump 上傳到Arduino,并打開串行監視器
請注意:請具有2K RAM緩沖區的Arduino處理64KB FLASH數據并將其從GPS吐出有時會給處理器增加負擔。如果遇到打h,請查看下面的GPS工具說明
將所有文本復制并粘貼到“-”之后(以 $ PMTKLOX,0,86 * 67 開頭 $ PMTK001,622,3 * 36 ),然后將其粘貼到此頁面上的框中
或
,您可以嘗試使用該工具請捐贈給社區!
GPS工具
如果您在使用Arduino/javascript工具時遇到困難,也可以嘗試使用GPS工具。該工具僅在Windows下運行,但功能非常強大。
將GPS模塊連接到Arduino(與Direct Wiring示例連接),FTDI適配器或其他TTL轉換器,然后下載GPS工具-通過COM連接到GPS Arduino/FTDI/TTL電纜的端口。然后,您可以查詢,轉儲和刪除日志存儲器
資源
數據表
MTK3329/MTK3339命令集表,用于更改固定數據速率,波特率,句子輸出等!
PMTK“完整”數據表(與上面類似,但具有更多命令)
PA6B(MTK3329)GPS模塊本身的數據表
PA6C(MTK3339)GPS模塊本身的數據表
PA6H(MTK3339)GPS模塊本身的數據表
MT3339 GPS PC工具(僅限Windows)和PC工具手冊
LOCUS內置記錄器的示例代碼和規格表
LOCUS(內置內置數據記錄系統)用戶指南
迷你GPS工具(僅適用于Windows)
更多閱讀:
Trimble的GPS教程
Garmin的GPS教程
用于Arduino的Adafruit GPS庫
https://github.com/adafruit/Adafruit-GPS -Library/
用于AGPS的EPO文件
EPO文件的數據格式
MTK_EPO_Nov_12_2014.zip
常見問題解答
終極GPS可以用于高海拔嗎?我怎么知道?
2013年以上出廠的模塊(許多2012年下半年開始安裝)固件已通過40公里GPS工廠的仿真測試。
您可以通過發送固件查詢命令 $ PMTK605 * 31 來告訴您擁有什么固件(您可以使用echo演示將自定義語句發送到GPS)
如果您的模塊回復了 AXN_2.10_3339_2012072601 5223 ,這意味著您具有版本#5223,這是40Km支持的固件版本。如果數量大于5223,則其數量甚至更近,并且還應包括40Km支持
但是,這些模塊不是專門為高空氣球使用而設計的。人們已經成功使用了它們,但是由于我們(在Adafruit)尚未對它們進行高空使用的親自測試,因此我們不以任何方式保證它們適合高海拔使用。
請不要要求我們“證明”它們適合高海拔使用,我們沒有任何辦法
如果您想使用GPS測量高海拔,請找到可以保證/保證高空功能的模塊
終極GPS是否受2019周轉期問題影響?
終極GPS( 20110922_GTOP_EVK01_A2.10 和更高-在2011年以后出售的任何產品)都經過了測試,直到2019年都可以正常工作。
它們沒有通過2038過渡測試,因此您可能需要從現在到2038之間更新固件。這不會影響他的2019年展期(每20年有一次)
好,我想要最新的固件!
此處是5632固件的二進制文件,您可以使用此工具通過FTDI或USB-TTL電纜(或直接接線)上傳FTDI)。我們沒有更新固件的教程,如果您更新固件并以某種方式使GPS變磚,我們將不提供替代產品!在執行更新過程之前,請記住這一點!
我修改了示例代碼,但我的GPS NMEA句子都亂碼且不完整!
我們使用SoftwareSerial從GPS讀取數據,這是對“ bitbang” UART的支持。它在Arduino上不是很好,并且可以工作,但是添加太多的delay()且未足夠調用GPS數據解析器將導致其阻塞數據。
如果您使用的是Leonardo(或Micro/Flora/ATmega32u4)或Mega,請考慮使用HardwareSerial端口而不是SoftwareSerial!
我的GPS正在給我數據,但位置不正確!
由于GPS是工作正常,但“相距5英里”-這是因為它們沒有正確解析經緯度數據。盡管有外觀,但是地理位置數據并非以十進制度為單位。格式為度和分鐘,格式如下:緯度:DDMM.MMMM(前兩個字符為度。)經度:DDDMM.MMMM(前三個字符為度。)
為什么我無法使GPS以10Hz的頻率輸出?
GPS的默認波特率為9600-這只能以10Hz的頻率發送RMC消息。如果要輸出更多數據,可以提高GPS波特率(例如,達到57600)或采用2或5Hz的頻率。您希望GPS輸出更多數據,GPS波特率,Arduino緩沖區/處理能力和更新率之間存在權衡!
可能需要進行實驗才能獲得最佳結果。我們建議RMC僅在10Hz進行測試,因為它已經過測試。
為什么不能使用Adafruit RTC庫設置RTC?
GPS中的實時時鐘不可“寫入”,也無法從Arduino訪問。它僅在GPS中!一旦安裝了電池,并且GPS首次從衛星接收數據,它將設置內部RTC。然后,只要安裝了電池,就可以照常從GPS讀取時間。即使沒有適當的“ gps修復”,時間也將是正確的。
時區無法更改,因此您必須基于UTC計算本地時間!
所有GPS模塊是否同時發出PPS脈沖?
在理想條件下,GPS模塊在每個GPS秒開始的10ns內發出PPS信號。
實際上,每個GPS模塊與GPS時鐘系統的同步取決于修復的質量,GPS模塊修復了多長時間以及一組該模塊用于修復的衛星。我們已經觀察到剛剛獲得修復的模塊之間的偏移約為300ns,在模塊具有良好的修復后,偏移減少到不到100ns(模塊用于修復的衛星的信噪比高于20)持續十分鐘。
當兩個GPS模塊使用同一組衛星進行定位時,一旦模塊獲得定位,PPS脈沖之間的偏移就小于30ns。
如何讀取Ultimate GPS USB上的PPS信號?
PPS線連接到串行端口 RI (環形指示器)引腳。您可以使用串行端口接口代碼來閱讀。例如,這是使用pyserial的Python版本:
import serial
ser = serial.Serial(’/dev/ttyS34‘) # open serial port
print(ser.name) # check which port was really used
last_ri = ser.ri
while True:
if ser.ri != last_ri:
last_ri = ser.ri
if last_ri:
print(“ ---------- Pulse high ----------”)
else:
print(“ ---------- Pulse low ----------”)
if ser.in_waiting:
print(ser.read(ser.in_waiting).decode(’utf-8‘), end=“”)
下載
文件
MTK3329/MTK3339命令集表,用于更改固定數據速率,波特率,句子輸出等!
LOCUS(內置數據記錄系統)用戶指南
PA6B(MTK3329)GPS模塊本身的數據表-在該模塊的版本1中使用
PA6C(MTK3339)GPS模塊本身的數據表-在該模塊的版本2中使用
PA6H(MTK3339)GPS模塊本身的數據表-在該模塊的版本3中使用
MT3339 GPS PC工具(僅限Windows)和PC工具手冊
小型GPS工具(僅限Windows)
GitHub上的EagleCAD PCB文件
Adafruit Fritzing庫中的Fritzing對象
最終GPS v3原理圖
U精確的GPS加工打印
英寸尺寸
最終GPS USB原理圖
最終GPS USB構造打印
責任編輯:wv
-
gps
+關注
關注
22文章
2886瀏覽量
166055
發布評論請先 登錄
相關推薦
評論