將兩個巡線傳感器分開一 點距離(大于線的寬度)安裝在機器人的底盤 上,開始巡線的時候令黑線正好從兩個巡線傳 感器之間穿過,如圖8-1所示。這樣,如果兩 個傳感器檢測到都在白色的地板上方,就說明 機器人在線的上方,可以讓機器人一直往前 走;如果右邊的傳感器檢測到了黑線,就往右 轉;如果左邊的傳感器檢測到了黑線就往左 轉。若用原來的方法,即使機器人遇到一根直線,也要走“之”字形前進,而如果采用剛剛 設計的方案,機器人在巡直線的時候就完全可以筆直前進了,這樣它就可以比“之”字形巡 線法跑得更快了。
當使用兩個傳感器時,在巡直線時機器人可以一直前進而不用拐彎,這樣比走“之”字形的 軌跡就要平滑得多了。怎樣讓它走得更加平滑呢?很自然地,同學們就會想到,能不能再 增加更多的傳感器數量呢?沒錯,這是一種很常用的辦法。
如果有4個巡線傳感器,就可以這么做:假設把4個傳感器從右到左分別叫做1號、 2號、3號、4號。如果1號檢測到了黑線,說明機器人行進的方向和黑線之間的角度已經 很大了,應該馬上向右大幅轉動;否則,如果2號檢測到了黑線,則說明機器人的行進方向 和黑線之間有角度但還不是很大,只需要向右“溫柔”地轉彎就可以了。對于3號、4號傳 感器,同學們可以用類似的方法進行分析。這樣我們在控制程序中就可以判斷,根據不同 的傳感器給出不同的電機控制信號。用這種方法,機器人不僅比只有兩個傳感器時跑得 更快、更平滑,而且對于突然急轉彎的黑線有更好的適應性。同學們會發現小機器人跑得 更加可靠了。
到目前為止,我們已經為機器人編寫過好幾個小程序了。在每個程序中都免不了要 和各種數字打交道,比如所使用的接口、傳感器的讀數、地面的灰度閾值等。在編寫程序的過程中,也許有的同學已經發現了很多不方便的地方。
比如說在使用 pinMode 命令為端口規定方向時肯定要用到它的編號,然后再用 digitalRead 之類的命令操縱端口時也要用到同一個編號。同學們想一想,如果某天我們 突然要改為使用另一個端口,那么是不是要一個一個地把它的編號改變過去呢?顯然用 這種方式編寫程序修改起來既費力又容易出錯。
再比如說,有時我們用analogRead 命令讀到了傳感器當前的值,但如果在接下來的 程序里我們還要用到這個值做比較復雜的計算,該怎么辦呢?我們可不想在接下來的算 式中每個用到這個值的地方都去調用一次analogRead 命令,因為這樣做的代價太大了。 實際上,在C 語言編程中,只要合理地使用常量和變量就可以很方便地解決上面這 幾個問題了。
1.變量
變量是什么?顧名思義,變量就是數值可能發生變化的量。在程序中,常常需要把一 個數據存儲起來供以后使用,還可能隨時在程序中更改這個數據的值。這種情況下,就要 用到變量了。變量由數據類型、變量名和變量的值組成。
假設主控板上有一個溫度傳感器能感知外界溫度。可以在程序里就可以聲明一個叫 作溫度(Temperature) 的變量來記錄傳感器的數值,并且聲明它的類型是整數型。
int temperature; //int 代表變量類型是整數,變量名為 temperature, 表示溫度
而在后面的程序運行過程中,主控板測得當前溫度為20℃,在程序中就可以給溫度 變量賦值為20。這時,如果要用它做各種計算,那么只要用temperature 這個變量名就可 以代表當前的溫度值了。
temperature=20; //將溫度賦值為20℃
2.變量的聲明與賦值
上面的例子中,先聲明了一個名叫 temperature 的整數型的變量。然后又將它賦值 為20。我們這么做時,變量的聲明和賦值是分開進行的。而在另一種情況下,也可以在 聲明變量的同時就為它賦值。這時給變量賦予的值叫作初始值或是默認值。比如,我們 認為房間內大部分情況下溫度是23℃。就可以這樣做:
int temperature=23; //聲明名為temperature 的整型變量,并設初始值為23
當然,在后續的程序中隨時可以改變這個變量的值,將它重新賦值為那時的溫度值。 這也是我們為什么要使用變量的原因。
在為變量命名時,可以根據習慣使用英文或漢語拼音。但是,要注意的是變量名一般 都要和變量的實際用途相關。有的同學為了省事,喜歡用a0 、b1 之類的簡單字母加上個 數字作為變量名。這樣做是很壞的習慣,你的代碼將會很難被別人讀懂,甚至不久后你自 己都忘了它們是做什么用的。所以,請同學們一定要養成良好的命名習慣。這也是優秀 的程序員的標志之一。
3.常量
常量就是數值永遠不會發生變化的量。我們在數學課中已經接觸過好幾個大名鼎鼎 的變量,和它相對的自然就是常量了。圓周率π就是一個大小永遠不變的量 — — 常量。 在計算機程序中,有的數值是在程序的整個生命中都不會被改變的,我們就Z好用常量來 表示它們。常量的聲明很簡單,只要在變量的類型前加上一個 const 就可以了。不過,和 變量不同的一點是,常量在聲明時一定要給它賦值,這個值就是它那個永遠不變的值。
現在,同學們可能已經想到了,我們在程序中所使用的端口的編號就是典型的應該使 用常量來定義的。下面的例子就聲明了一個整數類型的常量,用來表示 LED 小燈連接到 了主控板上的3號端口上。
const int ledPort=3; //聲明一個名為 ledPort 的整數型常量,并賦值為3
4.數據類型
以前所舉的所有例子里,變量和常量都是用來表示整數的。同學們一定會好奇,除了 整數類型,我們至少還學習過小數啊!比如,如果測得的溫度值是20.5℃,那可怎么辦 呢?現在就來介紹 一 下C 語言中的其他幾種常用數據類型
此外,如果在 int 和 char 類型的變量前加上 unsigned 關鍵字,就代表這個變量不可 能為負值。
好了,現在就在一個實際例子中,用剛剛學到的知識定義幾個不同類型的變量。
假設我們的程序需要處理學生的成績,每個學生在考試中都得到了一個百分制的分 數,而這個分數又可以分為A、B 、C、D4 擋,還可以根據分數夠不夠60分判斷是否及格。 已知全班同學的分數后還可以計算出平均分。那么很可能需要聲明以下幾個變量:
int score;
boolean isQualified;
char grade;
float averageScore;
//整數類型變量score 代表學生的分數
//布爾類型變量isQualified 代表學生是否及格
//字符類型變量 char 代表學生的分數等JA,B,C,D //浮點數類型變量averageScore 代表全班的平均分
![]() |
| 機器人底盤 Disinfection Robot 消毒機器人 講解機器人 迎賓機器人 移動機器人底盤 商用機器人 智能垃圾站 智能服務機器人 大屏機器人 霧化消毒機器人 展廳機器人 服務機器人底盤 具身智能教育機器人 智能配送機器人 導覽機器人 |