作为小白一只,近两天因为项目需要做一个arduino uno通过A4988控制42步进电机正反转一定角度加一个角度微调
然后在面包板上接好电路后发现按钮不给信号时电机也在转动,单独每个接口测试都正常,一起接到板上就有问题,想问下是怎么回事。
做出来的如下:
其中4个按钮作用分别是令步进电机正转90°,正转30°,反转30°
,反转90°,旋转电位器步进电机也会转过一个比较小的角度。
arduino的代码如下:
int EN=6; //EN
int X_DIR=4; //DIR
int X_STP=5; //STEP
int s1=9; //s1 input
int s2=10; //s2 input
int s3=11; //s3 input
int s4=12; //s4 input
int potpin=1; //电位器input
int val1=0;
int val2=0;
int val3=0;
int val4=0;
int col=0;
int x,y;
//步进电机step控制函数
void step(boolean dir, byte dirPin, byte stepperPin, int steps)
{
digitalWrite(dirPin, dir);
delay(50);
for (int i = 0; i < steps; i++)
{
digitalWrite(stepperPin, HIGH);
delayMicroseconds(800);
digitalWrite(stepperPin, LOW);
delayMicroseconds(800);
}}
void setup()
{ //定义I/O口输入/输出
pinMode(EN,OUTPUT);
pinMode(X_STP,OUTPUT);
pinMode(X_DIR,OUTPUT);
digitalWrite(EN,LOW);
pinMode(s1,INPUT);
pinMode(s2,INPUT);
pinMode(s3,INPUT);
pinMode(s4,INPUT);
Serial.begin(9600);
}
void loop()
{
//开关s1-4控制步进电机转动,3600细分为一圈
val1=digitalRead(s1);
delay(10);
if (HIGH==val1) step(HIGH, X_DIR, X_STP, 800);//电机正转800细分,就是90°
val2=digitalRead(s2);
delay(10);
if (HIGH==val2) step(HIGH, X_DIR, X_STP, 800/3);//电机正转800/3细分,就是30°
val3=digitalRead(s3);
delay(10);
if (HIGH==val3) step(LOW, X_DIR, X_STP, 800/3);//电机反转800/3细分,就是30°
val4=digitalRead(s4);
delay(10);
if (HIGH==val4) step(LOW, X_DIR, X_STP, 800);//电机反转800细分,就是90°
//旋转电位器,步进电机转动,采用模拟输入
y=x;
x=analogRead(potpin);
delay(10);
if (x>y)
{ int r=(x-y)/5;
step(HIGH, X_DIR, X_STP, r);
}
else
{ int r=(y-x)/5;
step(LOW, X_DIR, X_STP, r);
};
//串口控制
col=Serial.read();
delay(10);
switch(col)
{
case 'A':step(HIGH, X_DIR, X_STP, 200);
delay(1000);
break;
case 'B':step(HIGH, X_DIR, X_STP, 400);
delay(1000);
break;
case 'C':step(HIGH, X_DIR, X_STP, 800);
delay(1000);
break;
case 'D':step(HIGH, X_DIR, X_STP, 1600);
delay(1000);
break;
case 'E':step(HIGH, X_DIR, X_STP, 3200);
delay(1000);
break;
}
}