☛ 功能說明
利用電腦鍵盤按鍵值控制步進馬達的轉速、正轉步數、反轉步數、連續正轉、連續反轉及停止等功能,其中 0~9 鍵設定馬達的轉動方向或速度,r 鍵使馬達正轉設定的步數,l 鍵使馬達反轉設定的步數,s 鍵設定馬達轉速 ( 單位:RPM ),+ 鍵使馬達連續正轉,- 鍵使馬達連續反轉,e 鍵使馬達停止轉動。例如鍵盤輸入 60s,設定馬達轉速爲 60 RPM;輸入 100r,馬達正轉 100 步;輸入 50l,馬達反轉 50 步;輸入 + 鍵,馬達連續正轉;輸入 – 鍵,馬達連續反轉。
☛ 使用材料
Arduino UNO R3 開發板 × 1、ULN2003 步進馬達控制模塊 × 1、步進馬達 28BYJ-48 × 1。
☛ 電路圖及麪包板接線圖
☛ 程式碼
#include <Stepper.h> //使用 Stepper.h 函式庫 #define STEPS 200 //步進馬達每圈步進數 Stepper stepper(STEPS, 2, 4, 3, 5); //建立 Steeper 資料形態的物件 int steps = 63.68395; //步進馬達 28BYJ-48 每一步步進值 int num = 0; //按鍵數值 int cr = 0; //連續右轉旗標 int cl = 0; //連續左轉旗標 char ch; //按鍵值 void setup() { stepper.setSpeed(steps); //設定步進馬達的轉速爲 64 RPM Serial.begin(9600); //初始化串列埠,鮑率爲 9600 bps Serial.println("Press 0-9: Setting steps"); Serial.println("Press s: Setting speed ( default value 64 RPM )"); Serial.println("Press r: Right Turn"); Serial.println("Press l: Left Turn"); Serial.println("Press +: Continuous Right Turn"); Serial.println("Press -: Continuous Left Turn"); Serial.println("Press e: Stop"); } void loop() { if(Serial.available()) //按下任意鍵? { ch = Serial.read(); //讀取按鍵值 if(ch>='0' && ch<='9') //按鍵值爲 0-9 num = num*10+ch-'0'; //加權儲存 else if(ch=='s') //鍵值爲 s (設定轉速) { Serial.print("Setting Speed:"); Serial.print(num); //顯示所設定的馬達轉速 Serial.println(" RPM"); stepper.setSpeed(num); //設定馬達轉速 (單位:RPM) num=0; //清除鍵盤輸入數值 cl = 0; //重置連續左轉旗標 cr = 0; //重置連續右轉旗標 } } if(ch=='r') //鍵值爲 r (右轉) { Serial.print("Right Turn remain Steps:"); Serial.println(num); //顯示步數 stepper.step(-num*steps); //右轉步數 num=0; //清除步進數 cl = 0; //重置連續左轉旗標 cr = 0; //重置連續右轉旗標 } else if(ch=='l') //鍵值爲 l (左轉) { Serial.print("Left Turn remain Steps:"); Serial.println(num); //顯示步進數 stepper.step(num*steps); //左轉步數 num=0; //清除步進數 cl = 0; //重置連續左轉旗標 cr = 0; //重置連續右轉旗標 } else if(ch=='+') //鍵值爲 + (連續右轉) { Serial.println("Continuous Right Turn"); cr =1; //啓動連續右轉 cl =0; //停止連續左轉 } else if(ch=='-') //鍵值爲 - (連續左轉) { Serial.println("Continuous Left Turn"); cl =1; //啓動連續左轉 cr = 0; //停止連續右轉 } else if(ch=='e') //鍵值爲 e { num=0; //清除步進數 cl=0; //重置連續左轉旗標 cr=0; //重置連續右轉旗標 } if(cr==1) stepper.step(-steps); //連續右轉 if(cl==1) stepper.step(steps); //連續左轉 }
☛ 練習
⑴ 設計 Arduino 程式,接續例題功能,新增 >,< 兩個按鍵設定正反轉的轉動圈數功能。例如輸入 2> 時,馬達正轉兩圈;輸入 3< 時,馬達反轉 3 圈。
#include <Stepper.h> //使用 Stepper.h 函式庫 #define STEPS 200 //步進馬達每圈步進數 Stepper stepper(STEPS, 2, 4, 3, 5); //建立 Steeper 資料形態的物件 int steps = 63.68395; //步進馬達 28BYJ-48 每一步步進值 int num = 0; //按鍵數值 int cr = 0; //連續右轉旗標 int cl = 0; //連續左轉旗標 char ch; //按鍵值 void setup() { stepper.setSpeed(steps); //設定步進馬達的轉速爲 64 RPM Serial.begin(9600); //初始化串列埠,鮑率爲 9600 bps Serial.println("Press 0-9: Setting steps"); Serial.println("Press s: Setting speed ( default value 64 RPM )"); Serial.println("Press r: Right Turn"); Serial.println("Press l: Left Turn"); Serial.println("Press +: Continuous Right Turn"); Serial.println("Press -: Continuous Left Turn"); Serial.println("Press e: Stop"); } void loop() { if(Serial.available()) //按下任意鍵? { ch = Serial.read(); //讀取按鍵值 if(ch>='0' && ch<='9') //按鍵值爲 0-9 num = num*10+ch-'0'; //加權儲存 else if(ch=='s') //鍵值爲 s (設定轉速) { Serial.print("Setting Speed:"); Serial.print(num); //顯示所設定的馬達轉速 Serial.println(" RPM"); stepper.setSpeed(num); //設定馬達轉速 (單位:RPM) num=0; //清除鍵盤輸入數值 cl = 0; //重置連續左轉旗標 cr = 0; //重置連續右轉旗標 } } if(ch=='r') //鍵值爲 r (右轉) { Serial.print("Right Turn remain Steps:"); Serial.println(num); //顯示步數 stepper.step(-num*steps); //右轉步數 num=0; //清除步進數 cl = 0; //重置連續左轉旗標 cr = 0; //重置連續右轉旗標 } else if(ch=='l') //鍵值爲 l (左轉) { Serial.print("Left Turn remain Steps:"); Serial.println(num); //顯示步進數 stepper.step(num*steps); //左轉步數 num=0; //清除步進數 cl = 0; //重置連續左轉旗標 cr = 0; //重置連續右轉旗標 } else if(ch=='+') //鍵值爲 + (連續右轉) { Serial.println("Continuous Right Turn"); cr =1; //啓動連續右轉 cl =0; //停止連續左轉 } else if(ch=='-') //鍵值爲 - (連續左轉) { Serial.println("Continuous Left Turn"); cl =1; //啓動連續左轉 cr = 0; //停止連續右轉 } else if(ch=='e') //鍵值爲 e { num=0; //清除步進數 cl=0; //重置連續左轉旗標 cr=0; //重置連續右轉旗標 } else if(ch=='>') //鍵值爲 > { stepper.step(-steps*32*num); //馬達正轉至設置的圈數 num=0; //清除設定的圈數 cl=0; //重置連續左轉旗標 cr=0; //重置連續右轉旗標 } else if(ch=='<') //鍵值爲 < { stepper.step(steps*32*num); //馬達反轉至設置的圈數 num=0; //清除設定的圈數 cl=0; //重置連續左轉旗標 cr=0; //重置連續右轉旗標 } if(cr==1) stepper.step(-steps); //連續右轉 if(cl==1) stepper.step(steps); //連續左轉 }
⑵ 設計 Arduino 程式,接續例題功能,新增 >,< 兩個按鍵設定正反轉的轉動角度功能。例如輸入 90> 時,馬達正轉 90 °;輸入 45< 時,馬達反轉 45°。
#include <Stepper.h> //使用 Stepper.h 函式庫 #define STEPS 200 //步進馬達每圈步進數 Stepper stepper(STEPS, 2, 4, 3, 5); //建立 Steeper 資料形態的物件 int steps = 63.68395; //步進馬達 28BYJ-48 每一步步進值 int num = 0; //按鍵數值 int cr = 0; //連續右轉旗標 int cl = 0; //連續左轉旗標 char ch; //按鍵值 float x = 0.089; //步數角度比 void setup() { stepper.setSpeed(steps); //設定步進馬達的轉速爲 64 RPM Serial.begin(9600); //初始化串列埠,鮑率爲 9600 bps Serial.println("Press 0-9: Setting steps"); Serial.println("Press s: Setting speed ( default value 64 RPM )"); Serial.println("Press r: Right Turn"); Serial.println("Press l: Left Turn"); Serial.println("Press +: Continuous Right Turn"); Serial.println("Press -: Continuous Left Turn"); Serial.println("Press e: Stop"); } void loop() { if(Serial.available()) //按下任意鍵? { ch = Serial.read(); //讀取按鍵值 if(ch>='0' && ch<='9') //按鍵值爲 0-9 num = num*10+ch-'0'; //加權儲存 switch(ch) { case 's': //鍵值爲 s (設定轉速) Serial.print("Setting Speed:"); Serial.print(num); //顯示所設定的馬達轉速 Serial.println(" RPM"); stepper.setSpeed(num); //設定馬達轉速 (單位:RPM) num=0; //清除鍵盤輸入數值 cl = 0; //重置連續左轉旗標 cr = 0; //重置連續右轉旗標 break; case 'r': //鍵值爲 r (右轉) Serial.print("Right Turn remain Steps:"); Serial.println(num); //顯示步數 stepper.step(-num*steps); //右轉步數 cl = 0; //重置連續左轉旗標 cr = 0; //重置連續右轉旗標 break; case 'l': //鍵值爲 l (左轉) Serial.print("Left Turn remain Steps:"); Serial.println(num); //顯示步進數 stepper.step(num*steps); //左轉步數 num=0; //清除步進數 cl = 0; //重置連續左轉旗標 cr = 0; //重置連續右轉旗標 break; case '+': //鍵值爲 + (連續右轉) Serial.println("Continuous Right Turn"); cr =1; //啓動連續右轉 cl =0; //停止連續左轉 break; case '-': //鍵值爲 - (連續左轉) Serial.println("Continuous Left Turn"); cl =1; //啓動連續左轉 cr = 0; //停止連續右轉 break; case 'e': //鍵值爲 e num=0; //清除步進數 cl=0; //重置連續左轉旗標 cr=0; //重置連續右轉旗標 break; case '>': //鍵值爲 > stepper.step(-steps*x*num); //馬達正轉至設置的角度 num=0; //清除設定的角度 cl=0; //重置連續左轉旗標 cr=0; //重置連續右轉旗標 break; case '<': stepper.step(steps*x*num); //馬達反轉至設置的角度 num=0; //清除設定的角度 cl=0; //重置連續左轉旗標 cr=0; //重置連續右轉旗標 break; } } if(cr==1) stepper.step(-steps); //連續右轉 if(cl==1) stepper.step(steps); //連續左轉 }