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