这两天入门arduino,用来控制旋转台。arduino集成度高,可以快速出效果,这一点确实真切感受到了。做的过程中编程不难,麻烦的是找资料,官网的电机转台只给了一张表,刚接触有点看不懂。
上图是使用到的DB9,那个厂家的就找他们的说明吧,图一的颜色分配和图二的不一致。是有一套颜色标准的,但是百度上的图和这厂家的图颜色分配有出入……
只需要用到四个引脚,对应端口接四个到步进电机驱动器即可。总体连接如下图,ENA端口可不接,DIR-与PUL-最好共地,试了下不共地问题不大。这里使用到的电压源给到24V左右。
转动比是指电机转动90圈,台面转动1圈,也就是说电机转一圈,台面转4°。步距角是指一个脉冲电机转动1.8°,电机需要200个脉冲才能转一圈,总共90*200=18000个脉冲转台才转一圈,在算上步进电机驱动器的细分精度(该实验选择的细分进度为4),那么电机需要800个脉冲才能转一圈,总共90*800=72000个脉冲转台才转一圈,下图是步进电机驱动器的设置对照表。
上位机指令:
格式:rotxxxx
bit |
num |
说明 |
1~3 |
rot |
指令起始位rotate |
4 |
0 |
自行设置 |
1 |
使用默认顺时针旋转5°,后续bit位无效 |
|
5 |
0 |
设置逆时针旋转 |
1 |
设置顺时针旋转 |
|
6~7 |
theta |
一次旋转角度 |
代码:
/
// 参数定义
/
#define Moto1_drivel 3
#define Moto1_drive2 4
#define Moto1Dir1_negative 5
#define Moto1Dir1_positive 6
int theta;
///
// 起始定义 //
///
void setup()
{
pinMode(Moto1_drivel,OUTPUT); //设置引脚为输出引脚
pinMode(Moto1_drive2,OUTPUT);
pinMode(Moto1Dir1_negative,OUTPUT);
pinMode(Moto1Dir1_positive,OUTPUT);//定义波特率9600
Serial.begin(9600);
}
///
// 主循环 //
///
void loop() //主循环
{
if(Serial.available()){
command ();
rotate(theta);
}
else
delay(1000);
}
// 800脉冲电机转一圈
// 电机转一圈转台转4°
// 200个脉冲转台转动1°,rotate_unit为转一度;太快了电机扛不住
void rotate_unit()
{
int i;
for(i=0;i<200;i++) {
digitalWrite(Moto1_drivel,HIGH);
delayMicroseconds(500);
digitalWrite(Moto1_drivel,LOW);
delayMicroseconds(10);
}
}
// 转多少度 //
void rotate(int theta)
{
u32 k;
char str_temp[50] = {0};
for (k = 1; k <= theta; k++)
{
rotate_unit();
}
}
// 分析上位机的命令 //
void command()
{
char buffer[8] = {0};
for(int j=0;j<8;j++){
if(Serial.available()){
buffer[j]=Serial.read();
}
}
if(buffer[0]==114&&buffer[1]==111&&buffer[2]==116){
if(buffer[3]==49) {//第一位为1则设置默认选项,顺时针转5°
digitalWrite(Moto1Dir1_negative,HIGH);
theta=5;
Serial.print("direction:");
Serial.println("顺时针");
Serial.println("theta=5");
}
if(buffer[3]==48){
if(buffer[4]==49) {
digitalWrite(Moto1Dir1_negative,HIGH);
Serial.print("direction:");
Serial.println("顺时针");
}
if(buffer[4]==48) {
digitalWrite(Moto1Dir1_negative,LOW);
Serial.print("direction:");
Serial.println("逆时针");
}
theta = (buffer[5]-48)*10 + buffer[6]-48;
Serial.print("theta=");
Serial.println(theta);
}
}
}
实物图: