☛ 功能說明
利用串列埠傳送電腦鍵盤按鍵值控制伺服馬達轉動固定角度。 當按下 a 鍵時,伺服馬達轉動至 0° 的位置;當按下 b 鍵時,伺服馬達轉動至 90° 的位置;當按下 c 鍵時,伺服馬達轉動至 180° 的位置。
☛ 使用材料
Arduino UNO R3 開發板 × 1、SG-90 伺服馬達 × 1。
☛ 電路圖及麵包板接線圖
☛ 程式碼
#include<Servo.h> //使用 Servo.h 函式庫 Servo myServo; //建立 Servo 資料形態的物件 char ch; //按鍵值 void setup() { Serial.begin(9600); //初始化串列埠,設定鮑率為 9600 bps myServo.attach(2); //數位接腳連接伺服馬達的信號線 } void loop() { if(Serial.available()) //鍵盤輸入任意鍵 { ch=Serial.read(); //讀取按鍵值 } if(ch=='a' || ch=='A') //按下 a 或 A 鍵 myServo.write(0); //伺服馬達轉動至 0° 的位置 if(ch=='b' || ch=='B') //按下 b 或 B 鍵 myServo.write(90); //伺服馬達轉動至 90° 的位置 if(ch=='c' || ch=='C') //按下 c 或 C 鍵 myServo.write(180); //伺服馬達轉動至 180° 的位置 }
☛ 練習
⑴ 設計 Arduino 程式,利用鍵盤控制伺服馬達轉動角度。 當按下 a 鍵時,伺服馬達轉動至 0° 的位置;當按下 b 鍵時,伺服馬達轉動至 45° 的位置;當按下 c 鍵時,伺服馬達轉動至 90° 的位置;當按下 d 鍵時,伺服馬達轉動至 135° 的位置;當按下 e 鍵時,伺服馬達轉動至 180° 的位置。
#include<Servo.h> //使用 Servo.h 函式庫 Servo myServo; //建立 Servo 資料形態的物件 char ch; //按鍵值 void setup() { Serial.begin(9600); //初始化串列埠,設定鮑率為 9600 bps myServo.attach(2); //數位接腳連接伺服馬達的信號線 } void loop() { if(Serial.available()) //鍵盤輸入任意鍵 ch=Serial.read(); //讀取按鍵值 switch(ch) { case 'a': //按下 a 或 A 鍵 case 'A': myServo.write(0); //伺服馬達轉動至 0° 的位置 break; case 'b': //按下 b 或 B 鍵 case 'B': myServo.write(45); //伺服馬達轉動至 45° 的位置 break; case 'c': //按下 c 或 C 鍵 case 'C': myServo.write(90); //伺服馬達轉動至 90° 的位置 break; case 'd': //按下 d 或 D 鍵 case 'D': myServo.write(135); //伺服馬達轉動至 135° 的位置 break; case 'e': //按下 e 或 E 鍵 case 'E': myServo.write(180); //伺服馬達轉動至 180° 的位置 break; } }
⑵ 設計 Arduino 程式,利用鍵盤控制伺服馬達轉動角度。 當按下 a 鍵時,伺服馬達轉動由 0 ~ 180° 來回擺動;當按下 b 鍵時,伺服馬達轉動由 45 ~ 135° 來回擺動;當按下 c 鍵時,伺服馬達轉動至 90° 後停止。
#include<Servo.h> //使用 Servo.h 函式庫 Servo myServo; //建立 Servo 資料形態的物件 char ch; //按鍵值 void setup() { Serial.begin(9600); //初始化串列埠,設定鮑率為 9600 bps myServo.attach(2); //數位接腳連接伺服馬達的信號線 } void loop() { if(Serial.available()) //鍵盤輸入任意鍵 ch=Serial.read(); //讀取按鍵值 switch(ch) { case 'a': //按下 a 或 A 鍵 case 'A': motoTurn(0,180); //伺服馬達 0-180° 來回擺動 break; case 'b': //按下 b 或 B 鍵 case 'B': motoTurn(45,135); //伺服馬達 45-135° 來回擺動 break; case 'c': //按下 c 或 C 鍵 case 'C': myServo.write(90); //伺服馬達轉動至 90° 的位置 break; } } void motoTurn(int angle1, int angle2) //伺服馬達來回擺動副程式 { int angle; for(angle=angle1;angle<=angle2;angle++)//順時針擺動 { myServo.write(angle); delay(15); //延遲 15ms,降低伺服馬達擺動速度 if(Serial.available()) //鍵盤輸入任意鍵 { ch=Serial.read(); //讀取按鍵值 return; } } for(angle=angle2;angle>=angle1;angle--)//逆時針擺動 { myServo.write(angle); delay(15); //延遲 15ms,降低伺服馬達擺動速度 if(Serial.available()) //鍵盤輸入任意鍵 { ch=Serial.read(); //讀取按鍵值 return; } } }