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