☛ 功能說明

利用電腦鍵盤按鍵值控制步進馬達的轉速、正轉步數、反轉步數、連續正轉、連續反轉及停止等功能,其中 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);                    //連續左轉
}