找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 38020|回复: 30
打印 上一主题 下一主题
收起左侧

自制基于arduino的GPS地图导航系统

  [复制链接]
跳转到指定楼层
楼主
这是一篇关于动手制作基于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并做了相应修改,具体可参考:
Bing Maps Tile System[1*]
Virtual Earth Tile Image URI 参数解析
Goolge and Microsoft Map Url Parameters
在瓦片系统中地图采用金字塔式的分层存储结构,不同层具有不同级别的地图分辨率(地图精细程度),每一层地图被分割成等像素大小(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)
部分代码预览:
  1. //Demo LCD12864 spi


  2. #include "LCD12864RSPI.h"


  3. extern "C"
  4. {
  5. #include  
  6. #include
  7. #include   //not needed yet
  8. #include  //needed for strlen()
  9. #include
  10. }



  11. LCD12864RSPI::LCD12864RSPI()
  12. {
  13. this->DEFAULTTIME = 80; // 80 ms default time
  14. this->delaytime = DEFAULTTIME;
  15. }

  16. //*********************延时函数************************//
  17. void LCD12864RSPI::delayns(void)
  18. {   
  19. delayMicroseconds(delaytime);
  20. }


  21. void LCD12864RSPI::WriteByte(int dat)
  22. {
  23.     digitalWrite(latchPin, HIGH);
  24.     delayns();
  25.     shiftOut(dataPin, clockPin, MSBFIRST, dat);
  26.     digitalWrite(latchPin, LOW);
  27. }


  28. void LCD12864RSPI::WriteCommand(int CMD)
  29. {
  30.    int H_data,L_data;
  31.    H_data = CMD;
  32.    H_data &= 0xf0;           //屏蔽低4位的数据
  33.    L_data = CMD;             //xxxx0000格式
  34.    L_data &= 0x0f;           //屏蔽高4位的数据
  35.    L_data <<= 4;             //xxxx0000格式
  36.    WriteByte(0xf8);          //RS=0,写入的是指令;
  37.    WriteByte(H_data);
  38.    WriteByte(L_data);
  39. }


  40. void LCD12864RSPI::WriteData(int CMD)
  41. {
  42.    int H_data,L_data;
  43.    H_data = CMD;
  44.    H_data &= 0xf0;           //屏蔽低4位的数据
  45.    L_data = CMD;             //xxxx0000格式
  46.    L_data &= 0x0f;           //屏蔽高4位的数据
  47.    L_data <<= 4;             //xxxx0000格式
  48.    WriteByte(0xfa);          //RS=1,写入的是数据
  49.    WriteByte(H_data);
  50.    WriteByte(L_data);
  51. }



  52. void LCD12864RSPI::Initialise()
  53. {
  54.     pinMode(latchPin, OUTPUT);     
  55.     pinMode(clockPin, OUTPUT);   
  56.     pinMode(dataPin, OUTPUT);
  57.     digitalWrite(latchPin, LOW);
  58.     delayns();

  59.     WriteCommand(0x30);        //功能设定控制字
  60.     WriteCommand(0x0c);        //显示开关控制字
  61.     WriteCommand(0x01);        //清除屏幕控制字
  62.     WriteCommand(0x06);        //进入设定点控制字
  63. }


  64. void LCD12864RSPI::CLEAR(void)
  65. {  
  66.     WriteCommand(0x30);//
  67.     WriteCommand(0x01);//清除显示
  68. }


  69. void LCD12864RSPI::DisplayString(int X,int Y,uchar *ptr,int dat)
  70. {
  71.   int i;

  72.   switch(X)
  73.    {
  74.      case 0:  Y|=0x80;break;

  75.      case 1:  Y|=0x90;break;

  76.      case 2:  Y|=0x88;break;

  77.      case 3:  Y|=0x98;break;

  78.      default: break;
  79.    }
  80.   WriteCommand(Y); // 定位显示起始地址

  81.   for(i=0;i<dat;i++)
  82.     {
  83.       WriteData(ptr[i]);//显示汉字时注意码值,连续两个码表示一个汉字
  84.     }
  85. }



  86. void LCD12864RSPI::DisplaySig(int M,int N,int sig)
  87. {
  88.   switch(M)
  89.    {
  90.      case 0:  N|=0x80;break;

  91.      case 1:  N|=0x90;break;

  92.      case 2:  N|=0x88;break;

  93.      case 3:  N|=0x98;break;

  94.      default: break;
  95.    }
  96.   WriteCommand(N); // 定位显示起始地址
  97.   WriteData(sig); //输出单个字符
  98. }

  99. void LCD12864RSPI::DrawPoint(int X,int Y,uchar *p)
  100. {
  101.         int x,y,i;
  102.         int tmp;
  103.       
  104.       if(Y<32)
  105.             {
  106.              x=  0x80;
  107.              y=Y+0x80;
  108.             }
  109.            else
  110.             {
  111.               x= 0x88;
  112.               y=Y-32+0x80;   
  113.             }         
  114.            WriteCommand(0x34);        //写入扩充指令命令
  115.            WriteCommand(y);           //写入y轴坐标
  116.            WriteCommand(x);           //写入x轴坐标
  117.            WriteCommand(0x30);        //写入基本指令命令
  118.            tmp=Y*16;
  119.                    for(i=0;i<round(x 8.0+0.5);i++)
  120.                  {
  121.                     WriteData(p[tmp++]);
  122.           }

  123.         WriteCommand(0x34);        //写入扩充指令命令
  124.         WriteCommand(0x36);        //显示图象
  125. }


  126. void LCD12864RSPI::DrawFullScreen(uchar *p)
  127. {
  128.       int ygroup,x,y,i;
  129.       int temp;
  130.       int tmp;
  131.             
  132.       for(ygroup=0;ygroup<64;ygroup++)           //写入液晶上半图象部分
  133.         {                           //写入坐标
  134.            if(ygroup<32)
  135.             {
  136.              x=0x80;
  137.              y=ygroup+0x80;
  138.             }
  139.            else
  140.             {
  141.               x=0x88;
  142.               y=ygroup-32+0x80;   
  143.             }         
  144.            WriteCommand(0x34);        //写入扩充指令命令
  145.            WriteCommand(y);           //写入y轴坐标
  146.            WriteCommand(x);           //写入x轴坐标
  147.            WriteCommand(0x30);        //写入基本指令命令
  148.            tmp=ygroup*16;
  149.            for(i=0;i<16;i++)
  150.                  {
  151.                     temp=p[tmp++];
  152.                     WriteData(temp);
  153.                }
  154.           }
  155.         WriteCommand(0x34);        //写入扩充指令命令
  156.         WriteCommand(0x36);        //显示图象
  157. }


  158. LCD12864RSPI LCDA = LCD12864RSPI();
