☛ 功能说明
利用 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; } } }