|
在此之前, 制作过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打印 - 设计
最初设计多层
第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一下:
复制代码
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 -> BB -> 1
- */
- void connectToApp(){
- int wait_time = 0;
- boolean isTry = 0;
- while(wait_time<=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<=5){
- getBluetoothData();
- if(_comdata.length()>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>5)Serial.println("time out");
- }</font>
复制代码
- 蓝牙连接成功时, 开始上传TF卡中的数据, 上传成功的话自动清除本地数据. (...................代码上传多次,排版全乱,只好删除, 要看代码的请在文后下载)
5.完整流程图
实物效果图
主控没螺丝孔, 暂时固定不了
换个角度
最后展示一下周末收集的数据效果图
附上程序以及一些实用资料
|
[mw_shl_code=applescript,true]
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();[/mw_shl_code]