这是一篇关于动手制作基于arduino 和12864液晶模块的图形化显示GPS导航系统的帖子,作品效果和成本可能无法和TB上的导航产品媲美,但是动手过程会带给你乐趣和知识。
动手之前最好能具备一些背景知识:
1. arduino 相关基础;
2. 能使用12864 液晶模块;
3. 能够用arduino 通过串口通信获取GPS模块定位信息;
4. 能够用arduino 操作SD卡模块;
搜索论坛即可找到相关内容。
制作所需主要硬件:
1. arduino UNO 1片;
2. 12864 液晶模块 1片;
3. GPS模块1片;
4. SD卡模块及SD卡 1套;
原理:
将地图数据依据瓦片算法存储在SD卡中,通过串口获取GPS定位信息并从中解析出经纬度坐标,依据经纬度坐标读取相应地图数据显示在12864液晶模块上,同时显示定位坐标点。
1. 地图存储算法——瓦片系统(Maps Tile System)
本制作采用的地图数据和地图存储算法来源于微软的bing maps并做了相应修改,具体可参考:
在瓦片系统中地图采用金字塔式的分层存储结构,不同层具有不同级别的地图分辨率(地图精细程度),每一层地图被分割成等像素大小(256X256)的瓦片,算法要解决的问题就是给定经纬度坐标和缩放级别(层索引)得到具体相应的瓦片编号。
在连接[1*]的最后有算法实现的代码可共参考。
2. 针对12864液晶模块的设计
12864液晶模块是128像素宽64像素高的单色液晶显示模块,本制作为了适应模块显示做出了两个设计。
1). 将256X256像素的瓦片裁切成128X64像素大小的8份 子瓦片,如下图所示:
每层每个瓦片均做相应处理。
2). 通过阈值方法将8位png索引图像(bing maps 的道路数据)转换成二进制地图数据文件,为了能够显示原图中的文字信息,采用多阈值提取求或方法提取原地图中背景、地物和标注文字数据,由于标注文字和背景之间的扰动,提取效果有待改进。
显示效果:
arduino 代码说明:
1. 在“LCD12864RSPI” 文件中加入画点函数,减少重绘区域;
2. 使用占用内存小、具有只读能力的SD模块库“petit_fatfs”;
3. 分配1K内存用于地图数据缓存,由于SD卡库只支持8.3文件名,地图数据文件名采用十六进制不定长压缩编码方式命名。
代码下载:
arduinoTile.rar(4.24 KB, 下载次数: 82)LCD12864RSPI.rar(1.86 KB, 下载次数: 60)
petit_fatfs.rar(16.88 KB, 下载次数: 63)
部分代码预览:
生成地图程序(需要连接互联网):
通过设置地图范围经纬度信息获取要使用定位的区域,可通过google earth 等能显示经纬度的软件或网页获取经纬度的最大最小值(上大下小,右大左小),
缩放级别建议设置范围1~15,较大地图范围和较高缩放级别会增加地图下载、显示加载的时间。
maptile.rar(8.73 KB, 下载次数: 60)需要 .net2.0以上库支持。
动手之前最好能具备一些背景知识:
1. arduino 相关基础;
2. 能使用12864 液晶模块;
3. 能够用arduino 通过串口通信获取GPS模块定位信息;
4. 能够用arduino 操作SD卡模块;
搜索论坛即可找到相关内容。
制作所需主要硬件:
1. arduino UNO 1片;
2. 12864 液晶模块 1片;
3. GPS模块1片;
4. SD卡模块及SD卡 1套;
原理:
将地图数据依据瓦片算法存储在SD卡中,通过串口获取GPS定位信息并从中解析出经纬度坐标,依据经纬度坐标读取相应地图数据显示在12864液晶模块上,同时显示定位坐标点。
1. 地图存储算法——瓦片系统(Maps Tile System)
本制作采用的地图数据和地图存储算法来源于微软的bing maps并做了相应修改,具体可参考:
在瓦片系统中地图采用金字塔式的分层存储结构,不同层具有不同级别的地图分辨率(地图精细程度),每一层地图被分割成等像素大小(256X256)的瓦片,算法要解决的问题就是给定经纬度坐标和缩放级别(层索引)得到具体相应的瓦片编号。
在连接[1*]的最后有算法实现的代码可共参考。
2. 针对12864液晶模块的设计
12864液晶模块是128像素宽64像素高的单色液晶显示模块,本制作为了适应模块显示做出了两个设计。
1). 将256X256像素的瓦片裁切成128X64像素大小的8份 子瓦片,如下图所示:
每层每个瓦片均做相应处理。
2). 通过阈值方法将8位png索引图像(bing maps 的道路数据)转换成二进制地图数据文件,为了能够显示原图中的文字信息,采用多阈值提取求或方法提取原地图中背景、地物和标注文字数据,由于标注文字和背景之间的扰动,提取效果有待改进。
显示效果:
arduino 代码说明:
1. 在“LCD12864RSPI” 文件中加入画点函数,减少重绘区域;
2. 使用占用内存小、具有只读能力的SD模块库“petit_fatfs”;
3. 分配1K内存用于地图数据缓存,由于SD卡库只支持8.3文件名,地图数据文件名采用十六进制不定长压缩编码方式命名。
代码下载:
arduinoTile.rar(4.24 KB, 下载次数: 82)LCD12864RSPI.rar(1.86 KB, 下载次数: 60)
petit_fatfs.rar(16.88 KB, 下载次数: 63)
部分代码预览:
生成地图程序(需要连接互联网):
通过设置地图范围经纬度信息获取要使用定位的区域,可通过google earth 等能显示经纬度的软件或网页获取经纬度的最大最小值(上大下小,右大左小),
缩放级别建议设置范围1~15,较大地图范围和较高缩放级别会增加地图下载、显示加载的时间。
maptile.rar(8.73 KB, 下载次数: 60)需要 .net2.0以上库支持。
自制基于arduino的GPS地图导航系统3.0
最后一个版本,主要用来在跑步的时候定位和记录路径。
使用1.8寸TFT屏,128*160分辨率,SPI接口。采用Atmega 328为主控芯片。
5V输入锂电池充电板,系统电压3.3V。
左侧黑色按钮放大,右侧红色按钮缩小,长按红色按钮(>=2秒)录制轨迹,再次长按停止录制。
演示如下:
蓝色的点代表历史路径,刷屏后消失不保存,右下角REC字样表示仪器正在录制轨迹,存在SD卡中。
下部绿色显示经纬度信息,红色显示时间和日期,蓝色显示海拔高度、速度和朝向。从图中历史轨迹点可看出数据漂移较多,原因可能是1.GPS模块精度不高;2.GPS模块应该设置在仪器的上方;3.需要采用滤波算法过滤。
地图数据存在SD卡中,目录结构如下:
TRACK文件为轨迹文件
这是地图下载程序,需要.net Framework 4 支持
Release.rar(1.03 MB, 下载次数: 65)
这是Arduino 程序
appMaster.rar(5.5 KB, 下载次数: 43)
支持的库文件
lib.rar(161.98 KB, 下载次数: 41)
串口速率与GPS模块要设置一致,接线方式如下:
//TFT SDA -> UNO 11
//TFT SCK -> UNO 13
#define TFT_CS 10 // Chip select line for TFT display
#define TFT_A0 9 // Data/command line for TFT
#define TFT_RST 8 // Reset line for TFT (or connect to +5V)
#define TFT_LED A0
#define SD_CS 4 // Chip select line for SD card
//SD MISO -> UNO 12
//SD SCK -> UNO 13
//SD MOSI -> UNO 11
//GPS tx - UNO rx
//GPS rx - UNO tx
#define BTNZOOMIN 2
#define BTNZOOMOUT 3
拨动开关控制电池充电和仪器开关,电池接中间引脚,充电板和仪器电源各接两边。
点击“显示地图”出现地图窗口,地图可能加载较慢,通过鼠标左键拖拽进行平移,鼠标滚轮进行放大缩小,浏览到感兴趣的区域,点击“选择区域”并在地图中点击确定多边形的顶点,双击左键绘制结束,通过绘制多边形确定下载区域,关闭地图窗口,其它参数默认,点击确定并设置下载路径进行下载。将下载路径下的MAP文件夹替换SD卡相应目录下的MAP文件夹即可。
下一步功能,将轨迹上传到网上并可以共享;添加历史轨迹回放功能;实现平滑卷屏效果,不过328的计算能力可能无法满足。
最后一个版本,主要用来在跑步的时候定位和记录路径。
使用1.8寸TFT屏,128*160分辨率,SPI接口。采用Atmega 328为主控芯片。
5V输入锂电池充电板,系统电压3.3V。
左侧黑色按钮放大,右侧红色按钮缩小,长按红色按钮(>=2秒)录制轨迹,再次长按停止录制。
演示如下:
蓝色的点代表历史路径,刷屏后消失不保存,右下角REC字样表示仪器正在录制轨迹,存在SD卡中。
下部绿色显示经纬度信息,红色显示时间和日期,蓝色显示海拔高度、速度和朝向。从图中历史轨迹点可看出数据漂移较多,原因可能是1.GPS模块精度不高;2.GPS模块应该设置在仪器的上方;3.需要采用滤波算法过滤。
地图数据存在SD卡中,目录结构如下:
TRACK文件为轨迹文件
这是地图下载程序,需要.net Framework 4 支持
Release.rar(1.03 MB, 下载次数: 65)
这是Arduino 程序
appMaster.rar(5.5 KB, 下载次数: 43)
支持的库文件
lib.rar(161.98 KB, 下载次数: 41)
串口速率与GPS模块要设置一致,接线方式如下:
//TFT SDA -> UNO 11
//TFT SCK -> UNO 13
#define TFT_CS 10 // Chip select line for TFT display
#define TFT_A0 9 // Data/command line for TFT
#define TFT_RST 8 // Reset line for TFT (or connect to +5V)
#define TFT_LED A0
#define SD_CS 4 // Chip select line for SD card
//SD MISO -> UNO 12
//SD SCK -> UNO 13
//SD MOSI -> UNO 11
//GPS tx - UNO rx
//GPS rx - UNO tx
#define BTNZOOMIN 2
#define BTNZOOMOUT 3
拨动开关控制电池充电和仪器开关,电池接中间引脚,充电板和仪器电源各接两边。
点击“显示地图”出现地图窗口,地图可能加载较慢,通过鼠标左键拖拽进行平移,鼠标滚轮进行放大缩小,浏览到感兴趣的区域,点击“选择区域”并在地图中点击确定多边形的顶点,双击左键绘制结束,通过绘制多边形确定下载区域,关闭地图窗口,其它参数默认,点击确定并设置下载路径进行下载。将下载路径下的MAP文件夹替换SD卡相应目录下的MAP文件夹即可。
下一步功能,将轨迹上传到网上并可以共享;添加历史轨迹回放功能;实现平滑卷屏效果,不过328的计算能力可能无法满足。
自制基于arduino的GPS地图导航系统2.0
主要算法类似。
屏幕采用oled RGB 96*64 ,使用三轴磁阻获取罗盘信息(受周围磁场干扰较大),使用SD卡存储地图数据,使用TinyGPS处理GPS数据。
oled RGB 96*64 使用的是lm095cg-096064
接线方法和代码如下:
代码仅供参考。
感谢 czad 赠送的atmge328p的贴片板和好人做到底的geek精神!
< /endx;i++)
< /endy;k++)
< /w;i++)
< /h;k++)
主要算法类似。
屏幕采用oled RGB 96*64 ,使用三轴磁阻获取罗盘信息(受周围磁场干扰较大),使用SD卡存储地图数据,使用TinyGPS处理GPS数据。
oled RGB 96*64 使用的是lm095cg-096064
接线方法和代码如下:
代码仅供参考。
感谢 czad 赠送的atmge328p的贴片板和好人做到底的geek精神!
< /endx;i++)
< /endy;k++)
< /w;i++)
< /h;k++)