由2個光敏電阻模組可以偵側2個不同方向的亮度,再依據兩邊不同的亮度之差值,控制伺服馬達是要正轉還是反轉,一直到兩邊的數值差不多一致就就讓馬達停止,如此就可以達到追踪光源的目的。先來看程式碼:

#include <Servo.h>

Servo m;
char buf[100];
int a0, a1;
void setup() {
  // put your setup code here, to run once:
  m.attach(9);
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  Serial.begin(9600);
}

void loop() {
  buf[100];
  a0 = analogRead(A0)+50;
  a1 = analogRead(A1);
  
  sprintf(buf, "(%d, %d, %d)", a0, a1, a0-a1);
  Serial.println(buf);
  if (a0-a1>20) {
    m.write(110);
  }
  else if(a0-a1<-20) {
    m.write(70); 
  } else {
    m.write(90);
  }
  delay(150);
}

再來看看組裝之後的樣子:

還有成果示範影片:

這次使用的光敏電阻模組使用的是以下的模組,總共2個,如上圖所示,分別鎖在伺服馬達的曲柄軸上,而且兩個光敏電阻的方向,大約呈現60度的夾角:

此模組共有4支接腳,其中分別是Vcc和GND,也就是電源的正負極,而另外兩支則分別是DO和AO,也就是數位輸出和類比輸出,其中數位輸出主要使用在開關上,在這裡用不到,所以留空就好。而類比輸出的部份則是我們要用的輸入信號,其中一個接到A0,而另外一個則是接到Arduino的A1上。

此裝置的程式有一個重點就是不同的光敏電阻多少會有一些誤差,而放置的角度當然也會有影響。為了瞭解兩個光敏電阻輸出的值,在程式中我們對COM埠進行輸出以及監控,以瞭解兩者之間的差值。同學們可以利用監控的過程中,使用一個光束(手電筒)對著此機構的正前方,然後觀察兩邊數值的差異,然後在程式中加上一個數值以彌補之間的誤差,在我的例子中,其差值大約是50左右,所以在取得A0的輸入值之後,我還會將其加上50之後再放到變數a0中。

之後,就在loop()迴圈中不斷地檢視a0和a1 的差值,如果其差值超過20就依其正值或是負值,轉動伺服馬達,而當然,如果差值在20之內,就停止馬達的轉動,在設定的過程中,delay(150)是必需的,而適當的數值同學們也可以自行調校。

(14)

%d 位部落客按了讚: