资料介绍
描述
该项目使用开源minmea NMEA 解析器和低成本LPC845-BRK 开发板作为简单的位置查找器。
MCU 将等待来自通过 UART1 连接的板外 GPS(产品链接*)的初始锁定。一旦建立锁定(通过FIX引脚检测),当前位置将不断更新。然后您可以定期检查当前位置和定义的目标位置之间的距离。
可以在 UART0 上看到调试输出,它可通过 LPC845-BRK 上的 USB CDC 获得,从而在对源代码进行任何修改时轻松获得状态更新。
* 任何通过 UART 提供标准 NMEA 语句的 GPS 都应该在这个项目中工作。
引出线
以下引脚用于连接外部 GPS(3 引脚)和 PWM 压电蜂鸣器(1 引脚):
- 压电蜂鸣器的 SCT_OUT2(PWM 输出):P0.29
- USART1_RXD(GPS):P0.26
- USART1_TXD(GPS):P0.27
- GPS 定位:P0.28
操作(调试模式)
当您将固件闪存到 LPC845(使用免费的跨平台 MCUXpresso IDE 和 LPC845-BRK 上的调试器)时,您可以使用任何终端仿真器包以9600bps连接到 USART1 。
退出重置后,您将看到以下消息:
LPC845 GPS Wayfinder
Waiting for a fix on the GPS module.
The GREEN LED indicates that we are waiting for a fix.
The BLUE LED indicates that we are parsing GPS data.
此时,等待锁定 3 颗或更多卫星时,LED 上的绿色 LED 将以 1Hz 的频率闪烁,这是位置锁定所需的。
一旦获得锁定,蓝色 LED 将开始闪烁,表明 MCU 当前正在处理来自 GPS 单元的 NMEA 数据,调试输出将更新为以下(示例)输出:
Current degree coordinates and speed: xx.xxxxxx, xx.xxxxxx (0.002333)
Distance to target: 14.30 km.
源代码
虽然大部分源代码相对容易理解,但下面描述了一些关键概念。
半正弦距离估计器
我们可以使用Haversine 公式的实现来确定两点之间的距离,如下所示:
float
calc_distance(struct gps_coord_fp_deg *a, struct gps_coord_fp_deg *b)
{
float hav_r_meters = 6371e3; /* Mean radius of the earth in meters. */
//float hav_r_miles = 3961; /* Mean radius of the earth in miles. */
/* Convert degrees to radians and calculate the deltas. */
float lat1 = deg_to_rad(a->latitude);
float lat2 = deg_to_rad(b->latitude);
float lon1 = deg_to_rad(a->longitude);
float lon2 = deg_to_rad(b->longitude);
float delta_lat = lat2 - lat1;
float delta_long = lon2 - lon1;
/* Haversine */
float hav_a = pow(sin(delta_lat/2.0f),2.0f) + cos(lat1) * cos(lat2) * pow(sin(delta_long/2.0f),2.0f);
float hav_c = 2.0f * atan2(sqrt(hav_a), sqrt(1.0f-hav_a));
/* Calculate the great circle distance in meters. */
return hav_c * hav_r_meters;
}
Haversine 公式将近似计算两个位置之间球体表面的距离,输出以米为单位。您可以选择更新代码以通过调整函数顶部的系数来输出英里或任何其他单位。
Haversine 有点不完美,因为地球不是一个完美的球体,它以直线计算距离,但它是一个很好的整体距离近似值,计算量最少。
GPS 位置数据
应用程序中的另一个关键功能是解析RMC 句子的 NMEA 解析器(基于minmea ) (其他句子可以根据需要轻松添加!):
int
parse_nmea_sentence_release(char *line)
{
switch (minmea_sentence_id(line, false))
{
case MINMEA_SENTENCE_RMC: {
struct minmea_sentence_rmc frame;
if (minmea_parse_rmc(&frame, line)) {
g_gps_coord_fp_deg_last.latitude = minmea_tocoord(&frame.latitude);
g_gps_coord_fp_deg_last.longitude = minmea_tocoord(&frame.longitude);
g_gps_coord_fp_deg_last.speed = minmea_tocoord(&frame.speed);
g_gps_coord_fp_deg_last.is_valid = true;
PRINTF("Current degree coordinates and speed: %f, %f (%f)\r\n",
g_gps_coord_fp_deg_last.latitude,
g_gps_coord_fp_deg_last.longitude,
g_gps_coord_fp_deg_last.speed);
float dist_m = calc_distance(&g_gps_coord_fp_deg_last, &g_gps_coord_fp_deg_trgt);
if (dist_m > 1000.0F) {
/* Show distance in kilometers. */
PRINTF("Distance to target: %.2f km.\r\n", dist_m / 1000.0F);
} else {
/* Show distance in meters */
PRINTF("Distance to target: %.1f meters.\r\n", dist_m);
}
} else {
PRINTF("$xxRMC sentence is not parsed\r\n");
}
} break;
case MINMEA_INVALID: {
/* $xxxxx sentence is not valid */
error_blink();
} break;
default: {
/* $xxxxx sentence is valid but wasn't handled above. */
} break;
}
return 0;
}
在这个基本示例中,我们只解析RMC语句,它代表最小推荐数据,具有以下 NMEA 语句格式(来源):
$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
在哪里:
- RMC - 推荐的最低刑期 C
- 123519 - 修复时间为 12:35:19 UTC
- A - 状态 A=active 或 V=Void。
- 4807.038, N - 北纬 48 度 07.038'
- 01131.000, E - 东经 11 度 31.000'
- 022.4 - 对地速度(节)
- 084.4 - 以度为单位的轨道角度 True
- 230394 - 日期 - 1994 年 3 月 23 日
- 003.1, W - 磁差
- *6A - 校验和数据,始终以 * 开头
距离事件
这个应用程序的关键部分是上面 GPS 解析函数中的以下几行代码,每当解析引擎解析到新的位置定位时,它就会不断地将当前位置与目的地进行比较:
if (dist_m > 1000.0F) {
/* Show distance in kilometers. */
PRINTF("Distance to target: %.2f km.\r\n", dist_m / 1000.0F);
} else {
/* Show distance in meters */
PRINTF("Distance to target: %.1f meters.\r\n", dist_m);
}
根据你想做什么,你应该扩展上面的代码,比如当你接近目的地时,压电蜂鸣器发出越来越响亮或频率越来越高的声音。
压电蜂鸣器
根据您的应用要求,您可以选择使用以下宏启用或禁用压电蜂鸣器:
PIEZO_ON();
/* ... do something ... */
PIEZO_OFF();
可以使用main.c中的以下宏定义来调整压电蜂鸣器(使用 SCT 外围设备)发出的确切频率:
#define SCTIMER_CLK_FREQ (CLOCK_GetFreq(kCLOCK_Fro))
#define SCTIMER_OUT (kSCTIMER_Out_2)
#define SCTIMER_PIEZO_FREQ (4000U)
#define SCTIMER_PIEZO_DUTY (25U)
#define PIEZO_ON() SCTIMER_StartTimer(SCT0, kSCTIMER_Counter_L);
#define PIEZO_OFF() SCTIMER_StopTimer(SCT0, kSCTIMER_Counter_L);
进一步发展
虽然当前的概念证明具有简单、便携式寻路器的关键要素,但我目前正在研究一种外壳,使整个设备便携,并由 3.7V LIPO 电池供电。当我完成一些原型时,硬件文件将在此处可用。
- Spresense GPS摄像头开源分享
- 道路质量GPS追踪器开源
- ESP32 Feather GPS接收器开源分享
- 皮划艇GPS导航开源分享
- GPS和AHRS数据记录器开源分享
- LPC845自制开发板原理图 2次下载
- LoRa GPS追踪器开源设计
- RTK GPS航向开源分享
- Oak-劳拉GPS追踪器开源项目
- Raspberry Pi零GPS和相机帽开源分享
- 基于STM32的A*(A星)寻路算法实现
- 【简单的四足机器人制作(基于STC15/LPC845)】
- 开源网络协议分析器WireShark软件下载 15次下载
- 车载GPS、GSM报警器电路原理图
- 基于ARM7的寻北仪控制模块的硬件设计与实现
- 如何制作一个智能寻路+避障的小车? 4222次阅读
- 基于LPC2132微控制器和IRIG码实现GPS时钟的应用方案 2500次阅读
- 基于AT89S52单片机和GPS OEM 板实现GPS授时服务器的设计 4729次阅读
- 如何提高GPS接收器的灵敏度 5301次阅读
- 基于微处理器LPC2214和GPS接收器实现车载导航终端的设计 3968次阅读
- 采用LPC2294四路CAN控制器实现智能通信卡系统的设计 2328次阅读
- 米尔科技NXP LPC1857 LPC1850 Cortex-M3开发板概述 4396次阅读
- 合路器的作用_合路器和耦合器 6202次阅读
- 基于lpc1768的系统时钟设计 3016次阅读
- gps和agps的区别 2.2w次阅读
- gps追踪器接线方式 8280次阅读
- GPS跟踪定位器如何使用 3.7w次阅读
- 高通骁龙845安兔兔跑分骁龙845安兔兔跑分多少 2w次阅读
- nxp单片机汇总_lpc单片机选型 1.9w次阅读
- Unity3d自动寻路以及在Game视图中显示线段 3800次阅读
下载排行
本周
- 1A7159和A7139射频芯片的资料免费下载
- 0.20 MB | 55次下载 | 5 积分
- 2PIC12F629/675 数据手册免费下载
- 2.38 MB | 36次下载 | 5 积分
- 3PIC16F716 数据手册免费下载
- 2.35 MB | 18次下载 | 5 积分
- 4dsPIC33EDV64MC205电机控制开发板用户指南
- 5.78MB | 8次下载 | 免费
- 5STC15系列常用寄存器汇总免费下载
- 1.60 MB | 7次下载 | 5 积分
- 6模拟电路仿真实现
- 2.94MB | 4次下载 | 免费
- 7PCB图绘制实例操作
- 2.92MB | 2次下载 | 免费
- 8零死角玩转STM32F103—指南者
- 26.78 MB | 1次下载 | 1 积分
本月
- 1ADI高性能电源管理解决方案
- 2.43 MB | 452次下载 | 免费
- 2免费开源CC3D飞控资料(电路图&PCB源文件、BOM、
- 5.67 MB | 141次下载 | 1 积分
- 3基于STM32单片机智能手环心率计步器体温显示设计
- 0.10 MB | 137次下载 | 免费
- 4A7159和A7139射频芯片的资料免费下载
- 0.20 MB | 55次下载 | 5 积分
- 5PIC12F629/675 数据手册免费下载
- 2.38 MB | 36次下载 | 5 积分
- 6如何正确测试电源的纹波
- 0.36 MB | 19次下载 | 免费
- 7PIC16F716 数据手册免费下载
- 2.35 MB | 18次下载 | 5 积分
- 8Q/SQR E8-4-2024乘用车电子电器零部件及子系统EMC试验方法及要求
- 1.97 MB | 8次下载 | 10 积分
总榜
- 1matlab软件下载入口
- 未知 | 935121次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420062次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233088次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191367次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183335次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81581次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73810次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65988次下载 | 10 积分
评论
查看更多