4 有用
3 下载

如何将连接GPS模块(NEO-6m)与Arduino

文件列表(压缩包大小 771.41K)

免费

概述

在这个示例中,我将展示如何将GPS模块与Arduino UNO接口,并在LCD上显示经度和纬度数据。

需要的元件

  • Arduino mega 2560

    ph-a000067_iso_(1)_wzec989qrF

  • u-blox NEO-6M GPS模块

  • Adafruit RGB背光LCD1602

398-09

  • Arduino IDE

原理及流程

1.有关GPS的信息

什么是GPS

全球定位系统(GPS)是由至少24颗卫星组成的基于卫星的导航系统。GPS在全球任何地方的任何天气条件下,一天24小时均可工作,无需支付订阅费或安装费。

GPS如何运作

GPS卫星每天在精确的轨道上绕地球一周两次。每颗卫星都传输唯一的信号和轨道参数,从而使GPS设备能够解码和计算卫星的精确位置。GPS接收器使用此信息和三边测量来计算用户的确切位置。本质上,GPS接收器通过接收发射信号所花费的时间来测量到每个卫星的距离。通过再测量几颗卫星的距离,接收器可以确定用户的位置并显示它。

要计算您的二维位置(经度和纬度)和轨迹运动,必须将GPS接收器锁定到至少3颗卫星的信号上。看到4个或更多卫星时,接收器可以确定您的3-D位置(纬度,经度和高度)。通常,GPS接收机将跟踪8颗或更多的卫星,但这取决于一天中的时间以及您在地球上的位置。

确定您的位置后,GPS单元可以计算其他信息,例如:

  • 速度
  • 轴承座
  • 跟踪
  • 旅行距离
  • 到目的地的距离

GPS信号是什么信号?

GPS卫星至少发送2个低功率无线电信号。信号按视线传播,这意味着它们将穿过云,玻璃和塑料,但不会穿过大多数固体物体,例如建筑物和山脉。但是,现代接收器更加敏感,通常可以在房屋中进行跟踪。

GPS信号包含3种不同类型的信息:

  • 伪随机码是标识哪个卫星正在发送信息的ID码。您可以在设备的卫星页面上查看正在接收信号的卫星。
  • 利用星历数据来确定卫星的位置,并提供有关卫星健康状况,当前日期和时间的重要信息。
  • 年历数据会告诉GPS接收器一天中任何时候每个GPS卫星应该在哪里,并显示该卫星和系统中其他所有卫星的轨道信息。

2.下载并安装必需的库,以使GPS在Arduino IDE中正常工作

  • (i)SoftwareSerial库

  • (ii)TinyGPS库

    你可以在下载区找到它。

3. NEO-6M GPS模块

NEO-6M GPS模块如下图所示。它带有一个外部天线,不带有插头。因此,您将需要焊接它。

image_fvopedEtUl

NEO-6M GPS模块概述

  • NEO-6M GPS芯片

该模块的核心是u-blox的NEO-6M GPS芯片。它可以在50个频道上跟踪多达22颗卫星,并达到业界最高水平的灵敏度,即-161 dB跟踪,同时仅消耗45mA的电源电流。u-blox 6定位引擎还拥有不到1秒的首次定位时间(TTFF)。芯片提供的最佳功能之一是省电模式(PSM)。通过有选择地打开和关闭接收机的各个部分,可以降低系统功耗。这极大地降低了模块的功耗至11mA,使其适合于GPS手表等对功耗敏感的应用。NEO-6M GPS芯片的必要数据引脚被分拆为“ 0.1”间距接头,其中包括通过UART与微控制器通信所需的引脚。

注意:该模块支持从4800bps到230400bps的波特率,默认波特率为9600。

image_xJq6mduAcY

位置固定的LED指示灯

NEO-6M GPS模块上有一个LED,指示位置固定的状态。它会以不同的速率闪烁,具体取决于它所处的状态

  • 无闪烁==>表示正在搜索卫星

  • 每1秒闪烁一次-表示找到定位

  • 3.3V LDO稳压器

NEO-6M芯片的工作电压为2.7至3.6V。但是,该模块带有MICREL的MIC5205超低压降3V3稳压器。逻辑引脚也可以承受5伏电压,因此我们可以轻松地将其连接到Arduino或任何5V逻辑微控制器,而无需使用任何逻辑电平转换器。