复制代码




生成地图程序(需要连接互联网):

通过设置地图范围经纬度信息获取要使用定位的区域,可通过google earth 等能显示经纬度的软件或网页获取经纬度的最大最小值(上大下小,右大左小),

缩放级别建议设置范围1~15,较大地图范围和较高缩放级别会增加地图下载、显示加载的时间。


maptile.rar (8.73 KB, 下载次数: 60) 需要 .net2.0以上库支持。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶 踩1
回复

使用道具 举报

沙发
ID:113207 发表于 2016-4-11 01:35 | 只看该作者
自制基于arduino的GPS地图导航系统2.0
主要算法类似。



屏幕采用oled RGB 96*64 ,使用三轴磁阻获取罗盘信息(受周围磁场干扰较大),使用SD卡存储地图数据,使用TinyGPS处理GPS数据。

oled RGB 96*64 使用的是lm095cg-096064

接线方法和代码如下:
  1.     //OLED LM095CG-096064 - UNO
  2.     //E/RD#(12) - VCC
  3.     //R/W#(13) - GND
  4.     //D/C#(14) - A0
  5.     //RES#(15) - A1
  6.     //CS#(16) - A2
  7.     //D7(4) - 7
  8.     //D6(5) - 6
  9.     //D5(6) - 5
  10.     //D4(7) - 4
  11.     //D3(8) - 3
  12.     //D2(9) - 2
  13.     //D1(10) - 9
  14.     //D0(11) - 8

  15.     /***********************************************************/
  16.     //oled pin define
  17.     /***********************************************************/
  18.     #define CS A2
  19.     #define DC A0
  20.     #define RES A1
  21.     /***********************************************************/
  22.     // special defines for the dataport
  23.     /***********************************************************/
  24.     #define DATAPORT1 PORTD
  25.     #define DATAPIN1 PIND
  26.     #define DATADDR1 DDRD

  27.     #define DATAPORT2 PORTB
  28.     #define DATAPIN2 PINB
  29.     #define DATADDR2 DDRB

  30.     #define DATA1_MASK 0xFC  // top 6 bits
  31.     #define DATA2_MASK 0x03  // bottom 2 bits
复制代码
  1. /* write by davidce
  2. davidce@163.com
  3. 2013.6.10
  4. v1.0
  5. */

  6. //********************************************
  7. //low level function
  8. //********************************************
  9. /**********************************************
  10. * // Write Command
  11. **********************************************/
  12. static void write_command(unsigned char Command_value)
  13. {
  14.   digitalWrite(CS, LOW);
  15.   digitalWrite(DC, LOW);
  16.   DATAPORT2 = (DATAPORT2 & DATA1_MASK) |
  17.     (Command_value & DATA2_MASK);
  18.   DATAPORT1 = (DATAPORT1 & DATA2_MASK) |
  19.     (Command_value & DATA1_MASK); // top 6 bits
  20.   digitalWrite(CS, HIGH);
  21. }
  22. /**********************************************
  23. * // Write Data
  24. **********************************************/
  25. static void write_Data(unsigned char Data_value)
  26. {
  27.   digitalWrite(CS, LOW);
  28.   digitalWrite(DC, HIGH);
  29.   DATAPORT2 = (DATAPORT2 & DATA1_MASK) |
  30.     (Data_value & DATA2_MASK);
  31.   DATAPORT1 = (DATAPORT1 & DATA2_MASK) |
  32.     (Data_value & DATA1_MASK); // top 6 bits
  33.   digitalWrite(CS, HIGH);
  34. }
  35. /********************************************
  36. * // Draw Picture
  37. ********************************************/
  38. static void drawPicFromFlash(uint8_t x0,uint8_t y0,uint8_t w,uint8_t h,const PROGMEM char *c)                                               
  39. {
  40.   digitalWrite(DC, LOW);  //solve a bug of write_command defore write_data
  41.   write_command(0x15); //set column address
  42.   write_command(x0); //column address start 00
  43.   write_command(x0+w-1); //column address end 95
  44.   write_command(0x75); //set row address
  45.   write_command(y0); //row address start 00
  46.   write_command(y0+h-1); //row address end 63

  47.   unsigned char k,i;
  48.   for(k=0;k<h;k++)
  49.   {
  50.     for(i=0;i<w;i++)
  51.     {      
  52.       write_Data(pgm_read_byte(c++));
  53.       write_Data(pgm_read_byte(c++));
  54.     }
  55.   }
  56. }
  57. /********************************************
  58. * // Fill color
  59. ********************************************/
  60. static void fill_color (uint8_t startx,uint8_t endx,uint8_t starty,uint8_t endy,unsigned char dat1,unsigned char dat2)                                               
  61. {
  62.   digitalWrite(DC, LOW);  //solve a bug of write_command defore write_data
  63.   write_command(0x15); //set column address
  64.   write_command(startx); //column address start 00
  65.   write_command(endx-1); //column address end 95
  66.   write_command(0x75); //set row address
  67.   write_command(starty); //row address start 00
  68.   write_command(endy-1); //row address end 63
  69.   unsigned char k,i;
  70.   for(k=starty;k<endy;k++)
  71.   {
  72.     for(i=startx;i<endx;i++)
  73.     {      
  74.       write_Data(dat1);
  75.       write_Data(dat2);
  76.     }
  77.   }
  78. }
  79. /********************************************
  80. * // DrawRectangle
  81. ********************************************/
  82. static void drawRectangle(unsigned char startx,unsigned char starty,
  83. unsigned char endx,unsigned char endy,
  84. unsigned char BcolorR,unsigned char BcolorB,unsigned char BcolorG,
  85. unsigned char FcolorR,unsigned char FcolorB,unsigned char FcolorG,
  86. boolean isFill)
  87. {
  88.   digitalWrite(DC, LOW);  //solve a bug of write_command defore write_data
  89.   write_command(0x26);
  90.   if(isFill)
  91.   {
  92.     write_command(0x01);
  93.   }
  94.   else
  95.   {
  96.     write_command(0x00);
  97.   }
  98.   write_command(0x22);
  99.   write_command(startx);
  100.   write_command(starty);
  101.   write_command(endx);
  102.   write_command(endy);
  103.   write_command(BcolorR);
  104.   write_command(BcolorB);
  105.   write_command(BcolorG);
  106.   write_command(FcolorR);
  107.   write_command(FcolorB);
  108.   write_command(FcolorG);
  109. }
  110. /********************************************
  111. * // cover color format from 888 to 565
  112. ********************************************/
  113. static uint16_t Color565(uint8_t r, uint8_t g, uint8_t b) {
  114.   uint16_t c;
  115.   c = r >> 3;
  116.   c <<= 6;
  117.   c |= g >> 2;
  118.   c <<= 5;
  119.   c |= b >> 3;
  120.   return c;
  121. }
  122. /********************************************
  123. * // DrawLine
  124. ********************************************/
  125. static void drawLine(unsigned char startx,unsigned char starty,
  126. unsigned char endx,unsigned char endy,
  127. unsigned char colorR,unsigned char colorB,unsigned char colorG)
  128. {
  129.   digitalWrite(DC, LOW);  //solve a bug of write_command
  130.   write_command(0x21);
  131.   write_command(startx);
  132.   write_command(starty);
  133.   write_command(endx);
  134.   write_command(endy);
  135.   write_command(colorR);
  136.   write_command(colorB);
  137.   write_command(colorG);
  138. }
  139. /***************************************************/
  140. //oled Initial
  141. /***************************************************/
  142. static void Initial_SSD1330ZB()
  143. {
  144.   write_command(0xfd); // command lock
  145.   write_command(0x12);
  146.   write_command(0xae); // display off
  147.   write_command(0xa4); // Normal Display mode
  148.   write_command(0x15); //set column address
  149.   write_command(0x00); //column address start 00
  150.   write_command(0x5f); //column address end 95
  151.   write_command(0x75); //set row address
  152.   write_command(0x00); //row address start 00
  153.   write_command(0x3f); //row address end 63
  154.   write_command(0x87); //master current control
  155.   write_command(0x0A);
  156.   write_command(0x81); //Set Contrast for Color A
  157.   write_command(0x85); //91
  158.   write_command(0x82); //Set Contrast for Color B
  159.   write_command(0x56); //50
  160.   write_command(0x83); //Set Contrast for Color C
  161.   write_command(0x7f); //7d
  162.   write_command(0x8a);  // set scond pre-change speed of Color A
  163.   write_command(0x64);
  164.   write_command(0x8b);  // set scond pre-change speed of Color B
  165.   write_command(0x78);
  166.   write_command(0x8c);  // set scond pre-change speed of Color C
  167.   write_command(0x64);
  168.   write_command(0xa0); //set re-map & data format
  169.   write_command(0x72); //Horizontal address increment
  170.   write_command(0xa1); //set display start line
  171.   write_command(0x00); //start 00 line
  172.   write_command(0xa2); //set display offset
  173.   write_command(0x00);
  174.   write_command(0xa8); //set multiplex ratio
  175.   write_command(0x3f); //64MUX
  176.   write_command(0xb0); //set power save
  177.   write_command(0x1a);
  178.   write_command(0xb1);
  179.   write_command(0xf1); // Phase 2 period Phase 1 period
  180.   write_command(0xb3); // Set Display Clock Divide Ratio/ Oscillator Frequency
  181.   write_command(0xd0);
  182.   write_command(0xbb); // set pre-charge
  183.   write_command(0x3e);
  184.   write_command(0xbe); //set Vcomh
  185.   write_command(0x3e);
  186.   write_command(0xad); //Select external VCC supply at Display ON
  187.   write_command(0x8e); //Select External VP voltage supply
  188.   write_command(0xaf); //display on
  189. }
  190. //********************************************
  191. //high level function
  192. //********************************************
  193. /********************************************
  194. * // DrawPixel
  195. ********************************************/
  196. static void drawPixel(unsigned char px,unsigned char py,
  197. unsigned char colorR,unsigned char colorB,unsigned char colorG)
  198. {
  199.   drawLine(px,py,px,py,colorR,colorB,colorG);
  200. }
  201. /********************************************
  202. * // draw a character
  203. ********************************************/
  204. static void drawChar(uint8_t x, uint8_t y, char c,uint8_t colorR,uint8_t colorB,uint8_t colorG,uint8_t size) {
  205.   uint8_t tempx,tempy;
  206.   uint8_t i,j;
  207.   for (i =0; i<5; i++ ) {
  208.     uint8_t line = pgm_read_byte(font+(c*5)+i);
  209.     for (j = 0; j<8; j++) {
  210.       if (line & 0x1) {
  211.         if (size == 1) // default size
  212.           drawPixel(x+i, y+j, colorR,colorB,colorG);
  213.         else {  // big size
  214.           tempx= x+i*size;
  215.           tempy= y+j*size;
  216.           drawRectangle(tempx,tempy,tempx + size,tempy + size, colorR,colorB,colorG,colorR,colorB,colorG,true);
  217.         }
  218.       }
  219.       line >>= 1;
  220.     }
  221.   }
  222. }
  223. /********************************************
  224. * // DrawString
  225. ********************************************/
  226. static void drawString(uint8_t x, uint8_t y, char *c,uint8_t colorR,uint8_t colorB,uint8_t colorG,uint8_t size) {
  227.   if(size>0)
  228.   {
  229.     while (c[0] != 0) {
  230.       drawChar(x, y, c[0], colorR,colorB,colorG, size);
  231.       x += size*6;
  232.       c++;
  233.     }
  234.   }
  235. }
  236. /********************************************
  237. * // DrawCircleHelper
  238. ********************************************/
  239. static void drawCircleHelper(uint8_t x0, uint8_t y0,
  240. uint8_t r, uint8_t cornername,
  241. uint8_t colorR,uint8_t colorB,uint8_t colorG) {
  242.   int16_t f = 1 - r;
  243.   int16_t ddF_x = 1;
  244.   int16_t ddF_y = -2 * r;
  245.   int16_t x = 0;
  246.   int16_t y = r;
  247.   while (x<y) {
  248.     if (f >= 0) {
  249.       y--;
  250.       ddF_y += 2;
  251.       f += ddF_y;
  252.     }
  253.     x++;
  254.     ddF_x += 2;
  255.     f += ddF_x;
  256.     if (cornername & 0x4) {
  257.       drawPixel(x0 + x, y0 + y,  colorR,colorB,colorG);
  258.       drawPixel(x0 + y, y0 + x,  colorR,colorB,colorG);
  259.     }
  260.     if (cornername & 0x2) {
  261.       drawPixel(x0 + x, y0 - y,  colorR,colorB,colorG);
  262.       drawPixel(x0 + y, y0 - x,  colorR,colorB,colorG);
  263.     }
  264.     if (cornername & 0x8) {
  265.       drawPixel(x0 - y, y0 + x,  colorR,colorB,colorG);
  266.       drawPixel(x0 - x, y0 + y,  colorR,colorB,colorG);
  267.     }
  268.     if (cornername & 0x1) {
  269.       drawPixel(x0 - y, y0 - x,  colorR,colorB,colorG);
  270.       drawPixel(x0 - x, y0 - y,  colorR,colorB,colorG);
  271.     }
  272.   }
  273. }
  274. /********************************************
  275. * // DrawCircle
  276. ********************************************/
  277. static void drawCircle(uint8_t x0, uint8_t y0,
  278. uint8_t r,
  279. uint8_t colorR,uint8_t colorB,uint8_t colorG)
  280. {
  281.   drawCircleHelper(x0, y0, r, 0xF, colorR,colorB,colorG);
  282.   drawPixel(x0, y0+r, colorR,colorB,colorG);
  283.   drawPixel(x0, y0-r, colorR,colorB,colorG);
  284.   drawPixel(x0+r, y0, colorR,colorB,colorG);
  285.   drawPixel(x0-r, y0, colorR,colorB,colorG);
  286. }
  287. /********************************************
  288. * // drawTriangle
  289. ********************************************/
  290. static void drawTriangle(uint8_t x0, uint8_t y0,
  291. uint8_t x1, uint8_t y1,
  292. uint8_t x2, uint8_t y2,
  293. unsigned char colorR,unsigned char colorB,unsigned char colorG)
  294. {
  295.   drawLine(x0, y0, x1, y1, colorR,colorB,colorG);
  296.   drawLine(x1, y1, x2, y2, colorR,colorB,colorG);
  297.   drawLine(x2, y2, x0, y0, colorR,colorB,colorG);
  298. }
  299. /********************************************
  300. * // init color OLED
  301. ********************************************/
  302. static void initOLED()
  303. {
  304.   pinMode(CS, OUTPUT);
  305.   pinMode(DC, OUTPUT);
  306.   pinMode(RES, OUTPUT);
  307.   //set pin output mode
  308.   DATADDR2 |= DATA2_MASK;
  309.   DATADDR1 |= DATA1_MASK;
  310.   //reset oled model
  311.   digitalWrite(RES, LOW);
  312.   delay(50);
  313.   digitalWrite(RES, HIGH);
  314.   delay(50);
  315.   Initial_SSD1330ZB();

  316.   fill_color(0,96,0,64,0x00,0x00);
  317. }
复制代码



代码仅供参考。
感谢 czad 赠送的atmge328p的贴片板和好人做到底的geek精神!

</endx;i++)
</endy;k++)
</w;i++)
</h;k++)
回复

使用道具 举报

板凳
ID:113207 发表于 2016-4-11 01:39 | 只看该作者
自制基于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的计算能力可能无法满足。

回复

使用道具 举报

地板
ID:149758 发表于 2016-11-23 16:55 | 只看该作者
很好。
回复

使用道具 举报

5#
ID:232117 发表于 2017-9-9 18:33 | 只看该作者
楼主求全部资料发一份邮箱2272599707@qq.com
回复

使用道具 举报

6#
ID:255408 发表于 2017-11-29 21:19 | 只看该作者
果然牛人
回复

使用道具 举报

7#
ID:255408 发表于 2017-11-29 21:28 | 只看该作者
楼主 我下载了下载地图的软件release,使用时下载不成功 显示 “下载 1失败”
请问下这是什么原因呢
回复

使用道具 举报

8#
ID:253733 发表于 2017-12-10 09:50 | 只看该作者
很感 兴趣,求接线图、全部资料QQ: 1360667@qq.com
回复

使用道具 举报

9#
ID:255869 发表于 2017-12-16 11:15 | 只看该作者
厉害!请问能否发一下接线图和资料~  yht1592754117@126.com
回复

使用道具 举报

10#
ID:278630 发表于 2018-1-29 00:16 | 只看该作者
想问一下楼主,下载地图时,显示下载1失败,下载3失败是什么原因呢,影响吗
回复

使用道具 举报

11#
ID:136110 发表于 2018-2-12 15:29 | 只看该作者
跪求用oled 12c 12864的版本,买不起lcd啊
回复

使用道具 举报

12#
ID:289840 发表于 2018-3-9 21:37 | 只看该作者
楼主能发下接线图和相关资料吗
回复

使用道具 举报

13#
ID:308602 发表于 2018-5-26 22:28 | 只看该作者
请问那个v1版本总显示“Card Error”怎么回事???
回复

使用道具 举报

14#
ID:276685 发表于 2018-8-17 19:21 | 只看该作者
楼主我那个v3.0程序和地图都没问题就是一直提示gps bad。我那个定位模块是sim868,就是不知道程序兼容的是什么gps协议,电脑测试gps定位模块没有问题
回复

使用道具 举报

15#
ID:236106 发表于 2018-9-14 17:04 | 只看该作者
楼主 用UNO下载V3程序  报错 <Adafruit_ST7735.h> 库有问题,帮忙提示一下  是我的打开姿势不对吗
回复

使用道具 举报

16#
ID:445463 发表于 2018-12-20 11:35 | 只看该作者
感谢楼主分享
回复

使用道具 举报

17#
ID:445463 发表于 2018-12-20 11:36 | 只看该作者
很感 兴趣,求接线图、全部资料 383985046@qq.com
回复

使用道具 举报

18#
ID:465223 发表于 2019-1-11 15:15 | 只看该作者
求全套资料741176472@qq.com
回复

使用道具 举报

19#
ID:452731 发表于 2019-1-20 22:43 | 只看该作者
这个很牛啊
回复

使用道具 举报

20#
ID:79544 发表于 2019-3-3 11:23 | 只看该作者
太好的资料啦,感谢楼主分享!!!!!!
回复

使用道具 举报

21#
ID:316761 发表于 2019-5-12 21:33 | 只看该作者
希望楼主也发一份完整资料哇,3102845014@qq.com
回复

使用道具 举报

22#
ID:316761 发表于 2019-5-17 00:27 | 只看该作者
sf5a1 发表于 2018-9-14 17:04
楼主 用UNO下载V3程序  报错  库有问题,帮忙提示一下  是我的打开姿势不对吗

一样的问题。。。。
回复

使用道具 举报

23#
ID:300101 发表于 2019-11-9 21:41 | 只看该作者
很感兴趣,求接线图、全部资料 20171979@qq.com
回复

使用道具 举报

24#
ID:463062 发表于 2020-2-22 22:06 | 只看该作者
太厉害了吧,楼主能共享一下资料学习一下吗呜呜呜,我还是个小菜鸟
邮箱435042110@qq.com
回复

