[X-NUCLEO-53L4A3 TOF评估板] 之手势控制舵机
<p> 之手势识别 <a href="https://bbs.eeworld.com.cn/thread-1299302-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1299302-1-1.html</a><br />TouchGFX测距尺 - 传感器 - 电子工程世界-论坛<br />
开箱体验以及常规测距 - 传感器 - 电子工程世界-论坛</p>
<p>在前面的三篇文章里,我实现了手势的识别,这一篇分享手势控制舵机。</p>
<p>【舵机控制实现】</p>
<p>舵机是通过一个20ms的周期PWM波型来控制他的方向,这里我先使用TIM2来通过PA1实现输出50Hz的pwm波形。</p>
<p>首先配置TIM2 CH2来输出50Hz的pwm波形,配置如下图所示:</p>
<p> 通过查看总线TIM的总线时钟,我们配置他为84MHz的时钟,那么配置成84000 000/8400-1 即为10Khz,再除上Period 200即为50Hz的周期。生成代码后,我们还需要手工添加代码为设置TIM2的启动即:</p>
<p> </p>
<pre>
<code> HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);//开启定时器2的通道2
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 200/20);//设置他的占空比为 1ms.</code></pre>
<p>在手势识别函数中,我们来设定,不同的方向手势,对占空比进行修改,最后实现对舵机的实时控制:</p>
<pre>
<code> 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;
sum_d += distanceData;
sum_tt += timeData * timeData;
sum_td += timeData * distanceData;
}
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");
}</code></pre>
<p>通过原理图,我们找到A1的位置,并把A1接到舵机的信号输入位置:</p>
<p></p>
<p>【实现效果】</p>
<p>下载程序后,就可以通过手势来对舵机的控制了。详见视频:</p>
<p>2054bb376fed3c7aa043dac8a5e0ea44<br />
</p>
<p>快速进行采样的时候最快可以达到多少的采样率? </p>
秦天qintian0303 发表于 2024-11-18 14:56
快速进行采样的时候最快可以达到多少的采样率?
<p>这个没有详细搞呢。这个是他一个系列中采样最快的,因为他只采一个点。</p>
lugl4313820 发表于 2024-11-18 16:56
这个没有详细搞呢。这个是他一个系列中采样最快的,因为他只采一个点。
<p>ADC+DMA自动转换,多个也应该会比较快,就看内部设置最快能到多少了</p>
秦天qintian0303 发表于 2024-11-18 16:58
ADC+DMA自动转换,多个也应该会比较快,就看内部设置最快能到多少了
<p>不是的,如果要实时性高要不断的往分析数组里添加数据,然后再去计算,这算法有点头痛。应该可以做出姿态的多判断。</p>
lugl4313820 发表于 2024-11-18 17:01
不是的,如果要实时性高要不断的往分析数组里添加数据,然后再去计算,这算法有点头痛。应该可以做出姿态 ...
<p>我说的是芯片内部,外部接口采集肯定麻烦,才到一个就得算一遍</p>
秦天qintian0303 发表于 2024-11-18 17:03
我说的是芯片内部,外部接口采集肯定麻烦,才到一个就得算一遍
<p>国产有的手势识别应该有特有算法,可以直接读取他的几个状态的。</p>
页:
[1]