查看: 10913|回复: 21

Bluno Beetle免费试用 - 交作业 - 便携GPS

[复制链接]
本帖最后由 visionsl 于 2016-5-4 11:29 编辑

在此之前, 制作过GPRS+GPS实时获取卫星坐标上传服务器, 显示轨迹的例子, 但很不幸地, 因未考虑车辆输出电流过大的问题, 测试几天后GPRS因电流过大烧(炸)了...


停滞了一段时间后, 正巧碰上DFRobot开展Bluno beetle免费试用被我申请试用成功!(在此感谢@Ashley), 于是把剩下的GPS ublox模块利用上, 主控换成Bluno beetle, 再加上一个普通的TF读卡模块开工!(这货适合于无手机, 或无手机信号时, 又需要记录GPS轨迹的地方)
有了蓝牙, 一下子解决了数据联网上传的问题


使用场景介绍:

场景一: 室外,且无手机
    便携GPS插上电池(充电宝)在室外活动, 收集坐标数据,记录轨迹.​

场景二: 室外/室内, 有手机​​
    便携GPS发现有配对成功的手机在通信范围, 互相握手成功, 便携GPS把存在TF卡上的数据传输给手机, 手机接收完毕后自动上传到云服务器

最后通过WEB可以查看地图上的活动轨迹​.


所需材料:
Bluno Beetle主控
GPS ublox模块 NEO-6M
Risym Micro SD卡模块 TF卡读写卡器 SPI接口​
TF卡一枚
220欧姆电阻
蓝色LED
固定底座(3D打印)​​
Android手机一部​(注:需支持蓝牙4.0以上)

3D打印 - 设计

design.jpg
最初设计多层


design_2.jpg
第2版, 加高了底座


IMG_1776.JPG
正面, GPS/TF模块螺丝孔


IMG_1777.JPG
底面



​​

接线设计:
Bluno Beetle​      GPS
​​4                         RX
5                         TX
5V                       VCC
GND                    GND


Bluno Beetle​​​       TF模块(SPI)
5V                       VCC
​GND                    GND​
SCK                     SCK
MOSI                  MOSI
MISO                  MISO
3                         CS​

Bluno Beetle       LED
2​                         电阻-LED正极(长脚)
GND                   LED负极​


附上Bluno Beetle的SPI接线图

QQ截图20160122120038.jpg
此处焊点较小, 需小心处理


QQ图片20160504101523.jpg
上一张焊接细节


程序:

这里主要讲几个细节, 有兴趣的小伙伴想要完整程序请在文后下载​

1.​在Setup里, 对TF卡模块需要检测有效性:


  1.   if (!SD.begin(3)) {
  2.     while(!SD.begin(3)){ledFlicker(2);delay(1000);}
  3.   }  
复制代码



2.由于GPS接的是软串口, 考虑到串口监听的问题, 需要在调用GPS时先Listen一下:


  1. gps.listen();delay(2);
复制代码



​3.GPS数据抓去以及模块的一些简单知识
NMEA-0183 协议简介
NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备 制定的标准格式。目前业已成了GPS导航设备统一的RTCM(Radio Technical Commission for Maritime services)标准协议。
NMEA-0183协议采用ASCII码来传递GPS定位信息,我们称之为帧。
帧格式形如:$aaccc,ddd,ddd,„,ddd*hh(CR)(LF)
GPS模块会返回多种不同的帧数据,我们在本例中重点关注$GPRMC:
$GPRMC(推荐定位信息,Recommended Minimum Specific GPS/Transit Data)
$GPRMC语句的基本格式如下:
$GPRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF)
(1) UTC时间,hhmmss(时分秒)
(2) 定位状态,A=有效定位,V=无效定位
(3) 纬度ddmm.mmmmm(度分)
(4) 纬度半球N(北半球)或S(南半球)
(5) 经度dddmm.mmmmm(度分)
(6) 经度半球E(东经)或W(西经)
(7) 地面速率(000.0~999.9节)
(8) 地面航向(000.0~359.9度,以真北方为参考基准)
(9) UTC日期,ddmmyy(日月年)
(10)磁偏角(000.0~180.0度,前导位数不足则补0)
(11) 磁偏角方向,E(东)或W(西)
(12) 模式指示(A=自主定位,D=差分,E=估算,N=数据无效)
举例如下: ​
$GPRMC,023543.00,A,2308.28715,N,11322.09875,E,0.195,,240213,,,A*78​

