啟智模塊機器人是一款側重機器人底層硬體教學的模塊化套件,採用免螺絲的獨特裝配方式,縮短裝配手工時間,學習的重點集中於結構設計、程序編寫和功能實現上。在有限的實驗課時裡快速體驗和學習各種機器人構型的優缺點和控制特性,為將來深入學習機器人學打好堅實基礎。
一、循跡實驗主體拼裝
1、底盤拼接圖
啟智模塊機器人套件標配了4個伺服電機模塊,由於伺服電機模塊採用RS485總線通訊, 所以每個伺服電機模塊均有一個獨立的ID號。伺服電機模塊的供電和通訊功能集成在一個航插接口,使用時通過通訊線纜連接控制器 的RS485接口即可。控制器的兩個RS485接口也是並聯關係,插接任意接口都可以。2、傳感器的搭建● 根據視頻搭建完機器人底盤以後,將兩枚灰度檢測傳感器通過延長柱安裝在底盤的前下方。其中左前側的傳感器連接到啟智控制器的Adc1接口,右前側的傳感器連接啟智控制器的Adc2接口,如下圖所示。
● 機械結構組裝完畢後,下面進行電氣連接。將啟智控制器和電池模塊連接,並將四個電機模塊用航插線串聯起來,連接到啟智控制的RS485航插接口上。電氣連接示意圖如下圖所示:
二、實驗原理
黑線循跡功能的實現思路是:在機器人的前方底盤下安裝兩枚灰度檢測傳感器,在機器人行進過程中不停讀取灰度檢測傳感器的光通量數值。光通量這個數值在檢測到高亮度的表面(如白紙)時數值升高,檢測到低亮度的表面(如黑色線)數值降低。所以我們設定一個閾值,比傳感器檢測黑色線的光通量稍高即可。機器人行進過程中,當左側的傳感器返回光通量值低於閾值時,可認為黑線將會從機器人左側偏出,機器人左轉,及時追回黑線;當右側的傳感器返回光通量值低於閾值時,可認為黑線將會從機器人左側偏出,機器人右轉,及時追回黑線;當所有傳感器的返回值都高於閾值時,可認為黑線還在左右兩個傳感器之間,機器人保持直行。
啟智模塊機器人套件中,有一種能安裝在機器人底盤下方的灰度傳感器延長柱,灰度傳感器需要這個延長柱將其儘可能的靠向地面。在這個實驗裡,為了簡單好入門,暫時只使用兩枚灰度傳感器,分別安裝在機器人底盤前方的左前和右前側,與機器人中線可以隔開一個安裝位。兩個灰度傳感器隔開一定距離,可以讓循線的容錯度更大一些。左前側的灰度傳感器連接到Adc1,右前側的灰度傳感器連接到Adc2,實驗中會在程序裡從這兩個接口讀取傳感器數值。
實驗代碼中將會用到啟智控制器的部分庫函數:
● 換算灰度檢測傳感器的光通量值
int Sensor_Lux(u8 Channel)
Channel —— 接入了灰度檢測傳感器的Adc埠通道;
返回值:從該埠獲取的AD轉換原始數據換算成的光通量值,單位為10mLux。
● 設置電機速度
void Motor_SetSpeed(u8 MotorID, float MotorSpeed)
MotorID —— 電機ID號,範圍1~4;
MotorSpeed —— 設置的轉速值,精度0.1,單位為「轉/分」。
這條函數調用後,控制器只是把速度值發給電機模塊,而電機模塊並未立刻執行,需要等待調用Motors_Action()後才執行新的速度值。
返回值:空。
● 電機執行設置的速度
void Motors_Action(void)
命令所有電機模塊執行新的速度值。
返回值:空。
三、啟智模塊機器人灰度循跡代碼
1. 法建立一個新的工程,工程名為「15_LineTracking」
2. 打開USER目錄下的main.c文件,編寫如下代碼:#include "Wp_Sys.h"
int Lux[2];
int i=0;
float R4wd = 0.165;
float Rw = 0.029;
float Pi = 3.1415926;
void FourWD(float Vx, float Wz)
{
float w1,w2,w3,w4,wt;
w1 = -((Vx/Rw)/(2*Pi))*60;
w2 = -1*w1;
w3 = w2;
w4 = w1;
wt = ((Wz*R4wd/Rw)/(2*Pi))*60*1.2222;
w1 += wt;
w2 += wt;
w3 += wt;
w4 += wt;
Motor_SetSpeed(1, w1);
Motor_SetSpeed(2, w2);
Motor_SetSpeed(3, w3);
Motor_SetSpeed(4, w4);
Motors_Action();
}
int main(void)
{
WPB_Init();
while(1)
{
for(i=0;i<2;i++)
{
Lux[i] = Sensor_Lux(i+1);
OLED_Int(0,i,Lux[i],5);
}
if(Lux[0]<1500)
{
FourWD(0.1, 2*Pi/20);
}
else if(Lux[1]<1500)
{
FourWD(0.1, -2*Pi/20);
}
else
{
FourWD(0.1, 0);
}
DelayMs(10);
}
}(1) 代碼開頭先include系統函數頭文件「Wp_Sys.h」。
(2) 定義五組變量:第一個Lux[2]數組,用來讀取兩個灰度檢測傳感器的測量光通量。第二個i作為後面for循環的臨時變量。第三個R4wd是機器人旋轉時輪子施力點到機器人中心的水平距離,這裡為0.165米;第四個Rw為橡膠輪半徑,這裡為0.029米;第五個Pi為圓周率係數。
(3) 定義一個函數void FourWD(float Vx, float Wz)。第一個參數Vx是機器人直行的速度,第二個參數Wz是機器人旋轉的速度。這個函數會根據這兩個輸入值解算出四個電機應該輸出的轉速,並驅動四個電機執行這個計算結果。
(4) 在void FourWD()函數裡,可以看到代碼分為三個部分:第一部分是根據Vx計算四個電機速度w1、w2、w3和w4,計算的公式參照前面推導結果()。需要注意的是按照公式計算出來的數值結果單位為(弧度/秒),而啟智機器人的電機模塊驅動函數的輸入參數是(轉/分)。所以代碼裡能看到對計算結果進行了一個換算,先除以2*Pi,單位變成(轉/秒),再乘以60,單位變成(轉/分)。第二部分代碼是根據Wz計算機器人電機速度,公式參照前面的推導結果。同樣的,計算完畢後還需要進行一次換算,把單位從(弧度/秒)換算成(轉/分)。換算後的結果,直接累計到前面的電機速度w1、w2、w3和w4裡。第三部分代碼是執行計算結果,調用函數Motor_SetSpeed()為四個電機設置目標轉速,再調用函數Motors_Action()指示電機開始執行目標轉速。
(5) 在主體函數main函數中,先調用系統初始化函數「WPB_Init()」。
(6) 構建一個while循環,在這個循環中持續的讀取傳感器數值並驅動底盤做出反應。第一步是用for循環調用Sensor_Lux()函數讀取兩個灰度檢測傳感器的數值並保存在數組Lux[2]中,數值單位為10mLux。調用OLED_Int()函數將兩個檢測數值顯示在控制器的OLED屏幕上,一共兩行每行顯示一個數值。
第二步就是使用if判斷兩個傳感器的測距值是否低於閾值,這裡閾值的選取是數值1500,即15000mLux。這個閾值需要通過實驗測得,實驗方法就是用灰度傳感器實驗的程序,去測量黑色軌跡線和背景地面的具體數值。通常黑色軌跡線的檢測值在1000以下,而淺色背景的檢測值應該在2000以上,閾值1500是取其中間值。
下面開始黑線循跡的實現邏輯,當左側灰度傳感器的測量值Lux[0](對應Adc1)低於閾值時,說明黑色線即將從左側偏出,這時調用FourWD(0.1, 2*Pi/20)驅動機器人以0.05圈/分鐘的速度向左轉,同時保持0.1米/秒的直行速度,這樣能讓機器人繼續回到軌跡線上來。同樣的,當右側灰度傳感器測量值Distance[1](對應Adc2)低於閾值時,說明黑色線即將從右側偏出,這時調用FourWD(0.1, -2*Pi/20)驅動機器人以0.05圈/分鐘的速度向右轉,同時保持0.1米/秒的直行速度,這樣能讓機器人繼續回到軌跡線上來。最後,如果兩側傳感器的測量數值都大於閾值,可認為機器人還在黑線上,調用FourWD(0.1, 0)驅動機器人以0.1米/秒的速度繼續直行。while循環的最後,調用DelayMs(10)讓循環停頓10毫秒,把這個循環周期控制在0.01秒左右,讓程序能夠及時響應。
3. 編譯這個工程,確認程序沒有錯誤能順利編譯。
4. 將啟智控制器通過下載器和電腦連接。打開啟智控制器電源,讓控制器上電。
5. 在Keil uVision4工具欄裡點擊「LOAD」下載按鈕,將編譯好的程序下載到控制器裡。當Keil uVision4左下角狀態欄裡的下載進度進行完成後,控制器會重新啟動,屏幕顯示開機信息。此時將啟智控制器斷電,拔掉下載線。
6. 將黑色軌跡線貼在白色或淺色平面上,將機器人放置於黑線的正上方,讓黑色軌跡線位於左右兩個灰度檢測傳感器的中間位置。
結論
1. 程序運行後,機器人默認是直行狀態。
2. 機器人移動過程中,當移動到黑線處於左側灰度傳感器下時,機器人會往左偏轉,讓黑線重新回到兩個灰度傳感器中間。當移動到黑線處於右側灰度傳感器下時,機器人會往右偏轉,讓黑線重新回到兩個灰度傳感器中間。
3. 這個簡單的程序邏輯只能實現一個低速的循跡功能,如果速度提高的話,還需要做哪些優化,可以思考思考。(提示:增加灰度傳感器數量能夠讓機器人對黑線偏離程度有更細膩的判斷。)