为什么要自己做
现售的专业记录轨迹的设备有很多,从几百元到几千元不等,智能手机也可以记录轨迹,既然可以这么方便的记录轨迹,那自己做轨迹记录仪的好处在哪里呢?
1、智能手机的待机时间是痛点,如果设置不当,自动管理后台应用的程序会让地图软件休眠,导致熄屏的时候没有记录数据。自制设备开机即记录。
2、现售的设备存储空间不是很理想,且操作需要主机菜单点击,存储路点不方便。自制设备一键记录路点。
3、买来的东西没有自己做的东西好玩。
设想的功能:
1、没有屏幕,不显示时间等信息,调试的时候可以使用屏幕,最后成品打包的时候,拿掉屏幕。
2、tf卡读卡器,取数据的时候,把卡拔出来。
3、物理按钮:拨动开关0控制电源、微动开关1控制记录路点、微动开关2控制停止操作tf卡
4、用几个led显示当前状态,led0显示电源接通、led1显示gps信号、led2显示tf卡
5、gps数据纯粹记录log文件,不做任何解析,使用谷歌地球导入文件。
需要的模块:
1、Arduino uno
2、gps模块+天线
3、tf卡模块
4、电池,目前设想是一节18650,到时候还是要看看待机时间。
5、led、按钮等。
逐步实现的代码思路
1. gps
是否解析gps数据,这是两个思路,如果解析,那么,就只需要写入$GPRMC和 GPGGA,按日期为文件名写入tf卡,并节省tf卡的空间,然而tf卡有32GB,完全不需要考虑容量;
不解析就拿不到日期,写入数据的文件就只能按序列编号递增,不便于日后查询。根据从易到难的顺序,我还是先不解析,待调试完毕,第二版增加解析的功能。
初级目标就是把原始的gps 数据写入。这步的问题在于如何设置适当的缓冲区,把串口信息写入tf卡。中间加一个定时器,设定写卡的间隔
2. tf卡
这步没有什么难度,按照官方的例程把线插好,测试一下读写即可。尽量把串口信息缓冲到内存,减少tf卡的频繁操作。卡里放个配置文件,配置记录航点的频率。
3. 按钮
要学一下端口中断,保证系统响应到按钮。这步还是设想。
初级版本的代码
1、gps部分
String s1 = ""; //缓存串口字符
//读取指定长度的串口字符存入s1,如果不解析,直接把s1写入卡中
char st;
while (s1.length() < maxLength)
{
if (Serial.available()) {
st = Serial.read();
s1 += String(st);
}
}
用习惯了c#,回头再用c来编程,处理字符串的时候特别吃力,指针和字符数组看的头大,如果有支持c#的开发板该有多好。还好后来发现arduino支持String类,简化了很多。这里不得不说,arduino只有2kB内存,缓存600B的串口数据就占掉了三分之一。如果减少缓存,就要更加频繁的读写tf卡,现在看看其他的开发板,零知开发板的内存是20kB,是uno的10倍,操作一下gps肯定是够了;nodeMcu的内存是50kB,更是让人激动。不知道这两个板子的上手难度如何,淘宝都已下单,过几天把玩一下。
2、tf卡部分
File f = SD.open(fileWrite, FILE_WRITE);
f.print(s1);
f.close();
if(s1.length() >= maxLength){
s1="";
}
fileWrite是待写入的文件名,由下面的函数判读
String toWriteFile()
{
//如果默认文件不存在,直接返回默认值
if (!SD.exists("gps1001.log"))
{
return String("gps1001.log");
}
for (int i = 1001; i < 9999; i++)
{
//根据递增判断目录中的最大号码的文件名
String n = String("gps") + String(i) + String(".log");
String n2 = String("gps") + String(i + 1) + String(".log");
//Serial.println("check...");
if (SD.exists(n) && (!SD.exists(n2)))
{
//判断当前的最大号码文件的大小,如果过大就递增一个号码
long maxSize = 900000;
File f = SD.open(n);
if (f.size() > maxSize) {
f.close();
return n2;
} else {
f.close();
return n;
}
}
}
}
以上代码已调试完毕,可以完美的记录gps轨迹啦,等新的开发板到货,准备把gps信号解析出来,只记录有效信息。