极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 57149|回复: 25

Microduino GPS(码表、轨迹记录及最新M8N模块)评测报告

[复制链接]
发表于 2015-4-12 15:51:02 | 显示全部楼层 |阅读模式
本帖最后由 沧海笑1122 于 2015-4-12 18:17 编辑

Microduino GPS(码表、轨迹记录及最新M8N模块)评测报告

一、        评测项目名称及基本情况
项目名称:Microduino GPS评测
时间:2015-01~04 (04月以前使用ublox 7n模块,0401~0412使用最新的Microduino Ublox-M8n模块)
评测内容:A、使用Microduino硬件以及代码,利用第三方ublox 7n模块,自制GPS记录仪,对代码、GPS库以及硬件进行整体测试。
          B、对Microduino最新研制的 Ublox-M8n GPS模块进行评测,使用了自制的记录盒平台,Microduino Cube-V1框架对三种GPS解析库进行评测。
二、关于评测A的情况介绍
(一)硬件:Microduino core+(644,5V,16M);OLED模块,电源管理BM模块,FT232模块;第三方ublox 7n模块、SD存储模块。洞洞板、500MAH锂电池。
(二)软件:Microduino老潘兄代码,来自GITHUB;洞洞板绘图软件(LM4.0)
(三)制作过程:
1、利用面包板搭建原型,验证代码;
2、利用U center 8.10软件测试ublox 7n模块工作正常。
3、整体设计:原理图、洞洞板布局图绘制、记录盒壳体选择,各元器件位置布局;







(四)评测情况及主要问题:
1、通过徒步、驾车进行测试。可以将gps模块测量的经纬度以及速度数据记录在SD模块,并且在OLED模块显示;
2、通过google earth进行路径回放。(结果同后图)
3、使用情况:上电后,红色LED闪烁,说明开始读取GPS数据,搜星正常后,绿色LED闪动,并且已经开始记录数据。按动按键可以切换至下一段记录。使用比较便捷,代码编写可读性很强。Microduino的堆叠很方便。

4、存在的主要问题:
(1)在2015年1月前测试过程中,GPS数据在记录过程中存在较大跳变现象。一是跳变很大,比如经纬度可以直接跳变到0左右,形成了坏数据;二是出现的频率比较高,在一次开车行驶中,半小时的测试,大约十几次跳变。针对跳变,在代码中采取了一些过滤手段(如根据我所在的城市和活动范围设置粗滤条件,然后根据行车的速度,对超出正常速度的跳变再次过滤);以及滤波手段(如中值滤波);结果有所改进,但没有完全消除数据跳变。还好在新的模块中彻底解决了。
(2)我这个版本使用了洞洞板加飞线的方法,应该说在稳定性上还不是很好,尤其是我的ublox 7n模块采用了外置,也就是说将TX,VCC,GND三根线用一个USB接口送回来,初衷是在行路过程中,记录盒可以放在包里,而ublox 7n模块和天线可以放在包外。不过我采用了USB接口,连接不够紧密,出现过数据掉线的情况。因此在硬件上还是比较粗的。下一步还是要考虑画PCB,模块的连接采用microUsb或者直接在PCB上固定。
(3)SD记录模块刚开始采用第三方的,比较笨重,排母连接也不是很可靠;优点是SD大卡容易从盒子中取出。后来使用Microduino的TF模块,很精巧,不过每次记录后TF卡取出不方便,这个问题是难以兼顾的,体积和使用的便利性。
(4)同样的便利性问题,还出现在BM模块的电源开关上。BM模块不可以使用外接开关,一旦外接开关掉电BM模块必须用microusb重启;使用过程中不是很方便,每次在盒子里打开电源就需要用尖锐物体伸进去拨动。如同上一个问题,也是袖珍体积和便利性的兼顾问题。
三、        关于评测B的情况说明
(一)硬件:Microduino core+(644,5V,16M);OLED模块FT232模块; ublox 8MN模块、CUBE V1框架(带键盘)以及小米移动电源(5000MAH)。
(二)软件:首先是三种GPS解析库,1、老潘兄提供的官方测试解析库;2、TINYGPS+库;3、在arduino.cc找到的Ublox M8N的解析库;
           其次是ublox官方的设置软件,U center 8.15
