0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用STM32实现自平衡机器人功能项目

嵌入式开发爱好者 来源:嵌入式开发爱好者 2023-05-10 09:48 次阅读

机器人整体开源,同时总结一下机器人搭建过程中遇到的坑和未来的改进方向。在分享的文件里包含了结构设计、程序控制、电路设计以及其他模块相关资料供大家参考。

第一:机器人原理分析

首先来看成品图:

02807150-ee6f-11ed-90ce-dac502259ad0.jpg

如图所示,该机器人根据陀螺仪的位姿数据,通过三个全向轮驱动底部球体调整自己在球上的位置,保持动态平衡的同时实现全向移动。

保持动态平衡过程需要对机器人进行运动学分析,这里参考了平衡小车之家的运动学方程:

02a78c0e-ee6f-11ed-90ce-dac502259ad0.png

自平衡控制问题转化为三步:输入X、Y角度—控制器计算—输出A、B、C电机转速的控制模型。

第二:控制器设计

首先考虑参考平衡车控制,球上自平衡机器人本质上依然是一个一阶倒立摆问题。

02b888e2-ee6f-11ed-90ce-dac502259ad0.png

这里参考了飞思卡尔直立车的控制方法,采用串级PID控制器,外环PD角度环,内环速度PI环。

由于我的驱动方案选择的是42步进电机,在速度闭环的时候有些问题。正常的直流电机+编码器的控制方案可以通过编码器将轮子的真实速度计算出来,从而和控制器的理想转速作差,实现速度控制。

而我这里的速度闭环是通过计算上一个时钟周期时给步进电机的控制量,通过运动学方程分解,得到机器人的虚拟速度,与理想转速作差控制。我认为这种速度闭环方式还是存在一定缺陷的,但是在网上查看论文的时候我发现有很多自平衡机器人都是用42步进电机来实现速度闭环的,不知道是什么方法。

这里还可以好好思考一下为什么角度环要用PD控制,速度环要PI控制,角度环的P部分和D部分对机器人控制有什么影响?在很多CSDN调试平衡车的博客中都有解释,这里就留给大家思考了。

第三:硬件及结构设计

自平衡机器人的硬件清单有:

56mm全向轮 45元/个

42步进电机 25/个

42步进闭环模块 59.8元/个

LM2596S降压模块 20元

STM32F103C8T6-4飞控板 59.8元

GY-521六轴陀螺仪 25元

用到的模块大致如上所示,C8T6的价格随着最近芯片涨价直线上升,我白嫖了实验室的两块板子,现在买一块实在太贵,可以等芯片价格稳定一些再买。其余开关排针等常见元件不再赘述。

电路原理图如下所示:

02d11628-ee6f-11ed-90ce-dac502259ad0.png

机器人使用solidworks设计整体结构,底板可在某宝定制6050太空铝切割,蓝色件为正常3D打印件。

02f5e1a6-ee6f-11ed-90ce-dac502259ad0.png

第四:程序部分

keil 5中开发STM32。

控制程序采用定时器0.5ms定时中断的方式进行计算,每触发两次中断计算对电机控制一次,这里还是推荐大家采用外部中断读取GY-521上的INT引脚的方式,控制计算周期。GY-521上的INT引脚每5ms触发一次跳变,采用外部中断的方式可以严格保证读取位姿数据与计算处理同步。

int TIM1_UP_IRQHandler (void)                
{
    u8 key_cal;
    if(TIM_GetITStatus(TIM1,TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM1,TIM_IT_Update); 
        flag_target=!flag_target;
        key_cal=KEY_Scan(0);
        if(state_flag==1)//矫正结束
        {
            if(flag_target==1)//每读取两次陀螺仪控制一次 
            {
                        Read_DMP();                      //===读取倾角
                        scope();
                        return 0;
            }
        }
        if(key_cal==1)//矫正按键
        {
                        Angle_Zero_X=Angle_Balance_X;
                        Angle_Zero_Y=Angle_Balance_Y;
                        key_cal=0;
                  Flag_Stop=0;
        }
        if(key_cal==2||key_cal==3)//矫正按键
        {
        Flag_Stop=1;//关闭速度环I积分
        key_cal=0;
        }
        Angle_Bias_X =Angle_Balance_X-Angle_Zero_X;     //获取Y方向的偏差
        Angle_Bias_Y =Angle_Balance_Y-Angle_Zero_Y;     //获取Y方向的偏差
        if(control_mode==0)//PID控制模式
        {
        Encoder_Analysis(Motor_A,Motor_B,Motor_C);  //正运动学分析,得到X Y方向的速度
        Balance_Pwm_X= balance_X(Angle_Bias_X,Gyro_Balance_X);//X方向的倾角控制
        Balance_Pwm_Y=-balance_Y(Angle_Bias_Y,Gyro_Balance_Y);  //Y方向的倾角控制
//      if(++flag_target_2==4)//速度环频率慢于加速度环 但是还没加速度环 
//          {
            Velocity_Pwm_X=velocity_X(compute_X);      //X方向的速度控制
            Velocity_Pwm_Y=velocity_Y(compute_Y);     //Y方向的速度控制  
//          flag_target_2=0;
//          }
            Move_X =Balance_Pwm_X+Velocity_Pwm_X;   //===X方向控制量累加   
            Move_Y =Balance_Pwm_Y+Velocity_Pwm_Y;   //===Y方向控制量累加   
            Move_Z=0;                
            Kinematic_Analysis(Move_X,Move_Y,Move_Z);//逆运动学分析得到ABC电机控制量
        }
            Motor_A=Target_A;//直接调节PWM频率 
            Motor_B=Target_B;//直接调节PWM
            Motor_C=Target_C;//直接调节PWM
//以下都是为了速度连续化处理防止突变
            if(Motor_A==0)  Motor_A=motor_a_last;
            if(Motor_B==0)  Motor_B=motor_b_last;
            if(Motor_C==0)  Motor_C=motor_c_last;
            Xianfu_Pwm(2000);
            Set_Pwm(Motor_A,Motor_B,Motor_C);
            Gyro_Balance_X_last=Gyro_Balance_X;
            Gyro_Balance_Y_last=Gyro_Balance_Y;
            Gyro_Balance_Z_last=Gyro_Balance_Z;
            Angle_Balance_X_last=Angle_Balance_X;
            Angle_Balance_Y_last=Angle_Balance_Y;
            Angle_Balance_Z_last=Angle_Balance_Z;
            motor_a_last=Motor_A;
            motor_b_last=Motor_B;
            motor_c_last=Motor_C;
    }
      return 0;
}
对于电机控制,由于采用的驱动方案是步进电机,调速的方式是改变驱动步进电机的脉冲频率。我这里选择了三个定时器,动态调节定时器的频率,具体方式是在初始化时设定好定时器的预分频系数psc的值,然后在程序里动态更改ARR寄存器的值,从而改变定时器的定时频率。
//这里以A电机的速度控制为例 输入为 电机方向和电机速度
void set_motorA_speed(u8 dir,u16 speed)
{
    u32 arr;
    arr=speed;
        TIM_ARRPreloadConfig(TIM3,DISABLE);
        TIM3->ARR=arr;//计数到10000在归零重新计数
        TIM3->CCR4=arr/2;//保持占空比为50%
        TIM_ARRPreloadConfig(TIM3,ENABLE);
        TIM_Cmd(TIM3,ENABLE);
    if(dir==0)
    {
    GPIO_SetBits(GPIOA,GPIO_Pin_1);
    }
  else
  {
    GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  }
}

小车的运动学分解代码实现如下,参考了平衡小车之家的代码:

/**********************************************************
函数功能:小车运动数学模型
入口参数:X Y Z 三轴速度或者位置
返回  值:无
***********************************************************/
void Kinematic_Analysis(float Vx,float Vy,float Vz)
{
        Target_A   = Vx + L_PARAMETER*Vz;
        Target_B   = -X_PARAMETER*Vx + Y_PARAMETER*Vy + L_PARAMETER*Vz;
        Target_C   = -X_PARAMETER*Vx - Y_PARAMETER*Vy + L_PARAMETER*Vz;
}
/*****************************************************************
函数功能:小车运动 正运动学分析 
入口参数:A B C三个电机的速度
返回  值:无
******************************************************************/
void Encoder_Analysis(float Va,float Vb,float Vc)
{
    compute_X=(Va*2-Vb-Vc);
    compute_Y=((Vb-Vc)*sqrt(3));
    compute_Z=(Va+Vb+Vc);  
}
其余代码不全放出,可在文末点击“阅读原文”下载查看。

第五:总结与展望

球上自平衡机器人可以作为算法试验平台, 输入输出固定,更换不同控制器,将数据导入MATLAB进行分析即可比较控制器性能。

个人认为结构有两个改进方向,一方面参考以下论文:余义. 单球驱动自平衡机器人位姿解算与控制系统研究[D].武汉科技大学,2019。论文中采用的四足式驱动结构更有利于机器人自平衡控制。

另一方面可以增加球体和机器人固定装置,利用机械结构将机器人与底部驱动球结合成一个整体防止机器人跳轮等问题。同时驱动球对于机器人平衡的影响较大,最好还是定制空心钢球,然后喷漆增大摩擦力,最有利于机器人自平衡控制。

控制部分的改进,首先是控制原理,本文是针对建立好的运动学方程进行分析,通过串级PID算法来实现自平衡运动。该机器人的控制问题本质上是一阶倒立摆问题,可以采用动力学建模的方式,通过动力学分析算出平衡需要的虚拟力矩,再对电机进行力矩控制。

其次是控制器,PID控制算法应用广泛但也有一定的缺点,可以考虑采用模糊PID,ADRC自抗扰控制器,强化学习等智能控制算法对机器人自平衡进行控制。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15235

    浏览量

    171209
  • 机器人
    +关注

    关注

    206

    文章

    27043

    浏览量

    201423
  • 电路设计
    +关注

    关注

    6565

    文章

    2317

    浏览量

    195462
  • STM32
    +关注

    关注

    2240

    文章

    10674

    浏览量

    348809
  • 平衡小车
    +关注

    关注

    1

    文章

    38

    浏览量

    12452

原文标题:利用STM32实现自平衡机器人功能项目

文章出处:【微信号:嵌入式开发爱好者,微信公众号:嵌入式开发爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    转:NANO—东半球最小的平衡机器人(硬件+源码+3D文件)

    什么的总算炫酷了起来 还加了一推特技(超声波,摄像头,OLED,抬头舵机,蜂鸣器,红扑扑小脸蛋),蛋黄变蛋白的,光会卖萌怎么行,蛋黄2.0是目前最小功能最多的平衡机器人 直立方案是Mega328
    发表于 07-25 10:30

    关于两轮平衡机器人载重问题

    现在流行的平衡两轮机器人,有人接触过吗,小弟最近想DIY一个玩玩,现在碰到了一个难点,至今没想通,这一类平衡机器人都是能够载物的,不同的
    发表于 11-24 11:20

    怎样去设计基于STM32的二轮平衡小车

    ​​前言近年来,移动机器人是目前科学领域比较活跃的领域之一,其应用范围越来越广泛,面临的环境也越来越复杂,这就要求机器人能够适应一些复杂的环境和任务。二轮平衡机器人正是在这一背景下提
    发表于 08-09 09:18

    怎样去制作一种球上自平衡机器人

    毕业设计——球上平衡机器人前言本次毕业设计过程中,受到过许多人的帮助,收获良多,在此将机器人整体开源,同时总结一下机器人搭建过程中遇到的坑和未来的改进方向。一、机器人原理分析首先来看成
    发表于 08-17 08:44

    基于 ATMega328p-PU 的迷你平衡机器人设计

    互联网上已经有很多平衡机器人项目,但我也想制作一个。更具体的说,我想要做一个迷你平衡机器人机器人应该从带有蓝牙连接的自制遥控器获取信息,这样我们就可以四处走动。但在内部,
    发表于 10-14 13:47

    如何利用EDA软件去设计一种球上自平衡机器人

    如何利用EDA软件去设计一种球上自平衡机器人呢?在设计过程中遇到过哪些坑呢?
    发表于 11-19 06:32

    如何设计一款球上自平衡机器人

    如何设计一款球上自平衡机器人
    发表于 02-22 07:39

    制作一个迷你平衡机器人

    描述迷你平衡机器人大家好。我知道互联网上已经有很多平衡机器人项目,但我也想做一个。实际上,我想制作一些特别的东西并制作一个迷你平衡机器人,但我的步进电机有点失败,我将在下面的视频中解释
    发表于 07-07 07:17

    平衡机器人护盾的资料分享

    描述平衡机器人护盾
    发表于 09-05 06:11

    用全志R128复刻平衡赛车机器人,还实现了三种不同的操控方式

    更上一层楼。 硬件设计 本项目中的平衡赛车机器人的硬件设计结构非常简单,硬件部分主要由R128开发板和几个驱动模块组成。 供电模块
    发表于 12-20 10:22

    迷你平衡机器人

    电子发烧友网站提供《迷你平衡机器人.zip》资料免费下载
    发表于 07-08 09:34 16次下载
    迷你<b class='flag-5'>平衡机器人</b>

    利用麦克风和音符来控制自平衡机器人

    电子发烧友网站提供《利用麦克风和音符来控制自平衡机器人.zip》资料免费下载
    发表于 11-16 11:11 0次下载
    <b class='flag-5'>利用</b>麦克风和音符来控制自<b class='flag-5'>平衡机器人</b>

    Magicbit的自平衡机器人

    电子发烧友网站提供《Magicbit的自平衡机器人.zip》资料免费下载
    发表于 11-24 11:15 0次下载
    Magicbit的自<b class='flag-5'>平衡机器人</b>

    基于Arduino UNO的自平衡机器人

    平衡机器人,使用带有 BluBug 和 Android 的车轮和 imu 6 轴传感器平衡机器人
    发表于 12-08 10:24 0次下载

    平衡机器人的构建

    电子发烧友网站提供《自平衡机器人的构建.zip》资料免费下载
    发表于 02-09 11:54 0次下载
    自<b class='flag-5'>平衡机器人</b>的构建