查看: 6572|回复: 14

DFRobot SIM808 Shield 的 GPS 功能

[复制链接]

该用户从未签到

发表于 2016-12-4 20:54 | 显示全部楼层 |阅读模式
本帖最后由 Zoologist 于 2016-12-4 20:55 编辑

人类对于世界的了解的越多,能够掌握的工具和方法就越多。
曾经读过方舟子写的《相对论有没有用?》【参考1】,让我大吃一惊的是日常用到的GPS就是相对论使用的典型:
“GPS是靠美国空军发射的24颗GPS卫星来定位的(此外还有几颗备用卫星),每颗卫星上都携带着原子钟,它们计时极为准确,误差不超过十万亿分之一,即每天的误差不超过10纳秒(1纳秒等于10亿分之一秒),并不停地发射无线电信号报告时间和轨道位置。这些GPS卫星在空中的位置是精心安排好的,任何时候在地球上的任何地点至少都能见到其中的4颗。GPS导航仪通过比较从4颗GPS卫星发射来的时间信号的差异,计算出所在的位置。
GPS卫星以每小时14000千米的速度绕地球飞行。根据狭义相对论,当物体运动时,时间会变慢,运动速度越快,时间就越慢。因此在地球上看GPS卫星,它们携带的时钟要走得比较慢,用狭义相对论的公式可以计算出,每天慢大约7微秒。
GPS卫星位于距离地面大约2万千米的太空中。根据广义相对论,物质质量的存在会造成时空的弯曲,质量越大,距离越近,就弯曲得越厉害,时间则会越慢。受地球质量的影响,在地球表面的时空要比GPS卫星所在的时空更加弯曲,这样,从地球上看,GPS卫星上的时钟就要走得比较快,用广义相对论的公式可以计算出,每天快大约45微秒。
在同时考虑了狭义相对论和广义相对论后,GPS卫星时钟每天还要快上大约38微秒,这似乎微不足道,但是如果我们考虑到GPS系统必须达到的时间精度是纳秒级的,这个误差就非常可观了(38微秒等于38000纳秒)。如果不校正的话,GPS系统每天将会累积大约10千米的定位误差,是没有用的。为此,在GPS卫星发射前,要先把其时钟的走动频率调慢100亿分之4.465,把10.23兆赫调为10.22999999543兆赫。此外,GPS卫星的运行轨道并非完美的圆形,与地面的距离和运行速度会有所变化,如果轨道偏心率为0.02,时间就会有46纳秒的误差。由于地球的自转,GPS导航仪在地球表面上的位移也会产生误差,例如当GPS导航仪在赤道上,而GPS卫星在地平线上时,由于位移产生的误差将会达到133纳秒。GPS导航仪在定位时还必须根据相对论进行计算纠正这些误差。

我手中的 DFRobot的SIM808 Shield支持GPS功能,这次我们就实验一下这个功能,GPS取得当前的时间和经纬度之后,结果显示在1602液晶上。使用到的硬件包括:
1.       Arduino Uno 1块
2.      DFRobot 的SIM808 Shield 1块
3.      18650 电池组 2块
4.      1602 LCD 一块
5.      亚克力切割的外壳 一对

特别注意的是,必须使用外接电源,USB端口供电不足以驱动模块,特别注意:一定要接上 GPS 天线,否则无法收到信号。

硬件准备妥当之后,先实验直接发送 AT 命令,这个实验不需要SIM卡:
1.      板上开关放置于3号位置
2.      下载 blink 程序(需要不占用 的程序)
3.      外接电源(我用的是2节18650,目前有7.5v左右)
4.      板上开关放置于2号位置
5.      用IDE自带的串口工具,输入 AT  可以看到自动回复 OK,这说明模块本身是正常的
6.      输入AT+CGNSPWR=1命令(打开GPS电源)AT+CGNSTST=1命令(开始从串口接收GPS数据)
7.      下面就可以看到获得的GPS数据了

image001.png

