【STM32+OPENMV】二维云台颜色识别及追踪

一、准备工作

有关OPENMV最大色块追踪及与STM32通信内容,详情见【STM32+HAL】与OpenMV通信

有关七针OLED屏显示内容,详情见【STM32+HAL】七针OLED(SSD1306)配置(SPI版)

二、所用工具

1、芯片:STM32F407ZGT6

2、CUBEMX配置软件

3、KEIL5

4、OPENMV

三、实现功能

二维云台追踪最大色块,并显示中心x,y坐标至OLED

四、HAL配置步骤

1、生成两路PWM波控制舵机

周期为20ms

2、中断配置

五、KEIL填写代码

1、ptz.c
#include "ptz.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "main.h"
#include "tim.h"
#include "usart.h"#define RXBUFFERSIZE	256
#define CCR_UD 			TIM2->CCR2   	//up and down....		RANGE:420-2000		
#define CCR_LR 			TIM2->CCR3   	//Left and Right....	RANGE:420-2500  	
#define Cen_x  			160		//x轴中心坐标值
#define Cen_y  			120		//y轴中心坐标值#define sp1				7       //x轴速度
#define sp2				6       //y轴速度
#define range			40      //识别范围char RxBuffer[RXBUFFERSIZE],rx_buf[RXBUFFERSIZE];
uint8_t aRxBuffer;
uint8_t Uart1_Rx_Cnt = 0;int cnt_rx=0,cnt_dt=0;
int cx=0,cy=0;void Tilt(void)
{if(cx < (Cen_x-range)) CCR_LR = (CCR_LR>2450)?2450:CCR_LR+sp1;else if (cx > (Cen_x+range))	CCR_LR = (CCR_LR<450)?450:CCR_LR -sp1;else CCR_LR= CCR_LR;if(cy < (Cen_y-range)) CCR_UD = (CCR_UD<420)?420:CCR_UD -sp2;else if (cy > (Cen_y+range))	CCR_UD = (CCR_UD>1800)?1800:CCR_UD+sp2;else CCR_UD= CCR_UD;
}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{UNUSED(huart);if(huart==&huart2){RxBuffer[Uart1_Rx_Cnt] = aRxBuffer;Uart1_Rx_Cnt++;if((RxBuffer[Uart1_Rx_Cnt-1] == 0xb3)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0xb3)) cnt_rx=1;		//帧头判定else if((RxBuffer[Uart1_Rx_Cnt-2] == 0x0d)&&(RxBuffer[Uart1_Rx_Cnt-1] == 0x0a)) cnt_rx=2;	//帧尾判定else cnt_rx=0;switch (cnt_rx){case 1:Uart1_Rx_Cnt = 0;memset(RxBuffer,0x00,sizeof(RxBuffer));break;case 2:RxBuffer[Uart1_Rx_Cnt-1] = '\0';RxBuffer[Uart1_Rx_Cnt-2] = '\0';strcpy(rx_buf,RxBuffer);int st=0;						//有效数值开始位置cnt_dt=0;						//空格数for(int i=0;rx_buf[i];i++){if(cnt_dt==4) break;if(rx_buf[i]==' ') {cnt_dt++;int temp=0;for(int j=st;j<i;j++)temp=temp*10+(rx_buf[j]-'0');switch (cnt_dt){case 1:cx=temp;break;case 2:cy=temp;break;}st=i+1;}}while(HAL_UART_GetState(&huart2) == HAL_UART_STATE_BUSY_TX);Uart1_Rx_Cnt = 0;memset(RxBuffer,0x00,sizeof(RxBuffer));break;default:break;}HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);}
}

2、main.c
  /* USER CODE BEGIN 2 */OLED_Init();HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);TIM2->CCR2 = 420-1;TIM2->CCR3 = 1400-1;HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_2);HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_3);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){OLED_ShowNum(30,20,cx,3,16);OLED_ShowNum(30,40,cy,3,16);OLED_Refresh();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(flag) Tilt();}/* USER CODE END 3 */
}

3、按键控制暂停
/* USER CODE BEGIN 4 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)  
{if(GPIO_Pin == KEY0_Pin){HAL_Delay(20); //延时消抖if(GPIO_Pin == KEY0_Pin){flag=0;}}
}
/* USER CODE END 4 */

六、巨人之肩

【毕业设计】基于STM32及OpenMV的云台追踪装置

电赛:二维云台控制

【毕业设计】基于STM32F103C8T6最小系统板与OpenMV的二维云台PID控制追踪系统

后续优化方案:PID调控

位置式PID与增量式PID区别浅析

