NXC雙光感車進階版 by 祥瑞

每周和祥瑞上課都覺得他實在是個認真又勤奮的好孩子, 不過別過分投入變宅男就不好了。

延續上一堂的自動偵測功能, 這次我們希望機器人直接出發就可以跟著軌跡線跑, 不需要事先寫入光值。

唯一的假設是黑色與白色的光值差至少要大於20。 我想這個假設是很合理的, 因為如果黑白差值太小的話, 那其他的方式也應該不能work了。

請注意本範例使用了3個光感應器(左, 中, 右), 它們的值分別丟給 vL, vM, vR這三個變數。

事先定義 scaleChange(光值差) 為20, 並宣告 scaleL (左側光值邊界值) 為 (vL + vM )/2, scaleR (右側光值邊界值) 為 (vR + vM )/2。

重點在這裡!!

進入while迴圈之後, 只要1, 2 或是 2, 3號光感應器的光值差 > 20, 就會重新計算scaleL與 scaleR。 這樣機器人才會dynamic一直去計算實際上的光值。我們期待這台車可以克服掉因照明不均勻而產生的偵測誤差問題。

之後的機器人動作與先前的雙光感車是一樣的。 

#define speed 40
#define scaleChange 20

task main() {
SetSensorLight(S1);
SetSensorLight(S2);
SetSensorLight(S3);

int vL = Sensor(S1);
int vM = Sensor(S2);
int vR = Sensor(S3);
int scaleL = (vL+vM)/2;
int scaleR = (vR+vM)/2;
while(true) {
if((Sensor(S1)-Sensor(S2))>=scaleChange || (Sensor(S3)-Sensor(S2))>=scaleChange) {
vL = Sensor(S1);
vM = Sensor(S2);
vR = Sensor(S3);
scaleL = (vL+vM)/2;
scaleR = (vR+vM)/2;
}

if(vL>scaleL && vR>scaleR) {
OnRev(OUT_AC, speed);
}
else if(vL>scaleL && vR<=scaleR) {
OnRev(OUT_A, speed);
Off(OUT_C);
until(Sensor(S2)
}
else if(vL<=scaleL && vR>scaleR) {
OnRev(OUT_C, speed);
Off(OUT_A);
until(Sensor(S2)
}
else {
PlayTone(600, 200);
OnRev(OUT_AC, speed);
}
}
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *