情境:當小偷進門,手電筒照到Robi的眼睛,Robi會轉頭向比較亮的那邊,並且發出幽幽綠光來嚇人。影片最後有一個很吵的聲音,那個是按壓式手電筒的聲音,不是伺服馬達喲。

材料:

Arduino Uno Rev 3. 1
10K ohm 電阻,接光敏電阻 2
220 ohm 電阻,接LED 2
光敏電阻 2
綠光LED  2
伺服馬達 1

 

線路接續圖

Ghost_Robi_bb  

※因改造引起的Robi故障,本人及本站都不負賠償任,進行改造前需有小朋友出走的覺悟。

程式碼下載https://box.nctu.edu.tw/public.php?service=files&t=f44de60f2b6cd3c2455a8c42b0de4fde

程式碼

// 使用光敏電阻控制 Servo
// 引用 Servo Library
 
#include <Servo.h>
 
// 建立一個 Servo 物件
 
Servo myservo;
 
// 兩顆光敏電阻接在 Analog pin 0 及 pin 5
 
int sensorLeft = 0;
 
int sensorRight = 5;
 
 
//一定要接到第11腳,因為第10腳不支援模擬類比輸出,所以無法營造出燈光幽幽亮起的樣子。
int LED_Right = 11;
int LED_Left = 11;
 
void setup()
 
{
 
  Serial.begin(9600);
 
  myservo.attach(9);  // Servo 接在 pin 9
 
  pinMode(LED_Right, OUTPUT);
  //pinMode(LED_Left, OUTPUT);
}
 
 
void loop()
 {
 
  int readingLeft, readingRight;
  int i;
  // 讀取左右兩顆光敏電阻的讀值
 
  readingLeft = analogRead(sensorLeft);
 
  readingRight = analogRead(sensorRight);
 
  // 印出左右兩顆光敏電阻的讀值,DEBUG用
  Serial.print("left: "); Serial.print(readingLeft);
 
  Serial.print(" right: "); Serial.println(readingRight); 
 //如果二隻眼睛的光敏電阻讀值相差大於等於30才轉頭 
if (abs(readingLeft-readingRight)>=30) {
  if (readingLeft > readingRight) {
    myservo.write(50);                    // 設定 Servo 旋轉角度
 
    delay(150);                           // 等 Servo 旋轉
    Ghost_LED ();
 
  } else {
 
    // 右邊光敏電阻較亮,控制 Servo 轉到 120 度
    myservo.write(120);                  // 設定 Servo 旋轉角度
 
    delay(150);                           // 等待 Servo 旋轉
    Ghost_LED ();
 
  }
 delay(1000) ;
 
 
void Ghost_LED ()
{
    for (int i=0;i<=127;i++)    //從最暗開始慢慢亮起
    {
      //analogWrite(LED_Left, i*2+1); 
      analogWrite(LED_Right, i*2+1); 
      delay(50);
    }
    for (int i=127;i>=0;i--)                          //從最亮開始慢慢熄掉
    {
      //analogWrite(LED_Left, i*2+1); 
      analogWrite(LED_Right, i*2+1); 
      delay(25);
    }
  for (int i=0;i<=255;i++)                          //從最暗開始慢慢亮起,這次拉長燈光變亮的時間
    {
      //analogWrite(LED_Left, i); 
      analogWrite(LED_Right, i); 
      delay(50);
    }
    for (int j=0;j<=2;j++)                        //快速閃爍二下,營造嚇人的氣氛
    {
     //analogWrite(LED_Left, 0); 
      analogWrite(LED_Right, 0); 
      delay(1000);
      //analogWrite(LED_Left, 255); 
      analogWrite(LED_Right, 255); 
      delay(1000);
    }
      //analogWrite(LED_Left, 0);                  //最後把燈光熄滅,等下一個事件觸發。
      analogWrite(LED_Right, 0);
}

 

 

 

qmaw 發表在 痞客邦 留言(0) 人氣()