Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GPS的组件加入 #16

Merged
merged 5 commits into from
Dec 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions components/gps_ATGM336H/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
idf_component_register(SRCS "gps.c"
INCLUDE_DIRS ".")
136 changes: 136 additions & 0 deletions components/gps_ATGM336H/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
# ATGM336H


## Origin output data form


```c
char *test_data = "\
$GNGGA,132506.000,2233.87430,N,11407.13740,E,1,13,1.0,103.3,M,-2.8,M,,*5E\n\
$GNGLL,2233.87430,N,11407.13740,E,132506.000,A,A*4E\n\
$GNGSA,A,3,02,05,15,23,24,29,195,,,,,,1.6,1.0,1.3,1*07\n\
$GNGSA,A,3,07,10,16,21,34,42,,,,,,,1.6,1.0,1.3,4*33\n\
$GPGSV,3,1,09,02,34,134,15,05,40,044,14,15,71,308,25,18,32,326,26,0*68\n\
$GPGSV,3,2,09,20,25,074,,23,13,293,37,24,32,174,31,29,45,251,37,0*6B\n\
$GPGSV,3,3,09,195,50,158,31,0*6A\n\
$BDGSV,3,1,11,03,,,28,07,13,193,27,10,14,207,32,12,,,35,0*71\n\
$BDGSV,3,2,11,16,66,191,29,21,47,308,41,22,41,027,,34,33,309,25,0*74\n\
$BDGSV,3,3,11,40,,,33,42,12,265,36,44,,,28,0*4B\n\
$GNRMC,132506.000,A,2233.87430,N,11407.13740,E,0.00,244.71,080522,,,A,V*0A\n\
$GNVTG,244.71,T,,M,0.00,N,0.00,K,A*27\n\
$GNZDA,132506.000,08,05,2022,00,00*44\n\
$GPTXT,01,01,01,ANTENNA OPEN*25\n\
";
```
GNRMC:Global Navigation Satellite System Recommended Minimum Specific GNSS Data

典型GNRMC数据
$GNRMC,132506.000,A,2233.87430,N,11407.13740,E,0.00,244.71,080522,,,A,V*0A\n\


GNRMC解读
字段 1:UTC时间,hhmmss.sss格式
字段 2:状态,A=定位,V=未定位
字段 3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段 4:纬度N(北纬)或S(南纬)
字段 5:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段 6:经度E(东经)或W(西经)
字段 7:速度,节,Knots(一节也是1.852千米/小时)
字段 8:方位角,度(二维方向指向,相当于二维罗盘)
字段 9:UTC日期,DDMMYY格式
字段10:磁偏角,(000 - 180)度(前导位数不足则补0)
字段11:磁偏角方向,E=东,W=西
字段12:模式,A=自动,D=差分,E=估测,N=数据无效(3.0协议内容)
字段13:校验值
## Usage

### modify the macros

```c
#define UART_GPS UART_NUM_2 //串口号
#define UART_GPS_TXD GPIO_NUM_16 //主控的TX引脚
#define UART_GPS_RXD GPIO_NUM_18 //主控的RX引脚
```

### use the API

#### esp_err_t GPS_init( )
initialize related uart configuration

#### GPS_data get_gps_value( )
return GPS information with a GPS_data structure


```c
typedef struct
{
double latitude;
double longitude;
double speed_kmh; // 单位:千米每小时
double speed_ms; // 单位:米每秒
} GPS_data;
```


## Example

```c
#include gps.h

void gps_task(void *arg)
{
const char *TAG = "GPS";
while (1)
{
GPS_data gps_data = get_gps_value();
ESP_LOGI(TAG, "lat: %f, lon: %f \n", gps_data.latitude, gps_data.longitude);
ESP_LOGE(TAG, "speed: %f\n", gps_data,speed_ms);
ESP_LOGI(TAG, "======================================================\n");
vTaskDelay(1000 / portTICK_RATE_MS);
}
}

void app_main(void)
{
GPS_init();
xTaskCreate(&gps_task, "gps_task", 1024 * 2, NULL, 5, NULL);
}
```

or you can use other device like a SSD1306 OLED

```c
#include gps.h
#include fonts.h
#include ssd1306.h

void SSD1306_task(void *arg)
{
const char *TAG = "SSD1306";
while (1)
{
SSD1306_Clear();
//输出GPS数据
GPS_data gps_data = get_gps_value();
char str[16];
SSD1306_GotoXY(0, 0);
sprintf(str, "lat: %f", gps_data.latitude);
SSD1306_Puts(str, &Font_7x10, 1);
SSD1306_GotoXY(0, 10);
sprintf(str, "lon: %f", gps_data.longitude);
SSD1306_Puts(str, &Font_7x10, 1);
SSD1306_GotoXY(0, 20);
sprintf(str, "speed: %f", gps_data.speed_ms);
SSD1306_Puts(str, &Font_7x10, 1);
SSD1306_UpdateScreen();
vTaskDelay(1000 / portTICK_RATE_MS);
}
}

void app_main(void)
{
GPS_init();
SSD1306_Init();
xTaskCreate(&SSD1306_task, "SSD1306_task", 1024 * 2, NULL, 5, NULL);
}
```
84 changes: 84 additions & 0 deletions components/gps_ATGM336H/gps.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/**
* @file gps.c
* @brief GPS driver source file
*/
#include "gps.h"

char *GPS_temp_data = NULL; // GPS模块输出数据缓冲区
static const int GPS_RX_BUF_SIZE = 1024;
static const char *TAG = "GPS";

/// @brief 读取GPS模块的串口数据
GPS_data get_gps_value()
{
esp_log_level_set(TAG, ESP_LOG_INFO);
GPS_data gps_data;
// bzero(&gps_data, sizeof(gps_data)); // 清空
const int rxBytes = uart_read_bytes(UART_GPS, GPS_temp_data, GPS_RX_BUF_SIZE, 1000 / portTICK_RATE_MS);
ESP_LOGE(TAG, "rxBytes: %d\n", rxBytes);
if (rxBytes > 0)
{
// ESP_LOGI(GPS_TAG, "GPS_temp_data: %s\n", GPS_temp_data);//打印数据,测试用
GPS_temp_data[rxBytes] = 0;
char *row = strstr(GPS_temp_data, "$GNRMC"); // 截取GNRMC数据
if (row == NULL)
{
ESP_LOGI(TAG, "row is NULL\n");
}
else
{
char *token = strtok(row, ",");
int count = 0;
while (token != NULL)
{
count++;
switch (count)
{
case 4: // 纬度
gps_data.latitude = atof(token) / 100;
break;
case 6: // 经度
gps_data.longitude = atof(token) / 100;
break;
case 8: // 速度
gps_data.speed_kmh = atof(token); // 默认为节
gps_data.speed_kmh *= 1.852; // 节转换为千米每小时
gps_data.speed_ms = gps_data.speed_kmh / 3.6; // 千米每小时转换为米每秒
break;
}
token = strtok(NULL, ",");
}
// ESP_LOGI(TAG, "lat: %f, lon: %f \n", gps_data.latitude, gps_data.longitude); // 输出经纬度,测试用
// ESP_LOGE(TAG, "speed: %f\n", gps_data.speed_ms); // 输出速度,测试用
// ESP_LOGI(TAG, "======================================================\n");
}
}
return gps_data;
}



/// @brief 初始化GPS模块
esp_err_t GPS_init()
{
ESP_LOGI(TAG, "GPS ATGM336H Initializing...\n");
esp_err_t esp_err;
// 8位数据位,无校验,1位停止位,无硬件流控制,模块默认波特率9600(可修改)
const uart_config_t uart_config_GPS = {
.baud_rate = 9600,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
.source_clk = UART_SCLK_APB,
};
esp_err = uart_param_config(UART_GPS, &uart_config_GPS);
ESP_LOGI(TAG, "uart_param_config: %d\n", esp_err);
esp_err = uart_driver_install(UART_GPS, GPS_RX_BUF_SIZE * 2, 0, 0, NULL, 0);
ESP_LOGI(TAG, "uart_driver_install: %d\n", esp_err);
esp_err = uart_set_pin(UART_GPS, UART_GPS_TXD, UART_GPS_RXD, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
ESP_LOGI(TAG, "uart_set_pin: %d\n", esp_err);
GPS_temp_data = (char *)malloc(GPS_RX_BUF_SIZE + 1);
ESP_LOGI(TAG, "GPS init success!\n");
return esp_err;
}
41 changes: 41 additions & 0 deletions components/gps_ATGM336H/gps.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/**
* @file gps.h
* @brief GPS driver header file
*/

#ifndef __GPS_H__
#define __GPS_H__

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "esp_system.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

//GPS模块的串口号、引脚号和相关计算数据
#define UART_GPS UART_NUM_2
#define UART_GPS_TXD GPIO_NUM_16
#define UART_GPS_RXD GPIO_NUM_18

/// @brief GPS数据结构体
typedef struct
{
double latitude;
double longitude;
double speed_kmh; // 单位:千米每小时
double speed_ms; // 单位:米每秒
} GPS_data;

/// @brief 初始化 GPS模块
esp_err_t GPS_init();

/// @brief 从 GPS模块读取数据
GPS_data get_gps_value();

#endif
2 changes: 1 addition & 1 deletion main/app_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
/// @brief Main application entry point
void app_main(void)
{

printf("Hello world!\n");
}
2 changes: 1 addition & 1 deletion main/include/app_main.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@
#include <stdlib.h>
#include <string.h>

#endif // _APP_MAIN_H_
#endif //_APP_MAIN_H_
1 change: 1 addition & 0 deletions main/src/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ This directory contains all the source files for the project.
## List of source files

- [hal](./hal):Hardware Abstraction Layer,硬件抽象层,所有与硬件相关的源代码。
-
- ...
Loading