当前位置:   article > 正文

关于四足行走机器人步态分析STM32+SG90舵机控制_王龙基于stm32制作四足机器人

王龙基于stm32制作四足机器人

关于四足行走机器人步态分析STM32+SG90舵机控制

  • 最近逛某站看了很多国赛大佬的赛车,下面评论区一堆大佬在感叹“老师看到赛车都摇头。”作为一个初入STM32坑的萌新,我在某些站上查阅了相关资料后,确定给我自己的机器人搞成四足行走(ps,其实是L298N烧了)。
  • 目前手上的板子是C8T6,学习的视频是江科协,主要代码有部分属于移植的,这里就不贴源码包了,也有很多自己的设计在里面,懒得去移植出来。
  • 言归正传,四足机器人,类似动物界的猫狗豹狮子等进行行走运动。可以前进,后退,右转向,左转向。

引脚设置:

我采用的是,PB 6 、7、 8、 9四个引脚控制四个舵机,用的是TIM4的四个通道,参数源于江科协视频参数。
 

  1. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  2. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  3. GPIO_InitTypeDef GPIO_InitStructure;
  4. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  5. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
  6. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  7. GPIO_Init(GPIOB, &GPIO_InitStructure);
  8. TIM_InternalClockConfig(TIM4);
  9. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  10. TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  11. TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  12. TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1; //ARR
  13. TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSC
  14. TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
  15. TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);
  16. TIM_OCInitTypeDef TIM_OCInitStructure;
  17. TIM_OCStructInit(&TIM_OCInitStructure);
  18. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  19. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  20. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  21. TIM_OCInitStructure.TIM_Pulse = 0; //CCR
  22. TIM_OC1Init(TIM4, &TIM_OCInitStructure);
  23. TIM_OC2Init(TIM4, &TIM_OCInitStructure);
  24. TIM_OC3Init(TIM4, &TIM_OCInitStructure);
  25. TIM_OC4Init(TIM4, &TIM_OCInitStructure);
  26. TIM_Cmd(TIM4, ENABLE);

Pwm输出波形控制舵机,

  1. void PWM_SetComparePB6(uint16_t Compare)
  2. {
  3. TIM_SetCompare1(TIM4, Compare);
  4. }
  5. void PWM_SetComparePB7(uint16_t Compare)
  6. {
  7. TIM_SetCompare2(TIM4, Compare);
  8. }
  9. void PWM_SetComparePB8(uint16_t Compare)
  10. {
  11. TIM_SetCompare3(TIM4, Compare);
  12. }
  13. void PWM_SetComparePB9(uint16_t Compare)
  14. {
  15. TIM_SetCompare4(TIM4, Compare);

下面,我们将他的四肢分解开来,设为ABCD四足。如图。

PB6-------A

PB7-------B

PB8-------C

PB9-------D

这个时候我的代码是这样的

  1. PWM_SetComparePB6(1500);
  2. PWM_SetComparePB7(1500);
  3. PWM_SetComparePB8(1500);
  4. PWM_SetComparePB9(1500);

在四足运动过程当中,把每两次直立步态之间的时间定为一个周期T,从四脚直立状态开始,时间设置为γ

前进分析:

当γ=0时,ABCD 同时 站立,

从γ=0 到γ=1/4T

        时间段内,A C 向前抬起,(假设抬起45°),这个时候,BD保持直立以支撑身体站立。

此时我们的4个舵机代码应该是(假设抬起45°)(代码参数根据自己引脚输出和舵机放置方向调试,我这里舵机方向大头在前 小头在后。。离齿轮近的边为大头方向,远的边叫小头方向。)实在分不清楚 每个角度设置一次看看。

  1. PWM_SetComparePB6(1000);//A腿是顺时针在动角是缩小的,
  2. PWM_SetComparePB7(1500);
  3. PWM_SetComparePB8(2000);//c腿是逆时针在动,角度是放大的。
  4. PWM_SetComparePB9(1500);

从γ=1/4T到γ=1/2T

        的时间段里,这时候AC处于悬空态,BD 从直立状态开始悬空,学过初中物理,应该能够理解,力的作用是相互的,我们的车要向前走,轮子给地面的力方向是向后的。所以此时,我们的BD两条腿,同时向后蹬腿,给到机器人向前的力。此时的状态应该如图:

此时我们的4个舵机代码应该是:

  1. PWM_SetComparePB6(1000);//
  2. PWM_SetComparePB7(2000);//B腿开始向后蹬,,
  3. PWM_SetComparePB8(2000);//
  4. PWM_SetComparePB9(1000);//D腿开始向后蹬,

这个时候机器人应该会向CD方向倾斜,这边变矮了。

当γ=1/2T到γ=3/4T

        的时候。我们机器人的AC腿往直立方向回复,BD悬空,AC向后蹬腿,再一次给了机器人向前的力。如图

  1. PWM_SetComparePB6(1500);//回到直立
  2. PWM_SetComparePB7(2000);//,
  3. PWM_SetComparePB8(1500);//回到直立
  4. PWM_SetComparePB9(1000);//

当γ=3/4T到γ=T

        的时候。我们机器人的AC腿直立支持机器人,BD从悬空回复。

  1. PWM_SetComparePB6(1500);//回到直立
  2. PWM_SetComparePB7(1500);//,
  3. PWM_SetComparePB8(1500);//回到直立
  4. PWM_SetComparePB9(1500);//

这样就完成了一个前进的周期,同理,可以计算出先出DB腿的数值和步态。

后退同理,反向写代码就行了。

转弯:左转,

当γ=0时,

        四足姿态直立,照搬前面的代码。

  1. PWM_SetComparePB6(1500);//回到直立
  2. PWM_SetComparePB7(1500);//,
  3. PWM_SetComparePB8(1500);//回到直立
  4. PWM_SetComparePB9(1500);//

当γ从γ=0到γ=1/4T

        过程中,机器人抬起AC腿,如图。

这时候 BD支撑 AC悬空。

  1. PWM_SetComparePB6(2000);//
  2. PWM_SetComparePB7(1500);//,
  3. PWM_SetComparePB8(1000);//
  4. PWM_SetComparePB9(1500);//

当γ从γ=1/4T到γ=1/2T

        过程中,AC悬空,BD开始悬空,B腿向前,作用力向后;D腿向后,作用力向前;形成逆时针旋转,力向左倾斜,完成向左运动。

  1. PWM_SetComparePB6(2000);//
  2. PWM_SetComparePB7(1000);//,
  3. PWM_SetComparePB8(1000);//
  4. PWM_SetComparePB9(2000);//

当γ从γ=1/2到γ=3/4T

        过程中,ABCD倾斜支撑机器人身体,此时AC回复直立状态,A向前蹬腿,形成向后的力,C向后蹬腿形成向前的力。BD被拉起悬空。

AC形成的合力,逆时针方向,机器人整个身体向左运动。


 

  1. PWM_SetComparePB6(1500);//
  2. PWM_SetComparePB7(1000);//,
  3. PWM_SetComparePB8(1500);//
  4. PWM_SetComparePB9(2000);//

最后,当γ=从γ=3/4T到γ=T

过程中,BD从悬空到直立,双腿没落地,也行成不了力。

  1. PWM_SetComparePB6(1500);//
  2. PWM_SetComparePB7(1500);//,
  3. PWM_SetComparePB8(1500);//
  4. PWM_SetComparePB9(1500);//

同理,可以分析出向右的四个步态。

新人第一次写,试试手,如有不懂,或者错误,感谢指出!

资源参考,某站的少儿编程视频步态分析。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/872950
推荐阅读
相关标签
  

闽ICP备14008679号