驱动步进电机, 我是用的A4988来做的,非常经典的一个模块,便宜(应该还算便宜)
虽然左右引脚不少,但是用户实际上需要操作的就三个脚位,EN,STEP和DIR,EN是低电平有效 ,低电平有效,低电平有效!因为搞错差点让我以为板子报废了。
先来看看我的一个修改的程序,控制一个电动机转动,数码管显示数据,使用step这个函数
#include "SevenSegmentTM1637.h"
#define EN 8//步进电机使能端,低电平有效
#define Y_DIR 6//y轴步进电机方向控制
#define Y_STP 3//y轴步进控制
#define PIN_DIO 2
#define PIN_CLK 4
/*
*
//函数:step 功能:控制步进电机方向,步数。
//参数:dir 方向控制, dirPin对应步进电机的DIR引脚,stepperPin 对应步进电机的step引脚, steps 步进的步数
//无返回值
*/
SevenSegmentTM1637 display(PIN_CLK, PIN_DIO);
void step(boolean dir, byte dirPin, byte stepperPin, int steps, int _speed)
{
digitalWrite(dirPin, dir);
delay(50);
for (int i = 1; i <= steps; i++) {
digitalWrite(stepperPin, HIGH);
delay(_speed);
digitalWrite(stepperPin, LOW);
delay(_speed);
display.print((int)(i*1.8*1/16));
}
}
void setup() { //将步进电机用到的IO管脚设置成输出
pinMode(Y_DIR, OUTPUT); pinMode(Y_STP, OUTPUT);
pinMode(EN, OUTPUT);
digitalWrite(EN, LOW);
Serial.begin(115200);
display.begin(); // initializes the display
display.setBacklight(100); // set the brightness to 100 %
display.print("INIT"); // display INIT on the display
delay(1400); // wait 1000 ms
}
void loop() {
Serial.println("Speed 1");
display.print("00E1");
step(false, Y_DIR, Y_STP, 200 * 4, 4); //y轴电机 反转1圈,200步为一圈,最后一个数值越大那么也就越慢
delay(2000);
Serial.println("Speed 2");
display.print("00E2");
step(false, Y_DIR, Y_STP, 200 * 4, 3); //y轴电机 反转1圈,200步为一圈,最后一个数值越大那么也就越慢
delay(2000);
Serial.println("Speed 3");
display.print("00E3");
step(false, Y_DIR, Y_STP, 200 * 4, 2); //y轴电机 反转1圈,200步为一圈,最后一个数值越大那么也就越慢
delay(2000);
Serial.println("Speed 4");
display.print("00E4");
step(false, Y_DIR, Y_STP, 200 * 4, 1);
delay(2000);
}