由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)是必需的,而適當的數值同學們也可以自行調校。
(1141)
近期留言