visionsl 发表于 2016-5-4 11:15:42

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

在此之前, 制作过GPRS+GPS实时获取卫星坐标上传服务器, 显示轨迹的例子, 但很不幸地, 因未考虑车辆输出电流过大的问题, 测试几天后GPRS因电流过大烧(炸)了...{:5_161:}
停滞了一段时间后, 正巧碰上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打印 - 设计

最初设计多层


第2版, 加高了底座


正面, GPS/TF模块螺丝孔


底面


​​
接线设计:
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接线图
此处焊点较小, 需小心处理


上一张焊接细节

​​程序:这里主要讲几个细节, 有兴趣的小伙伴想要完整程序请在文后下载​1.​在Setup里, 对TF卡模块需要检测有效性:

if (!SD.begin(3)) {
    while(!SD.begin(3)){ledFlicker(2);delay(1000);}
}


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

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就能把数据通过蓝牙传输出去, 相当方便.
   - ​监听蓝牙信号, 如果发现有握手请求, 则应答并完成握手过程

<font color="rgb(51, 51, 51)">
/**
* try connect to app, shake hands
* flow:AA -&gt; BB -&gt; 1
*/
void connectToApp(){
    int wait_time = 0;
    boolean isTry = 0;
    while(wait_time&lt;=2){
      getBluetoothData();                   //listen app shake hands 'AA'
      if(_comdata=="A"){isTry=1;break;}   //is not shake hands data
      wait_time++;
      delay(1000);
    }
    //Serial.print("isTry:");Serial.println(isTry);
    if(isTry!=1)return;
    wait_time=0;
    delay(100);Serial.println("!B#");         //握手请求
    while(wait_time&lt;=5){
      getBluetoothData();
      if(_comdata.length()&gt;2)_comdata=_comdata.substring(0,2);
      if(_comdata=="1"){            //成功连接通信
      _is_connect = 1;
      Serial.print("Bluetooth build communication successfully.");
      break;
      }
      wait_time++;delay(1000);
    }
    if(wait_time&gt;5)Serial.println("time out");
}</font>

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

5.完整流程图​


​实物效果图
主控没螺丝孔, 暂时固定不了


换个角度

​最后展示一下周末收集的数据效果图{:5_165:}
附上程序以及一些实用资料










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

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

是用了一个translateCallback的方法, 给你一个我用的样例代码

    translateCallback = function (data) {
      if (data.status === 0) {
            bm.clearOverlays();
            bm.setCenter(data.points, 15);
            marker = new BMap.Marker(data.points);
            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();

visionsl 发表于 2019-2-18 17:29:54

绊 发表于 2018-12-21 12:29
楼主我想问下你最后的轨迹是怎么弄出来的啊?如何把GPS获取的坐标在百度地图上显示出来并且标记成轨迹啊? ...

你查一下百度地图的API, 官方有教程的, 不难

李旭东 发表于 2017-11-16 09:43:11

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

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?

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

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

小芒果超人 发表于 2017-5-30 16:03:06

膜拜{:5_190:} 还想请问一下楼主,传递数据的速度快吗? 你一共传了多少数据呢?

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

值得研究

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

楼主我想问下你最后的轨迹是怎么弄出来的啊?如何把GPS获取的坐标在百度地图上显示出来并且标记成轨迹啊?
页: [1] 2
查看完整版本: Bluno Beetle免费试用 - 交作业 - 便携GPS