- 博客(118)
- 问答 (1)
- 收藏
- 关注
原创 PX4开始之旅(二)通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信
想象一下,MAVLink 就像是无人机(飞控)和地面站(QGroundControl)之间约定好的一种“语言”。这种语言有很多标准的“词汇”和“句子”,比如用来报告无人机位置、速度、电池电量,或者发送起飞、降落指令等等。但是,有时候你可能想让无人机做一些特别的事情,或者发送一些标准 MAVLink 语言里没有的信息。比如,你的无人机上装了一个很特别的传感器,你想把这个传感器的数据显示在 QGC 上;或者你想通过 QGC 控制一个自定义的机械臂。这时候,标准的 MAVLink 语言就不够用了。
2025-05-09 23:37:26
957
原创 简易版无人机飞控
想象你正在骑一辆没有车把的自行车,要保持平衡需要不断调整身体重心。四旋翼无人机也是如此,它需要实时感知自己的倾斜角度,并通过调整四个电机转速来保持平衡。使用互补滤波或卡尔曼滤波将陀螺仪和加速度计数据融合,得到准确的欧拉角。
2025-05-09 17:33:32
476
原创 为什么拆分高低字节而不直接存入数组
当需要传输一个多字节的值(如16位的长度值)时,必须将其拆分成单个字节进行传输。如果想直接存储在数组中而不拆分,那么需要使用uint16_t类型的缓冲区,但W25Q64闪存的接口是基于字节(8位)作的,所以最终在与硬件交互时仍然需要进行字节拆分。这种拆分方式实际上是在实现小端序(little-endian)的字节序,即低字节在前,高字节在后。不同的系统可能使用不同的字节序(大端序或小端序)。这种拆分和重组16位值的方法在嵌入式系统和通信协议中非常常见,特别是在处理跨字节边界的多字节数据时。
2025-05-08 04:16:52
433
原创 红外信号发送的简单说明
Cyberry Potter Electromagic Wand 项目包括传输红外 (IR) 信号的功能,类似于电视遥控器的工作原理。这段代码是用于发送红外线(IR)信号的循环处理部分。简单来说,它是一个“按照遥控器信号模式,控制红外LED开关”的机制。:实际的 IR 信号是通过在特定持续时间内快速打开和关闭 38kHz 载波产生的,从而产生 IR 接收器可以理解的模式。通过这种方式,按照预先记录的遥控器信号模式(存储在数组中)精确控制红外LED,从而可以操作电视、空调等家电设备。红外信号发送代码解析。
2025-05-08 04:14:34
438
原创 基于nnom的多选择器
核心组件作模式系统有两种主要作模式,用于确定识别手势时的行为:模式 0 (执行)模式 1 (录制)默认情况下,系统以模式 0 启动。长按按钮 (>0.5 秒) 可在模式之间切换,LED 指示灯模式提供当前模式的视觉反馈。核心硬件组件STM32F103CB 微控制器STM32F103CB 微控制器用作 WAND 系统的中央处理单元。MPU6050 IMU 传感器MPU6050 是一个 6 轴运动跟踪装置,结合了 3 轴陀螺仪和 3 轴加速度计。
2025-05-08 00:15:53
929
原创 基于nnom模型的多选择控制器
CyberryPotter ElectromagicWand 是一款基于 STM32F103C8T6 微控制器的嵌入式手势识别系统。它使用MPU6050惯性测量单元 (IMU) 来捕获运动数据,使用嵌入式机器学习库通过卷积神经网络 (CNN) 对其进行处理,并识别 12 种不同的手势模式(称为“咒语”)以触发相应的作,例如控制 LED。nnom系统架构CyberryPotter ElectromagicWand 由三个主要组件组成:硬件、固件和 PC 软件工具,它们协同工作以实现手势识别和响应。
2025-05-07 16:22:20
935
原创 无人机相关技术与故障排除笔记
核心逻辑: 通过微控制器生成高精度 PWM 信号,控制电调输出电压,驱动无刷电机按需运转。关键参数: 频率决定响应速度,分辨率影响控制精度,初始占空比保障安全性。实际应用: 无人机、机器人、工业自动化等领域依赖此类参数实现精准动力控制。核心逻辑: 通过电子换向和磁场同步实现无刷电机高效运转,外转子适合大扭矩场景,内转子适合高转速场景。技术关键: 霍尔传感器定位、六步换向顺序、MOS 管驱动电路设计。SPI 凭借全双工、高时钟频率和精简协议实现高速传输,适合对速度要求高的场景;
2025-05-06 08:22:09
909
原创 手表心率检测算法的简化说明
根据项目文档,开发人员最初使用了传感器的官方库,但发现它对于他们的需求来说太慢了,因此他们开发了自己的自定义算法来计算心率。OV-Watch 中的心率检测算法是一种简单的峰值检测算法,其工作原理是识别 PPG 信号中的峰值并计算这些峰值之间的时间以确定心率。峰值检测算法侧重于识别 PPG 信号中心率峰值的特征形状,而不是使用更复杂的信号处理技术,这与开发更简单、更快速算法的项目目标一致。OV-Watch 中的算法是一种简化的实时峰值检测方法,可直接处理来自 EM7028 传感器的原始 PPG 信号。
2025-05-06 03:39:56
574
原创 手表 各功能遇到的问题与解决方案
在电源管理方面,实现了三种模式:正常运行模式、睡眠模式(MCU进入STOP模式)和关机模式 README.md:131-132。在V2.4.1版本中,修改了串口IO口的处理方式,解决了休眠功耗高的问题 README.md:65。实现经典的双栈表达式计算法:一个栈存放数字,一个栈存放符号 README.md:182-184。使用外部EEPROM进行数据存储,并实现了完善的数据校验机制 README.md:155。使用栈结构存储页面指针,而不是直接存储页面对象,避免动态变化导致的问题。
2025-05-06 02:48:52
790
原创 手表的编程思想技巧详解
本回答基于对 OV-Watch 代码库的分析,主要介绍了其软件架构、页面管理、计算器功能、硬件抽象层、任务管理、心率测量和低功耗设计等核心功能的实现方式。OV-Watch 项目展示了一个结构良好的嵌入式系统设计,在硬件、中间件和应用程序层之间明确分离了关注点。该代码库展示了嵌入式系统设计的良好实践,包括适当的硬件抽象,可促进实际硬件和 PC 仿真环境之间的代码可移植性,这对于 UI 开发和测试特别有价值。该项目通过文件实现硬件抽象层,该文件充当硬件层和应用层之间的中间件。
2025-05-05 23:10:23
646
原创 手表关于MPU6050中的功能实现
OV-Watch 项目为 MPU6050 传感器实施了复杂的电源管理,以优化电池寿命,同时保持手腕检测和计步功能。
2025-05-05 20:37:05
1334
原创 手表功能RunModeTasks
RunModeTasks 执行特定于当前模式的功能 根据模式控制作行为”这句话是指 OV-Watch 智能手表项目中的一组任务,这些任务负责管理设备的运行模式并根据不同模式控制设备的行为。这种模式管理机制是智能手表延长电池寿命的关键设计。RunModeTasks 功能解释。
2025-05-05 19:04:00
403
原创 手表对EEPROM的访问
信号灯(同步机制)在OV-Watch中的实现方式在OV-Watch项目中,信号灯(即同步机制)主要通过FreeRTOS作系统提供的消息队列、任务优先级和任务挂起机制来实现对共享资源的访问控制。消息队列实现这些消息队列用于任务间的同步和通信,尤其是可能用于控制对EEPROM的访问。EEPROM访问控制显示器访问控制任务挂起和恢复机制任务优先级机制总结。
2025-05-05 04:17:50
294
原创 手表部件通信
项目使用了名为 (硬件数据访问)的中间层,作为 UI 和硬件之间的桥梁。这一层抽象了硬件访问,为 UI 组件提供了统一的接口来读取各种传感器和硬件组件的数据。在 OV-Watch 项目中,它在函数中用于检查更新请求并在需要时触发传感器数据处理。FreeRTOS 中的消息队列是线程安全的数据结构,支持任务间通信。OV-Watch 中的实现展示了一种清晰的关注点分离,每个任务都处理特定的职责并通过消息队列进行通信。OV-Watch 项目采用了多层架构来读取和显示数据,主要通过硬件中间层和任务管理系统来实现。
2025-05-05 04:07:17
909
原创 手表中计算器中小数的处理
在实现中,当需要处理连续数字并且位于小数点后时,处理逻辑与整数不同:整数是通过乘10实现位移,而小数是通过除以10的幂来调整小数位。这段代码是计算器字符串解析过程中的核心部分,用于判断当前处理的字符与前一个字符的关系。具体来说,它检查前一个处理的字符是否为数字类型。在OV-Watch的计算器实现中,小数处理是通过一个特殊的标志位和位置计数器来完成的。存储当前正在处理的字符信息,而 存储前一个处理过的字符信息。这种处理方法确保了计算器能正确识别和计算带小数点的数值。3. 处理小数点后的后续数字。
2025-05-05 03:27:06
249
原创 FreeRTOS手表学习
概述OV-Watch 是一款功能齐全、节能的智能手表,具有丰富的功能。该项目为具有广泛功能的可穿戴设备提供完整的固件和硬件设计。系统架构OV-Watch 遵循分层架构模式,可分离关注点并提高可维护性。系统架构概述硬件层固件层系统层应用层启动过程和固件更新OV-Watch 实现了一个引导加载程序系统,该系统支持通过蓝牙进行无线 (OTA) 更新。引导流程从 2.4.0 版本开始,固件已拆分为单独的 Bootloader 和 Application 组件,以支持 OTA 更新。
2025-05-05 02:51:04
1091
原创 QUIC 与 MQTT 深度解析:协议、优势与应用融合
本文详细介绍了 QUIC 协议的核心特性、优势以及它如何解决传统传输协议的问题。同时,深入解析了 MQTT 与 QUIC 的区别,并重点阐述了 MQTT over QUIC 这种融合方案的实现原理、代码示例和实际应用场景。通过理解和应用这些技术,可以在物联网、Web 服务等领域构建更高效、更稳定、更安全的网络通信系统,特别是在处理热点数据、弱网环境和高并发场景时,其优势更加突出。MQTT over QUIC 结合了 MQTT 的轻量级消息模型和 QUIC 的高效传输能力,为物联网通信提供了新的优化方向。
2025-05-04 00:38:55
677
原创 复合心跳包设计保活
维度标准 MQTT 心跳自定义复合心跳触发方式协议层自动触发(PINGREQ/PINGRESP)应用层定时器或主题订阅触发数据负载空包(0 字节)包含健康指标的 JSON/二进制数据灵活性固定频率,不可扩展支持动态频率、多指标扩展适用场景基础连接保活健康监控、故障预警等复杂场景EMQX规则引擎定时推送触发指令EMQX触发主题(服务器主动发布触发消息)ESP32响应主题(设备上报复合心跳包)
2025-05-04 00:06:27
766
原创 SQLite优化策略、Redis Cluster分片存储、历史数据转存ClickHouse(记得找好工具)
本文详细阐述了针对数据库优化,特别是处理热点数据和历史数据的关键技术。通过分库分表分散数据压力,索引优化加速数据查询,写入优化提升数据写入效率,WAL 模式提高并发读写性能,数据压缩节省存储空间,连接池与锁控制保障高并发下的数据一致性。在此基础上,进一步探讨了利用对热点数据进行高速缓存和分片处理,以及将历史数据转存到 ClickHouse进行高效分析的分层存储策略。这些技术结合应用,能够显著提升数据库系统的整体性能、可伸缩性和成本效益,有效应对海量数据和高并发访问的挑战。
2025-05-04 00:05:20
597
原创 LVGL按键触发回调函数的完整流程
如果是我的话我会怎么写:例如按键,我先定义一个结构体里面包含ID,事件名等和回调函数的链表节点结构体里面有具体函数的指针,也有指向下一个回调函数的链表节点的指针,初始化一个结构体变量的,通过BSP层来驱动触摸屏幕,再通过中间层与被按下时就会判断是长按还是短按还是其他,改变变量的事件例如:改成长按,生成事件包后再注册你长按的回调函数链表节点,再根据变量的事件到链表中遍历最后实现功能.父容器监听所有子列表项的点击事件,无需为每个列表项单独注册回调。的回调,打印所有事件日志,观察事件触发顺序。
2025-04-24 14:45:14
1070
原创 LVGL出现的问题(一)(对象获取的宽长是0,对象获取的坐标是错误的)
问题类型关键操作相关文档坐标未更新调用坐标系误解使用对齐函数替代手动计算布局依赖更新父对象布局坐标函数误用区分原始坐标与对齐后坐标样式影响检查边框、填充属性对象未正确初始化关联到活动屏幕通过以上步骤排查,可解决绝大多数坐标不准确的问题。若仍存在异常,建议结合LVGL的调试工具(如LV_USE_LOG)输出实时坐标值辅助分析。问题类型关键操作验证方法延迟更新未触发调用打印更新前后的尺寸内容/尺寸未设置显式设置尺寸或添加内容检查对象是否有可见内容布局配置错误。
2025-04-23 12:36:51
794
原创 LVGL学习(三)(groups,开关,复选框,下拉列表,滚轮,进度条,滑动条,圆弧,定时器,线条,文本框,按钮矩阵,通过FreeType显示字体,添加新的图标字体SYMBOL)
预制组件:提前安装好传感器(状态检测)、执行器(样式变化)、控制器(事件处理)批量生产:后续控件直接从流水线下线,自带完整交互能力开发者只需:告诉控件“做什么”(业务逻辑),而不用操心“怎么做”(交互响应)这种设计让 LVGL 的开发效率大幅提升,就像用预制板盖房子——不用从烧砖开始,直接搭积木就能建成大厦。滚轮 = 滑动选择列表,配置简单,交互直观。记住关键函数:设选项、改样式、拿选中值、绑事件。动手试一次比看十遍更管用!
2025-04-23 12:15:04
1268
原创 LVGL学习(一)(IMX6ULL运行LVGL,lv_obj_t,lv_obj,size,position,border-box,styles,events)
将拨码开关拨至USB烧写模式:烧录完成后将拨码开关设为EMMC启动模式:登录用户名为:root。不需要密码,输入 root 之后回车即可将资料目录中的 “03_开发软件\imx6ull_toolchain\toolchain.zip” 解压得到 “arm-buildroot-linux-musleabihf_sdk-buildroot.tar.gz”,将其上传到虚拟机系统中在虚拟机中执行命令解压:tar -xvf arm-buildroot-linux-musleabihf_sdk-buildroot.t
2025-04-21 21:20:41
952
原创 OV_Watch(二)(OV_Watch中Tasks学习)
是系统中“活动状态” 的 “心跳信号通道”发送端:在用户交互(界面操作、功能计时)时发送 “活动信号”,阻止系统进入节能模式。接收端:根据队列是否有消息,判断是否执行关屏、降频等空闲操作。这种设计确保设备在 “用户体验” 和 “功耗控制” 之间取得平衡,是嵌入式系统中典型的任务间通信案例。驱动 GUI 框架的时间逻辑(LVGL 滴答更新)。处理特定页面的实时计时(如定时器页面的毫秒级计数)。控制传感器的周期性操作(如心率数据的定时采样)。
2025-04-21 03:17:41
607
原创 OV-Watch(一)(IAP_F411学习)
flash_if.c是 Flash 操作的 “底层工具箱”,为 Ymodem 传输提供了可靠的硬件操作支持。核心逻辑围绕“擦除 - 写入 - 验证”三大步骤,确保固件升级过程中数据的正确性和安全性。理解这些函数的作用,就能明白 IAP 如何通过串口等方式安全地更新设备固件,就像给手机 “无线升级系统” 一样,每一步都需要严格的擦写和验证。第一段代码:禁用 Flash 写保护(功能关闭指定 Flash 存储区的写保护,允许后续对这些区域进行擦除或编程操作。
2025-04-20 12:20:03
571
原创 Using the CubeMX code (二)(Thermal Camera,simulink hardware-in-the-loop(HIL) Demo)
。
2025-04-18 12:25:39
832
原创 Using the CubeMX code (一)(GPIO,PWM ,Cube AI,手写数字识别 MNIST,Demo)
由于CST816读取频率问题,绘制的触摸点与点的距离会有一定距离,同时1×1的点非常小,因此,需要对点进行膨胀,都变为8×8的黑点绘制到LCD上,其中。通过串口传数据到上位机VAFA,其中蓝色的线为准确的sin(x)的值,绿色的为模型输出的值,可以看到拟合的比较好,但是在接近sin(x)=0的附近,拟合的比较不好。当然,还有一个问题,如果手写滑动速度太快,就算扩充成了8×8,点与点的距离远了看起来还是很明显,所以推荐再做处理,将没相连的黑点连接在一起。,灵活适配不同场景的死区时间需求。
2025-04-17 16:31:26
1013
原创 FreeRTOS入门与工程实践-基于STM32F103(二)(互斥量,事件组,任务通知,软件定时器,中断管理,资源管理,调试与优化)
事件组是 FreeRTOS 中轻量级的多事件同步工具,通过 “位操作” 和 “逻辑条件” 实现任务间的高效协作。相比队列(传数据)和信号量(传状态),事件组更适合处理“多事件组合”的场景,比如 “同时等待多个条件” 或 “等待任意条件”,是嵌入式系统中任务同步的核心机制之一。// 按键处理任务句柄一对一通知:比如传感器驱动任务通知数据处理任务 “数据准备好了”。轻量级信号量:替代二进制 / 计数型信号量,减少内存开销。中断到任务通信:中断触发后快速通知任务处理事件(如按键、传感器触发)。
2025-04-15 14:42:40
659
原创 FreeRTOS入门与工程实践-基于STM32F103(一)(单片机程序设计模式,FreeRTOS源码概述,内存管理,任务管理,同步互斥与通信,队列,信号量)
裸机极限:状态机是裸机的终极优化模式,但受限于单线程本质,无法彻底解决耗时任务相互影响的问题。升级方向:当任务复杂度超过人工拆分能力时,需使用多任务系统(RTOS),通过操作系统调度实现“伪并行”。方案全局变量互斥量队列线程安全❌ 易冲突✔️ 原子操作✔️ 无需锁CPU利用率❌ 轮询耗资源✔️ 自动阻塞✔️ 自动阻塞适用场景无低频独占操作高频数据发送结论:在RTOS中,绝对不要用全局变量实现互斥,优先选择互斥量或队列。
2025-04-13 21:59:48
1099
原创 ARM架构与编程(六)后续(09_GIC介绍与编程10_实战_GPIO中断编程(IMX6ULL))
ARM体系结构定义了通用中断控制器(GIC),该控制器包括一组用于管理单核或多核系统中的中断的硬件资源。GIC提供了内存映射寄存器,可用于管理中断源和行为,以及(在多核系统中)用于将中断路由到各个CPU核。它使软件能够屏蔽,启用和禁用来自各个中断源的中断,以(在硬件中)对各个中断源进行优先级排序和生成软件触发中断。它还提供对TrustZone安全性扩展的支持。GIC接受系统级别中断的产生,并可以发信号通知给它所连接的每个内核,从而有可能导致IRQ或FIQ异常发生。你可以把 。
2025-04-10 19:06:32
865
原创 ARM架构与编程学习(六)(异常与中断(概念与处理,处理,分析_保存现场,CPU Mode State与寄存器,ARM_Thumb指令集程序,未定义指令异常,SVC异常,中断硬件框架,GIC介绍))
假设有个大房间里面有小房间,婴儿正在睡觉,他的妈妈在外面看书。 问:这个母亲怎么才能知道这个小孩醒?过一会打开一次房门,看婴儿是否睡醒,然后接着看书一直等到婴儿发出声音以后再过去查看,期间都在读书第一种方法叫做查询方式:优点:简单缺点: 累如何写程序? while(1) { 1 read book(读书) 2 open door(开门) if(小孩还在睡) return(继续读书)
2025-04-08 15:18:53
341
原创 ARM架构与编程学习(五)(代码重定位(段的概念_重定位的引入,重定位要做的事,链接脚本使用与分析,数据段重定位,清除BSS段,代码段重定位,重定位的纯C函数实现))
段 = 给固件的“工具箱”分区,让管家(片内固件)做事又快又稳,功能自然强大!段类型是否需要重定位类比原因代码段✅ 需要修改说明书上的地址指令隐含绝对地址只读数据段✅ 需要调整装饰品悬挂位置数据引用依赖预设地址可读写数据段✅ 需要重新摆放家具变量地址必须对齐BSS段❌ 不需要预留空仓库货架并清空只占位,无实际数据搬运一句话理解:只要段里有“写死地址的快递单”(绝对地址引用),搬家(加载到内存)时就必须改地址(重定位)。
2025-04-06 21:10:30
1049
2
原创 ARM架构与编程学习(四)(08_keil_gcc_Makefile)
IDE指集成开发环境(Integrated Development Environment)。我们开发STM32F103等单片机程序时使用是keil就是一种IDE。使用IDE,很容易操作,点点鼠标就可完成:添加文件指定文件路径(头文件路径、库文件路径)指定链接库编译、链接下载、调试。
2025-04-05 13:30:06
583
原创 ARM架构与编程(三)(05_第1个程序深度解析、(01_编程知识_进制、02_编程知识_字节序_位操作、03_编程知识_汇编_反汇编_机器码蹲、04_编程知识_C与汇编深入分析、纯汇编点灯))
C 为了方便人类方便使用,发明的高级语言,要转换为汇编。汇编 为了解放人类的记忆,发明的“助记符”,不用去记各类机器码。最终要转换为机器码。机器码给CPU使用。
2025-04-04 11:17:54
616
原创 ARM架构与编程学习(二)(ARM架构(地址空间_RISC与CISC,ARM内部寄存器,ARM汇编,ARM汇编模拟器VisUAL,内存访问指令,数据处理指令,跳转指令))
参考与Cortex-M4权威指南.pdf》第5章以“数据处理”指令为例,UAL汇编格式为:Operation表示各类汇编指令,比如ADDMOV;如下图:cond。
2025-04-03 22:39:32
1076
空空如也
关于#图像处理#的问题,请各位专家解答!(语言-c++)
2023-10-23
关于#stm32#的问题:为什么我的OLED都显示0000
2023-09-12
为什么我的PWM驱动呼吸灯和舵机烧录进去后要按一下reset才有用啊
2023-08-23
PWM在驱动LED灯时无法正常驱动,如何解决?
2023-08-23
关于#链表#的问题,请各位专家解答!(语言-c语言)
2023-04-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人