image_WFTYAINfGt

电池和EEPROM

该模块配有HK24C32两线串行EEPROM。它的大小为4KB,并通过I2C连接到NEO-6M芯片。该模块还包含一个可充电纽扣电池,可以用作超级电容器。

EEPROM和电池一起有助于保留电池支持的RAM(BBR)。BBR包含时钟数据,最新位置数据(GNSS或位数据)和模块配置。但这并不意味着永久数据存储。

由于电池保持时钟和最后位置,因此首次修复时间(TTFF)大大减少了1s。这允许更快的位置锁定。

没有电池,GPS总是冷启动,因此初始GPS锁定需要更多时间。接通电源后,电池会自动充电,并且在没有电源的情况下最多可以保留两周的数据。

image_uhz8TFBRFM

引脚排列

image_vrtpPBdzNM

  • GND是接地引脚,需要连接到Arduino的GND引脚。
  • TxD(发送器)引脚用于串行通信。
  • RxD(接收器)引脚用于串行通信。
  • VCC为模块供电。您可以将其直接连接到Arduino的5V引脚。

Arduino Uno

Arduino是一个基于易于使用的硬件和软件的开源电子平台。Arduino开发板能够读取输入-传感器上的灯,按钮上的手指或Twitter消息-并将其转换为输出-激活电动机,打开LED并在线发布内容。您可以通过向板上的微控制器发送一组指令来告诉您该怎么做。为此,您可以使用Arduino编程语言(基于Wiring)和Arduino软件(IDE)(基于Processing)。

image_iDJ8Pf4Qbi

引脚排列

image_Q06Cx57JNp

引脚说明

Arduino Uno是基于8位ATmega328P微控制器的微控制器板。与ATmega328P一起,它还包含其他组件,例如晶体振荡器,串行通信,稳压器等,以支持微控制器。Arduino Uno有14个数字输入/输出引脚(其中6个可用作PWM输出),6个模拟输入引脚,USB连接,电源桶插孔,ICSP插头和复位按钮。

通过使用Arduino编程中的pinMode(),digitalRead()和digitalWrite()函数,可以将14个数字输入/输出引脚用作输入或输出引脚。每个引脚均以5V工作,可提供或接收最大40mA电流,并具有一个20-50 KOhms的内部上拉电阻,默认情况下已断开连接。在这14个引脚中,有些引脚具有以下特定功能

  • 串行引脚0(Rx)和1(Tx)==> Rx和Tx引脚用于接收和发送TTL串行数据。它们与相应的ATmega328P USB至TTL串行芯片连接。
  • 外部中断引脚2和3 ==>这些引脚可以配置为在低值,上升沿或下降沿或值变化时触发中断。
  • PWM引脚3、5、6、9和11 ==>这些引脚通过使用AnalogWrite()函数提供8位PWM输出。
  • SPI引脚10(SS),11(MOSI),12(MISO)和13(SCK)==>这些引脚用于SPI通信。
  • 内置LED引脚13 ==>此引脚与内置LED连接,当引脚13为高电平时– LED点亮,而当引脚13为低电平时,其熄灭。

有6个模拟输入引脚,每个引脚提供10位分辨率,即1024个不同的值。它们的电压范围为0至5伏,但可以通过将AREF引脚与模拟Reference()函数配合使用来提高此极限。

  • 模拟引脚4(SDA )和引脚5(SCA )也用于通过Wire库进行TWI通信。
  • AREF ==>用于为具有AnalogReference()函数的模拟输入提供参考电压。
  • 复位引脚==>使该引脚为低电平,可复位微控制器。

4. Arduino UNO和GPS模块的连接

如下所示将UBLOX的四个引脚连接到Arduino:

GPS模块==> Arduino

  • 接地==> GND
  • TX ==>数字引脚(D3)
  • RX ==>数字引脚(D4)
  • Vcc ==> 3.3 V

在这里,我建议您使用外部电源为GPS模块供电,因为GPS模块正常工作的最低电源要求为3.3 V,而Arduino无法提供这么大的电压。

要提供电压,请使用USB TTL。

image_H5H7SoAFXw

  • USB驱动(下载区可下载)

我在使用GPS天线随附的模块时发现的另一件事是,它无法在室内接收信号,因此我使用了该天线。

要连接此天线,必须使用连接器:

image_T6BqgAdfGW

