知道一個特定物體/人的下落總是令人欣慰的。如今,GPS 已廣泛用于資產管理應用,如車輛跟蹤、車隊跟蹤、資產監控、人員跟蹤、寵物跟蹤器等。對于任何跟蹤設備,主要的設計考慮將是其電池預期和監控范圍。考慮到這兩者,LoRa似乎是完美的選擇,因為它具有非常低的功耗并且可以長距離運行。因此,在本教程中,我們將使用 LoRa 構建 GPS 跟蹤系統,該系統將包含一個發射器,該發射器將從NEO-6M GPS 模塊讀取位置信息并通過 Lora 無線傳輸。接收器部分將接收信息并將其顯示在16x2 LCD 顯示器上。
為了讓這個項目的事情變得簡單和具有成本效益,我們將不使用 LoRa 網關。而是在發送器和接收器之間執行點對點通信。但是,如果您想要一個全球范圍,您可以用 LoRa 網關替換接收器。此外,由于我來自印度,我們將使用433MHz LoRa 模塊,這是合法的 ISM 頻段,因此您可能需要根據您的國家/地區選擇模塊。
所需材料
Arduino Lora Shield – 2Nos(PCB 設計可供下載)
Arduino Uno – 2Nos
SX1278 433MHz LoRa 模塊 – 2
433MHz Lora 天線
NEO-6M GPS模塊
液晶顯示模塊
連接線
Arduino LoRa 盾牌
為了更輕松地使用 LoRa 進行構建,我們為此項目設計了一個 LoRa Arduino Shield。該屏蔽由 SX1278 433MHz 和一個使用 LM317 可變穩壓器設計的 3.3V 穩壓器組成。Shield 將直接位于 Arduino 之上,為其提供 LoRa 功能。當您必須部署 LoRa 傳感節點或創建 LoRa 網狀網絡時,此 LoRa Shield 將派上用場。LoRa Arduino Shield的完整電路圖如下所示
Shield 包含一個 12V 插孔,通電時將使用LM317 穩壓器為 LoRa 模塊調節 3.3V 。它還將用于通過 Vin 引腳為 Arduino UNO 供電,來自 Arduino 的穩壓 5V 用于為屏蔽板上的 LCD 供電。LM317 的輸出電壓分別使用電阻 R1 和 R2 固定為 3.3V,這些電阻的值可以使用LM317 計算器計算。
由于 LoRa 模塊功耗非常低,也可以直接從 Arduino 的 3.3V 引腳供電,但我們使用了外部穩壓器設計,因為 LM317 比板載穩壓器更可靠。屏蔽罩還有一個電位器,可用于調節 LCD 的亮度。LoRa 模塊與 Arduino 的連接類似于我們在之前的Arduino 與 Lora接口教程中所做的。
為 LoRa Shield 制造 PCB
現在我們的電路已經準備好了,我們可以繼續設計我們的 PCB。我用PCB設計軟??件打開并開始形成我的軌道。PCB設計完成后,我的電路板如下所示
組裝印刷電路板
我打開焊條并開始組裝電路板。由于腳印、焊盤、通孔和絲網印刷的形狀和尺寸都非常合適,因此我在組裝電路板時沒有問題。焊接完成后,電路板如下所示,您可以看到它非常適合我的 Arduino Uno 電路板。
由于我們的項目有一個Arduino LoRa 發射器和一個Arduino LoRa 接收器,我們需要兩個屏蔽,一個用于接收器,另一個用于發射器。所以我繼續焊接另一個PCB,帶有LoRa模塊和LCD的PCB如下所示。
如您所見,只有接收器 LoRa 屏蔽(左側)連接了 LCD,發射器側僅包含 LoRa 模塊。我們將進一步將 GPS 模塊連接到發射器端,如下所述。
將 GPS 模塊連接到 LoRa 發射器
這里使用的 GPS 模塊是 NEO-6M GPS 模塊,該模塊可以在非常低的功耗下運行,并且外形小巧,非常適合跟蹤應用。然而,我們之前在不同類型的車輛跟蹤和位置檢測應用中使用了許多其他可用的 GPS 模塊。
該模塊在 5V 下運行,并使用 9600 波特率的串行通信進行通信。因此,我們將模塊供電到 Arduino 的 +5V 引腳,并將 Rx 和 Tx 引腳分別連接到數字引腳 D4 和 D3,如下所示
引腳 D4 和 D3 將被配置為軟件串行引腳。一旦通電,NEO-6M GPS 模塊將尋找衛星連接并自動串行輸出所有信息。此輸出數據將采用NMEA 語句格式,代表國家海洋電子協會,是所有 GPS 設備的標準格式。要了解有關在 Arduino 中使用 GPS 的更多信息,請點擊鏈接。這些數據將很大,大多數時候我們必須手動對其進行短語化以獲得所需的結果。幸運的是,有一個名為 TinyGPS++ 的庫為我們完成了所有繁重的工作。如果您還沒有添加 LoRa 庫,您還必須添加它。所以讓我們從下面的鏈接下載兩個庫
下載 TinyGPS++ Arduino 庫
下載 Arduino LoRa 庫
該鏈接將下載一個 ZIP 文件,然后可以按照Sketch -》 Include Library -》 Add.ZIP library 命令將其添加到 Arduino IDE。一旦您準備好硬件和庫,我們就可以繼續對我們的 Arduino 板進行編程。
像往常一樣,我們通過添加所需的庫和引腳來開始程序。這里 SPI 和 LoRa 庫用于 LoRa 通信,而 TinyGPS++ 和 SoftwareSerial 庫用于 GPS 通信。我硬件中的 GPS 模塊連接到引腳 3 和 4,因此我們還定義如下
?
#include#include #include #include //選擇兩個Arduino引腳用于軟件串行 int RXPin = 3; int TXPin = 4;
?
在設置函數中,我們啟動串行監視器并將軟件串行初始化為“gpsSerial?”,以便與我們的 NEO-6M GPS 模塊通信。另請注意,我使用 433E6 (433 MHz) 作為 LoRa 工作頻率,您可能需要根據您使用的模塊類型進行更改。
?
無效設置(){ 序列.開始(9600); gpsSerial.begin(9600); 而(!串行); Serial.println("LoRa 發件人"); if (!LoRa.begin(433E6)) { Serial.println("啟動 LoRa 失敗!"); 而(1); } LoRa.setTxPower(20); }
?
在循環函數中,我們檢查 GPS 模塊是否正在輸出一些數據,如果是,那么我們讀取所有數據并使用 gps.encode 函數對其進行表述。然后我們使用gps.location.isValid()函數檢查我們是否收到了有效的位置數據。
?
while (gpsSerial.available() > 0) if (gps.encode(gpsSerial.read())) if (gps.location.isValid()) {
?
如果我們收到一個有效的位置,我們就可以開始傳輸緯度和經度值。函數gps.location.lat()給出緯度坐標,函數gps.location.lng()給出經度坐標。由于我們將在 16*2 LCD 上打印它們,因此我們必須提到何時將其拉到第二行,因此我們使用關鍵字“c”來提示接收器在第 2 行打印以下信息。
?
LoRa.beginPacket(); LoRa.print("緯度:"); LoRa.print(gps.location.lat(), 6); LoRa.print("c"); LoRa.print("長:"); LoRa.print(gps.location.lng(), 6); Serial.println("通過 LoRa 發送"); LoRa.endPacket();
?
將 Arduino LoRa 編程為 GPS 接收器
發射器代碼已經在發送緯度和經度坐標值,現在接收器必須讀取這些值并在 LCD 上打印。同樣,這里我們為 LoRa 模塊和 LCD 顯示器添加庫,并定義 LCD 連接到哪些引腳,并像以前一樣初始化 LoRa 模塊。
?
#include//SPI 庫 #include //LoRa 庫 #include //LCD 庫 常量 int rs = 8, en = 7, d4 = 6, d5 = 5, d6 = 4, d7 = 3; //記液晶連接的管腳號 LiquidCrystal lcd(rs, en, d4, d5, d6, d7);//初始化液晶方法 無效設置(){ 序列.開始(9600);//調試串口 lcd.begin(16, 2); //初始化 16*2 LCD lcd.print("Arduino LoRa"); //介紹消息行 1 lcd.setCursor(0, 1); lcd.print("接收者"); //介紹消息第 2 行 延遲(2000); if (!LoRa.begin(433E6)) { //在 433MHz 上運行 Serial.println("啟動 LoRa 失敗!"); lcd.print("LoRa 失敗"); 而(1); } }
?
在循環函數中,我們使用LoRa.parsePacket()函數監聽來自發送器 LoRa 模塊的數據包及其大小,并將其存儲在“?packetSize?”變量中。如果收到數據包,我們繼續將它們作為字符讀取并在 LCD 上打印。該程序還檢查 LoRa 模塊是否正在發送關鍵字“c”,如果是,則在第二行打印剩余信息。
?
if (packetSize) { // 如果收到數據包 Serial.print("Received packet '"); lcd.clear(); while (LoRa.available()) { char 傳入 = (char)LoRa.read(); if (incoming == 'c') { lcd.setCursor(0, 1); } 其他 { lcd.print(傳入); } }
?
Arduino LoRa GPS 追蹤器工作
硬件和程序準備好后,我們可以將代碼上傳到各自的 Arduino 模塊中,并使用 12V 適配器或 USB 電纜為它們供電。當發射器通電時,您會注意到 GPS 模塊上的藍色 LED 閃爍,這表明模塊正在尋找衛星連接以獲取坐標。同時接收模塊將開機并在液晶屏上顯示歡迎信息。發射器發送信息后,接收器模塊將在其 LCD 上顯示信息,如下所示
現在您可以使用發射器 GPS 模塊四處走動,您會注意到接收器正在更新其位置。要知道發射器模塊的確切位置,您可以讀取 LCD 上顯示的緯度和經度值并將其輸入谷歌地圖以獲取地圖上的位置,如下所示。
Lora 發件人代碼
#include
#include
#include
#include
// 選擇兩個 Arduino 引腳用于軟件串行
int RXPin = 3;
int TXPin = 4;
// 創建一個 TinyGPS++ 對象
TinyGPSPlus gps;
SoftwareSerial gpsSerial(RXPin, TXPin);
無效設置(){
序列.開始(9600);
gpsSerial.begin(9600);
而(!串行);
Serial.println("LoRa 發件人");
if (!LoRa.begin(433E6)) {
Serial.println("啟動 LoRa 失敗!");
而(1);
}
LoRa.setTxPower(20);
}
void loop() {
while (gpsSerial.available() > 0)
if (gps.encode(gpsSerial.read()))
if (gps.location.isValid())
{
Serial.println("發送到 LoRa");
LoRa.beginPacket();
LoRa.print("緯度:");
LoRa.print(gps.location.lat(), 6);
LoRa.print("c");
LoRa.print("長:");
LoRa.print(gps.location.lng(), 6);
Serial.println("通過 LoRa 發送");
LoRa.endPacket();
}
}
Lora 接收器代碼
/*程序通過 LoRa 接收溫度和濕度值并在 LCD 上打印
*日期:24-06-2019
*For:www.circuitdigest.com
*/
#include
#include
#include
常量 int rs = 8, en = 7, d4 = 6, d5 = 5, d6 = 4, d7 = 3; //記液晶連接的管腳號
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);//初始化液晶方法
無效設置(){
序列.開始(9600);//調試串口
lcd.begin(16, 2); //初始化 16*2 LCD
lcd.print("Arduino LoRa"); //介紹消息行 1
lcd.setCursor(0, 1);
lcd.print("接收者"); //介紹消息第 2 行
延遲(2000);
if (!LoRa.begin(433E6)) { //在 433MHz 上運行
Serial.println("啟動 LoRa 失敗!");
lcd.print("LoRa 失敗");
而(1);
}
}
無效循環(){
int packetSize = LoRa.parsePacket();
if (packetSize) { // 如果收到數據包
Serial.print("Received packet '");
lcd.clear();
while (LoRa.available()) {
char 傳入 = (char)LoRa.read();
if (incoming == 'c')
{
lcd.setCursor(0, 1);
}
其他
{
lcd.print(傳入);
}
}
}
}
評論
查看更多