工程筆記本 / NXC/RobotC/C++ for Lego robot

NXC/RobotC/C++ for Lego robot

NXC雙光感車進階版 by 祥瑞

CAVEDU 阿吉 - 雜工📅 2009-08-13👁 15
每周和祥瑞上課都覺得他實在是個認真又勤奮的好孩子, 不過別過分投入變宅男就不好了。 延續上一堂的自動偵測功能, 這次我們希望機器人直接出發就可以跟著軌跡線跑, 不需要事先寫入光值。 唯一的假設是黑色與白色的光值差至少要大於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); } } }

相關文章 📎

留言 💬 (0)

還沒有留言,來當第一個。