如何使用LoRa构建GPS跟踪系统

安全设备/系统

153人已加入

描述

  知道一个特定物体/人的下落总是令人欣慰的。如今,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的完整电路图如下所示

gps

  Shield 包含一个 12V 插孔,通电时将使用LM317 稳压器为 LoRa 模块调节 3.3V 。它还将用于通过 Vin 引脚为 Arduino UNO 供电,来自 Arduino 的稳压 5V 用于为屏蔽板上的 LCD 供电。LM317 的输出电压分别使用电阻 R1 和 R2 固定为 3.3V,这些电阻的值可以使用LM317 计算器计算。

gps

  由于 LoRa 模块功耗非常低,也可以直接从 Arduino 的 3.3V 引脚供电,但我们使用了外部稳压器设计,因为 LM317 比板载稳压器更可靠。屏蔽罩还有一个电位器,可用于调节 LCD 的亮度。LoRa 模块与 Arduino 的连接类似于我们在之前的Arduino 与 Lora接口教程中所做的。

  为 LoRa Shield 制造 PCB

  现在我们的电路已经准备好了,我们可以继续设计我们的 PCB。我用PCB设计软​​件打开并开始形成我的轨道。PCB设计完成后,我的电路板如下所示

gps

  组装印刷电路板

  我打开焊条并开始组装电路板。由于脚印、焊盘、通孔和丝网印刷的形状和尺寸都非常合适,因此我在组装电路板时没有问题。焊接完成后,电路板如下所示,您可以看到它非常适合我的 Arduino Uno 电路板。

gps

  由于我们的项目有一个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,如下所示

gps

  引脚 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

  现在您可以使用发射器 GPS 模块四处走动,您会注意到接收器正在更新其位置。要知道发射器模块的确切位置,您可以读取 LCD 上显示的纬度和经度值并将其输入谷歌地图以获取地图上的位置,如下所示。

gps

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 //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);

}

}


无效循环(){


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(传入);

}



}


}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分