# Arduino筆記 05. 使用光敏電阻(CdS)控制Servo ## 實驗項目: 利用讀取光敏電阻的類比輸入值來控制Servo作動 ## 學習重點: 1. 了解光敏電阻元件特性類似可變電阻,唯其為隨環境照度而改變阻值,相對其分壓值也會改變。(參考Arduino 互動設計入門 p.6-6 電阻分壓公式) > [color=#e52b02]電阻分壓計算待深入了解 2. 了解如何利用函式write()控制Servo。 ## 實驗電路: ![](https://i.imgur.com/ElU8mXp.png) {%youtube nRbz5OOk4is %} > [color=#e52b02]**注意:** 因為Arduino 5V電源只有一孔, 因此Servo應採外接電源。外接電源接法可參考Arduino 互動設計入門 p.11-7或以下論壇。 > [power your servo externally](https://arduino.stackexchange.com/questions/57508/connecting-an-arduino-to-a-servo-with-an-external-power-supply) ![](https://i.imgur.com/Ly1rm6Q.png) ## 程式碼: ```cpp= //使用光敏電阻控制Servo轉動 #include <Servo.h> Servo myservo; //建立一個servo const byte photocellPin = A2; //定義光敏電阻腳位 int photocellVal = 0; //光敏電阻類比值 int minLight = 100; //最小光線臨界值 int pos = 0; //servo位置變數 int reset = 0; //servo校正位置0度 int flag = 0; //判斷serveo順時針(0)或逆時針(1)的旗標 void setup() { Serial.begin(9600); myservo.attach(9); // attaches the servo on pin 9 to the servo object myservo.write(reset); // servo校正至0度 } void loop() { photocellVal = analogRead(photocellPin); // 讀取光敏電阻類比值 Serial.println(photocellVal); // 監測光敏電阻類比值or Servo角度 if(photocellVal < minLight){ if (flag == 0){ pos++; myservo.write(pos); // 告訴 servo 走到 'pos' 的位置 delay(5); // 等待 5ms 讓 servo 走到指定位置 if (pos == 180) // 角度++到180度時,改逆時針轉 flag = 1 ; } if (flag == 1){ pos--; myservo.write(pos); // 告訴 servo 走到 'pos' 的位置 delay(5); // 等待 5ms 讓 servo 走到指定位置 if (pos == 0) // 角度--到0度時,改順時針轉 flag = 0 ; } } } ``` ## 延伸學習: * N/A ## 參考資料: * Arduino 互動設計入門動手做6-2 (p.6-7)。 * 2021 交大創客營超級電子元件課程第一題。