• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
Arduino通过A4988电机驱动板控制NEMA电机电路连接

http://www.taichi-maker.com/homepage/reference-index/motor-reference-index/arduino-a4988-nema-stepper-motor/

 

 简化版本呢代码

/*
  Arduino控制NEMA步进电机测试程序
  by 太极创客()
  本示例程序旨在演示如何通过Arduino控制NEMA步进电机。
  如需获得本示例程序详细电路信息以及如何使用Arduino控制电机的更多知识,请参考太极创客网站:
  http://www.taichi-maker.com/homepage/reference-index/motor-reference-index/arduino-a4988-nema-stepper-motor/
*/
 
// 定义电机控制用常量
 
// A4988连接Arduino引脚号
const int dirPin = 2;  // 方向引脚
const int stepPin = 3; // 步进引脚
 
// 电机每圈步数
const int STEPS_PER_REV = 200;
 
void setup() {
  
  // Arduino控制A4988步进和方向的引脚为输出模式
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
}
void loop() {
  
  // 设置电机顺时针旋转
  digitalWrite(dirPin,LOW); 
  
  // 电机慢速旋转
  for(int x = 0; x < STEPS_PER_REV; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(2000); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(2000); 
  }
  
  // 等待一秒
  delay(1000); 
  
  // 设置电机逆时针旋转
  digitalWrite(dirPin,HIGH);
  
  // 电机快速旋转
  for(int x = 0; x < (STEPS_PER_REV * 2); x++) {
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(1000);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(1000);
  }
  
  // 等待一秒
  delay(1000);
}
 

  

Arduino通过A4988电机驱动板控制NEMA电机电路连接(完整版)

 

/*
  Arduino控制NEMA步进电机测试程序 (2018-09-25)
  by 太极创客(www.taichi-maker.com)
  本示例程序旨在演示如何通过Arduino控制NEMA步进电机。
  用户可通过串口监视器控制电机的各个功能
  如需获得本示例程序详细电路信息以及如何使用Arduino控制电机的更多知识,请参考太极创客网站:
  http://www.taichi-maker.com/homepage/reference-index/motor-reference-index/arduino-a4988-nema-stepper-motor/
  
  控制指令:
  顺时针旋转/逆时针旋转 - x0/x1
  运行步数 - z100(走100步)
  步进方式 - b1(全步),b2(半步),b4(四分),b8(8分),b16(16分)
  速度 - d2000(转动速度2000)
  允许工作/禁止工作(enable/disable) - g1/g0
  睡眠 - m0(sleep)/m1(awake)  
*/
 
// A4988引脚连接Arduino引脚编号
const int dirPin   = 2;   // Direction
const int stepPin  = 3;   // Step
const int sleepPin = 4;   // Sleep
const int resetPin = 5;   // Reset
const int ms3Pin   = 6;   // Ms3
const int ms2Pin   = 7;   // Ms2
const int ms1Pin   = 8;   // Ms1
const int enPin    = 9;   // Enable
 
// 步进电机旋转一周步数
const int STEPS_PER_REV = 200;
 
char cmd;  //用户指令字符
int data;  //用户指令数据
int motorSpeed = 2000;  //电机转速(数值越小速度越小)
 
void setup() { 
  // 设置引脚模式
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode(sleepPin,OUTPUT); 
  pinMode(resetPin,OUTPUT);  
  pinMode(ms3Pin,OUTPUT);  
  pinMode(ms2Pin,OUTPUT);  
  pinMode(ms1Pin,OUTPUT); 
  pinMode(enPin,OUTPUT);   
 
  // 初始化引脚状态
  digitalWrite(sleepPin, HIGH);  
  digitalWrite(resetPin, HIGH); 
  digitalWrite(enPin, LOW); 
 
  // 初始化电机步进模式为全步进
  digitalWrite(ms1Pin, LOW); 
  digitalWrite(ms2Pin, LOW); 
  digitalWrite(ms3Pin, LOW); 
 
  Serial.begin(9600);
  Serial.println("++++++++++++++++++++++++++++++++++");     
  Serial.println("+ Taichi-Maker A4988 Steper Demo +");   
  Serial.println("+     www.taichi-maker.com       +");  
  Serial.println("++++++++++++++++++++++++++++++++++");  
  Serial.println("");  
  Serial.println("Please input motor command:"); 
}
 
void loop() {    
  if (Serial.available()) {     // 检查串口缓存是否有数据等待传输 
    cmd = Serial.read();        // 获取电机指令中电机编号信息    
    Serial.print("cmd = ");
    Serial.print(cmd);    
    Serial.print(" , "); 
 
    data = Serial.parseInt();
    Serial.print("data = ");
    Serial.print(data);   
    Serial.println("");    
 
    runUsrCmd();
  }
} 
 
//此函数用于运行用户指令
void runUsrCmd(){
  switch(cmd){ 
    case 'x':    // 设置步进电机旋转(顺时针/逆时针)
      Serial.print("Set Rotation To "); 
      if (data == 0){
        digitalWrite(dirPin, 0);
        Serial.println("Clockwise."); 
      } else {
        digitalWrite(dirPin, 1);
        Serial.println("Counter Clockwise."); 
      }
      break;
    
    case 'g':   // 设置A4988 enable功能
      Serial.print("Set Motor To "); 
      if (data == 0){
        digitalWrite(enPin, 1);
        Serial.println("Disable."); 
      } else {
        digitalWrite(enPin, 0);
        Serial.println("Enable."); 
      }
      break;
      
    case 'm':  // 设置A4988 sleep功能
      Serial.print("Set Motor To "); 
      if (data == 0){
        digitalWrite(sleepPin, 0);
        Serial.println("Sleep."); 
      } else {
        digitalWrite(sleepPin, 1);
        Serial.println("Awake."); 
      }
      break;
 
    case 'b':   // 设置步进模式
      if (data == 1 || data == 2  || data == 4  || data == 8 || data == 16){
        Serial.print("Set Motor Step Control To "); 
        setStepMode(data);
      } else {
        Serial.println("Wrong Step Mode Cmd!");
      }
      break;
 
    case 'z': // 设置步进电机运行步数
      runStepper(motorSpeed, data);
      break;
 
    case 'd': // 设置步进电机运行速度      
      motorSpeed = data;
      Serial.print("Set Motor Speed To ");
      Serial.println(data);
      break;
          
    default:  // 未知指令
      Serial.println("Unknown Command");
  }
}
 
//运行步进电机
void runStepper (int rotationSpeed, int stepNum){
  for(int x = 0; x < stepNum; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(rotationSpeed); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(rotationSpeed); 
  }  
}
 
 //设置步进模式
void setStepMode(int modeNum){ 
  switch(modeNum){ 
    case 1:   // 全步进
    digitalWrite(ms1Pin, LOW); 
    digitalWrite(ms2Pin, LOW); 
    digitalWrite(ms3Pin, LOW);  
    Serial.println(F("Stepping Mode: Full"));
    break; 
 
    case 2:  // 半步进  
    digitalWrite(ms1Pin, HIGH); 
    digitalWrite(ms2Pin, LOW); 
    digitalWrite(ms3Pin, LOW);  
    Serial.println(F("Stepping Mode: 1/2"));
    break; 
 
    case 4:  // 1/4 步进   
    digitalWrite(ms1Pin, LOW); 
    digitalWrite(ms2Pin, HIGH); 
    digitalWrite(ms3Pin, LOW);  
    Serial.println(F("Stepping Mode: 1/4"));
    break;     
 
    case 8:  // 1/8 步进   
    digitalWrite(ms1Pin, HIGH); 
    digitalWrite(ms2Pin, HIGH); 
    digitalWrite(ms3Pin, LOW);  
    Serial.println(F("Stepping Mode: 1/8"));
    break;  
 
    case 16:  // 1/16 步进   
    digitalWrite(ms1Pin, HIGH); 
    digitalWrite(ms2Pin, HIGH); 
    digitalWrite(ms3Pin, HIGH); 
    Serial.println(F("Stepping Mode: 1/16")); 
    break;    
  }      
}

  

使用CNC电机扩展板配合A4988驱动步进电机

Arduino CNC 电机扩展板概述

CNC是计算机数字控制(Computerized Numerical Control )的英文缩写。顾名思义,Arduino CNC电机扩展板常用于驱动3D打印机、机械臂或机器人系统中的NEMA17电机(俗称42步进电机)。CNC扩展板可以支持A4988、DRV8825等步进电机驱动板。

 使用一个CNC电机扩展板配合A4988驱动板可以让Arduuino一次控制1台-4台42步进电机,而且省去了连线的麻烦。如果您想了解如何操作,请点击以下链接进入本站相关教程页面

 

A4988电机驱动板常见问题

1)4988驱动板可以驱动多大的电流?
如果4988芯片上没有加散热片,电流最好在1.2A以下。如果加散热片,电流可以达到2A。

2)步进电机的连接方式是什么?
如果你的电机线是标准的红蓝绿黑的颜色,可以按照颜色连接为:红-蓝-绿-黑,或相反:黑-绿-蓝-红。

3)接上电后,电机左右抖动不能正常运行是什么原因?
电机出现抖动一般有两个原因,一是缺相:可能是4988与电机没有接好导致4988的输出端某一相断开,造成电机缺相从而抖动。也有可能是步进电机接线接错:如果步进电机没有正确的进行连接,电机会出现抖动的情况。

4)电机丢步如何解决?
相电流的大小跟步进电机的扭力有直接关系,如果感觉你的步进电机扭力不足、丢步,可能是4988输出的电流太小。您可以调节A4988模块上的电位器调节A4988模块的输出电流强度。具体调节方法请参考本页面中关于Vref电压的调节方法。请注意:如A4988输出电流强度大于电机工作电流强可能会烧毁您的步进电机。请小心调节。

5)4988可以驱动两相六线或两相五线的电机吗?
可以,两相连线按照问题2连接,将中间抽头悬空即可。

6)电机停止转动时会有滋滋的电流声。
这是正常现象。步进电机有一个参数-步距角。通过细分驱动可以缩小步进角度,比如步距角为1.8度的步进电机,采用16细分,最小可以走的角度是1.8/16=0.1125度。由于这个角度非常小,当电机停止时,可能处于非电机物理位置(1.8度为一个物理位置)。因此步进电机在静止时会有电流声,这属于正常现象,不用担心。

 

https://item.taobao.com/item.htm?spm=a21n57.1.0.0.bc1d523ctnBzfM&id=682303222936&ns=1&abbucket=0#detail

 

一、 产品介绍

该扩展板可用作雕刻机,3D打印机等的驱动扩展板,一共有4路步进电机驱动模块的插槽,(注意本板子不包含A4988步进电机驱动模块,需要可在本店另购),可驱动4路不进电机,而每一路步进电机都只需要2个IO口,也就是说,6个IO口就可以很好的管理3个步进电机,使用起来非常的方便,告别传统步进电机操作繁琐。

 

 

二、UNO 与模块IO口对应关系介绍

 

 

步进电机的基本控制需要的引脚,其他引脚是在雕刻机,或3D打印机的时候才用到的,这里我们不作详解,IO对应如上图。

 

 

Arduino UNO----------------------扩展板

    8 ------------------------  EN (步进电机驱动使能端,低电平有效)

7 -----------------------  Z.DIR(Z轴的方向控制)

6 -----------------------  Y.DIR(Y轴的方向控制)

5 -----------------------  X.DIR(X轴的方向控制)

4 ----------------------  Z.STEP(Z轴的步进控制)

3 ----------------------  Y.STEP(Y轴的步进控制)

2 ----------------------  X.STEP(X轴的步进控制)

//下面是简单的步进电机控制程序,

#define EN        8       //步进电机使能端,低电平有效

#define X_DIR     5       //X轴 步进电机方向控制

#define Y_DIR     6       //y轴 步进电机方向控制

#define Z_DIR     7       //z轴 步进电机方向控制

#define X_STP     2       //x轴 步进控制

#define Y_STP     3       //y轴 步进控制

#define Z_STP     4       //z轴 步进控制

/*

//函数:step    功能:控制步进电机方向,步数。

//参数:dir 方向控制, dirPin对应步进电机的DIR引脚,stepperPin 对应步进电机的step引脚, steps 步进的步数

//无返回值

*/

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(){//将步进电机用到的IO管脚设置成输出

  pinMode(X_DIR, OUTPUT); pinMode(X_STP, OUTPUT);

  pinMode(Y_DIR, OUTPUT); pinMode(Y_STP, OUTPUT);

  pinMode(Z_DIR, OUTPUT); pinMode(Z_STP, OUTPUT);

  pinMode(EN, OUTPUT);

  digitalWrite(EN, LOW);

}

void loop(){

  step(false, X_DIR, X_STP, 200); //X轴电机 反转1圈,200步为一圈

  step(false, Y_DIR, Y_STP, 200); //y轴电机 反转1圈,200步为一圈

  step(false, Z_DIR, Z_STP, 200); //z轴电机 反转1圈,200步为一圈

  delay(1000);

  step(true, X_DIR, X_STP, 200); //X轴电机 正转1圈,200步为一圈

  step(true, Y_DIR, Y_STP, 200); //y轴电机 正转1圈,200步为一圈

  step(true, Z_DIR, Z_STP, 200); //z轴电机 正转1圈,200步为一圈

  delay(1000);

}

 

  

实验现象:步进电机反转一圈,停顿1秒,再正传一圈,如此循环。

值得注意的是:在接插A4988模块的时候注意不要插反,步进电机接线方式是:

2A ,2B 为一组(红,绿), 1A,1B为一组(蓝,黄)想改变方向,改变其中一组的位置即可,比如2A,与2B交换。

posted on 2023-07-05 15:51  MKT-porter  阅读(1284)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3