zoukankan      html  css  js  c++  java
  • 关于Arduino上读取GPS模块遇到的几个问题

    Arduino以编程简洁、外围扩展丰富而闻名天下!将最近通过Arduino读取GPS模块遇到的几个问题总结一下:

    1. 一般的GPS模块都是通过串口进行读取的,但假如串口不够用,也可以通过 SoftwareSerial.h 库将普通数字接口模拟成串口使用。如:

    #include <SoftwareSerial.h>
    SoftwareSerial gps(6,7); //RX-6;TX-7 此时将pin6 模拟成RX, pin7模拟成TX
    char c;
     
    void setup()
    {
    Serial.begin(9600);
    gps.begin(9600);
    }
     
    void loop()
    {
    c = gps.read();
    Serial.print(c);
    }

    2. 库文件SoftwareSerial.h里面默认定义的RX Buff大小为32字节,而GPS返回的数据是很大的,所以可根据实际需求更改成128或256,如:

    #define _SS_MAX_RX_BUFF 256

    3. 关于NewSoftSerial.h 与SoftwareSerial.h 的关系:
    这两种称谓只存在于Arduino IDE V1.0 以前,如在使用0018,0022版本,可以自行下载NewSoftSerial.h库放入到Arduino IED 的Library目录下使用,引用方式:

    #include <NewSoftSerial.h>
    NewSoftSerial gps(6,7);
    ... ... ...

    但在Arduino IDE V1.0及以后的版本,NewSoftSerial.h 已然替换了之前旧版本的 SoftwareSerial.h,所以V1.0及以后的用户只需引用“SoftwareSerial.h”即可。

    详细描述参见这里:arduiniana.org/libraries/NewSoftSerial/

    4. 可以通过PWM方式驱动减速电机,但对于舵机及电调之类,需要使用PPM进行驱动;Arduino留有专用的PWM引脚来产生PWM信号;对于PPM,则 需要使用Servo.h 库。最初版本的Servo.h库仅能支持在一块Arduino板子上驱动两个舵机(或电调,而且需要接入指定的引脚 pin9 和 pin10),后来新版本的Servo.h库就解决这个限制 了,基本每个引脚都可以用来产生PPM信号(详细参见本人的另一篇文档:Arduino舵机控制测试

    5. 无论是Servo.h库支持普通数字引脚产生PPM信号 还是 SoftwareSerial.h 库支持将普通数字引脚模拟成串口,其底层实现过程中都是通过中断实现的(不太确定,好像是这样),然后这里就产生问题了:即同时使用Servo.h和 SoftwareSerial.h 库的就会产生干扰了。

    比如一旦接上前面提到的GPS模块,连接到舵机的引脚就会收到干扰信号以致舵机自行运转起来。

    关于这个问题网上有不少人遇到,可以确定是Arduino IED的一个bug,也有人提出了不少建议,但经过我这边测试都一一否决了,建议包括:
    a) 使用老版本的那个仅支持两个舵机的Servo.h库,并已经改名成Servo2.h,下载该库的目录后放入到IED 的Library目录下,然后通过“#include <Servo2.h>” 进行引用。
    下载地址:www.arduino.cc/playground/uploads/Code/Servo2.zip
    探讨连接:www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1272501603
    但我这边测试时编译通不过,不知是否与使用的V1.0 IDE有关。

    b) 使用NewSoftSerial.h 库替代 SoftwareSerial.h库,这个可以参考上面的第3节,了解了其历史变更应该明白出错时就已经再使用了。

    c) 在读取GPS之前detach() 舵机(就是取消舵机引脚的绑定),读完后后再 attach()(重新绑定)的方式;详细参见:www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1265129044
    这个提议没尝试,即使能成功也不满足需求,因为不彻底!

    d) 也尝试使用过Arduino的真实串口,好像也会产生干扰信号

    e) 还有其它提议:pharos.ece.utexas.edu/wiki/index.php/Res...Servo_on_the_Traxxas

    6. 重新回到GPS模块读取问题,通过上面情况来看使用串口读取是不行的了,不过幸好购买的GPS模块同时支持I2C模式读取,所以只能使用I2C尝试了。
    I2C操作对应的是Wire.h库。该库也经历了版本的变更,当前版本的read()方法替换了旧的receive();write()方法替换了旧的的send();

    对于非Mega板子,I2C对应的两个管脚是模拟引脚 A4(SDA) 和 A5(SCL);对于Mega,对应的是数字引脚 pin20(SDA) 和 pin21(SCL)。

    Wire.h库定义的Buff长度也是32字节,所以默认下每次只能请求32个字节的数据,本想按照之前SoftwareSerial.h的方式将其更改成更大的,结果发现都不工作。

    关于Arduino的I2C操作,可以参考这里:www.eefocus.com/zhang700309/blog/12-01/236815_59f78.html

    7. 关于GPS各个数据段的含义:

    • GPGSV:可见卫星信息
    • GPGLL:地理定位信息
    • GPRMC:推荐最小定位信息
    • GPVTG:地面速度信息
    • GPGGA:GPS定位信息
    • GPGSA:当前卫星信息

    各个字段描述:hi.baidu.com/shaobozuo/item/b88e2d2801ad3f96af48f5b8

  • 相关阅读:
    kindeditor-4.1.10在线编辑器的使用[多个]
    从人被造的目的看灵魂的价值2014-07-07 唐崇荣 祷告吧
    C#&JQuery非缓存式无刷新临时存储数据之仿购物车功能
    仿主题广告轮播js
    C#&JQ仿网上商城商品条件筛选功能
    百度地图API调用实例之地址标注与位置显示
    Google Maps API 调用实例
    Jquery CheckBox复选框 全选/取消全选 最佳实现方式 参考案例
    基督徒的长篇情书-人生第二次表白之傻人自有傻人福^_^后知此事违神旨意_不要激动爱情,等它自发
    C# Ajax 手机发送短信验证码 校验验证码 菜鸟级别实现方法
  • 原文地址:https://www.cnblogs.com/wzc0066/p/2949270.html
Copyright © 2011-2022 走看看