沧海笑1122 发表于 2015-4-12 15:51:02

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

本帖最后由 沧海笑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是一个百搭的平台。

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

沧海笑1122 发表于 2015-4-12 16:10:45

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


分享库\代码\PCB的图:


davidce 发表于 2015-4-12 16:18:54

厉害         

小猪会轮滑 发表于 2015-4-12 16:52:40

l蛮有意思

huang1234 发表于 2015-4-12 23:53:41

好帖,顶!

fuwen0202 发表于 2015-4-13 06:57:26

这个的SD卡库用的是哪个呢?

topdog 发表于 2015-4-13 07:12:01

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

沧海笑1122 发表于 2015-4-13 07:17:14

fuwen0202 发表于 2015-4-13 06:57 static/image/common/back.gif
这个的SD卡库用的是哪个呢?

还是microduino提供的SD卡库。

沧海笑1122 发表于 2015-4-13 07:18:57

topdog 发表于 2015-4-13 07:12 static/image/common/back.gif
看了帖子知道了u-blox M8, 能够同时获取和跟踪不同的 GNSS(全球导航卫星)系统: 并行接收 GPS(QZSS) 和G ...

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

fuwen0202 发表于 2015-4-13 12:15:43

沧海笑1122 发表于 2015-4-13 07:17 static/image/common/back.gif
还是microduino提供的SD卡库。

不是arduino自带的那个sd库么?

suoma 发表于 2015-4-13 15:09:58

             什么GPS模块?

wasdpkj 发表于 2015-4-13 15:58:37

“如果整体超过24小时,就取余数,然后day+1即可”
这个要遇到月底,或者闰年就没法搞了,建议还是把时间转化成ntp时间

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

#include "Arduino.h"

#define TIME_ZONE +8

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


/*==============================================================================*/
/* Useful Constants */
#define SECS_PER_MIN(60UL)
#define SECS_PER_HOUR (3600UL)
#define SECS_PER_DAY(SECS_PER_HOUR * 24UL)
#define DAYS_PER_WEEK (7UL)
#define SECS_PER_WEEK (SECS_PER_DAY * DAYS_PER_WEEK)
#define SECS_PER_YEAR (SECS_PER_WEEK * 52UL)

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

staticconst uint8_t monthDays[]=
{
31,28,31,30,31,30,31,31,30,31,30,31
}; // API starts months from 1, this array starts from 0


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

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

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

// add days for this year, months start from 1
for (i = 1; i < c_Month; i++) {
    if ( (i == 2) && LEAP_YEAR(c_Year)) {
      seconds += SECS_PER_DAY * 29;
    }
    else {
      seconds += SECS_PER_DAY * monthDays;//monthDay array starts from 0
    }
}
seconds+= (c_Day-1) * SECS_PER_DAY;
seconds+= c_Hour * SECS_PER_HOUR;
seconds+= c_Minute * SECS_PER_MIN;
seconds+= c_Second;

seconds-= TIME_ZONE * SECS_PER_HOUR;

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


//timeStamp to RTC
void getDateStamp(uint32_t _getDateStamp)
{
_getDateStamp += TIME_ZONE * SECS_PER_HOUR;

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

Year = 1970;
while(1) {
    uint32_t Seconds;
    if(LEAP_YEAR(Year-1970)) Seconds = SECS_PER_DAY * 366;
    else Seconds = SECS_PER_DAY * 365;
    if(_getDateStamp >= Seconds) {
      _getDateStamp -= Seconds;
      Year++;
    }
    else break;
}

Month = 0;
while(1) {
    uint32_t Seconds = SECS_PER_DAY * monthDays;
    if(LEAP_YEAR(Year-1970) && Month == 1) Seconds = SECS_PER_DAY * 29;
    if(_getDateStamp >= Seconds) {
      _getDateStamp -= Seconds;
      Month++;
    }
    else break;
}
Month++;

Day = 1;
while(1) {
    if(_getDateStamp >= SECS_PER_DAY) {
      _getDateStamp -= SECS_PER_DAY;
      Day++;
    }
    else break;
}

Hour = _getDateStamp / 3600;
Minute = (_getDateStamp - (uint32_t)Hour * 3600) / 60;
Second = (_getDateStamp - (uint32_t)Hour * 3600) - Minute * 60;

/*
Serial.print("week: ");
   Serial.println(Weekday);
   
   Serial.print(Day);
   Serial.print("/");
   
   Serial.print(Month);
   Serial.print("/");
   
   Serial.println(Year);
   
   Serial.print(Hour);
   Serial.print(":");
   
   Serial.print(Minute);
   Serial.print(":");
   
   Serial.println(Second);
   
   Serial.println();
   */
}

wasdpkj 发表于 2015-4-13 15:59:20

topdog 发表于 2015-4-13 07:12 static/image/common/back.gif
看了帖子知道了u-blox M8, 能够同时获取和跟踪不同的 GNSS(全球导航卫星)系统: 并行接收 GPS(QZSS) 和G ...

这么细心,从哪发现的

henrypcw 发表于 2015-4-13 22:09:27

能否做成手机使用它的信号???   手机信号总不好

沧海笑1122 发表于 2015-4-14 09:26:00

suoma 发表于 2015-4-13 15:09
什么GPS模块?

ublox的m8n
页: [1] 2
查看完整版本: Microduino GPS(码表、轨迹记录及最新M8N模块)评测报告