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