☛ 功能說明
利用光線控制伺服馬達轉動角度。 使用三個光敏電阻 a、b、c 並將其排列成一直線,利用三個光敏電阻感測光線照射位置,並使伺服馬達轉動至相對位置。 如果光線完全照射在光敏電阻 a 時,馬達轉動至 0° 位置;如果光線照射在光敏電阻 a 與 b 之間時,馬達轉動至 45° 位置;如果光線完全照射在光敏電阻 b 時,馬達轉動至 90° 位置;如果光線照射在光敏電阻 b 與 c 之間時,馬達轉動至 135 ° 位置;如果光線完全照射在光敏電阻 c 時,馬達轉動至 180° 位置。
☛ 使用材料
Arduino UNO R3 開發板 × 1、SG-90 伺服馬達 × 1、光敏電阻 GM5528 × 3、電阻 10KΩ × 3。
☛ 電路圖及麵包板接線圖
☛ 程式碼
#include<Servo.h> //使用 Servo.h 函式庫 Servo myServo; //建立 Servo 資料形態的物件 const int cds[3]={0,1,2}; //三個光敏電阻連接至類比接腳 A0、A1、A2 int val[3]; //光敏電阻的類比值 void setup() { myServo.attach(2); //數位接腳 2 連接至伺服馬達信號輸出腳 myServo.write(0); //設定伺服馬達在 0° 位置 } void loop() { for(int i=0;i<3;i++) val[i]=analogRead(cds[i]); //讀取三個光敏電阻狀態 if(val[0]>800 && val[1]<800 && val[2]<800) //光源在 a 位置? myServo.write(0); //馬達轉動至 0° 位置 if(val[0]>800 && val[1]>800 && val[2]<800) //光源在 a 與 b 之間位置? myServo.write(45); //馬達轉動至 45° 位置 if(val[0]<800 && val[1]>800 && val[2]<800) //光源在 b 位置? myServo.write(90); //馬達轉動至90° 位置 if(val[0]<800 && val[1]>800 && val[2]>800) //光源在 b 與 c 之間位置? myServo.write(135); //馬達轉動至 135° 位置 if(val[0]<800 && val[1]<800 && val[2]>800) //光源在 c 位置? myServo.write(180); //馬達轉動至 180° 位置 }
☛ 練習
⑴ 設計 Arduino 程式,利用光線控制伺服馬達轉動角度。 接續本實習,新增三個發光二極體 (LED) L1、L2、L3 指示三個光敏電阻受光狀態,當光敏電阻受光照射時,點亮 LED;反之當光敏電阻未收光照射時,關閉 LED。
#include<Servo.h> //使用 Servo.h 函式庫 Servo myServo; //建立 Servo 資料形態的物件 const int cds[3]={0,1,2}; //三個光敏電阻連接至類比接腳 A0、A1、A2 const int led[3]={10,11,12}; //三個 LED 連接至數位接腳 10、11、12 int val[3]; //光敏電阻的類比值 int Val=800; //光敏電阻判斷值 void setup() { myServo.attach(2); //數位接腳 2 連接至伺服馬達信號輸出腳 myServo.write(0); //設定伺服馬達在 0° 位置 for(int i=0;i<3;i++) pinMode(led[i],OUTPUT); //設定數位接腳 10、11、12 為輸出模式 } void loop() { for(int i=0;i<3;i++) val[i]=analogRead(cds[i]); //讀取三個光敏電阻狀態 if(val[0]>Val && val[1]<Val && val[2]<Val) //光源在 a 位置? { myServo.write(0); //馬達轉動至 0° 位置 digitalWrite(led[0],HIGH); //點亮 LED1 digitalWrite(led[1],LOW); //關閉 LED2 digitalWrite(led[2],LOW); //關閉 LED3 } if(val[0]>Val && val[1]>Val && val[2]<Val) //光源在 a 與 b 之間位置? { myServo.write(45); //馬達轉動至 45° 位置 digitalWrite(led[0],HIGH); //點亮 LED1 digitalWrite(led[1],HIGH); //點亮 LED2 digitalWrite(led[2],LOW); //關閉 LED3 } if(val[0]<Val && val[1]>Val && val[2]<Val) //光源在 b 位置? { myServo.write(90); //馬達轉動至90° 位置 digitalWrite(led[0],LOW); //關閉 LED1 digitalWrite(led[1],HIGH); //點亮 LED2 digitalWrite(led[2],LOW); //關閉 LED3 } if(val[0]<Val && val[1]>Val && val[2]>Val) //光源在 b 與 c 之間位置? { myServo.write(135); //馬達轉動至 135° 位置 digitalWrite(led[0],LOW); //關閉 LED1 digitalWrite(led[1],HIGH); //點亮 LED2 digitalWrite(led[2],HIGH); //點亮 LED3 } if(val[0]<Val && val[1]<Val && val[2]>Val) //光源在 c 位置? { myServo.write(180); //馬達轉動至 180° 位置 digitalWrite(led[0],LOW); //關閉 LED1 digitalWrite(led[1],LOW); //關閉 LED2 digitalWrite(led[2],HIGH); //點亮 LED3 } if(val[0]<Val && val[1]<Val && val[2]<Val) //沒有光源在 a、b、c 位置? { digitalWrite(led[0],LOW); //關閉 LED1 digitalWrite(led[1],LOW); //關閉 LED2 digitalWrite(led[2],LOW); //關閉 LED3 } }
⑵ 設計 Arduino 程式,利用光線控制伺服馬達轉動角度。 接續本實習,新增三個發光二極體 (LED) L1、L2、L3 指示三個光敏電阻受光狀態,當光敏電阻受光照射時,閃爍 LED;反之當光敏電阻未收光照射時,關閉 LED。
#include<Servo.h> //使用 Servo.h 函式庫 Servo myServo; //建立 Servo 資料形態的物件 const int cds[3]={0,1,2}; //三個光敏電阻連接至類比接腳 A0、A1、A2 const int led[3]={10,11,12}; //三個 LED 連接至數位接腳 10、11、12 int ledDisplay[3]={0,0,0}; //LED 是否點亮 int val[3]; //光敏電阻的類比值 int Val=800; //光敏電阻判斷值 void setup() { myServo.attach(2); //數位接腳 2 連接至伺服馬達信號輸出腳 myServo.write(0); //設定伺服馬達在 0° 位置 for(int i=0;i<3;i++) pinMode(led[i],OUTPUT); //設定數位接腳 10、11、12 為輸出模式 } void loop() { for(int i=0;i<3;i++) val[i]=analogRead(cds[i]); //讀取三個光敏電阻狀態 if(val[0]>Val && val[1]<Val && val[2]<Val) //光源在 a 位置? { myServo.write(0); //馬達轉動至 0° 位置 ledDisplay[0]=1; //LED1 亮燈 ledDisplay[1]=0; //LED2 熄燈 ledDisplay[2]=0; //LED3 熄燈 } if(val[0]>Val && val[1]>Val && val[2]<Val) //光源在 a 與 b 之間位置? { myServo.write(45); //馬達轉動至 45° 位置 ledDisplay[0]=1; //LED1 亮燈 ledDisplay[1]=1; //LED2 亮燈 ledDisplay[2]=0; //LED3 熄燈 } if(val[0]<Val && val[1]>Val && val[2]<Val) //光源在 b 位置? { myServo.write(90); //馬達轉動至90° 位置 ledDisplay[0]=0; //LED1 熄燈 ledDisplay[1]=1; //LED2 亮燈 ledDisplay[2]=0; //LED3 熄燈 } if(val[0]<Val && val[1]>Val && val[2]>Val) //光源在 b 與 c 之間位置? { myServo.write(135); //馬達轉動至 135° 位置 ledDisplay[0]=0; //LED1 熄燈 ledDisplay[1]=1; //LED2 亮燈 ledDisplay[2]=1; //LED3 亮燈 } if(val[0]<Val && val[1]<Val && val[2]>Val) //光源在 c 位置? { myServo.write(180); //馬達轉動至 180° 位置 ledDisplay[0]=0; //LED1 熄燈 ledDisplay[1]=0; //LED2 熄燈 ledDisplay[2]=1; //LED3 亮燈 } if(val[0]<Val && val[1]<Val && val[2]<Val) //沒有光源在 a、b、c 位置? { for(int j=0;j<3;j++) ledDisplay[j]=0; //LED1、LED2、LED3 都處於熄燈狀態 } ledFlashing(); //LED 閃爍亮燈副程式 } void ledFlashing() //LED 閃爍亮燈副程式 { int j; for(j=0;j<3;j++) digitalWrite(led[j],ledDisplay[j]); //依照 ledDisplay 狀態決定是否要亮燈 delay(250); //延遲 250ms for(j=0;j<3;j++) digitalWrite(led[j],LOW); //關閉所有 LED delay(250); }