Arduino自制模型搭建GPS测速仪工具
1、第一,我们先了解一下它原理吧
原理:将地图数据依据瓦片算法存储在SD卡中,通过串口获取GPS定位信息并从中解析出经纬度坐标,依据经纬度坐标读取相应地图数据显示在12864液晶模块上,同时显示定位坐标点。1. 地图存储算法——瓦片系统(Maps Tile System)本制作采用的地图数据和地图存储算法来源于微软的bing maps并做了相应修改,具体可参考:Bing Maps Tile System[1*]Virtual Earth Tile Image URI 参数解析Goolge and Microsoft Map Url Parameters在瓦片系统中地图采用金字塔式的分层存储结构,不同层具有不同级别的地图分辨率(地图精细程度),每一层地图被分割成等像素大小(256X256)的瓦片,算法要解决的问题就是给定经纬度坐标和缩放级别(层索引)得到具体相应的瓦片编号。在连接[1*]的最后有算法实现的代码可共参考。2. 针对12864液晶模块的设计12864液晶模块是128像素宽64像素高的单色液晶显示模块,本制作为了适应模块显示做出了两个设计。


2、第二,搭建测试。
12864液晶模块是128像素宽64像素高的单色液晶显示模块,本制作为了适应模块显示做出了两个设计。1). 将256X256像素的瓦片裁切成128X64像素大小的8份 子瓦片
2). 通过阈值方法将8位png索引图像(bing maps 的道路数据)转换成二进制地图数据文件,为了能够显示原图中的文字信息,采用多阈值提取求或方法提取原地图中背景、地物和标注文字数据,由于标注文字和背景之间的扰动,提取效果有待改进。
效果如下:

3、第三,代码程序。
static void write_command(unsigned char Command_value)
{
digitalWrite(CS, LOW);
digitalWrite(DC, LOW);
DATAPORT2 = (DATAPORT2 & DATA1_MASK) |
(Command_value & DATA2_MASK);
DATAPORT1 = (DATAPORT1 & DATA2_MASK) |
(Command_value & DATA1_MASK); // top 6 bits
digitalWrite(CS, HIGH);
}
/**********************************************
* // Write Data
**********************************************/
static void write_Data(unsigned char Data_value)
{
digitalWrite(CS, LOW);
digitalWrite(DC, HIGH);
DATAPORT2 = (DATAPORT2 & DATA1_MASK) |
(Data_value & DATA2_MASK);
DATAPORT1 = (DATAPORT1 & DATA2_MASK) |
(Data_value & DATA1_MASK); // top 6 bits
digitalWrite(CS, HIGH);
}
/********************************************
* // Draw Picture
********************************************/
static void drawPicFromFlash(uint8_t x0,uint8_t y0,uint8_t w,uint8_t h,const PROGMEM char *c)
{
digitalWrite(DC, LOW); //solve a bug of write_command defore write_data
write_command(0x15); //set column address
write_command(x0); //column address start 00
write_command(x0+w-1); //column address end 95
write_command(0x75); //set row address
write_command(y0); //row address start 00
write_command(y0+h-1); //row address end 63
unsigned char k,i;
for(k=0;k<h;k++)
{
for(i=0;i<w;i++)
{
write_Data(pgm_read_byte(c++));
write_Data(pgm_read_byte(c++));
}
}
}
/********************************************
* // Fill color
********************************************/
static void fill_color (uint8_t startx,uint8_t endx,uint8_t starty,uint8_t endy,unsigned char dat1,unsigned char dat2)
{
digitalWrite(DC, LOW); //solve a bug of write_command defore write_data
write_command(0x15); //set column address
write_command(startx); //column address start 00
write_command(endx-1); //column address end 95
write_command(0x75); //set row address
write_command(starty); //row address start 00
write_command(endy-1); //row address end 63
unsigned char k,i;
for(k=starty;k<endy;k++)
{
for(i=startx;i<endx;i++)
{
write_Data(dat1);
write_Data(dat2);
}
}
}
/********************************************
* // DrawRectangle
********************************************/
static void drawRectangle(unsigned char startx,unsigned char starty,
unsigned char endx,unsigned char endy,
unsigned char BcolorR,unsigned char BcolorB,unsigned char BcolorG,
unsigned char FcolorR,unsigned char FcolorB,unsigned char FcolorG,
boolean isFill)
{
digitalWrite(DC, LOW); //solve a bug of write_command defore write_data
write_command(0x26);
if(isFill)
{
write_command(0x01);
}
else
{
write_command(0x00);
}
write_command(0x22);
write_command(startx);
write_command(starty);
write_command(endx);
write_command(endy);
write_command(BcolorR);
write_command(BcolorB);
write_command(BcolorG);
write_command(FcolorR);
write_command(FcolorB);
write_command(FcolorG);
}