七、源码提供

【STM32+OPENMV】二维云台颜色识别及追踪【无PID版】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/513094.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lichee Pi 4A:RISC-V架构的开源硬件之旅

一、简介 Lichee Pi 4A是一款基于RISC-V指令集的强大Linux开发板&#xff0c;它凭借出色的性能和丰富的接口&#xff0c;吸引了众多开发者和爱好者的关注。这款开发板不仅适用于学习和研究RISC-V架构&#xff0c;还可以作为软路由、小型服务器或物联网设备的核心组件。 目录 一…

【C++基础】STL容器面试题分享||上篇

&#x1f308;欢迎来到C基础专栏 &#x1f64b;&#x1f3fe;‍♀️作者介绍&#xff1a;前PLA队员 目前是一名普通本科大三的软件工程专业学生 &#x1f30f;IP坐标&#xff1a;湖北武汉 &#x1f349; 目前技术栈&#xff1a;C/C STL 1.请说说 STL 的基本组成部分2.详细的说&…

从事测绘地信,你需要这些插件、软件、小工具、图源...

特别声明&#xff0c;本篇是来自公众号GIS前沿的资源&#xff0c;看着比较好&#xff0c;特别给大家推荐。加粗样式 今天&#xff0c;我们又来汇总了一些工作中实用的插件、小工具、数据等等&#xff0c;小助手又来帮你提高工作效率了****。 因为小助手每年都会总结一次&…

10.WEB渗透测试-Linux基础知识-Linux用户权限管理(下)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;9.WEB渗透测试-Linux基础知识-Linux用户权限管理&#xff08;上&#xff09;-CSDN博客 ch…

蓝桥杯前端Web赛道-新鲜的蔬菜

蓝桥杯前端Web赛道-新鲜的蔬菜 题目链接&#xff1a;1.新鲜的蔬菜 - 蓝桥云课 (lanqiao.cn) 题目要求如下&#xff1a; 其实很容易联想到使用flex布局&#xff0c;这是flex布局一种非常经典的骰子布局&#xff0c;推荐Flex 布局教程&#xff1a;实例篇 - 阮一峰的网络日志 (r…

c++入门语法————初识类和对象

文章目录 一、类的定义1. 声明和定义全部放在类体中2.声明和定义分离 二、类的访问限定符及封装三、类的实例化四、 类对象的存储方式五.this指针1.简单应用2、问题思考 一、类的定义 class className { // 类体&#xff1a;由成员函数和成员变量组成 }; // 一定要注意后面的…

C++入门全集(5):内存管理

前言 一、内存区域划分 二、C的内存管理方式 2.1 对内置类型 2.2 对自定义类型 三、new和delete的底层实现 四、new和delete的原理 五、定位new 六、malloc/free和new/delete 前言 在C中&#xff0c;内存管理是不可避免的一门必修课。C对内存的自由度使其获得了更高的…

DA14531在三星手机手写笔的应用让我打开眼镜

手写笔的功能 这是一款内置蓝牙功能的魔性笔&#xff0c;它是遥控器、是照相、切换摄像头、是暂停或者打开播放列表。乃至更多操作-通过不同的手势隔空操作&#xff0c;或者按下触控按键便可轻松搞定。 手写笔硬件设计 内部结构 采用2.3V可循环充电电池&#xff0c;放入手…

【CSP试题回顾】202212-2-训练计划

CSP-202212-2-训练计划 解题思路 输入和初始化&#xff1a; 首先&#xff0c;代码从输入中获取项目的截止日期和项目数量。然后&#xff0c;它初始化一个项目列表&#xff0c;每个项目都有其依赖项、被依赖的项目集合、完成时间、总完成时间&#xff08;包括依赖链&#xff09…

@RequestBody

目录 概述 深入细节 案例 RequestBody与前端传过来的json数据的匹配规则 指定模型中的属性对应什么key 用Valid校验RequestBody的参数 根据RequestBody的内容来区分使用哪个资源 概述 RequestBody主要用来接收前端传递给后端的json字符串中的数据(请求体中的数据)而最常…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:多态样式)

设置组件不同状态下的样式。 说明&#xff1a; 从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 从API Version 11开始支持另一种写法attributeModifier&#xff0c;可根据开发者需要动态设置属性。 stateStyles stateStyl…

【深度学习笔记】5_8 网络中的网络NiN

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 5.8 网络中的网络&#xff08;NiN&#xff09; 前几节介绍的LeNet、AlexNet和VGG在设计上的共同之处是&#xff1a;先以由卷积层构成的…