☛ 功能说明

利用 Arduino UNO 开发板控制三个步进马达 28BYJ-48 转动。步进马达 1 ,顺时针来回转动,步进马达 2,逆时针来回转动,步进马达 3 ,180° 来回转动。其中,步进马达 1 以全速进行转动,步进马达 2 以半速进行转动,步进马达 3 的转速则介于步进马达 1、2 之间。

☛ 使用材料

Arduino UNO R3  开发板 × 1、ULN2003 步进马达控制模块 × 3、步进马达 28BYJ-48 × 3。

☛ 电路图及面包板接线图

☛ 程式码

#include <Stepper.h>                           //使用 Stepper.h 函式库

#define STEPS 2038                             //步进马达转动一圈步进数
Stepper stepper1(STEPS, 2, 4, 3, 5);           //建立 Steeper1 资料形态的物件
Stepper stepper2(STEPS, 6, 8, 7, 9);           //建立 Steeper2 资料形态的物件
Stepper stepper3(STEPS,10,12,11,13);           //建立 Steeper3 资料形态的物件

int motoStep = 63.68395;                       //步进马达 28BYJ-48 每一步步进值
int i = 1;
int j = 1;
int k = 1;

void setup()
{
     stepper1.setSpeed(10);                    //设定步进马达 1 的转速为 10 RPM
     stepper2.setSpeed(10);                    //设定步进马达 2 的转速为 10 RPM
     stepper3.setSpeed(10);                    //设定步进马达 3 的转速为 10 RPM
}

void loop()
{
     switch(i)                                 //步进马达 1 的顺时针 360° 来回转动
     {
            case 1:
                 stepper1.step(-32*motoStep);  //顺时针转动一圈
                 i++;
                 break;
            case 2:
                 stepper1.step(32*motoStep);   //逆时针转动一圈
                 i++;
                 break;
            case 3:
                 i=1;
                 break;     
     }

     switch(j)                                 //步进马达 2 的逆时针 360° 来回转动
     {
            case 1:
                 stepper2.step(32*motoStep);   //逆时针转动一圈
                 j++;
                 break;
            case 2:
                 stepper2.step(-32*motoStep);  //顺时针转动一圈
                 j++;
                 break;
            case 3:
                 j=1;
                 break;
      }

      switch(k)                                 //步进马达 3 的逆时针 180° 来回转动
      {
            case 1:
                 stepper3.step(4*motoStep);     //逆时针转动 180°
                 k++;
                 break;
            case 2:
                 stepper3.step(-4*motoStep);    //顺时针转动 180°
                 k++;
                 break;
            case 3:
                 k=1;
                 break;
      }
}

 

☛ 练习

⑴ 设计 Arduino 程式,搭配 FreeRTOS 函式库,控制三个步进马达同时来回转动。步进马达 1,以转动 60 步来回摆动。步进马达 2,以转动 50 步来回摆动。步进马达 3,以转动 8 步来回摆动。三个步进马达的转速分别为 16 RPM、10 RPM、4 RPM。

#include<Arduino_FreeRTOS.h>                       //引用 FreeRTOS 库
#include <Stepper.h>                               //使用 Stepper.h 函式库

#define STEPS 2038                                 //步进马达转动一圈步进数

Stepper stepper1(STEPS, 2, 4, 3, 5);               //建立 Steeper1 资料形态的物件
Stepper stepper2(STEPS, 6, 8, 7, 9);               //建立 Steeper2 资料形态的物件
Stepper stepper3(STEPS,10,12,11,13);               //建立 Steeper3 资料形态的物件

void Task1( void *pvParameters );                  //宣告 Task1
void Task2( void *pvParameters );                  //宣告 Task2
void Task3( void *pvParameters );                  //宣告 Task3

int motoStep = 63.68395;                           //步进马达 28BYJ-48 每一步步进值

void setup()
{
     stepper1.setSpeed(16);                        //设定步进马达 1 的转速为 16 RPM
     stepper2.setSpeed(10);                        //设定步进马达 2 的转速为 10 RPM
     stepper3.setSpeed(4);                         //设定步进马达 3 的转速为 4 RPM

     xTaskCreate(myMoto1,"Task1",128,NULL,1,NULL); //建立 myMoto1 任务
     xTaskCreate(myMoto2,"Task2",128,NULL,1,NULL); //建立 myMoto2 任务
     xTaskCreate(myMoto3,"Task3",128,NULL,1,NULL); //建立 myMoto3 任务
}

void loop()
{ }

void myMoto1(void *pvParameters)                   //伺服马达 1,转动 60 步来回摆动
{ 
     int i=1;
     
     while(1)
     {
           switch(i)                              
           {
              case 1:
                      stepper1.step(60*motoStep);  //逆时针转动 60 步
                      i++;
                      break;
              case 2:
                      stepper1.step(-60*motoStep); //顺时针转动 60 步
                      i++;
                      break;
              case 3:
                      i=1;
                      break;     
           }
     }
}

void myMoto2(void *pvParameters)                   //伺服马达 2,转动 50 步来回摆动
{ 
     int j=1;
     
     while(1)
     {
           switch(j)                               
           {
              case 1:
                      stepper2.step(-50*motoStep);  //顺时针转动 50 步
                      j++;
                      break;
              case 2:
                      stepper2.step(50*motoStep);   //逆时针转动 50 步
                      j++;
                      break;
              case 3:
                      j=1;
                      break;     
           }
     }
}

void myMoto3(void *pvParameters)                    //伺服马达 3,转动 8 步来回摆动
{ 
     int k=1;
     
     while(1)
     {
           switch(k)                                 
           {
              case 1:
                      stepper3.step(-8*motoStep);   //顺时针转动 8 步
                      k++;
                      break;
              case 2:
                      stepper3.step(8*motoStep);    //逆时针转动 8 步
                      k++;
                      break;
              case 3:
                      k=1;
                      break;     
           }
     }
}