其他分享
首页 > 其他分享> > arduino控制步进电机移动丝杆实现拨片架水平移动

arduino控制步进电机移动丝杆实现拨片架水平移动

作者:互联网

写在前面

这篇博客不同于前面的树莓派和底盘子系统的控制了,而是要进行讲解分析如何通过arduino控制步进电机移动丝杆实现拨片架的水平移动了,那么为什么要实现这么一格功能呢?
原因很简单,因为我们的购物机器人依靠拨片拨取货物,但是在货架上或者仓库里的时候,购物机器人的拨片可能拨不到货物,因此就需要依靠丝杆带动拨片架去拨取货物。

步进电机驱动介绍

TB6600型驱动器接线方法
TB6600升级版步进电机驱动器的A±和B±是连接步进电机的黑绿红蓝,EN(使能端) DIR(方向信号线) PUL(脉冲线),驱动可以采用共阴级也可以采用共阳级,共阳共阴接好后只需用arduino给PUL送进脉冲信号以及给DIR送进方向信号即可,至于EN的信号端可以悬空,这样比较方便,供电端口24V。
在这里插入图片描述
在这里插入图片描述

arduino驱动方法

按照上述方法连接好信号线后,就可以编写arduino程序控制步进电机了,在这里我使用了2种方法控制步进电机

按键控制

之前做电赛的时候还有一块调参的板子,上面有按键还有拨码,因此我也就将其用作按键控制丝杆作为调试工具了。
在这里插入图片描述
首先最主要的就是步进电机的控制方法了,线连接好之后,只需用arduino给PUL送进脉冲信号以及给DIR送进方向信号即可

#define pul1 9//pul接9号口 速度
#define dir1 8//dir接8号口 方向
#define speed_pul 4

脉冲信号的产生方法如下

  digitalWrite(pul1, HIGH);
  delayMicroseconds(speed_pul);
  digitalWrite(pul1, LOW);
  delayMicroseconds(speed_pul);

可以看到程序的实现方法很简单,就是通过给引脚输送一个高电平,延时一段时间,再输送一个低电平,再延时一段时间,从而产生方波信号。speed_pul这个参数就是方波里,高低电平的持续时间,那么这个方波频率的高低对于步进电机的运动会有怎样的影响呢?
我设计了一个实验,如图所示,我测量了不同方波频率下,丝杆从点1移动到点2所花费的时间
在这里插入图片描述
测试结果如下
在这里插入图片描述
横坐标是运动完全程所花费的时间,纵坐标是speed_pul数值大小,因为当speed_pul小于3时,步进电机不能移动,因此就将这种情况下的时间设定为0,不做考虑。从图中可以发现,随着speed_pul数值的减小,步进电机移动完全程的时间也在减少,因此为了减少购物机器人在场上移动丝杆的时间,我将speed_pul参数设置为了4。
产生了方波信号之后,只需要再给步进电机方向它就可以运动了,于是乎控制步进电机左移的程序如下所示

void turn_left()
{
  digitalWrite(dir1, HIGH);
  digitalWrite(pul1, HIGH);
  delayMicroseconds(speed_pul);
  digitalWrite(pul1, LOW);
  delayMicroseconds(speed_pul);
}

右移程序也可以类推

void turn_right()
{
  digitalWrite(dir1, LOW);
  digitalWrite(pul1, HIGH);
  delayMicroseconds(speed_pul);
  digitalWrite(pul1, LOW);
  delayMicroseconds(speed_pul);
}

至此完成了步进电机的驱动,接下来只需要结合按键即可,首先我们需要设置按键信号接入arduino的引脚
const int up_btn, down_btn, left_btn = 2, right_btn = 3;
接下来就是逻辑分析了,因为按键按下之后引脚呈现的是低电平,因此每检测到一个低电平之后我就输送50个方波信号给步进电机的驱动,从而控制步进电机带动丝杆转动一定距离,那么为什么是50个方波信号呢?其实也很好理解,输送的方波信号个数越多,相当于驱动步进电机转动的时间越长,丝杆移动的距离也就越远,拨片架移动的距离也就越远。
具体实现如下

int btn_move_dis = 50;
void key_board()
{
  int i = 0;
  int left_flag;
  int right_flag;
  left_flag = digitalRead(left_btn);
  right_flag = digitalRead(right_btn);
  if (left_flag == LOW)
  {
    for (i = 0; i < btn_move_dis; i++)
    {
      turn_left();
    }
  }
  else if (right_flag == LOW)
  {
    for (i = 0; i < btn_move_dis; i++)
    {
      turn_right();
    }
    exeTime2 = millis() - exeTime1;
  }
}

串口控制

标签:pul,btn,arduino,digitalWrite,电机,丝杆,步进,移动,speed
来源: https://blog.csdn.net/weixin_43454320/article/details/116502165