☛ 功能說明

利用光線控制伺服馬達轉動角度。 使用三個光敏電阻 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);
}