用GPS模块和Arduino制作一个多功能测速仪,GPS测速仪 2024-04-30 02:03:51 0 0 车辆测速装置有机械式和电子式两种,本项目利用GPS模块、Arduino和OLED显示屏测量并显示车辆的即时速度,属于智能仪表类别。 项目的核心是GPS接收器。目前最流行的GPS模块是ublox NEO-6M,这里我们采用了Quectel L86 GPS模块,因为其简单且天线非常小巧,只要与Arduino、0.96″ OLED显示屏连接,与速度相关参数就显示在OLED屏幕上。项目BOM清单如下: Arduino Nano板 x1 L80/L86 GPS模块 x1 OLED显示屏 x1 杜邦线 x20 面包板 x1 Quectel L86/L80 GPS模块 Quectel L86采用联发科技GNSS MT3333芯片,是一款集成16mm×16mm×4.0mm贴片天线的超紧凑型GNSS模块,使客户能灵活地从GPS切换到GNSS。L86采用LCC封装,内置贴片天线使其拥有超强的捕获和追踪能力。 通过先进的AGPS(EASY)轨道预测技术和省电模式(AlwaysLocate技术),L86模块能自动计算和预测长达三天的轨道信息,并将这些信息存储到内部RAM存储器中,即使在室内弱信号情况下也能实现低功耗快速定位。AlwaysLocate技术的运用,使得L86可以根据不同的环境状况和运行模式,自动调节定位时间,在确保定位精度的同时大大降低了模块功耗。 凭借超小尺寸,超高精度和灵敏度,L86几乎能满足M2M客户所有应用需求,尤其适用于车载、个人追踪、工业级PDA及其他相关手持设备等领域,特别适合于GPS接收机和OBD应用。主要优势包括: 支持多重卫星系统:GPS、GLONASS、QZSS 内嵌贴片天线:16mm×16mm×4.0mm 超紧凑型封装:18.4mm×18.4mm×6.45mm 支持内外置天线自动切换 支持短路保护和天线侦测 内置低噪声放大器,提高接收高灵敏度 支持自辅助AGPS(EASY技术,无需外部存储器) 极低的电流消耗:26mA@追踪模式 多种省电模式:待机模式、备份模式、周期模式、AlwaysLocate模式 LOCUS技术,支持日志信息自动记录保存 高灵敏度:-167dBm@追踪模式,-149dBm@捕获模式 99个捕获信道,33个追踪信道 支持Balloon模式,定位高度高达80km 支持DGPS和SBAS(WAAS/EGNOS/MSAS/GAGAN) 多频主动干扰消除技术增强抗干扰能力 授时服务支持PPS与NMEA同步功能 支持移远通信自主研发的SDK命令 UART接口:波特率范围4800~115200bps,默认波特率9600bps 更新速率:1Hz(默认),最高10Hz 输入/输出电压:2.7~2.9V 协议:NMEA 0183/PMTK 作为一个SMD形式的工业级模块,项目制作时需要插入2.54间距排针,并焊接在底部PCB上。焊上所有12个针脚后,L86模块就变得十分友好,可轻易插接在面包板上。 连接Arduino GPS测速仪 Arduino GPS测速仪电路非常简洁,只要将三个组件按照电路图连接起来即可。 Quectel L86 GPS模块有12个引脚,本项目只用其中的5个。将VCC、GND连接到Arduino开发板的3.3V、GND引脚;V_BCKP引脚也要连接到3.3V,如果不连接的话模块就不能工作。L86模块的Rx、Tx引脚要分别连接到Arduino开发板的数字引脚2、3上。 OLED显示屏是I2C总线,其VCC、GND引脚要连接到Arduino开发板的3.3V、GND引脚。同样,SDA、SCL引脚则连接到Arduino板子的A4、A5引脚上。 编写代码 L80 GPS模块支持Tiny GPS++ Library,下载库文件并上传到Arduino库文件夹。除了Tiny GPS++ Library,代码还需要称作Adafruit SSD1306的SSD1306 Library文件。 以下是完整代码,拷贝并上传到Arduino Nano Board即可。 #include #include #include #include #define rxPin 2 #define txPin 3 SoftwareSerial mygps(rxPin, txPin); #define SCREEN_WIDTH 128?????? // OLED display width, in pixels #define SCREEN_HEIGHT 64?????? // OLED display height, in pixels #define OLED_RESET -1??????????//Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C????//See datasheet for Address Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); TinyGPSPlus gps; void setup() { Serial.begin(115200); mygps.begin(9600); if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); ????for (;;); // Don't proceed, loop forever } display.clearDisplay(); display.display(); delay(2000); } void loop() { boolean newData = false; for (unsigned long start = millis(); millis() - start <>{ while (mygps.available()) { if (gps.encode(mygps.read())) { newData = true; } } } //If newData is true if (newData == true) { newData = false; display.setTextColor(SSD1306_WHITE); if (gps.location.isValid() == 1) { //String gps_speed = String(gps.speed.kmph()); display.setCursor(0, 0); display.setTextSize(3); display.print(gps.speed.kmph()); display.setCursor(75, 20); display.setTextSize(2); display.print("km/h"); display.setTextSize(1); display.setCursor(0, 50); display.print("SAT:"); display.setCursor(25, 50); display.print(gps.satellites.value()); display.setTextSize(1); display.setCursor(70, 50); display.print("ALT:"); display.setCursor(95, 50); display.print(gps.altitude.meters(), 0); display.display(); delay(1500); display.clearDisplay(); } } else { display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.setTextSize(3); display.print("No Data"); display.display(); delay(1500); display.clearDisplay(); } } Arduino GPS测速仪调试 把上述代码上传到Arduino Nano Board后,OLED显示屏起初并不显示数据,因为L86 GPS接收器还没有与卫星系统同步。 稍微等一下,GPS就开始接收来自最近卫星系统的数据,信号的接收与同步情况设备驻地的内外环境有关。与卫星系统同步妥当后,OLED显示屏开始以每小时公里(kmph)为单位显示速度。当然,现在显示的是0kmph,因为板子放在静止的桌上。 如果将GPS测速仪放在运动的车辆上,就会显示以kmph为单位的车速,连接的卫星数量,以及以米为单位的海拔高度。 可见。这个测速仪不但简单,功能还真不少,只要带在身上你就能够获得汽车、自动车、公交车、火车和飞机的速度和所在的海拔高度,以及比赛和训练时的运动速度,还可带它取户外一起融入大自然。 审核编辑:汤梓红 收藏(0)