您的位置:首页 > 产品设计 > UI/UE

关于Arduino上读取GPS模块遇到的几个问题

2013-03-08 09:36 260 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: