步进电机控制

作者: iotboy | 来源:发表于2017-01-08 22:18 被阅读375次

    一、工具

    1、Arduino UNO

    图片来自网络

    2、ULN2003步进电机驱动板

    图片来自网络

    3、步进电机

    步进电机

    二、参数(数据来自七星虫官网):

    直径:28mm

    电压:5V

    步进角度:5.625 x 1/16

    减速比:1/16

    注:5线4相可以用普通uln2003芯片驱动,也可以接成2相使用,可以配套开发板使用。

    三、接线

    1、步进电机可以直接插入驱动板接口

    电机接线

    2、驱动板正极、负极、IN1、IN2、IN3、IN4分别接Arduino VCC、GND、引脚8、9、10、11,然后通过专门的数据线将Arduino与电脑连在一起

    三、程序功能

    1、通过调用步进电机库文件控制步进电机正反转

    2、代码

    //初始化

    #include<Stepper.h>

    const int stepsPerRevolution = 200;  //定义200步/转

    Stepper myStepper(stepsPerRevolution, 8,9,10,11);

    //定义引脚为8,9,10,11(可根据实际情况自行改变)

    void setup() {

    myStepper.setSpeed(60);// 设置速度为60转/分钟

    Serial.begin(9600);//初始化串口

    }

    //循环

    void loop() {

    Serial.println("clockwise");//顺时针旋转

    myStepper.step(stepsPerRevolution);//控制步进电机开始旋转

    delay(500);//延时500ms

    Serial.println("counterclockwise");//逆时针旋转

    myStepper.step(-stepsPerRevolution);//stepsPerRevolution取反

    delay(500);

    }

    四、扩展

    身为一名技术宅,岂能简简单单就满足了,下面开始介绍步进电机另一种玩法

    1、功能:通过串口控制步进电机正反转

    2、代码

    //初始化

    int val;//定义变量

    int Pin0 = 8;//定义数字接口

    int Pin1 = 9;

    int Pin2 =10;

    int Pin3 = 11;

    int t=1;

    void setup() {

    pinMode(Pin0, OUTPUT);//设置输出

    pinMode(Pin1, OUTPUT);

    pinMode(Pin2, OUTPUT);

    pinMode(Pin3, OUTPUT);

    Serial.begin(9600); // 初始化串口

    }

    //循环

    void loop() {

    char val;

    while(1)

    {

    val = Serial.read();//读取串口

    if(val!=-1)

    {

    switch(val)

    {

    case 'Z'://即如果在串口输入Z,步进电机正转,后期介绍手机通过蓝牙控制Arduino我会详细介绍

    zheng();

    delay(50);

    break;

    case 'F'://即如果在串口输入F,步进电机反转

    fan();

    delay(50);

    break;

    case 'T'://即如果在串口输入T,步进电机停止转动

    ting();

    delay(50);

    break;

    }

    }

    }}

    void ting()

    {//定义停止函数

    digitalWrite(Pin0, LOW);

    digitalWrite(Pin1, LOW);

    digitalWrite(Pin2, LOW);

    digitalWrite(Pin3, LOW);

    Serial.println("stop");//显示“stop”字符串

    }

    void fan()

    {

    //定义反转函数

    for(int i=100;i>0;i--)//通过循环控制旋转步数,“i”值可以自定义

    {

    digitalWrite(Pin0, HIGH);

    digitalWrite(Pin1, LOW);

    digitalWrite(Pin2, LOW);

    digitalWrite(Pin3, LOW);

    delay(t);

    digitalWrite(Pin0, HIGH);

    digitalWrite(Pin1, HIGH);

    digitalWrite(Pin2, LOW);

    digitalWrite(Pin3, LOW);

    delay(t);

    digitalWrite(Pin0, LOW);

    digitalWrite(Pin1, HIGH);

    digitalWrite(Pin2, LOW);

    digitalWrite(Pin3, LOW);

    delay(t);

    digitalWrite(Pin0, LOW);

    digitalWrite(Pin1, HIGH);

    digitalWrite(Pin2, HIGH);

    digitalWrite(Pin3, LOW);

    delay(t);

    digitalWrite(Pin0, LOW);

    digitalWrite(Pin1, LOW);

    digitalWrite(Pin2, HIGH);

    digitalWrite(Pin3, LOW);

    delay(t);

    digitalWrite(Pin0, LOW);

    digitalWrite(Pin1, LOW);

    digitalWrite(Pin2, HIGH);

    digitalWrite(Pin3, HIGH);

    delay(t);

    digitalWrite(Pin0, LOW);

    digitalWrite(Pin1, LOW);

    digitalWrite(Pin2, LOW);

    digitalWrite(Pin3, HIGH);

    delay(t);

    digitalWrite(Pin0, HIGH);

    digitalWrite(Pin1, LOW);

    digitalWrite(Pin2, LOW);

    digitalWrite(Pin3, HIGH);

    delay(t);

    }

    Serial.println("counterclockwise");//显示“counterclockwise”字符串

    }

    void zheng()

    {

    //定义正转函数

    for(int i=100;i>0;i--)

    {

    digitalWrite(Pin0, LOW);

    digitalWrite(Pin1, LOW);

    digitalWrite(Pin2, LOW);

    digitalWrite(Pin3, HIGH);

    delay(t);

    digitalWrite(Pin0, LOW);

    digitalWrite(Pin1, LOW);

    digitalWrite(Pin2, HIGH);

    digitalWrite(Pin3, HIGH);

    delay(t);

    digitalWrite(Pin0, LOW);

    digitalWrite(Pin1, LOW);

    digitalWrite(Pin2, HIGH);

    digitalWrite(Pin3, LOW);

    delay(t);

    digitalWrite(Pin0, LOW);

    digitalWrite(Pin1, HIGH);

    digitalWrite(Pin2, HIGH);

    digitalWrite(Pin3, LOW);

    delay(t);

    digitalWrite(Pin0, LOW);

    digitalWrite(Pin1, HIGH);

    digitalWrite(Pin2, LOW);

    digitalWrite(Pin3, LOW);

    delay(t);

    digitalWrite(Pin0, HIGH);

    digitalWrite(Pin1, HIGH);

    digitalWrite(Pin2, LOW);

    digitalWrite(Pin3, LOW);

    delay(t);

    digitalWrite(Pin0, HIGH);

    digitalWrite(Pin1, LOW);

    digitalWrite(Pin2, LOW);

    digitalWrite(Pin3, LOW);

    delay(t);

    digitalWrite(Pin0, HIGH);

    digitalWrite(Pin1, LOW);

    digitalWrite(Pin2, LOW);

    digitalWrite(Pin3, HIGH);

    delay(t);

    }

    Serial.println("clockwise");//显示“clockwise”字符串

    }

    五、步进电机实际应用

    1、用于一些有定位要求的场合,例如:线切割的工作台拖动,植毛机工作台(毛孔定位)等

    2、广泛应用于ATM机、喷绘机、刻字机等设备

    六、总结

    通过前后代码对比你会发现,实现同样的功能,前面的代码要比后面的代码简洁的多,从这里我们可以看出Arduino库的强大之处,明天请跟随我一起走进Arduino库的世界,揭开其神秘的面纱。

    参考来源:

    1.Arduino官方网站

    2.Arduino中文社区

    电工学习网

    相关文章

      网友评论

        本文标题:步进电机控制

        本文链接:https://www.haomeiwen.com/subject/nkqcbttx.html