5. JHD162a液晶屏

image_Q79BIGbnL4

  • 接地==> LCD模块的接地引脚。
  • Pin2(Vcc)==> LCD模块的电源(此引脚提供了+ 5V电源)
  • **Pin3(VEE)==>**对比度调整引脚。这是通过将10K电位计的两端连接到+ 5V并接地,然后将滑块引脚连接到VEE引脚来完成的。VEE引脚上的电压定义了对比度。正常设置在0.4至0.9V之间。
  • **Pin4(RS)==>**寄存器选择引脚。JHD162A有两个寄存器,分别是命令寄存器和数据寄存器。RS引脚的逻辑高电平选择数据寄存器,RS引脚的逻辑低电平选择命令寄存器。如果我们将RS引脚设置为高电平并将输入输入到数据线(DB0至DB7),则该输入将被视为要在LCD屏幕上显示的数据。如果我们将RS引脚设为低电平并将输入信号馈送到数据线,则该命令将被视为命令(要写入LCD控制器的命令-如定位光标或清除屏幕或滚动)。
  • **Pin5(R / W)==>**读/写模式。该引脚用于在读写模式之间进行选择。该引脚上的逻辑高电平激活读取模式,而该引脚上的逻辑低电平激活写入模式。
  • **Pin6(E)==>**此引脚用于使能LCD模块。此引脚上的高电平到低电平信号将使能模块。
  • **Pin7(DB0)至Pin14(DB7)==>**这些是数据引脚。通过这些引脚将命令和数据馈送到LCD模块。
  • **Pin15(LED +)==>**背光LED的阳极。在5V电压下工作时,应将此引脚串联560欧姆电阻。在基于arduino的项目中,可以通过arduino板上的3.3V电源为背光LED供电。
  • **Pin16(LED-)==>**背光LED的阴极。

6. Arduino UNO和JHD162a LCD的连接

最好给GSM连接12V电源。

LCD Arduino
VSS
VCC 5伏
VEE 10K电阻器
RS A0(模拟引脚)
I/0 GND
E A1
D4 A2
D5 A3
D6 A4
D7 A5
LED + VCC
LED- 接地

7.代码

#include <LiquidCrystal.h> 
#include <SoftwareSerial.h> 
#include <TinyGPS.h> 
float lat = 28.5458,lon = 77.1703; // create variable for latitude and longitude object  
SoftwareSerial gpsSerial(3,4);//rx,tx 
LiquidCrystal lcd(A0,A1,A2,A3,A4,A5); 
TinyGPS gps; // create gps object 
void setup(){ 
Serial.begin(9600); // connect serial 
//Serial.println("The GPS Received Signal:"); 
gpsSerial.begin(9600); // connect gps sensor 
lcd.begin(16,2); 
} 
void loop(){ 
  while(gpsSerial.available()){ // check for gps data 
  if(gps.encode(gpsSerial.read()))// encode gps data 
  {  
  gps.f_get_position(&lat,&lon); // get latitude and longitude 
  // display position 
  lcd.clear(); 
  lcd.setCursor(1,0); 
  lcd.print("GPS Signal"); 
  //Serial.print("Position: "); 
  //Serial.print("Latitude:"); 
  //Serial.print(lat,6); 
  //Serial.print(";"); 
  //Serial.print("Longitude:"); 
  //Serial.println(lon,6);  
  lcd.setCursor(1,0); 
  lcd.print("LAT:"); 
  lcd.setCursor(5,0); 
  lcd.print(lat); 
  //Serial.print(lat); 
  //Serial.print(" "); 
  lcd.setCursor(0,1); 
  lcd.print(",LON:"); 
  lcd.setCursor(5,1); 
  lcd.print(lon); 
 } 
} 
String latitude = String(lat,6); 
  String longitude = String(lon,6); 
Serial.println(latitude+";"+longitude); 
delay(1000); 
} 

8.结果

image_TFIhzN5gHK

image_VLLElEiPYF

最后

所有需要的文件在下载区均可找到。

via:https://create.arduino.cc/projecthub/ruchir1674/how-to-interface-gps-module-neo-6m-with-arduino-8f90ad?ref=platform&ref_id=424_popular___&offset=8

理工酷提示:

如果遇到文件不能下载或其他产品问题,请添加管理员微信:ligongku001,并备注:产品反馈

评论(0)

0/250