GPS技术在我们的日常生活中发挥着重要作用。从人类导航到飞机导航,它有助于解决与位置相关的各种问题。但是,除了提供位置详细信息外,GPS模块从卫星获取的NMEA数据还包含其他参数的信息,例如高度、压力、日期和时间等。这意味着GPS模块也可以用于其他项目。
在本篇文章中,我们将使用UBLOX NEO-6M GPS模块确定我们所在位置的高度。该项目的一个很好的应用将是无人机的安装,其中需要高度作为对IMU或其他类似情况的反馈。尽管存在各种与Arduino兼容的Arduino GPS模块,但它们通常很笨重,并带有其他限制,例如功率要求,这会限制使用它们的项目。UBLOX NEO 6M GPS模块不存在类似的问题。
该模块结构紧凑,尺寸与小型Arduino开发板差不多,这使它们可以轻松安装到任意小型Arduino项目中。 NEO-6M GPS模块是一款高性能GPS接收器,内置25 x 25 x 4mm陶瓷天线,为该模块提供了强大的卫星搜索功能。该模块通过串行协议与连接的微控制器通信,并运行在3-5V的电压电平上。我们将使用GPS模块获取高度数据并将其显示在OLED显示屏上。在本文的最后,您将知道如何使用NMEA协议从GPS模块获取各种信息。
所需的组件 ● GPS模块 ● 彩色OLED显示屏 ● Arduino Uno开发板 ● 面包板 ● 连接导线
原理图 该项目的原理图非常简单。除了Arduino,我们还有其他两个主要组件,即GPS模块和OLED显示屏。 GPS模块通过串行通信,因此将连接到Arduino的串行引脚。但是,我们将使用基于软件串行的通信方式,因为Arduino与PC采用硬件串口进行通信的,请如下图所示连接组件。
Arduino开发板和GPS模块之间的连接如下表所示: Arduino开发板 | GPS模块 | GND | GND | 5v | VCC | D3 | RX | D4 | TX |
代码 如前所述,我们将不使用GPS模块来获取位置信息(例如经度和纬度),而是展示如何从GPS输出中导出其他参数(例如高度)。GPS模块一旦连接到卫星,就会产生一堆被称为NMEA数据的信息。该数据包含有用的信息,例如位置、高度、压力等。下图显示了典型的NMEA数据。
了解这些信息并提取所需的数据可能是一项艰巨的任务。为使事情变得容易,我们将使用tinyGPS ++库,该库已经具有从NMEA数据中提取特定信息所需的所有函数。可以通过链接下载该库。除了tinyGPS ++库之外,我们还将使用Adafruit GFX库。 GFX库将使与OLED显示屏的交互变得容易。
我们首先包括项目所需的库,然后定义OLED连接的Arduino引脚。 - // writtern by Nick Koumaris
- //Info@educ8s.tv
- #include <SoftwareSerial.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1331.h>
- #include <SPI.h>
- #include "TinyGPS++.h"
- #define sclk 13
- #define mosi 11
- #define cs 10
- #define rst 9
- #define dc
复制代码
接下来,我们指定变量以表示项目要使用的颜色的十六进制数,并创建tinyGPS ++库的实例。 该实例将用于引用传递代码的模块。 - #define BLACK 0x0000
- #define BLUE 0x001F
- #define RED 0xF800
- #define GREEN 0x07E0
- #define CYAN 0x07FF
- #define MAGENTA 0xF81F
- #define YELLOW 0xFFE0
- #define WHITE 0xFFFF
- TinyGPSPlus gps;
复制代码
为了使数据显示更加用户友好,创建了一个标语屏幕和图标,以便可以整洁而酷炫的方式显示信息。 表示UI和图标的字符代码在下面声明。 - static const unsigned char PROGMEM title[] = {
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x3f,0xc0,0xff,0xc0,0xf,0xe0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0xff,0xe0,0xff,0xf0,0x3f,0xf0,0x0,0x0,0x0,0x0,0x0,
- 0x3,0xff,0xe0,0xff,0xf8,0x7f,0xf0,0x0,0x0,0x0,0x0,0x0,
- 0x7,0xff,0xe0,0xf0,0xfc,0xff,0xf0,0x0,0x0,0x0,0x0,0x0,
- 0x7,0xe0,0x20,0xf0,0x3c,0xf8,0x10,0x0,0x0,0x0,0x0,0x0,
- 0xf,0x80,0x0,0xf0,0x3c,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0xf,0x0,0x0,0xf0,0x3c,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x1e,0x0,0x0,0xf0,0x3c,0xfc,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x1e,0xf,0xf0,0xf0,0x3c,0x7f,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x1e,0xf,0xf0,0xf0,0xf8,0x3f,0xc0,0x0,0x0,0x0,0x0,0x0,
- 0x1e,0xf,0xf0,0xff,0xf8,0x1f,0xe0,0x0,0x0,0x0,0x0,0x0,
- 0x1e,0xf,0xf0,0xff,0xe0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
- 0x1e,0x0,0xf0,0xff,0x80,0x1,0xf8,0x0,0x0,0x0,0x0,0x0,
- 0x1f,0x0,0xf0,0xf0,0x0,0x0,0x78,0x0,0x0,0x0,0x0,0x0,
- 0xf,0x80,0xf0,0xf0,0x0,0x80,0x78,0x0,0x0,0x0,0x0,0x0,
- 0xf,0xc0,0xf0,0xf0,0x0,0xe0,0xf8,0x0,0x0,0x0,0x0,0x0,
- 0x7,0xff,0xf0,0xf0,0x0,0xff,0xf8,0x0,0x0,0x0,0x0,0x0,
- 0x3,0xff,0xf0,0xf0,0x0,0xff,0xf0,0x0,0x0,0x0,0x0,0x0,
- 0x1,0xff,0xf0,0xf0,0x0,0xff,0xe0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x7f,0x80,0xf0,0x0,0x3f,0x80,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0xe0,0x71,0xff,0xf9,0xe0,0xf1,0xfd,0xff,0x7f,0x3f,0x80,
- 0x0,0xf0,0x71,0xff,0xf9,0xf0,0xf1,0xfd,0xff,0x7f,0x3f,0xc0,
- 0x1,0xb0,0x70,0x38,0x71,0xb0,0xb1,0xc0,0x38,0x70,0x38,0xc0,
- 0x1,0xb0,0x70,0x38,0x71,0xf1,0xb1,0xc0,0x38,0x70,0x38,0xc0,
- 0x3,0xb8,0x70,0x38,0x71,0xf9,0xb1,0xf8,0x38,0x7e,0x39,0xc0,
- 0x3,0x18,0x70,0x38,0x71,0xdb,0xb1,0xf8,0x38,0x7e,0x3f,0x80,
- 0x3,0x1c,0x70,0x38,0x71,0xdb,0x31,0xc0,0x38,0x70,0x3f,0x80,
- 0x7,0xfc,0x70,0x38,0x71,0xdf,0x31,0xc0,0x38,0x70,0x39,0x80,
- 0x7,0xfc,0x70,0x38,0x71,0xce,0x31,0xc0,0x38,0x70,0x39,0xc0,
- 0x6,0xe,0x7f,0x38,0xf9,0xce,0x31,0xfc,0x38,0x7f,0x38,0xe0,
- 0xe,0xe,0x7f,0x38,0xf9,0xce,0x31,0xfc,0x38,0x7f,0x38,0xf0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
- };
- static const unsigned char PROGMEM ui[] =
- {
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0xe0,0x38,0x7f,0xf7,0xdf,0xfc,0xe0,0xe1,0xfe,0x7,0xf1,
- 0x81,0xf0,0x38,0x7f,0xf7,0xdf,0xfc,0xe0,0xe1,0xff,0x7,0xf1,
- 0x81,0xb0,0x38,0x7,0x3,0x81,0xc0,0xe0,0xe1,0xc7,0x87,0x1,
- 0x81,0xb8,0x38,0x7,0x3,0x81,0xc0,0xe0,0xe1,0xc3,0xc7,0x1,
- 0x83,0xb8,0x38,0x7,0x3,0x81,0xc0,0xe0,0xe1,0xc1,0xc7,0x1,
- 0x83,0xb8,0x38,0x7,0x3,0x81,0xc0,0xe0,0xe1,0xc1,0xc7,0xe1,
- 0x87,0x1c,0x38,0x7,0x3,0x81,0xc0,0xe0,0xe1,0xc1,0xc7,0xe1,
- 0x87,0x1c,0x38,0x7,0x3,0x81,0xc0,0xe0,0xe1,0xc1,0xc7,0x1,
- 0x87,0xfc,0x38,0x7,0x3,0x81,0xc0,0xe0,0xe1,0xc1,0xc7,0x1,
- 0x8f,0xfe,0x38,0x7,0x3,0x81,0xc0,0xe0,0xe1,0xc3,0x87,0x1,
- 0x8e,0xe,0x38,0x7,0x3,0x81,0xc0,0x71,0xc1,0xc7,0x87,0x1,
- 0x8e,0xe,0x3f,0x87,0x7,0xc1,0xc0,0x7f,0xc1,0xff,0x7,0xf1,
- 0x9c,0x7,0x3f,0x87,0x7,0xc1,0xc0,0x1f,0x1,0xfc,0x7,0xf1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
- };
- static const unsigned char PROGMEM gpsIcon[] = {
- 0x0,0xe0,0x0,0x0,
- 0x1,0xf0,0x0,0x0,
- 0x3,0xf8,0x0,0x0,
- 0x3,0x98,0x0,0x0,
- 0xe,0x7,0x0,0x0,
- 0xe,0x7,0x80,0x0,
- 0xe,0x3,0x80,0x0,
- 0x3,0x81,0xfc,0x0,
- 0x3,0xc1,0xfc,0x0,
- 0x1,0xc1,0xfe,0x0,
- 0x0,0xf7,0xfe,0x0,
- 0x0,0x3f,0xfc,0x0,
- 0x0,0x3f,0xfc,0x0,
- 0x0,0x1f,0xff,0x80,
- 0x0,0x1f,0xfb,0x80,
- 0xcc,0x1f,0xe1,0xc0,
- 0xce,0x1f,0xe0,0x70,
- 0xce,0xf,0xe0,0x70,
- 0x6e,0x7,0x60,0x38,
- 0x67,0x0,0x78,0xc,
- 0x63,0x0,0x1c,0x1c,
- 0x73,0x80,0x1c,0x3c,
- 0x71,0xf0,0x7,0x70,
- 0x30,0xf8,0x7,0xf0,
- 0x1c,0x3e,0x3,0xc0,
- 0xf,0x0,0x0,0x80,
- 0xf,0x80,0x0,0x0,
- 0x3,0xf0,0x0,0x0,
- 0x0,0xfe,0x0,0x0,
- 0x0,0xe,0x0,0x0
- };
复制代码
接下来,我们初始化软件串行库,说明将arduino的引脚用作软件TX和RX引脚。我们还创建OLED库的实例。 - SoftwareSerial SoftSerial(4, 3); //RX, TX
- Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, rst);
复制代码
在void setup()函数中,我们初始化显示屏和串行通信,以声明希望设备进行通信的波特率。用于该项目的特定GPS模块的预设波特率是9600bps。确保与您的模块相同,或进行相应的修改。为了解决问题,我们显示了UI,使OLED准备显示高度数据。 - void setup()
- {
-
- display.begin();
- display.fillScreen(BLACK);
- printSplashScreen();
-
- SoftSerial.begin(9600); // the SoftSerial baud rate
- delay(1000);
- Serial.begin(9600); // the Serial port of Arduino baud rate.
- delay(2000);
- printUI();
- }
复制代码
在void loop函数中,我们检查GPS模块是否正在接收数据,并使用gps.altitude.meters()函数从模块中提取高度信息。该代码还显示了如何使用gps.location.lat()和gps.location.lng()函数从NMEA数据中获取位置信息的示例,以获取经度和纬度信息。 - void loop()
- {
- String altitude ;
-
- while (SoftSerial.available() > 0)
- gps.encode(SoftSerial.read());
-
- if (gps.location.isUpdated())
- {
- Serial.print("LAT="); Serial.print(gps.location.lat(), 6);
- Serial.print(" LNG="); Serial.println(gps.location.lng(), 6);
- }
- if (gps.altitude.isUpdated())
- {
- Serial.print("Altitude:");
- Serial.println(gps.altitude.meters());
- altitude = String((int)gps.altitude.meters())+" m";
- display.setCursor(18,35);
- display.print(altitude);
- }
- }
复制代码
最终效果演示 该项目的演示非常简单。 查看原理图以确认您已正确连接所有组件,然后将代码上传到Arduino开发板。 几分钟后,您应该会在OLED上看到设备当前位置的高度。 确保在室外进行测试。
以上就是本篇文章的全部内容。感谢您的阅读。 如果您对今天的教程有疑问,请随时在本帖下面进行回复。 |