GPS 模块广泛用于电子应用中,以基于经度和纬度坐标跟踪位置。车辆跟踪系统,GPS时钟,事故检测警报系统,交通导航,监视系统等是GPS功能必不可少的示例。GPS提供了高度,纬度,经度,UTC时间以及有关特定位置的许多其他信息,这些信息取自不止一颗卫星。要从GPS读取数据,需要一个微控制器,因此在这里,我们将GPS模块与AVR微控制器Atmega16连接,并在16x2 LCD显示屏上打印经度和纬度。
所需组件
- Atmega16 / 32
- GPS模块(uBlox Neo 6M GPS)
- 长线天线
- 16x2 LCD
- 2.2k电阻
- 1000uf电容器
- 10uF电容器
- 连接线
- LM7805
- DC插孔
- 12v DC适配器
- Burgstips
- PCB或通用PCB
Ublox Neo 6M 是一个串行GPS模块,可通过串行通信提供位置详细信息。它有四个针脚。
销 |
描述 |
Vcc |
2.7 – 5V电源 |
nd |
地面 |
TXD |
传输资料 |
接收器 |
接收资料 |
Ublox neo 6M GPS模块兼容TTL,其规格如下。
捕捉时间 |
冷启动:27s,热启动:1s |
通讯协议 |
NMEA |
串行通讯 |
9600bps,8个数据位,1个停止位,无奇偶校验和无流量控制 |
工作电流 |
45毫安 |
从GPS获取位置数据
GPS模块将以9600波特率以多个字符串传输数据。如果我们使用波特率为9600的UART终端,则可以看到GPS接收到的数据。
GPS模块 以NMEA格式发送实时跟踪位置数据(请参见上面的屏幕截图)。NMEA格式由几个句子组成,其中四个重要句子如下。有关NMEA语句 及其数据格式的更多详细信息,请 参见此处。
- $ GPGGA:全球定位系统修复数据
- $ GPGSV:可以看到GPS卫星
- $ GPGSA:GPS DOP和活动卫星
- $ GPRMC:建议的最低特定GPS /公交数据
在此处了解有关GPS数据和NMEA字符串的更多信息。
这是GPS以9600波特率连接时收到的数据。
$ GPRMC,141848.00,A,2237.63306,N,08820.86316,E,0.553,,100418,,, A * 73 $ GPVTG,, T,, M,0.553,N,1.024,K,A * 27 $ GPGGA,141848.00, 2237.63306,N,08820.86316,E,1,03,2.56,1.9,M,-54.2,M,* 74 $ GPGSA,A,2,06,02,05,,,,,,,, 2.75, 2.56,1.00 * 02 $ GPGSV,1,1,04,02,59,316,30,05,43,188,25,06,44,022,23,25,03,324,* 76 $ GPGLL,2237.63306,N,08820.86316,E,141848.00 ,A,A * 65
当我们使用GPS模块 跟踪任何位置时,我们只需要坐标,就可以在$ GPGGA string中找到它。仅$ GPGGA(全球定位系统修复数据)字符串主要用于程序中,而其他字符串则被忽略。
$ GPGGA,141848.00,2237.63306,N,08820.86316,E,1,03,2.56,1.9,M,-54.2,M,, * 74
那条线是什么意思?
该行的含义是:-
1.字符串始终以“ $”符号开头
2. GPGGA代表全球定位系统修复数据
3.“,”逗号表示两个值之间的分隔
4. 141848.00:GMT时间为14(hr):18(min):48(sec):00(ms)
5. 2237.63306,N:北纬22(度)37(分钟)63306(秒)
6. 08820.86316,E:经度088(度)20(分钟)86316(秒)东
7. 1:修复数量0 =无效数据,1 =有效数据,2 = DGPS修复
8. 03:当前查看的卫星数。
9. 1.0:HDOP
10. 2.56,M:海拔(海拔高度,以米为单位)
11. 1.9,M:大地水准面高度
12. * 74:校验和
因此,我们需要5号和6号来收集有关模块位置或模块位置的信息。在此项目中,我们使用了GPS库,该库提供了一些提取纬度和经度的功能,因此我们不必为此担心。
我们以前将GPS与其他微控制器接口:
- 如何在Arduino上使用GPS
- Raspberry Pi GPS模块接口教程
- GPS模块与PIC单片机的接口
- 使用Arduino,ESP8266和GPS在Google Maps上跟踪车辆
在此处检查所有与GPS相关的项目。
电路原理图
GPS与AVR Atemga16微控制器接口的电路图如下:
整个系统由12v直流适配器供电,但电路工作在5v电压下,因此电源通过LM7805稳压器调节至5v。16x2 LCD配置为4位模式,其引脚连接在电路图中显示。GPS还由5v供电,其tx引脚直接连接到Atmega16微控制器的Rx。8MHz晶体振荡器用于为微控制器提供时钟。
GPS与AVR微控制器接口的步骤
- 设置微控制器的配置,包括振荡器配置。
- 设置LCD的所需端口,包括DDR寄存器。
- 使用USART将GPS模块连接到微控制器。
- 在ISR模式下初始化系统UART,波特率为9600,LCD在4位模式下初始化。
- 根据纬度和经度的长度获取两个字符数组。
- 一次接收一个字符位,然后检查它是否从$开始。
- 如果收到$,则它是一个字符串,我们需要检查$ GPGGA,这6个字母包括$。
- 如果它是GPGGA,则接收完整的字符串并设置标志。
- 然后以两个数组的方向提取纬度和经度。
- 最后,在LCD中打印纬度和经度数组。
代码说明
最后给出了带有演示视频的完整代码,在此说明了代码的一些重要部分。
首先,在代码中包含一些必需的标头,然后为LCD和UART配置写入位掩码的MACROS。
# 定义F_CPU 8000000ul #包括#包括
现在声明并初始化一些变量和数组,以存储GPS字符串,纬度经度和标志。
char buf; volatile char ind,flag,stringReceived; char gpgga = {'$','G','P','G','G','A'}; 字符纬度 字符逻辑
之后,我们具有一些LCD驱动器功能来驱动LCD。
无效lcdwrite(char ch,char r) { LCDPORT = ch&0xF0; RWLow; if(r == 1) RSHigh; 否则 RSLow; ENHigh; _delay_ms(1); 低; _delay_ms(1); LCDPORT = ch << 4&0xF0; RWLow; if(r == 1) RSHigh; 否则 RSLow; ENHigh; _delay_ms(1); 低; _delay_ms(1); } void lcdprint(char * str) { while(* str) { lcdwrite(* str ++,DATA); // __ delay_ms(20); } } void lcdbegin() { char lcdcmd = {0x02,0x28,0x0E,0x06,0x01}; for(int i = 0; i <5; i ++) lcdwrite(lcdcmd,CMD); }
之后,我们初始化了与GPS的串行通信,并将接收到的字符串与“ GPGGA”进行比较:
void serialbegin() { UCSRC =(1 << URSEL)-(1 << UCSZ0)-(1 << UCSZ1); UBRRH =(BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB =(1 <
现在,如果接收到的字符串与GPGGA成功匹配,则在 主 函数中提取并显示位置的纬度和经度坐标:
lcdwrite(0x80,0); lcdprint(“ Lat:”); serialprint(“ Latitude:”); for(int i = 15; i <27; i ++) { latitude = buf; lcdwrite(latitude,1); serialwrite(latitude); if(i == 24) { lcdwrite('',1); i ++; } } serialprintln(”“); lcdwrite(192,0); lcdprint(“ Log:”); serialprint(“ Logitude:”); for(int i = 29; i <41; i ++) { logitude = buf; lcdwrite(logitude,1); serialwrite(logitude); if(i == 38) { lcdwrite('',1); i ++; } }
因此,这就是将GPS模块与ATmega16连接以查找位置坐标的方式。
在下面找到完整的代码和工作视频。