Arduino学习笔记(四)Matlab串口控制Arduino转动电机
2017-05-08 10:19
711 查看
1、用到的硬件设备以及最终实验效果
用到一个5V直流步进电机(28BYJ-48),然后一块对应的电机驱动(主芯片是ULN2003A),一个Arduino UNO开发板。我们最终实现的效果是,在Matlab GUI界面上输入想让电机正转(反转)的角度,执行程序之后,电机开始转动。
![](https://img-blog.csdn.net/20170508100431334?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDc1MTYwNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2、Arduino部分程序
驱动电机利用的是Arduino的库函数,使用起来十分简单。然后利用串口接收Matlab发送的字符,接收到相应字符之后就执行对应的命令。
3、Matlab的GUI界面
![](https://img-blog.csdn.net/20170508100826418?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDc1MTYwNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
需要注意的是,我们输入的角度必须是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代码——实验成功。
用到一个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代码——实验成功。
相关文章推荐
- Arduino学习笔记——按钮控制LED
- 【Arduino学习笔记】蓝牙控制手自两用避障车
- Arduino学习笔记之Arduino的数字输出&串口输入
- [Matlab]基础教程学习笔记(二):程序控制结构
- 通过串口传值给Arduino,再通过Arduino控制小车(直流电机)移动与二自由度云台转动角度
- 【Arduino学习笔记】ULN2003APG步进电机控制代码
- Arduino学习笔记之 Arduino的串口输出
- Arduino应用笔记(二)Matlab控制Arduino点亮一个LED灯
- 【Arduino学习笔记】使用L298N电机驱动模块驱动直流电机
- Arduino学习笔记一,电位器控制步进电机。
- Matlab图像处理学习笔记(六):基于sift特征点的人民币识别
- PL/SQL学习笔记[5]-流程控制语句
- webots自学笔记(三)控制器与电机控制
- iOS学习笔记07-运动事件和远程控制
- c#学习笔记之串口通信【转】
- Python 学习笔记 (2)—— 流程控制
- PHP学习笔记【9】--PHP程序流程控制
- java学习笔记之容器的同步与只读控制
- 使用Arduino开发板控制伺服电机
- Matlab学习笔记四:三维绘图