关于Arduino上读取GPS模块遇到的几个问题
2013-03-08 09:36
260 查看
Arduino以编程简洁、外围扩展丰富而闻名天下!将最近通过Arduino读取GPS模块遇到的几个问题总结一下:
1. 一般的GPS模块都是通过串口进行读取的,但假如串口不够用,也可以通过 SoftwareSerial.h 库将普通数字接口模拟成串口使用。如:
2. 库文件SoftwareSerial.h里面默认定义的RX Buff大小为32字节,而GPS返回的数据是很大的,所以可根据实际需求更改成128或256,如:
3. 关于NewSoftSerial.h 与SoftwareSerial.h 的关系:
这两种称谓只存在于Arduino IDE V1.0 以前,如在使用0018,0022版本,可以自行下载NewSoftSerial.h库放入到Arduino IED 的Library目录下使用,引用方式:
但在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
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
相关文章推荐
- 关于开发中html页面调整遇到的几个问题
- 关于VMware Workstation CentOS虚拟机联网遇到的几个问题
- 关于游戏制作过程中遇到的几个问题记录
- 今天遇到的几个关于编码的问题
- 关于java 中流读取时遇到的阻塞和返回-1的问题探究
- 关于读取CocoStudio的ui文件可能遇到的问题
- 关于 IOS 开发中遇到的 读取 cell xib 文件时导致死机的问题。
- java: 关于从jar中读取资源遇到的问题getClass().getResource(...)
- 做项目时遇到的几个关于C#和SQL的细节问题(二)
- 关于android Listview 使用时遇到的几个问题
- 关于GDI绘制遇到的几个问题
- 几个关于Visual Studio 的小问题(你们会遇到)
- 关于打包遇到的几个问题
- 2014年3月29日 遇到的关于opencv将图像转换为数组的几个问题 包含cvmat 到mat转换
- 遇到的几个关于路径报错的问题
- [置顶] 关于部署hexo到自己的Github博客上遇到的几个问题
- 关于android Listview 使用时遇到的几个问题
- 关于“foreach循环”中遇到的几个问题总结
- #关于apache POI 对Excel的下载 遇到的几个问题总结
- 关于在ubuntu10.04版本(而且该版本安装了OPEN JDK时),安装SUN JAVA遇到了几个问题并且安装成功