如何在 Arduino 中使用 NMEA-0183
组件和用品
![]() |
| × | 1 | |||
| × | 1 |
关于这个项目
NMEA-0183 是一种电气标准,用于连接船舶和船只中的 GPS、SONAR、传感器、自动驾驶装置等。与较新的 NMEA 2000 标准(基于 CAN)不同,NMEA 0183 基于 EIA RS422(一些较旧和/或简单的系统使用 RS-232 或单线)。
我想向您展示如何将 Arduino UNO(或任何其他 Arduino)连接到任何具有差分输出的 NMEA-0183 设备。尽管标准要求隔离输入和输出,但使用具有隔离接口的 RS422/RS485 Arduino 扩展板很有用。
与 NMEA 0183 的连接
在下图中,您可以看到具有差分输出的典型设备。端子为 NMEA OUT+ 和 NMEA OUT- 或 TX+ 或 TX-。 NMEA IN+ 和 NMEA IN- 线是可选的。

如果您的设备只有一根传输线(很可能标有 TX 或 NMEA OUT 或类似的东西),那么您的设备使用 RS-232 协议。在这种情况下,您将需要一个简单的 RS232 转换器。
跳线设置

- UART RX 到位置 2
- UART TX 到位置 3
- 电压到 5V 位置
拨码开关设置

固件
您可以为 Arduino 找到许多不同的 NMEA-0183 软件堆栈。一个很好的解决方案是 Justin R Cutler 的 NMEA 库
https://github.com/jrcutler/NMEA0183
需要将软件UART的引脚更改为引脚2和3! 拿 关心 那个 波特率 评分 的 软件 串口 是 相同 作为 在 你的 NMEA 设备 - 典型 4800 波特率。
试运行
编译和上传后,程序将解码传入的 NMEA 协议。您可以打开串行监视器以查看解码的协议。
如果您家里没有 NMEA 设备,您也可以使用 PC 上的模拟器和一个简单的 USB 转 RS485 适配器而不是真正的设备。

代码
- NMEA 0183 演示
NMEA 0183 演示Arduino
解析NMEA 0183协议#include//匹配Zihatec RS422/RS485 shieldSoftwareSerial gps(2, 3);NMEA0183 nmea;void setup(){ while (!Serial); Serial.begin(115200); gps.begin(4800); Serial.println("NMEA0183 解析器测试");}void loop(){ if (gps.available()) { char c =gps.read(); if (nmea.update(c)) { Serial.print("NMEA0183 句被接受("); Serial.print(nmea.getFields()); Serial.print(" fields):"); Serial.write(nmea.getSentence()); Serial.println(); } }}
制造工艺