​从GPS模块中取数据代码如下(本例中只取$GPRMC数据):
(...................代码上传多次,排版全乱,只好删除, 要看代码的请在文后下载)



​4.蓝牙模块部分
此部分涉及到与手机App交互, 较为复杂​

4.1 手机App部分
     - App驻留后台自动运行, 并自动搜索便携GPS是否在附近, 如果在, 则发送握手指令, 如果握手成功, 则开始接收数据​存放在手机中
     - ​每天在固定时间,把存在手机中的数据上传到云服务器

4.2 便携GPS部分
     蓝牙通信由于直接连接在Atmega328的串口上的, 所以在透传模式下, 直接调用Serial.print和Serial.write就能把数据通过蓝牙传输出去, 相当方便.
     - ​监听蓝牙信号, 如果发现有握手请求, 则应答并完成握手过程

  1. <font color="rgb(51, 51, 51)">
  2. /**
  3. * try connect to app, shake hands
  4. * flow:  AA -&gt; BB -&gt; 1
  5. */
  6. void connectToApp(){
  7.     int wait_time = 0;
  8.     boolean isTry = 0;
  9.     while(wait_time&lt;=2){
  10.       getBluetoothData();                   //listen app shake hands 'AA'
  11.       if(_comdata=="A"){isTry=1;break;}     //is not shake hands data
  12.       wait_time++;
  13.       delay(1000);
  14.     }
  15.     //Serial.print("isTry:");Serial.println(isTry);
  16.     if(isTry!=1)return;
  17.     wait_time=0;
  18.     delay(100);Serial.println("!B#");         //握手请求
  19.     while(wait_time&lt;=5){
  20.       getBluetoothData();
  21.       if(_comdata.length()&gt;2)_comdata=_comdata.substring(0,2);
  22.       if(_comdata=="1"){            //成功连接通信
  23.         _is_connect = 1;
  24.         Serial.print("Bluetooth build communication successfully.");
  25.         break;
  26.       }
  27.       wait_time++;delay(1000);
  28.     }
  29.     if(wait_time&gt;5)Serial.println("time out");
  30. }</font>
复制代码


     - ​蓝牙连接成功时, 开始上传TF卡中的数据, 上传成功的话自动清除本地数据.​
         (...................代码上传多次,排版全乱,只好删除, 要看代码的请在文后下载)


5.完整流程图​

flow.png


实物效果图

IMG_1778.JPG
主控没螺丝孔, 暂时固定不了


IMG_1779.JPG
换个角度


​最后展示一下周末收集的数据效果图

guiji.png

附上程序以及一些实用资料

Bluno Beetle 原理图.pdf (117.33 KB, 下载次数: 74)

visionsl  高级技师
 楼主|

发表于 2016-5-4 11:21:57

这个排版我也是醉了....修正中
回复 支持 反对

使用道具 举报

virtualwiz  版主

发表于 2016-5-4 13:22:35

外壳大赞~
回复 支持 反对

使用道具 举报

大连林海  初级技神

发表于 2016-5-4 13:44:30

超级牛掰
回复 支持 反对

使用道具 举报

dsweiliang  版主

发表于 2016-5-4 13:46:44

原来楼主住在天河区的啊
回复 支持 反对

使用道具 举报

visionsl  高级技师
 楼主|

发表于 2016-5-4 14:22:51

dsweiliang 发表于 2016-5-4 13:46
原来楼主住在天河区的啊

暴露了...
回复 支持 反对

使用道具 举报

gray6666  高级技匠

发表于 2016-5-5 10:38:04

大牛。。。
回复 支持 反对