(三)制作过程:
1、寄来的Microduino分体包装,比较精致、开袋后一如既往地精美,第三张图右上角是我第一版做的盒子。(开袋前后图,小资了一下,放了几片玉兰)




2、V1框架实在便捷,几分钟就搭建起来;再加上一个小米的移动电源(因为我带来的500MAH锂电池接口对不上,我手头没有烙铁所以只能用成品移动电源,但是看上去还是挺搭的,室内拍摄OLED会出现屏幕不完整,肉眼看不出)


3、利用U center 8.15软件测试ublox M8N模块工作正常。
   ublox M8N模块依旧精致,与现有的6M模块在外观上没有太大区别,陶瓷天线是和小板分离的,便于使用。

4、分别对三种库进行测试。

(四)评测情况及主要问题:
1、根据老潘兄提供的官方库(也是基于Adafruit_GPS库基础上修改的库),工作稳定,静态下1~2分钟搜星,热态下5~10秒就可以。和OLED做了一个显示配合,显示时间、经纬度以及速度,不过经纬度没有做进一步转换,现在看到的还是DDMM.MMMM格式,需要进行一个转换即可,老潘兄代码中有详细的过程。其次对东八区的时间做了一个修订,在GPS标准时间加了8小时,如果整体超过24小时,就取余数,然后day+1即可。

2、根据TINYGPS+的官方库,测试Microduino Ublox-M8n GPS模块,功能同上,由于tinygps带有distance函数,所以顺手增加了一个测距功能,使用V1的中间按钮触发,从按钮按动时刻开始计算并且累加行进距离。我在外面走了近2公里,分几段测试.实测情况看,运行顺畅,测距准确(和手机APP对比)。

3、根据arduino.cc论坛网友提供的解析库,在PC上联测过,经纬度、海拔、可用卫星数量正常。没有做进一步测试,因为这个库比较轻量级.有兴趣的极客可以继续探索。

(静止下测试轨迹,这个飘移是正常的,在移动过程中就没有了)

(徒步路测、SD存储后,google earth展示,数据跳变的问题不存在了,这是一个天大的好消息啊)

谈谈我的看法吧:有人说microduino只适合做原型搭建以及特定的场合(比如秃鹫鸟蛋计划,对体积功耗有苛刻限制),而不适合做极客作品。这一点我倒不太认同。其实Microduino的特点除了袖珍以外,统一的接口、堆叠是最大的亮点。你尽可以把core当作一片IC使用,正如我的图中所示,加一点外围电路就可以实现了。至于我刚才谈到的TF模块和BM模块,在兼顾体积的同时要放弃一些便利性,如果做成品,也难不住大多数极客,比如那个BM电源开关,也是可以引出来的。Microduino提供了这样的硬件,提供了如此优好的社区,就是给了极客们各种运用的空间,没有万能的、适用所有用途硬件,过去没有、将来很难说会有,所以根据你的用途选择硬件、平台更为合适,而不是要求Microduino是一个百搭的平台。

附件:
评测中使用的库、代码、洞洞板布线图全部打包,分享给大家。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2015-4-12 16:10:45 | 显示全部楼层
(徒步路测、SD存储后,google earth展示,数据跳变的问题不存在了,这是一个天大的好消息啊)


分享库\代码\PCB的图:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2015-4-12 16:18:54 | 显示全部楼层
厉害         
回复 支持 反对

使用道具 举报

发表于 2015-4-12 16:52:40 | 显示全部楼层
l蛮有意思
回复 支持 反对

使用道具 举报

发表于 2015-4-12 23:53:41 | 显示全部楼层
好帖,顶!
回复 支持 反对

使用道具 举报

发表于 2015-4-13 06:57:26 | 显示全部楼层
这个的SD卡库用的是哪个呢?
回复 支持 反对

使用道具 举报

发表于 2015-4-13 07:12:01 | 显示全部楼层
看了帖子知道了u-blox M8, 能够同时获取和跟踪不同的 GNSS(全球导航卫星)系统: 并行接收 GPS(QZSS) 和GLONASS 或 BeiDou,或同时接收 GLONASS 和 BeiDou。此平台专门适应于即使在 GPS 信号差的环境下(尤其是城市峡谷)都需要最高的可用性和准确性的高性能应用。
Microduino确实是极客的好玩具!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-13 07:17:14 | 显示全部楼层
fuwen0202 发表于 2015-4-13 06:57
这个的SD卡库用的是哪个呢?

还是microduino提供的SD卡库。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-13 07:18:57 | 显示全部楼层
topdog 发表于 2015-4-13 07:12
看了帖子知道了u-blox M8, 能够同时获取和跟踪不同的 GNSS(全球导航卫星)系统: 并行接收 GPS(QZSS) 和G ...

谢谢您的背景介绍,帖子对这个有疏漏。本次测试使用的还是GPS,会继续对北斗的测试。
回复 支持 反对

使用道具 举报

发表于 2015-4-13 12:15:43 | 显示全部楼层
沧海笑1122 发表于 2015-4-13 07:17
还是microduino提供的SD卡库。

不是arduino自带的那个sd库么?
回复 支持 反对

使用道具 举报

发表于 2015-4-13 15:09:58 | 显示全部楼层
             什么GPS模块?
回复 支持 反对

使用道具 举报

发表于 2015-4-13 15:58:37 | 显示全部楼层
“如果整体超过24小时,就取余数,然后day+1即可”
这个要遇到月底,或者闰年就没法搞了,建议还是把时间转化成ntp时间

下面是我整理的一些代码:
在里面先用“getTimeStamp(Hour,Minute,Second,Day,Month,Year)”得到当前TimeStamp时间,加/减去时区的秒数,再将新的TimeStamp带入getDateStamp()函数,就可以得到正确的日期/时间了。

  1. #include "Arduino.h"

  2. #define TIME_ZONE +8

  3. int Year,Month,Day,Hour,Minute,Second,Weekday;


  4. /*==============================================================================*/
  5. /* Useful Constants */
  6. #define SECS_PER_MIN  (60UL)
  7. #define SECS_PER_HOUR (3600UL)
  8. #define SECS_PER_DAY  (SECS_PER_HOUR * 24UL)
  9. #define DAYS_PER_WEEK (7UL)
  10. #define SECS_PER_WEEK (SECS_PER_DAY * DAYS_PER_WEEK)
  11. #define SECS_PER_YEAR (SECS_PER_WEEK * 52UL)

  12. #define LEAP_YEAR(Y)     ( ((1970+Y)>0) && !((1970+Y)%4) && ( ((1970+Y)%100) || !((1970+Y)%400) ) )

  13. static  const uint8_t monthDays[]=
  14. {
  15.   31,28,31,30,31,30,31,31,30,31,30,31
  16. }; // API starts months from 1, this array starts from 0


  17. //RTC to timeStamp
  18. uint32_t getTimeStamp(int c_Hour,int c_Minute,int c_Second,int c_Day, int c_Month, int c_Year)
  19. {
  20.   c_Year -= 1970;

  21.   // assemble time elements into time_t
  22.   // note year argument is offset from 1970 (see macros in time.h to convert to other formats)
  23.   // previous version used full four digit year (or digits since 2000),i.e. 2009 was 2009 or 9
  24.   int i;
  25.   uint32_t seconds;

  26.   // seconds from 1970 till 1 jan 00:00:00 of the given year
  27.   seconds= c_Year*(SECS_PER_DAY * 365);
  28.   for (i = 0; i < c_Year; i++) {
  29.     if (LEAP_YEAR(i)) {
  30.       seconds +=  SECS_PER_DAY;   // add extra days for leap years
  31.     }
  32.   }

  33.   // add days for this year, months start from 1
  34.   for (i = 1; i < c_Month; i++) {
  35.     if ( (i == 2) && LEAP_YEAR(c_Year)) {
  36.       seconds += SECS_PER_DAY * 29;
  37.     }
  38.     else {
  39.       seconds += SECS_PER_DAY * monthDays[i-1];  //monthDay array starts from 0
  40.     }
  41.   }
  42.   seconds+= (c_Day-1) * SECS_PER_DAY;
  43.   seconds+= c_Hour * SECS_PER_HOUR;
  44.   seconds+= c_Minute * SECS_PER_MIN;
  45.   seconds+= c_Second;

  46.   seconds-= TIME_ZONE * SECS_PER_HOUR;

  47.   //  Serial.print("Current date and time:");
  48.   //  Serial.println(seconds);
  49.   return seconds;
  50. }


  51. //timeStamp to RTC
  52. void getDateStamp(uint32_t _getDateStamp)
  53. {
  54.   _getDateStamp += TIME_ZONE * SECS_PER_HOUR;

  55.   unsigned long _weekday = (((_getDateStamp/3600/24)+4)%7);
  56.   Weekday=_weekday;

  57.   Year = 1970;
  58.   while(1) {
  59.     uint32_t Seconds;
  60.     if(LEAP_YEAR(Year-1970)) Seconds = SECS_PER_DAY * 366;
  61.     else Seconds = SECS_PER_DAY * 365;
  62.     if(_getDateStamp >= Seconds) {
  63.       _getDateStamp -= Seconds;
  64.       Year++;
  65.     }
  66.     else break;
  67.   }

  68.   Month = 0;
  69.   while(1) {
  70.     uint32_t Seconds = SECS_PER_DAY * monthDays[Month];
  71.     if(LEAP_YEAR(Year-1970) && Month == 1) Seconds = SECS_PER_DAY * 29;
  72.     if(_getDateStamp >= Seconds) {
  73.       _getDateStamp -= Seconds;
  74.       Month++;
  75.     }
  76.     else break;
  77.   }  
  78.   Month++;

  79.   Day = 1;
  80.   while(1) {
  81.     if(_getDateStamp >= SECS_PER_DAY) {
  82.       _getDateStamp -= SECS_PER_DAY;
  83.       Day++;
  84.     }
  85.     else break;
  86.   }  

  87.   Hour = _getDateStamp / 3600;
  88.   Minute = (_getDateStamp - (uint32_t)Hour * 3600) / 60;
  89.   Second = (_getDateStamp - (uint32_t)Hour * 3600) - Minute * 60;

  90.   /*
  91.   Serial.print("week: ");
  92.    Serial.println(Weekday);
  93.    
  94.    Serial.print(Day);
  95.    Serial.print("/");
  96.    
  97.    Serial.print(Month);
  98.    Serial.print("/");  
  99.    
  100.    Serial.println(Year);
  101.    
  102.    Serial.print(Hour);
  103.    Serial.print(":");
  104.    
  105.    Serial.print(Minute);
  106.    Serial.print(":");
  107.    
  108.    Serial.println(Second);
  109.    
  110.    Serial.println();
  111.    */
  112. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-4-13 15:59:20 | 显示全部楼层
topdog 发表于 2015-4-13 07:12
看了帖子知道了u-blox M8, 能够同时获取和跟踪不同的 GNSS(全球导航卫星)系统: 并行接收 GPS(QZSS) 和G ...

这么细心,从哪发现的
回复 支持 反对

使用道具 举报

发表于 2015-4-13 22:09:27 | 显示全部楼层
能否做成手机使用它的信号???   手机信号总不好
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-14 09:26:00 来自手机 | 显示全部楼层
suoma 发表于 2015-4-13 15:09
什么GPS模块?

ublox的m8n
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 08:24 , Processed in 0.048207 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表