1、用到的硬件设备以及最终实验效果
用到一个5V直流步进电机(28BYJ-48),然后一块对应的电机驱动(主芯片是ULN2003A),一个Arduino UNO开发板。我们最终实现的效果是,在Matlab GUI界面上输入想让电机正转(反转)的角度,执行程序之后,电机开始转动。
2、Arduino部分程序
驱动电机利用的是Arduino的库函数,使用起来十分简单。然后利用串口接收Matlab发送的字符,接收到相应字符之后就执行对应的命令。
//使用arduino IDE自带的Stepper.h库文件
#include
// 这里设置步进电机旋转一圈是多少步
#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代码——实验成功。