lugl4313820 发表于 2024-11-17 12:12

[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>&nbsp; 通过查看总线TIM的总线时钟,我们配置他为84MHz的时钟,那么配置成84000 000/8400-1 即为10Khz,再除上Period 200即为50Hz的周期。生成代码后,我们还需要手工添加代码为设置TIM2的启动即:</p>

<p> &nbsp;</p>

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

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

<pre>
<code>                ret = isApproximatelyLinear(timeData, distanceData, DATA_POINTS);
                if (ret &lt;100)
                        {
                                printf("物体静止或近似静止。\n");
                        }
                        else if( ret &gt;=100 &amp;&amp; ret &lt;5000)
                        {
                                        double sum_t = 0, sum_d = 0, sum_tt = 0, sum_td = 0;
                                        for (int i = 0; i &lt; 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 &gt; 0) {
                                                        printf("物体向前运动。\n");
                                                        pwmvalue --;
                                                if(pwmvalue &lt;5)
                                                        pwmvalue = 5;
                                                __HAL_TIM_SetCompare(&amp;htim2, TIM_CHANNEL_2, pwmvalue);//修改舵机运行位置
                                        } else if (a &lt; 0) {
                                                        printf("物体向后运动。\n");
                                                pwmvalue ++;
                                                if(pwmvalue &gt;25)
                                                        pwmvalue = 25;
                                                __HAL_TIM_SetCompare(&amp;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 />
&nbsp;</p>

秦天qintian0303 发表于 2024-11-18 14:56

<p>快速进行采样的时候最快可以达到多少的采样率?&nbsp;</p>

lugl4313820 发表于 2024-11-18 16:56

秦天qintian0303 发表于 2024-11-18 14:56
快速进行采样的时候最快可以达到多少的采样率?&nbsp;

<p>这个没有详细搞呢。这个是他一个系列中采样最快的,因为他只采一个点。</p>

秦天qintian0303 发表于 2024-11-18 16:58

lugl4313820 发表于 2024-11-18 16:56
这个没有详细搞呢。这个是他一个系列中采样最快的,因为他只采一个点。

<p>ADC+DMA自动转换,多个也应该会比较快,就看内部设置最快能到多少了</p>

lugl4313820 发表于 2024-11-18 17:01

秦天qintian0303 发表于 2024-11-18 16:58
ADC+DMA自动转换,多个也应该会比较快,就看内部设置最快能到多少了

<p>不是的,如果要实时性高要不断的往分析数组里添加数据,然后再去计算,这算法有点头痛。应该可以做出姿态的多判断。</p>

秦天qintian0303 发表于 2024-11-18 17:03

lugl4313820 发表于 2024-11-18 17:01
不是的,如果要实时性高要不断的往分析数组里添加数据,然后再去计算,这算法有点头痛。应该可以做出姿态 ...

<p>我说的是芯片内部,外部接口采集肯定麻烦,才到一个就得算一遍</p>

lugl4313820 发表于 2024-11-18 17:13

秦天qintian0303 发表于 2024-11-18 17:03
我说的是芯片内部,外部接口采集肯定麻烦,才到一个就得算一遍

<p>国产有的手势识别应该有特有算法,可以直接读取他的几个状态的。</p>
页: [1]
查看完整版本: [X-NUCLEO-53L4A3 TOF评估板] 之手势控制舵机