[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波形,配置如下图所示:
通过查看总线TIM的总线时钟,我们配置他为84MHz的时钟,那么配置成84000 000/8400-1 即为10Khz,再除上Period 200即为50Hz的周期。生成代码后,我们还需要手工添加代码为设置TIM2的启动即:
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接到舵机的信号输入位置:
【实现效果】
下载程序后,就可以通过手势来对舵机的控制了。详见视频: