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'
}
全站熱搜
留言列表