Arduino学习笔记(四)Matlab串口控制Arduino转动电机

1、用到的硬件设备以及最终实验效果
用到一个5V直流步进电机(28BYJ-48),然后一块对应的电机驱动(主芯片是ULN2003A),一个Arduino UNO开发板。我们最终实现的效果是,在Matlab GUI界面上输入想让电机正转(反转)的角度,执行程序之后,电机开始转动。
这里写图片描述
2、Arduino部分程序
驱动电机利用的是Arduino的库函数,使用起来十分简单。然后利用串口接收Matlab发送的字符,接收到相应字符之后就执行对应的命令。

//使用arduino IDE自带的Stepper.h库文件
#include <Stepper.h>

// 这里设置步进电机旋转一圈是多少步
#define STEPS 100
int flag=0;//电机正反转标志,默认情况下正转
char key;
//设置步进电机的步数和引脚(就是驱动板上IN1~IN4连接的四个数字口)。
Stepper stepper(STEPS, 8, 9, 10, 11);

void setup()
{
  Serial.begin(9600);//设置波特率
  // 设置电机的转速:每分钟为90步
  stepper.setSpeed(90);
}

void stopmotor()
{
  digitalWrite(8,0);
  digitalWrite(9,0);
  digitalWrite(10,0);
  digitalWrite(11,0);
}
void loop()
{
  key=Serial.read();
  delay(10);// 加个延时可能会好一点,这样可以保证读完所有数据。
  switch(key)
  {
    case 'Z':flag=1;break;
    case 'F':flag=0;break;
    case '1':
    if(flag==1) //4步模式下旋转一周用2048 步,所以45°是256步
    {
      stepper.step(256*1);
      stopmotor();
    }
    else if(flag==0)
    {
      stepper.step(-256*1);
      stopmotor();
    }
    break;
    case '2':
    if(flag==1)
    {
      stepper.step(256*2);
      stopmotor();
    }
    else if(flag==0)
    {
      stepper.step(-256*2);
      stopmotor();
    }
    break;
    case '3':
    if(flag==1)
    {
      stepper.step(256*3);
      stopmotor();
    }
    else if(flag==0)
    {
      stepper.step(-256*3);
      stopmotor();
    }
    break;
    case '4':
    if(flag==1)
    {
      stepper.step(256*4);
      stopmotor();
    }
    else if(flag==0)
    {
      stepper.step(-256*4);
      stopmotor();
    }
    break;
    case '5':
    if(flag==1)
    {
      stepper.step(256*5);
      stopmotor();
    }
    else if(flag==0)
    {
      stepper.step(-256*5);
      stopmotor();
    }
    break;
    case '6':
    if(flag==1)
    {
      stepper.step(256*6);
      stopmotor();
    }
    else if(flag==0)
    {
      stepper.step(-256*6);
      stopmotor();
    }
    break;
    case '7':
    if(flag==1)
    {
      stepper.step(256*7);
      stopmotor();
    }
    else if(flag==0)
    {
      stepper.step(-256*7);
      stopmotor();
    }
    break;
    case '8':
    if(flag==1)
    {
      stepper.step(256*8);
      stopmotor();
    }
    else if(flag==0)
    {
      stepper.step(-256*8);
      stopmotor();
    }
    break;
    default:
    break;
  }
}

3、Matlab的GUI界面
这里写图片描述
需要注意的是,我们输入的角度必须是45°的整数倍,因为Arduino程序里面电机转360°是2048步,转45°步数不会出现小数的情况,否则不精确。
4、Matlab代码
首先在xx_OpeningFcn()函数里面初始化:

global a;
a=serial(‘COM9’);
set(a,’BaudRate’,9600);
set(a,’DataBits’,8);
set(a,’StopBits’,1);
fopen(a);

然后是正转按钮的回调函数:
global a;
fprintf(a,’Z’);

反转按钮的回调函数:
global a;
fprintf(a,’F’);

开始按钮的回调函数:
global a;
global angle;
if angle==45
fprintf(a,’1’);
else if angle==90
fprintf(a,’2’);
else if angle==135
fprintf(a,’3’);
else if angle==180
fprintf(a,’4’);
else if angle==225
fprintf(a,’5’);
else if angle==270
fprintf(a,’6’);
else if angle==315
fprintf(a,’7’);
else if angle==360
fprintf(a,’8’);

end
end
end
end
end
end
end
end

连接外围电路,运行Matlab代码——实验成功。

猜你喜欢

转载自blog.csdn.net/u014751607/article/details/71403678