NEO-6M GPS模块
NEO—6M/7M GPS模块,具有高灵敏度、低功耗、小型化、高追踪灵敏度,大大扩大了其定位的覆盖面,在普通GPS接收模块不能定位的地方,如狭窄都市天空下、密集的丛林环境,NEO-6M都能高精度定位。模块的高灵敏度、小静态漂移、低功耗及轻巧的体积,适用于车载、手持设备如PDA,车辆监控、手机、摄像机及其他移动定位系统的应用,是GPS产品应用的好选择。
模块来源
规格参数
工作电压:3.3V-5V
工作电流:10-26mA
控制方式:串口
硬件连接
c
NEO-6M模块 开发板
VCC 5V
GND GND
TX D3(或其他可用的数字引脚,如果使用SoftwareSerial)
RX D4(或其他可用的数字引脚,不过实际上可以不连接,除非你需要向GPS模块发送指令)
1
2
3
4
5
2
3
4
5
使用方法
安装库
- 需要安装
TinyGPS
库或其他兼容的GPS解析库,用于解析GPS数据。通过Arduino IDE的库管理器搜索并安装TinyGPS
。
编写代码
因为GPS有在室外才有信号,所以在以下代码中,加入了一个2.8寸LCD屏幕用做显示,接法参考链接:ColorEasyDuino开发板模块移植手册。
c
/******************************************************************************
* 测试硬件:ColorEasyDuino开发板
* 版 本 号: V1.0
* 修改作者: www.lckfb.com
* 修改日期: 2024年04月11日
* 功能介绍:
*****************************************************************************
* 开发板软硬件资料与相关项目软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
******************************************************************************/
#include <TinyGPS.h>
#include <SoftwareSerial.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <XPT2046_Touchscreen.h>
// 为显示屏和触摸屏定义引脚
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
#define TOUCH_CS 4
// 初始化ILI9341
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC,TFT_RST);
// 定义SoftwareSerial的接收(RX)和发送(TX)引脚
static const int RXPin = 4, TXPin = 3;
// 定义GPS模块的波特率
static const uint32_t GPSBaud = 9600;
// 创建SoftwareSerial对象
SoftwareSerial gpsSerial(RXPin, TXPin);
// 创建TinyGPS++对象
TinyGPS gps;
// 假设这是你希望存储的数据量
const int dataArraySize = 180;
char dataFromSerial[]; // 数据数组
int dataIndex = 0; // 索引,用来跟踪数据在数组中的位置
void setup() {
Serial.begin(9600); // 开始串口通信,与电脑通信
gpsSerial.begin(GPSBaud); // 开始软件串口通信,与GPS模块通信
// 初始化显示屏
tft.begin();
tft.setRotation(1);
// 清屏为白色
tft.fillScreen(ILI9341_BLUE);
}
void loop() {
bool newData = false;
// For one second we parse GPS data and report some key values
for (unsigned long start = millis(); millis() - start < 2000;)
{
while (gpsSerial.available()> 0 && dataIndex < dataArraySize)
{
char c = gpsSerial.read();
dataFromSerial[] = c;
if(dataIndex >= dataArraySize) {
// 数据存满,可以显示
tft.fillRect(0, 0, 320, 80,ILI9341_BLUE);
tft.setCursor(0, 0); // 设置LCD的起始点
// 遍历数组并显示数据
for(int i = 0; i < dataArraySize; i++) {
tft.print(dataFromSerial[]);
}
//清除之前的数据
for(int i = 0; i < dataArraySize; i++)dataFromSerial[]=0;
// 重置索引,准备下一轮数据收集
// 这取决于你是否希望覆盖之前的数据或者只显示一次
dataIndex = 0;
}
if (gps.encode(c)) // 如果内容有变
newData = true;
}
}
// if (newData)
// {
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
tft.fillRect(5, 240-60, 150, 60,ILI9341_BLUE);
tft.setCursor(5, 240-60);
tft.print("LAT=");
tft.println(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
tft.print(" LON=");
tft.println(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
tft.print(" SAT=");
tft.println(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
tft.print(" PREC=");
tft.println(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
//}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
使用验证
上半部分是GPS模块发送过来的GPS原始数据;下半部分为解析成功后的GPS定位数据。