[光学传感器] [X-NUCLEO-53L4A3 TOF评估板] 之手势控制舵机

lugl4313820   2024-11-17 12:12 楼主

[X-NUCLEO-53L4A3 TOF评估板] 之手势识别 https://bbs.eeworld.com.cn/thread-1299302-1-1.html
[X-NUCLEO-53L4A3 TOF评估板] TouchGFX测距尺 - 传感器 - 电子工程世界-论坛
[X-NUCLEO-53L4A3 TOF评估板] 开箱体验以及常规测距 - 传感器 - 电子工程世界-论坛

在前面的三篇文章里,我实现了手势的识别,这一篇分享手势控制舵机。

【舵机控制实现】

舵机是通过一个20ms的周期PWM波型来控制他的方向,这里我先使用TIM2来通过PA1实现输出50Hz的pwm波形。

首先配置TIM2 CH2来输出50Hz的pwm波形,配置如下图所示:

image.png   通过查看总线TIM的总线时钟,我们配置他为84MHz的时钟,那么配置成84000 000/8400-1 即为10Khz,再除上Period 200即为50Hz的周期。生成代码后,我们还需要手工添加代码为设置TIM2的启动即:

image.png  

	HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);  //开启定时器2的通道2
	__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 200/20);  //设置他的占空比为 1ms.

在手势识别函数中,我们来设定,不同的方向手势,对占空比进行修改,最后实现对舵机的实时控制:

		ret = isApproximatelyLinear(timeData, distanceData, DATA_POINTS);
		if (ret <100) 
			{
				printf("物体静止或近似静止。\n");
			}
			else if( ret >=100 && ret <5000)
			{
					double sum_t = 0, sum_d = 0, sum_tt = 0, sum_td = 0;
					for (int i = 0; i < DATA_POINTS; i++) {
							sum_t += timeData[i];
							sum_d += distanceData[i];
							sum_tt += timeData[i] * timeData[i];
							sum_td += timeData[i] * distanceData[i];
					}
					double denominator = DATA_POINTS * sum_tt - sum_t * sum_t;
					double a = (DATA_POINTS * sum_td - sum_t * sum_d) / denominator;
					if (a > 0) {
							printf("物体向前运动。\n");
							pwmvalue --;
						if(pwmvalue <5)
							pwmvalue = 5;
						__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, pwmvalue);  //修改舵机运行位置
					} else if (a < 0) {
							printf("物体向后运动。\n");
						pwmvalue ++;
						if(pwmvalue >25)
							pwmvalue = 25;
						__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, pwmvalue); //修改舵机运行位置
					} else {
							printf("物体静止或近似静止。\n");
						
					}
				} else {
						printf("数据点不近似在一条直线上,无法简单判断运动方向。\n");
				}

通过原理图,我们找到A1的位置,并把A1接到舵机的信号输入位置:

image.png

【实现效果】

下载程序后,就可以通过手势来对舵机的控制了。详见视频:

20241117115525

 

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复