DIY Arduibot (7) --- 自製 Arduino 機器人 (7)   ---  向光性機器人        



Experiment 1:     Light seeker
                          向光性機器人

第一個實驗是來做一個 向光性機器人.
這個實驗很簡單, 目標就是讓機器人有能力偵測光的強度,
它會偵測前方左右兩側地面上的亮度, 哪邊亮就往哪裡去.






這裡所使用的光感測器是 光敏電阻 (CdS  硫化鎘),
顧名思義 它的電阻值會隨著受光的強度而改變, 光越亮時, 電阻越小,
利用這種特性,  我們可以使用 Arduino 的 analog in (ADC 類比至數位轉換器),
讀取分壓電路的電壓變化, 進而知道亮度變化.







為了能夠在往後的一些實驗中動態安裝一些實驗電路, 我在車上放了一塊小麵包板,
暫時先用橡皮筋綁著, 之後可能在車前安裝一個簡易固定架, 直接把麵包板鎖在上面,
方便安裝實驗電路.

因為只做簡單的左右判斷, 所以只在車前的左右兩側各安裝一顆光敏電阻,
並且各用一顆 2K ohm 的電阻與之串連, 各組成一個簡單的分壓電路,
再用 Arduino 量取在 2K ohm 電阻的電壓, 這樣, 偵測電路就完成了.

再來就是 Arduino 的程式, 這也是非常簡單,
就是一直偵測兩邊的亮度, 當某一邊比較亮時, 就控制 servo 使車子往那邊走就行了.


另外, 這個程式還會透過 RS232 輸出目前 analog input 的量測值,
所以 車子行進間, Arduino 的 TX LED 會一閃閃的, 這樣會讓車子看起來有好像很忙的效果.






/******************************************************************
 Light seeker

 Arduibot control
 
 Leo Chen  (http://tw.myblog.yahoo.com/galileo-sky)
 2010/5/27

******************************************************************/

#include

//----------------------------------------------------------------
// Analog INPUT pin definitions
//----------------------------------------------------------------
#define  PIN_CDS_RIGHT  0
#define  PIN_CDS_LEFT   1


//----------------------------------------------------------------
// Threshold
//----------------------------------------------------------------
#define  DIFF_THRESHOLD  15

 

//----------------------------------------------------------------
// Servo objects
//----------------------------------------------------------------
Servo myservos[6];  // create servo object to control a servo
 
//----------------------------------------------------------------
// Global variables
//----------------------------------------------------------------
int  nRightCds;
int  nLeftCds;


//----------------------------------------------------------------
//
//----------------------------------------------------------------
void setup()
{
  Serial.begin(9600);

  myservos[0].attach(2);  //
  myservos[1].attach(3);  //
  myservos[2].attach(4);  // Left  servo
  myservos[3].attach(5);  // Right servo
  myservos[4].attach(6);  //
  myservos[5].attach(7);  //
 
  // prints title
  Serial.println("Arduibot v0.1");
}
 
 
//----------------------------------------------------------------
//
//----------------------------------------------------------------
void loop()
{
  int    potValue;

   nRightCds = analogRead(PIN_CDS_RIGHT);
   nLeftCds = analogRead(PIN_CDS_LEFT);

  Serial.print("Right = ");
  Serial.print(nRightCds); 
  Serial.print("       Left = ");
  Serial.println(nLeftCds); 

  if (nRightCds>nLeftCds) {
    if ((nRightCds - nLeftCds)> DIFF_THRESHOLD) {
       TurnRight();
       }
     else {
       Forward();
       }
  }
   else {
     if (nLeftCds>nRightCds) {
        if ((nLeftCds - nRightCds)> DIFF_THRESHOLD) {
           TurnLeft();
        }
        else {
          Forward();
         }
     }
   else
     Forward();
   }
  
   delay(200);
      
 

}

//----------------------------------------------------------------
//
//----------------------------------------------------------------
void Stop() {
  myservos[0].write(90);          // tell servo to go to position in variable 'servoPos'
  myservos[1].write(90);          // tell servo to go to position in variable 'servoPos'
}

void Forward() {
  myservos[0].write(150);          // tell servo to go to position in variable 'servoPos'
  myservos[1].write(30);          // tell servo to go to position in variable 'servoPos'
}

void Backward() {
  myservos[0].write(30);          // tell servo to go to position in variable 'servoPos'
  myservos[1].write(150);          // tell servo to go to position in variable 'servoPos'
}


void TurnRight() {
  myservos[0].write(150);          // tell servo to go to position in variable 'servoPos'
  myservos[1].write(80);          // tell servo to go to position in variable 'servoPos'
}


void TurnLeft() {
  myservos[0].write(110);          // tell servo to go to position in variable 'servoPos'
  myservos[1].write(30);          // tell servo to go to position in variable 'servoPos'
}



void RotateRight() {
  myservos[0].write(120);          // tell servo to go to position in variable 'servoPos'
  myservos[1].write(120);          // tell servo to go to position in variable 'servoPos'
}

void RotateLeft() {
  myservos[0].write(60);          // tell servo to go to position in variable 'servoPos'
  myservos[1].write(60);          // tell servo to go to position in variable 'servoPos'
}

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Galileo 的頭像
    Galileo

    Galileo's Sky

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