使用道具 举报

gray6666  高级技匠 来自手机

发表于 2016-5-6 21:19:45

我的手机4.0蓝牙需要密码连接,请问你遇到了吗?
回复 支持 反对

使用道具 举报

visionsl  高级技师
 楼主|

发表于 2016-5-9 10:22:01

gray6666 发表于 2016-5-6 21:19
我的手机4.0蓝牙需要密码连接,请问你遇到了吗?

默认密码是: 123456
回复 支持 反对

使用道具 举报

萝卜  学徒

发表于 2016-5-14 17:43:31

学习了~
回复 支持 反对

使用道具 举报

dbc0301  初级技匠

发表于 2016-7-7 00:20:21

厉害,厉害。。。
回复 支持 反对

使用道具 举报

alieqiulijun  学徒

发表于 2016-9-20 15:36:43

下载看看
回复 支持 反对

使用道具 举报

alieqiulijun  学徒

发表于 2016-9-20 15:37:34

看起来不是很难,感谢分享。
回复 支持 反对

使用道具 举报

kongmeng  见习技师

发表于 2016-11-5 19:55:13

请问 是那个版本的IDE?

点评

1.6,但应该都可以的  发表于 2016-11-7 13:31
回复 支持 反对

使用道具 举报

lxr825078803  见习技师

发表于 2017-3-30 09:46:53

我想问一下,在地图上描点是怎么弄的,用了什么软件吗

点评

百度地图API  发表于 2017-4-18 10:07
回复 支持 反对

使用道具 举报

小芒果超人  学徒

发表于 2017-5-30 16:03:06

膜拜 还想请问一下楼主,传递数据的速度快吗? 你一共传了多少数据呢?
回复 支持 反对

使用道具 举报

xiaobudian  见习技师

发表于 2017-10-11 03:05:29

值得研究
回复 支持 反对

使用道具 举报

李旭东  学徒

发表于 2017-11-16 09:43:11

我想请教一下,我看楼主在上面说用的百度地图的API,GPS定位坐标和百度地图坐标之间不是要转换的吗,楼主是怎样转换的,那个转换公式能给我吗,或者当时的解决办法。谢谢了
回复 支持 反对

使用道具 举报

visionsl  高级技师
 楼主|

发表于 2017-11-21 12:41:37

李旭东 发表于 2017-11-16 09:43
我想请教一下,我看楼主在上面说用的百度地图的API,GPS定位坐标和百度地图坐标之间不是要转换的吗,楼主是 ...

是用了一个translateCallback的方法, 给你一个我用的样例代码
[AppleScript] 纯文本查看 复制代码
    translateCallback = function (data) {
        if (data.status === 0) {
            bm.clearOverlays();
            bm.setCenter(data.points[0], 15);
            marker = new BMap.Marker(data.points[0]);
            bm.addOverlay(marker);
            marker.setAnimation(BMAP_ANIMATION_BOUNCE); //跳动的动画
            var labelgg = new BMap.Label("i30现在的位置"+_center_time, {offset: new BMap.Size(20, -10)});
            marker.setLabel(labelgg);
        }
    }

    var _center_lat = 0;var _center_lng=0; var _center_time=0;
    function loadGPS() {
        $.getJSON("/nj/iot/gps/tracert_realgps", function (data) {

            _center_lat = data.lat;
            _center_lng = data.lng;
            _center_time = data.record_time;
            //转换坐标为百度系
            ggPoint = new BMap.Point(_center_lng, _center_lat);
            var arr = new Array();
            var convertor = new BMap.Convertor();
            arr.push(ggPoint);
            convertor.translate(arr, 1, 5, translateCallback);

            setTimeout("loadGPS()", 10000);
        });
    }
    loadGPS();
回复 支持 反对

使用道具 举报

 学徒

发表于 2018-12-21 12:29:07

楼主我想问下你最后的轨迹是怎么弄出来的啊?如何把GPS获取的坐标在百度地图上显示出来并且标记成轨迹啊?
回复 支持 反对

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail