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