使用道具 举报

25#
ID:716703 发表于 2020-3-31 08:12 | 只看该作者
提供一个Atmega 328的引脚图

无标题.png (118.15 KB, 下载次数: 124)

Atmega 328的引脚图

Atmega 328的引脚图
回复

使用道具 举报

26#
ID:433598 发表于 2021-3-16 10:03 | 只看该作者
求全套资料
回复

使用道具 举报

27#
ID:903164 发表于 2021-4-19 22:03 | 只看该作者
TFT屏显示GPS BAD 如何解决啊?
回复

使用道具 举报

28#
ID:475156 发表于 2021-11-3 13:56 | 只看该作者
这个真是牛。
回复

使用道具 举报

29#
ID:796712 发表于 2022-2-21 21:04 | 只看该作者
TFT屏显示GPS
回复

使用道具 举报

30#
ID:1111540 发表于 2024-3-22 22:13 | 只看该作者
1052092761 发表于 2018-5-26 22:28
请问那个v1版本总显示“Card Error”怎么回事???

你好,请问基于arduino的GPS导航V1版本显示cardError问题你解决了吗
回复

使用道具 举报

31#
ID:1111540 发表于 2024-3-25 17:53 | 只看该作者
1052092761 发表于 2018-5-26 22:28
请问那个v1版本总显示“Card Error”怎么回事???

你好,请问你找到原因了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表