• 2022-8-4用GPS模块和Arduino制作一个多功能车辆测速仪


    https://mbb.eet-china.com/blog/3975615-433890.html
    2022-8-4用GPS模块和Arduino制作一个多功能车辆测速仪
    2022-8-4 10:30  665 0 1 分类: 智能硬件 文集: 方案

    车辆测速装置有机械式和电子式两种,本项目利用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 < 1000;)
    {
    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为单位的车速,连接的卫星数量,以及以米为单位的海拔高度。

    可见。这个测速仪不但简单,功能还真不少,只要带在身上你就能够获得汽车、自动车、公交车、火车和飞机的速度和所在的海拔高度,以及比赛和训练时的运动速度,还可带它取户外一起融入大自然。

  • 相关阅读:
    【kafka】七、kafka数据可靠性保证
    【云原生之kubernetes实战】在kubernetes集群下部署Rainbond平台
    .NET6发布项目到腾讯云Windows2012R全网最详细教程
    Oracle修改表空间文件位置
    Python数学基础-识图一、平面直角坐标系
    《rust学习一》 fleet 配置rust环境
    【Python】基于OpenCV人脸追踪、手势识别控制的求生之路FPS游戏操作
    简单写一个eventbus
    dotnet 探究 SemanticKernel 的 planner 的原理
    java类的练习--下面给出一个根据雇员类型利用多态性完成
  • 原文地址:https://blog.csdn.net/wb4916/article/details/126762556