# AB32VG1_GPS_TRACK **Repository Path**: algoideas/AB32VG1_GPS_TRACK ## Basic Information - **Project Name**: AB32VG1_GPS_TRACK - **Description**: 基于AB32VG1的GPS位置记录器 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2021-11-28 - **Last Updated**: 2024-08-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: RT-Thread, AB32VG1, RSIC-V ## README # 基于AB32VG1的GPS位置记录器 ## 简介 基于AB32VG1丰富的板载资源,并结合GPS模块及显示等其他模块,在方便记录轨迹的同时,提供校为便利的用户交互体验(如声音提示和用户按键交互,及屏幕显示)。项目可用于运动轨迹记录,及实时显示速度等展示,及其他应用领域,解决部分场景下位置记录实时查看不便或需要借助其他功耗相对较高的记录设备的问题,同时增加生活的趣味性。 主要内容如下: - 开发板资源介绍 - 项目硬件说明 - 项目软件说明 ## 开发板介绍 ab32vg1-prougen 是 中科蓝讯(Bluetrum) 推出的一款基于 RISC-V 内核的开发板,最高主频为 120Mhz,该开发板芯片为 AB32VG1。 开发板外观如下图所示: ![board](figures/AB32VG1.png) 该开发板常用 **板载资源** 如下: - MCU:AB32VG1,主频 120MHz,可超频至 192MHz,8Mbit FLASH ,192KB RAM。 - 常用外设 - LED: RGB灯 - 按键: 3 个, USER(s2,s3) and RESET(s1) - 常用接口:USB 转串口、SD 卡接口 #### 外设支持 本 BSP 目前对外设的支持情况如下: | **板载外设** | **支持情况** | **备注** | | :----------- | :----------: | :---------------------------------------- | | USB 转串口 | 支持 | | | SD卡 | 支持 | | | IRDA | 支持 | | | 音频接口 | 支持 | 支持音频输出 | | **片上外设** | **支持情况** | **备注** | | GPIO | 支持 | PA PB PE PF | | UART | 支持 | UART0/1/2 | | SDIO | 支持 | | | ADC | 支持 | 10bit ADC | | SPI | 即将支持 | 软件 SPI | | I2C | 支持 | 软件 I2C | | RTC | 支持 | | | WDT | 支持 | | | FLASH | 即将支持 | 对接 FAL | | TIMER | 支持 | | | PWM | 支持 | LPWM 的 G1 G2 G3 之间是互斥的,只能三选一 | | FM receive | 支持 | | | USB Device | 暂不支持 | | | USB Host | 暂不支持 | | #### 使用说明 使用说明分为如下两个章节: - 快速上手 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 - 进阶使用 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 ## 项目硬件说明 整体硬件由4部分组成: AB32VG1开发板、SSD1306 OLED显示屏、GPS模块(支持北斗和GSP双模定位)和SD卡 注:其中开发板还用到了GREEN和RED灯,和S2及S3按键 ![HW_01](figures/AB32VG1_HW_01.jpg) 硬件整体外观如下图所示: ![HW_00](figures/AB32VG1_HW_00.jpg) 1、SSD1306 OLED显示屏(II2C)引脚连接: PE3 - OLED SCL、PE2 - OLED SDA、电源引脚 ![II2C](figures/AB32VG1_II2C.jpg) 2、GPS模块引脚连接(串口): PA4 - GPS RX、PA3 - GPS TX、电源引脚 ![UART](figures/AB32VG1_UART.jpg) 3、OLED和GPS模块电源引脚连接: 模块供电,均采用开发板提供的3.3V电源引脚 ![POWER](figures/AB32VG1_POWER.jpg) ## 项目软件说明 项目的软件采用RT-Thread官方提供的IDE RT-ThreadStudio开发,SDK基于AB32VG1-AB-PROUGEN,同时部分模块采用官方软件包,如ssd1306软件包,也移植了部分软件,如TinyGPS++和GPX(该部分开源软件主要由C++编写,移植采用C实现,并修改部分BUG),GPS记录后的轨迹符合GPX规范,可以用GPXSee(http://www.gpxsee.org) 软件查看。 软件框架: ![FRAMEWORK](figures/GPS位置记录器软件框架.png) #### 软件配置 ##### RT-Thread Setting 软件主要开启了与硬件相关的I2C和串口,同时开启了RTC相关功能 ![RT-Thread_Settings](figures/RT-Thread_Settings.jpg) #### 软件介绍 软件采用模块化设计,主要分为以下几个核心模块: ##### 1、gps.c (gps.h) - GPS数据管理 核心数据结构和API如下: ```c /* Clock */ typedef struct { uint16_t year; uint8_t month; uint8_t day; uint8_t week; uint8_t hour; uint8_t minute; uint8_t second; uint16_t millisecond; } Clock_Info_t; /* GPS */ typedef struct { bool isVaild; float longitude; float latitude; float altitude; float course; float speed; int16_t satellites; Clock_Info_t clock; } GPS_Info_t; typedef rt_int32_t (*gps_callback_t)(GPS_Info_t info); int gps_init(gps_callback_t callback); bool gps_get_info(GPS_Info_t* info); float gps_get_distance(GPS_Info_t* info, float preLong, float preLat); ``` ##### 2、gpx.c (gpx.h) - GPX数据格式封装 主要API如下: ```c char *gpx_getOpen(); char *gpx_getClose(); void gpx_getMetaData(char* data); char *gpx_getTrakOpen(); char *gpx_getTrakClose(); char *gpx_getTrakSegOpen(); char *gpx_getTrakSegClose(); void gpx_getInfo(char *info); void gpx_getPt(char *typ, char *lon, char *lat, char *pt); void gpx_setMetaName(char *name); void gpx_setMetaDesc(char *desc); void gpx_setName(char *name); void gpx_setDesc(char *desc); void gpx_setEle(char *ele); void gpx_setSym(char *sym); void gpx_setSrc(char *src); void gpx_setTime(char *time); ``` ##### 3、key.c (key.h) - 按键消息处理 按键消息,支持短按、长按等,可以方便移植到其他平台,核心结构体定义如下: ```c /** key information */ typedef struct _key_info { key_code_t code; key_state_t state; rt_bool_t short_press_done; rt_bool_t short_press; rt_bool_t long_press_done; rt_bool_t long_press; rt_bool_t double_press_done; rt_bool_t double_press; rt_uint32_t timtick; rt_uint32_t double_timtick; } key_info_t; ``` ##### 4、page.c (page.h) - OLED界面 OLED界面主要实现:系统本地日期时间显示、定位状态显示、当前经纬度和实时速度及已经定位的距离 头文件定义: ```c typedef enum _page_type { PAGE_STARTUP = 0, PAGE_DATE_TIME, PAGE_LOCATION, PAGE_SPEED, PAGE_MAX, }page_type_t; typedef enum _page_state { PAGE_STATE_LOCATION = 0x1, PAGE_STATE_TRACK = 0x2, }page_state_t; void page_init(); void page_switch(rt_int32_t index); void page_update(); ``` ##### 5、track.c - GPS轨迹记录模块 用于GPS轨迹的记录,统一由该模块管理,开始和停止记录。 一份简短的实际生成的GPS轨迹文件如下: ```c 15.20 15.20 18.20 18.30 18.20 13.70 ``` ##### 6、tinygps.c 和 gpx.c - GPS 0183协议的解析和GPX格式封装 基于开源库TinyGPS++和GPX移植,并完善对北斗定位信息的解析,如果GNRMC和GNGGA等 #### 编译下载 通过 `RT-Thread Studio` 或者 `scons` 编译得到 `.dcf` 固件,通过 `Downloader` 进行下载 #### 运行结果 下载程序成功之后,系统会自动运行,观察开发板上 GREEN 的运行和OLED显示效果,GPS在定位过程中GREEN灯会不定期闪烁,表示已经定位到,同时OLED在定位到后,显示GPS已经校时候的系统日期和时间。 在定位到后,可以通过开发板上的S2和S3按键,支持其他功能: ##### 1、短按: 支持OLED屏上下界面的切换,显示本地时间、当前经纬度、速度和第一次定位到目前的距离; ##### 2、长按: S2长按开启GPS的轨迹记录,同时GREEN灯会闪烁,在系统时间和日期界面左上角会显示rec,同时会把GPS的定位信息,持续记录到SD卡中,其中SD卡中生成的文件命名格式为:TRACK_%d%02d%02d_%02d%02d%02d.gpx; S3长按关闭GPS的轨迹记录,同时RED灯会闪烁,在系统时间和日期界面左上角无显示; 连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: ```bash \ | / - RT - Thread Operating System / | \ 4.0.4 build Nov 28 2021 2006 - 2021 Copyright by rt-thread team msh /> ``` #### 演示效果 ##### 1.演示视频 https://file.elecfans.com/web2/M00/21/5D/poYBAGGjPLyAW6TuANGDJG7nNJU241.mp4 ##### 2.轨迹展示 通过PC上的GPXSee工具可以查看到轨迹,如下图所示: ![GPXSee](figures/GPXSee.jpg) ## 注意事项 波特率默认为 1.5M,需要使用 [Downloader](https://github.com/BLUETRUM/Downloader) 下载 `.dcf` 到芯片,需要编译后自动下载,需要在 `Downloader` 中的下载的下拉窗中选择 `自动`;目前暂时屏蔽 uart1 打印 使用 `romfs` 时,需要自己生成 `romfs.c` 进行替换,操作参考[使用 RomFS](https://www.rt-thread.org/document/site/tutorial/qemu-network/filesystems/filesystems/#romfs) ## 作者信息 - [AlgoIdeas](https://gitee.com/algoideas)