您的位置:首页 > 编程语言 > MATLAB

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

2017-05-08 10:19 711 查看
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
4000
);
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代码——实验成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: