紅外循跡感測器PID循跡演算法

2021-10-02 05:15:37 字數 3367 閱讀 7998

前一段時間參加了乙個小車循跡競速的比賽,獲得了乙個還行的成績,所以在這裡想把裡面的核心部分pid尋線演算法給大家分享一下。

紅外感測器循跡原理如圖1所示:

圖1 紅外感測器原理

紅外二極體發射紅外光,接收管接受反射的紅外光訊號。不同的顏色反光效果不同,如果紅外光照射在黑色物體上,由於黑色物體對光的吸收能力強,反射的光很少。但照在白色物體上,由於白色物體對光的吸收能力弱,反射的光較多。從而當紅外二極體發出的光照射在不同顏色的物體上時,接收管接受的紅外光強度也不同,從而可以判斷出前面物體的顏色。

圖2 賽道

紅外循跡就是根據這個原理,將紅外模組安裝在尋跡小車上,然後再賽道上面貼上黑色膠帶,當檢測到黑色時說明小車在黑線上,檢測到白色是說明小車偏離黑線,則需要向黑線靠近,賽道如圖2所示。市面上大多數紅外循跡感測器採用數字式的,也就是將紅外置收管接受到的模擬量訊號通過電壓比較轉換為0和1的數值訊號,按照這種方法尋線的話至少需要兩個紅外感測器,固定在黑線兩側,當左邊紅外感測器檢測到偏離黑線時往右偏,當右邊紅外感測器檢測到偏離黑線時往左偏。這樣確實可以尋線,但是尋線效果相當不好,這樣尋線有以下幾個缺點:

①尋線精度差

②容易偏離軌跡

③尋線速度慢

不過也有優點,優點就是程式簡單。市場上也有五路的和七路的但是這樣效果也就好那麼一點。其實市場上這種將模擬量變成數字量的方法本身就將精度很高的感測器變為精度低的了。因為採集紅外置收管訊號的方式是通過ad採集,如果是10位ad的話精度位1024,採用stm32f103c8t6的話有12位ad,採集的精度位4096。但這種採集精度高的處理方法是比較好,但是處理的過程相對麻煩,大致思路就是微控制器通過內部ad採集循跡感測器模擬量,然後通過pid引數控制舵機角度。

下面我要介紹的紅外循跡模組也就是這種直接通過微控制器內部ad採集紅外循跡感測器資料,然後根據資料pid動態調調節舵機角度的方法。採用的紅外循跡模組為三路循跡模組實物如圖3所示,電路原理圖如圖4所示。

圖3 三路紅外循跡感測器實物圖

圖4 循跡模組電路原理圖

其中三個紅外管的功能不同,左右兩個紅外管的作用是判斷感測器離黑線邊界的距離,獲取的ad值越大說明離黑線越遠,則舵機需要轉動的角度也就越大。中間的乙個紅外管的作用是判斷是否感測器在黑線內,我將用乙個曲線圖來向大家表示原理,便於大家理解,圖5位循跡模組安裝圖。

圖5 循跡感測器安裝圖

將循跡感測器固定在小車上,感測器離軌道的高度為3cm左右,假設左兩個紅外感測器之間的距離和軌道黑線的寬度相同為3cm,感測器從左到右移動獲得的影象如圖6所示:

圖6 左右感測器向左移**像

將右感測器值減去左感測器值可得到影象如圖7所示:

圖7 左右感測器相減資料整合圖

這時獲取的資料有效長度只能在3cm黑線軌跡之內,當資料為0時表示小車循跡方向沒有偏差,大於0說明小車往左偏,小於0說明小車往右偏,數值越大說明偏離的越大。但是由於資料有效長度只有3cm當小車速度快時,容易衝出有效循跡黑線範圍,同時我們也注意到,有效長度左邊和右邊有一段資料沒有用到,我可以嘗試將左有兩段沒用用到的資料納入到有效處理資料。

圖8 根據中感測器獲取左右閾值點

如上圖8所示,我們可以通過中間的紅外感測器來獲取,當中間感測器小於閾值時,通過判斷左右兩個紅外感測器相減值得正負來處理左右兩邊的資料,資料翻轉將斜率變為原來2倍。得到的最終效果圖如下如所示,最終得到的寬度為原來3倍左右,為9cm。即使感測器完全偏離黑線,最終也會回來,最終達到處理後的效果為圖9所示。

圖9 最終資料處理效果

綜上所述,需要經過這幾步達到最終效果:

(1)確定左右感測器差值(d_ad_value):

確定方法:將感測器放到白色紙上,將左右兩個感測器的資料通過串列埠傳送到電腦上,獲取左右兩個感測器差值,d_ad_value=left_ad-right_ad。

(2)確定左感測器峰值點(left_max)和右感測器峰值點(right_max):

確定方法:將左紅外感測器和右紅外感測器分別從左到右移動,將資料通過串列埠傳送到電腦上觀察資料獲取最大值,一般當感測器移動到黑線中間是獲得資料最大值。

(3)確定左閾值點(left_threash)和右閾值點(right_threash):

確定方法:當達到左感測器達到峰值時,觀察中間紅外感測器數值,此時中間紅外感測器數值即為左閾值點。同樣當達到右感測器達到峰值時,觀察中間紅外感測器數值,此時中間紅外感測器數值即為右閾值點。

(4)進行資料整合:

①當中間感測器獲取的ad數值在左閾值點和右閾值點之間時,將獲取到的左傳感 器資料(left_ad)與右感測器資料(right_ad)相減加上左右感測器差 data_out=(left_ad-right_ad+d_ad_value)。

②當①中獲取的資料大於零(data_out>0)且中間感測器獲取的資料小於左閾 值時(mid_ad2

③當①中獲取的資料大於零(data_out>0)且中間感測器資料獲取的資料小於左閾 值時(mid_adright_max-right_ad)*2

綜上所述換成用c語言形式寫即為:

//獲取循跡感測器輸出函式

//返回值:int型別,範圍循跡感測器資料,根據此值來調節小車舵機角度

int gettracedate()

{ int data_out;//定義資料輸出變數

int left_ad,right_ad,mid_ad;//定義左右中感測器ad值變數

left_ad=get_adc(2);

mid_ad=get_adc(3);

right_ad=get_adc(4);

data_out=(left_ad-right_ad+d_ad_value);

if((data_out>0)&&(mid_ad如果大家感覺配置麻煩的話我做了一款一鍵配置的循跡模組,配置簡單,串列埠直接輸出資料,使用於1-4cm線寬,如果大家感興趣的話可以檢視此篇部落格有詳細介紹:串列埠直輸型循跡感測器。

串列埠直輸型PID紅外循跡模組 PID循跡

關於紅外pid循跡模組的原理我之前寫過一篇部落格,大家沒看過的話可以點此鏈結檢視 pid循跡模組原理。此循跡模組可以根據感測器離黑線的距離輸出線性值,但是配置起來比較麻煩,微控制器必須帶有ad採集功能,然後在 中改配置引數比較麻煩。最近本人將之前的pid循跡模組更新了一下,在模組上加入了乙個stm8...

Arduino使用循跡感測器

本文介紹我買的37款感測器套件中的循跡感測器模組,它的實物圖如下 模組的左邊是紅外發射和接收裝置,模組中間靠右位置是乙個調節測量距離的可調電阻,它總共有三個引腳,從上到下分別為 vcc 接電源正極 out 訊號輸出引腳,輸出1表示測量面顏色較深,輸出0表示測量面顏色比較淺 gnd 接電源負極 int...

紅外感測器 集錦

紅外置近開關是一種集發射與接收於一體的光電開關感測器。數碼訊號的輸出伴隨感測器後側指示燈亮的亮滅,檢測距離可以根據要求進行調節。該感測器具有探測距離遠 受可見光干擾小 便宜 易於裝配 使用方便等特點,可以廣泛應用於機械人避障 互動 工業自動化流水線等眾多場合。當感測器沒有監測到目標的時候,uno控制...