8.     结束的时候,使用AT+CGNSPWR=0命令关断GPS电源。

image002.png
我们在地图上看一下这个位置,很准
image003.png

软件方面需要下载DFRobot_SIM808的库,在https://github.com/DFRobot/DFRobot_SIM808。本文末尾提供了打包好的库文件。可以使用 Sketch->Include library->Add .zip library直接添加。
代码如下:

kittenblock中小学创客名师推荐的图形化编程软件

#include <LiquidCrystal_I2C.h>
#include <DFRobot_sim808.h>
 
DFRobot_SIM808 sim808(&Serial);
 
// Set the LCD address to 0x3F for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x3f, 16, 2);
 
void setup() {
    Serial.begin(9600);
 
    // initialize the LCD
    lcd.begin();
 
    // Turn on the blacklight and print a message.
    lcd.backlight();
  
    //************* Turn on the GPS power************
    if( sim808.attachGPS())
      {
        Serial.println("Open the GPS power success");
        lcd.print("power success");
      }
    else
      {    
        Serial.println("Open the GPS power failure");
        lcd.print("power failure");        
      }
}
 
void loop() {
     char s[20];    
     //************** Get GPS data *******************
     if (sim808.getGPS()) {
      Serial.print(sim808.GPSdata.hour);
      Serial.print(":");
      Serial.print(sim808.GPSdata.minute);
      Serial.print(":");
      Serial.println(sim808.GPSdata.second);
      Serial.print("latitude :");
      Serial.println(sim808.GPSdata.lat);
      Serial.print("longitude :");
      Serial.println(sim808.GPSdata.lon);
 
      lcd.clear(); 
      lcd.print("GPS     bbdebbbbbbbhhh             b        "); 
      lcd.print(sim808.GPSdata.hour);  
      lcd.print(":"); 
      lcd.print(sim808.GPSdata.minute); 
      lcd.print(":"); 
      lcd.print(sim808.GPSdata.second);
      
 
      lcd.setCursor(0,1);
      lcd.print("(");
      dtostrf(sim808.GPSdata.lat,3,2,s);
      lcd.print(s);
      lcd.print(",");
      dtostrf(sim808.GPSdata.lon,3,2,s);
      lcd.print(s);
      lcd.print(")");
 
      //************* Turn off the GPS power ************
      sim808.detachGPS();
    }
 
  }
最终运行结果:


image004.png

IMG_20161204_201131.jpg

最后说点关于GPS 好玩的事情:
第一件事情:我在昆山打工的时候,有一天瞎溜达,走到一座大桥下,看到上面铭牌上刻着经纬度。那是很久以前的事情,久远到google还没有被封,手机还没有GPS 功能。我很好奇的记下了经纬度。回去宿舍在googlemap上查找这个经纬度,非常疑惑的看着坐标飞到了太平洋中。朱多年来心中疑惑一直没有解开:这样的标注是为了“乱了敌人锻炼了群众”吗?
第二件事情: 198391日清晨(UTC时间为831日傍晚),大韩航空007号班机进入苏联领空,遭苏联空军Su-15拦截机击落于库页岛西南方的公海。误入的原因是机长操作失误,没有切换到正确的导航模式【参考2】。这件事情之后美国宣布开放部份的GPS功能给民间使用
参考:
1.     http://view.news.qq.com/a/20090422/000029.htm 方舟子:相对论有没有用?
借用臧克家的一句话来描述方舟子有的人死了,他还活着;有的人或者,他已经敏感字了
如果非说苏联伟大的话,那么伟大的原因一定是它一次次将人类从自己的魔爪下解救出来。

DFRobot_SIM808-master.zip (23.02 KB, 下载次数: 52)
打赏作者鼓励一下!

1人打赏

  • TA的每日心情
    擦汗
    2017-8-16 16:44
  • 签到天数: 229 天

    [LV.7]常住居民III

    发表于 2016-12-5 09:13 | 显示全部楼层
    谢谢分享               
  • TA的每日心情

    2018-1-11 13:58
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2016-12-5 10:42 | 显示全部楼层
    后面的2个小故事好有意思,特别是“”乱了敌人锻炼了群众“”~~哈哈哈哈哈哈
    打赏作者鼓励一下!
  • TA的每日心情
    无聊
    2017-3-25 10:02
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2017-3-25 15:30 | 显示全部楼层
    您好呀,请问您写的DFRobot SIM808电路板的文章对MEGA 和SIM808电路板适用吗为啥我接好电路板发送AT指令但是没收到OK呀

    该用户从未签到

     楼主| 发表于 2017-3-25 21:37 | 显示全部楼层
    lorjinn 发表于 2017-3-25 15:30
    您好呀,请问您写的DFRobot SIM808电路板的文章对MEGA 和SIM808电路板适用吗为啥我接好电路板发送AT指令但 ...

    你是不是搞错uart port了?
    打赏作者鼓励一下!

    该用户从未签到

    发表于 2017-9-28 16:04 | 显示全部楼层
    楼主 我想问下 你的AT指令是发送到电脑的默认串口吗   我最近也在调SIM808  如果可以的话能加qq3431978399指导下吗

    该用户从未签到

     楼主| 发表于 2017-9-28 17:04 | 显示全部楼层
    zjj178360360 发表于 2017-9-28 16:04
    楼主 我想问下 你的AT指令是发送到电脑的默认串口吗   我最近也在调SIM808  如果可以的话能加qq3431978399 ...

    我最开始的实验是 Usb 转串口的模块,你碰到什么具体问题了?
    打赏作者鼓励一下!
  • TA的每日心情
    郁闷
    2018-1-31 22:45
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2018-2-7 15:30 | 显示全部楼层
    Zoologist 发表于 2017-9-28 17:04
    我最开始的实验是 Usb 转串口的模块,你碰到什么具体问题了?

    请问lz是怎么解析GPS数据的呀      怎么转换坐标可以在准确的定位呢

    该用户从未签到

     楼主| 发表于 2018-2-7 15:33 | 显示全部楼层
    mhdhyl 发表于 2018-2-7 15:30
    请问lz是怎么解析GPS数据的呀      怎么转换坐标可以在准确的定位呢

    解析是直接用库做的,具体没算过

    你的问题是获得的坐标在 baidu地图之类上“对不准”吗?
    打赏作者鼓励一下!
  • TA的每日心情
    郁闷
    2018-1-31 22:45
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2018-2-8 11:22 | 显示全部楼层
    mhdhyl 发表于 2018-2-7 15:30
    请问lz是怎么解析GPS数据的呀      怎么转换坐标可以在准确的定位呢

    我将模块接受到的GPS数据输入到一个远程定位测试工具上转化成百度坐标,但是转化后的百度坐标在百度地图上的误差达到了几十米,但是用换算后的坐标在google earth上定位却更准。
    请问楼主是用什么库做的呀
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    有没人做过把arduino跟生物结合起来做课题的
    有没人做过把arduino跟生
    我想做一些这方面的有没有人做过可以稍微指点一下
    跪求,nano读两个软串口传感器,写入sd卡,一个读不到数
    跪求,nano读两个软串口传
    dfrobot的nano板,两个软串口连接攀藤pm2.5传感器和GPS ublox m8n,SPI连sd卡模块。
    Arduino2560/MegaPi与ROS机器人操作系统的连接
    Arduino2560/MegaPi与ROS
    大家好,我因为需要更多时间维系琐碎平凡的工作和生活,一段时间没有上Arduino论坛。
    atmegu328p开发板怎么做流水灯啊
    atmegu328p开发板怎么做流
    我是白小 求指点
    BuddyBlock 1.0.0 测试版发布,一款面向Arduino的图形化开发工...
    BuddyBlock 1.0.0 测试版
    BuddyBlock是一款面向Arduino图形化编程开发的集成开发工具,开发者可以通过积木模块
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表