利用ESP32-C6设计一款GNSS航点导航设备
一个月前,我手里拿着一个GNSS模块,心里在想:我可以开发一个导航设备,只要输入目的地的坐标,设备就能在我不走路时持续显示到目标的距离和方向吗?那个简单的问题成为了这个项目开始的起点。
我迅速用ESP32-C6、一个GNSS接收器和一块小型显示屏组装了一个初步原型。编写了一些测试代码后,当我移动时,惊讶地发现系统能够实时计算出到目的地的距离。
然而,有一个主要的局限性。
GNSS模块只有在用户正在主动移动时才能确定运动方向。如果停止行走,航向信息就会变得不可靠,因为接收器不再具备足够的移动数据来计算行进方向。
在研究解决方案的过程中,我发现早在智能手机导航普及之前,专用的航点导航设备就已经被广泛使用。这些设备将位置数据与指南针结合,持续指示目的地的方向。
这激励我为项目添加了一个数字指南针。
通过集成BMM350磁力计,导航仪现在即使在静止不动时也能确定自身方向。结果正是我所设想的:一个紧凑的手持设备,能够实时显示到预设航点的距离和方位角。
更令人印象深刻的是,该系统始终能实现约±5米的精度,这对于DIY导航项目来说非常出色。
本次构建所使用的硬件包括:
•DFRobot FireBeetle 2 ESP32-C6
•重力GNSS定位模块
•Gravity BMM350 三轴磁力计
•Fermion 1.54英寸 240×240 IPS TFT 显示屏
•用于用户输入的旋转编码器
•压电蜂鸣器用于反馈
•便携式使用的锂聚合物电池
为完成项目,所有部件都被封装在一个由Fusion 360设计的紧凑型定制外壳内,将原型机转变为一款实用的手持导航设备。
在本教程中,我将向你展示我是如何设计、组装、编程和测试这款DIY航点导航仪(Pathfinder)的,以便你能自己动手制作一个。
材料
电子产品
•1× DFRobot FireBeetle 2 ESP32-C6
•1× 重力GNSS定位模块
•1× Gravity BMM350 三轴磁力计
•1× Fermion 1.54英寸 240×240 IPS TFT 显示屏
•1× 旋转编码器
•1× 电容式蜂鸣器
•1× 锂聚合物电池
•1× 小型电源开关
硬件
•M2 螺丝套件
•M3螺丝套件
•螺丝刀
制造
•可使用3D打印机或
•预印封装部件
软件
•Arduino IDE
•Autodesk Fusion 360(用于机箱设计与修改)
步骤1:什么是GNSS,它是如何工作的?
在建造路径规划器之前,了解使其成为可能的技术会很有帮助。
什么是GNSS?
GNSS 是全球导航卫星系统的缩写,是用于卫星定位系统的统称,使地球上的接收设备能够确定自身位置。
目前全球正在运行多个GNSS星座:
•GPS(美国)
•GLONASS(俄罗斯)
•伽利略(欧盟)
•北斗(中国)
现代GNSS接收器可同时与多个卫星系统通信,从而提高定位精度,并缩短获取位置信息所需的时间。
GNSS是如何工作的?
每颗GNSS卫星持续广播包含以下信号的信号:
•其在空间中的精确位置
•确切的传输时间
•系统时间信息
GNSS接收器测量这些信号从多个卫星传到它所需的时间。
由于无线电波以光速传播,接收器可以计算出自己与每个卫星之间的距离。
通过结合至少四颗卫星的测量数据,接收器执行一种称为三边测量的过程,以确定:
•纬度
•经度
•海拔
•时间
接收器能接收到的卫星越多,定位精度通常就越好。
简化示例
想象一下,你站在地球的某个地方:
•一颗卫星告诉你,你位于一个大球体的某个位置。
•第二颗卫星缩小了可能的位置范围。
•第三颗卫星进一步降低了可能性。
•第四颗卫星提供了足够的信息,可计算出精确的三维位置。
这一过程持续不断地进行,通常每秒多次。
本项目中的GNSS
路径寻踪器使用一个连接到ESP32-C6的DFRobot重力GNSS定位模块。
GNSS模块持续提供:
•当前纬度
•当前经度
•海拔
•地速
•可见卫星数量
一旦输入目的地航点,ESP32 就会将当前的 GNSS 坐标与目的地坐标进行比较,并计算:
步骤2:到目的地的距离:哈弗斯线公式
一旦导航器知道你的当前位置坐标和目的地坐标,就需要计算这两个点之间的距离。
乍一看,这似乎很简单。然而,地球并非扁平的,而是近似球形的。因此,使用经纬度进行直线计算,在较长距离上会产生不准确的结果。
为了解决这个问题,固件使用了哈弗斯线公式,这是一种著名的导航公式,用于计算球面上两点之间的最短距离。
该公式需要四个输入:
•当前纬度
•当前经度
•目的地纬度
•目的地经度
使用这些坐标,它计算出大圆距离,即两点之间沿地球表面的最短路径。
随着用户移动,此距离会持续更新,使导航器能够实时显示到选定航点的剩余距离。
在固件中,计算出的距离以以下方式显示:
•附近目的地的米数
•长途行驶的公里数
这提供了一种简单直观的方式来跟踪实现目标的进度。
步骤3:前往目的地
只知道距离是不够的,你还得知道该朝哪个方向前进。
这就是轴承计算发挥作用的地方。
轴承是从一个位置到另一个位置的罗盘方向,从地理上的北点顺时针测量。
例如:
•0° = 北
•90° = 东
•180° = 南
•270° = 西
如果导航仪计算出的方位角为90°,则目的地位于你当前位置的正东方向。
如果计算出的方位角为225°,则目的地位于西南方向。
固件使用当前的GNSS坐标和目的地坐标来计算该航向。
示例
想象你站在:
•纬度:17.4000°
•经度:78.5500°
您的目的地是:
•纬度:17.4100°
•经度:78.5600°
轴承计算用于确定从当前位置到航点的方向。在此示例中,目的地大致位于你位置的东北方向。
步骤4:将轴承与数字指南针结合
计算出的方位角告诉我们目的地相对于真北的位置,但无法告诉我们设备当前朝向的方向。
这正是BMM350磁力计发挥作用的地方。
磁力计持续测量设备的朝向,使ESP32能够确定其当前的方向。
固件随后进行比较:
•目标轴承
•当前标题
确定目标位置相对于设备的位置。
例如:
•目标轴承 = 90°(东)
•设备朝向 = 45°(东北)
目的地位于你当前方向的右侧45度。
显示屏上的导航箭头会根据这个差值进行旋转,从而实时引导用户朝向选定的航点前进。
这种结合了GNSS定位、方位计算和数字指南针航向的方式,使Pathfinder即使在用户静止不动时,也能持续指向目的地。
步骤5:我为何选择 FireBeetle 2 ESP32-C6
该项目的核心是DFRobot FireBeetle 2 ESP32-C6,它非常适合用于便携式导航设备。
我选择它主要有三个原因:
•价格实惠——约5.90美元,性价比极高。
•电池友好型——内置锂聚合物电池接口和充电电路,无需额外的充电模块。
•性能强劲——ESP32-C6 能够轻松处理 GNSS 数据、罗盘计算、显示更新和用户输入,且不会因任务过重而影响性能。
另一个主要优势是其内置的Wi-Fi和蓝牙连接功能。无需在设备上直接输入坐标(硬编码),我只需创建一个简单的网页界面,即可通过本地网络无线传输航点的经纬度值。
这显著提升了用户体验,同时保持了硬件的简单和紧凑。
总体而言,FireBeetle 2 ESP32-C6 为这款 Pathfinder 提供了成本、功能、性能和功耗管理之间的完美平衡。
步骤6:在Fusion 360中设计外壳
我在 Fusion 360 中设计了一个定制外壳,将原型转化为一个紧凑的手持设备。
该装置由三个3D打印部件组成:
主机箱
主机箱包含所有主要部件的安装点,包括:
•FireBeetle 2 ESP32-C6
•GNSS模块
•BMM350 磁力计
•旋转编码器
•压电蜂鸣器
•电源开关
顶部区域还设有专门的GNSS天线安装区,以确保良好的卫星信号接收。侧面设有开口,便于访问ESP32-C6的USB Type-C接口,方便编程和充电。
封面
前面板通过安装螺丝固定1.54英寸TFT显示屏。
还包括:
•旋转编码器切割
•前面板上的装饰性图形
•集成式登山扣环,用于将导航仪固定在背包或装备上
编码器旋钮
第三部分是一个定制设计的旋转编码器旋钮,通过3D打印制成,并压入编码器轴上。
所有外壳部件均设计为无需支撑材料即可轻松打印,并可根据需要进行修改,以适配不同的硬件配置。
您可以从本项目下载 Fusion 360 设计文件和 STL 文件,并根据自身需求进行定制。
步骤7:3D打印零件
CAD设计完成后,是时候打印外壳了。
本次构建中,我使用了:
•外壳和旋钮用橙色PLA
•用于装饰图形和旋钮的黑色PLA
待打印零件
打印以下组件:
•1× 住房
•1× 前封面
•1× 编码器旋钮
我使用标准PLA打印参数,0.4毫米喷嘴和0.2毫米层高打印了所有部件。无需特殊打印设置,所有部件均可在无支撑材料的情况下打印。
步骤8:安装模块
封装完成后,就是将电子元件安装到外壳中的时候了。
安装ESP32-C6:
首先将 FireBeetle 2 ESP32-C6 放置到外壳内的指定安装位置。
确保USB Type-C接口与机箱侧面的开口正确对齐。
对齐后,使用以下方法固定板子:
•2× M2 螺丝
安装GNSS和磁力计模块:
接下来,将GNSS定位模块和BMM350磁力计模块安装到各自指定的安装位置上。
将每个模块上的安装孔与外壳中的凸台对齐,并使用以下方式固定:
•2× M3 螺丝用于 GNSS 模块
•BMM350 模块用 2× M3 螺丝
在拧紧螺丝之前,请确保两个模块都平直地紧贴安装表面。
步骤9:安装编码器、蜂鸣器和电源开关
安装好主模块后,现在是时候安装用户界面组件了。
安装旋转编码器
将旋转编码器安装到外壳内部提供的两个支架上。
对准安装孔,并使用以下方式固定编码器:
•2× M2 螺丝
确保编码器轴在前面板开口处居中,并能自由旋转。
安装蜂鸣器
将压电蜂鸣器轻轻按入外壳上专门设计的插槽中。
蜂鸣器应能紧密安装,无需额外硬件。
安装电源开关
接下来,将电源开关插入外壳上的开关开口。
用力将其压入到位,直到牢固地卡入槽中。
如果开关感觉松动,请涂抹少量速干胶将其固定。注意不要让胶水进入开关内部,以免影响其正常工作。
步骤10:安装GNSS天线
将GNSS天线安装到外壳内的专用天线舱中,如图所示。该外壳设计可牢固固定天线,同时保持其位于设备顶部。
将天线安装到位后,将天线电缆连接到GNSS模块的天线接口上。将接口向下按压,直到听到“咔哒”一声固定到位。
连接器较小且较脆弱,安装时请小心操作。避免拉扯电缆本身,应始终用手握住连接器本体进行操作。
步骤11:将所有线路连接起来
到目前为止,组装过程相当干净且简单。现在是将所有部分连接起来的关键环节:布线和焊接。
GNSS模块和BMM350磁力计
GNSS接收器和BMM350磁力计均通过I²C接口与ESP32-C6通信。
连接以下引脚:
•模块到ESP32-C6
•GND~ GND
•VCC~ 3.3V
•SDA~ SDA
•SCL~ SCL
由于两个模块都使用I²C,因此可以共享相同的SDA和SCL线路。
旋转编码器
按以下方式连接旋转编码器:
•编码器转ESP32-C6
•GND~ GND
•VCC~3.3V
•A~ GPIO 6
•B~ GPIO 7
•C~ GPIO 2
蜂鸣器
按以下方式连接压电蜂鸣器:
•蜂鸣器到ESP32-C6
•GND~ GND
•信号(+)~ GPIO 4
电池与电源开关
将锂聚合物电池连接到ESP32-C6上的电池接口。
为了使设备能够开关,将电源开关与电池的正极线串联。
接线顺序:
•电池(+)→ 开关 → ESP32 电池(+)
•电池(-)→ ESP32 电池(-)
这使得当设备未使用时,开关可以切断整个系统的电源。
所有连接完成后:
•检查所有焊点。
检查相邻导线之间是否有短路。
•在为设备通电前,请确认电池极性正确。
•线路整齐铺设,以防止最终组装时干扰外壳。
一切接线和测试完成后,即可安装显示屏并关闭机箱。
步骤12:安装显示屏
所有内部组件接线完成后,现在可以将显示屏安装到前面板上了。
将1.54英寸TFT显示屏安装在前面盖板的显示屏开口后方,并将显示屏的安装孔与盖板上提供的安装柱对齐。
对齐后,使用以下方式固定显示屏:
•2× M2 螺丝
确保显示屏平贴在盖板上,并居中放置于显示窗口内,以获得最佳外观效果。
安装完成后,前盖组件已准备好与主壳体连接,并可进行最终装配。
步骤13:将显示屏连接到ESP32
由于显示屏和FireBeetle ESP32-C6使用了GDI(通用显示接口)连接器,这一步在整个构建过程中是最简单的之一。
只需使用显示屏附带的GDI数据线,将一端连接到显示屏,另一端连接到ESP32-C6上的GDI接口即可。
由于电源和通信信号都通过同一根电缆传输,因此无需额外布线。
在连接电缆之前,请仔细检查连接器的方向,并与参考图进行对比。错误连接电缆可能导致显示屏无法正常工作。
步骤14:最终组装
所有电子元件安装并测试完毕后,现在可以关闭机箱,完成整机组装。
将锂聚合物电池小心地放入外壳中,并整齐排列电线,以防止外壳关闭时电线被夹住。
接下来,将前面板安装到外壳上,并检查以下内容:
•两部分之间没有电线被卡住。
•显示电缆已安全布设。
•编码器轴可顺利穿过盖板开口。
一切就位后,使用以下方法固定盖子:
•3× M3 螺丝
从盖子背面插入螺丝,并均匀拧紧,直到机箱牢固闭合。
组装完成后,将3D打印的编码器旋钮安装到编码器轴上,并确认其旋转顺畅。
您的DIY路径探测器现已完全组装完毕,可进行电源启动、配置和现场测试。
步骤15:刷写固件
硬件组装完成后,最后一步是将Pathfinder固件上传到ESP32-C6。
下载Pathfinder固件:
在上传代码之前,请从 GitHub 下载最新的 Pathfinder 固件:Pathfinder GitHub 仓库
•下载压缩包。
•解压ZIP文件。
•在Arduino IDE中打开Pathfinder.ino项目。
安装 Arduino IDE:如果尚未安装,请从官方网站下载并安装 Arduino IDE:
•下载 Arduino IDE
•使用默认设置进行安装
安装ESP32板载软件包:
•打开 Arduino IDE
•前往“文件”→“首选项”
•在附加的管理板 URL 中,添加:
•点击确定
•前往工具 → 板件 → 板件管理器
•搜索ESP32
•通过 Espressif Systems 安装 ESP32
安装所需库
DFRobot GNSS 库:
•开放库管理器
•草图 → 包含库 → 管理库
•搜索:
•点击安装
DFRobot GDL 显示库:
搜索:
并安装最新版本。
安装 BMM350 库:
目前必须手动安装 BMM350 库。
•访问 DFRobot BMM350 GitHub 仓库:DFRobot BMM350 GitHub 仓库
•点击代码 → 下载ZIP
•在 Arduino IDE 中,前往:Sketch → 包含库 → 添加 ZIP 库
•选择已下载的ZIP文件。
该库现在将被添加到您的Arduino安装中。
选择正确的电路板:
使用 USB Type-C 数据线将 FireBeetle 2 ESP32-C6 连接到电脑。
然后配置Arduino IDE:
•主板:DFRobot FireBeetle 2 ESP32-C6
•端口:选择与您的设备对应的COM端口
•点击上传。
•等待编译和刷写完成。
上传成功后,路径查找器将自动重启并显示启动界面。
步骤16:连接到接入点并配置Pathfinder
刷入固件后,现在是时候配置你的Pathfinder了。
连接到Pathfinder Wi-Fi网络:
使用电源开关打开Pathfinder。
启动后,设备将自行创建Wi-Fi接入点。
•打开手机或电脑上的Wi-Fi设置。
•寻找路径探测器热点。
•使用密码登录:
打开配置门户:
连接到Pathfinder网络后,打开网页浏览器并访问以下地址:
你应该看到路径规划器的配置界面。
添加途经点:
通过网页界面,输入您要保存的每个位置的详细信息:
•地点名称
•纬度
•经度
点击保存以存储航点。
您可以添加多个位置,这些位置之后将直接在路径规划器中可用。
设置您的时区:
网页界面还提供时区选择菜单。
简单来说:
•选择您所在时区。
•点击保存。
这可确保设备显示正确的本地时间。
持久化存储:
所有航点和时区信息均存储在ESP32的非易失性存储器(NVS)中。
这意味着即使设备关闭,您的设置仍会保存。
保存后,位置将自动加载,并在路径规划器菜单系统中可用。
校准指南针:
在使用路径导航前,必须先校准指南针。
开始校准
•双击编码器旋钮以打开菜单。
•使用旋转编码器滚动。
•选择设置。
•打开校准指南针。
校准过程将引导您完成八个方向的指南针设置:
•北(N)
•东北(NE)
•东(E)
•东南(SE)
•南(S)
•西南(SW)
•西(W)
•西北(NW)
每个方向:
•身体朝向指定方向。
•按下编码器旋钮以记录测量值。
•移动到下一个方向并重复。
这通常是一次性设置,除非设备被移动到新环境或指南针性能发生变化。
故障排除:
如果发现导航箭头没有准确指向目的地:
•重复罗盘校准过程。
•在每次校准步骤中,请确保面向正确的方向。
•校准时请将设备远离大型金属物体或强磁场。
开始导航:
当您的位置已添加并校准好指南针后:
•双击编码器旋钮以打开菜单。
•选择一个已保存的位置。
主屏幕现在将显示:
•到所选目的地的距离
•指向目标的箭头方向
•附加导航信息
移动时,距离会实时更新,而指南针则会持续将导航箭头指向你选定的航点。
步骤17:路径查找器代码的工作原理
路径规划器固件结合GNSS接收器和BMM350磁力计的数据,实现实时航点导航系统。
从总体上看,固件执行以下五项主要任务:
1. 读取GNSS数据
GNSS模块持续提供:
•纬度
•经度
•海拔
•速度
卫星数量
•UTC 时间
此信息用于确定设备在地球任何位置的当前位置。
2. 加载已保存的航点
设备启动时,会从ESP32的非易失性存储(NVS)加载所有已保存的航点和设置。
包括:
•已保存的位置
•纬度和经度值
•所选时区
•设备设置
由于数据存储在NVS中,即使设备关闭后仍可保留。
3. 计算距离和方位角
一旦选择了一个航点,固件就会进行比较:
•当前GNSS坐标
•目的地坐标
使用哈弗斯线公式,可计算地球表面两点之间的最短距离。
该代码还计算了方位角,表示目的地相对于真北方向的方向。
结果是:
•到目标的距离
•目标方向
4. 读取磁力计
BMM350 持续测量地球磁场。
利用这些读数,固件计算设备的当前航向。
与GNSS航向不同,指南针即使在用户静止站立时也能继续工作。
这使得路径寻路者始终知道它朝向的方向。
5. 绘制导航箭头
最终的导航箭头是通过以下方式计算得出的:
•如果目的地在正前方,箭头则指向直上。
•如果目标在左侧或右侧,箭头将相应旋转。
这一过程持续不断,提供实时导航指引。
调试方向问题
根据磁力计在机箱内的安装方式,指南针方向可能与预期方向不一致。
常见症状包括:
•箭头指向相反方向
•箭头显示为镜像
•南北互换
•东与西互换
为了解决此问题,Pathfinder 包含两种指南针配置设置:
heading_offset:此值用于旋转整个指南针方向。
示例:
未应用旋转。
指南针旋转了90度。
指南针旋转180度。
如果指南针持续以固定的角度指向错误的方向,请调整此数值。
典型值:
•0°
•90°
•180°
•270°
反向指南针:此设置可反转指南针的旋转方向。
正常运行。
反向标题计算。
如果使用此选项:
•向左转弯会使箭头向右移动。
•向右转会使箭头向左移动。
指南针行为似乎被镜像了。
快速调试步骤
上传固件后:
测试1:面向北方
使用手机的指南针,朝北方向前进。
路径导航仪的朝向应显示约为:0° 或 360°
测试2:顺时针旋转
缓慢顺时针旋转。
标题应平滑递增:
如果数值反而减少,请尝试:
反向指南针 = !反向指南针;
测试3:检查方向
如果北方看起来像南方:
如果北面出现为东面:
如果北面显示为西面:
这两种设置可使固件在无需更改硬件的情况下,补偿不同磁力计安装方向的影响。
本文编译自hackster.io





