李 真, 余善恩, 倪紅霞
(杭州電子科技大學 自動化學院, 杭州 310018)
當前,國內有很多高校都在研究球桿控制系統,該系統運用了模糊控制、自適應遺傳PID控制、魯棒控制等控制方法,且收獲了良好的控制效果,但是在小球位置檢測方面卻存在不足之處。目前球桿控制系統中小球的檢測方法主要分為以下幾類:① 采用紅外光電傳感器來檢測小球在導軌上的位置,即在導軌的一端安裝一個光電傳感器。但由于小球的反射面是弧狀的,發射過來的光線在球面會產生散射,使系統對小球的位置產生誤判,而且實驗環境中不同的光強也可能使小球的位置檢測產生誤差,因此此種方法的應用場合有限。② 采用超聲波測距:這也是一種比較普遍的選擇,但是由于超聲波測距本身并不敏感,而且超聲波測距受反射聲波的反射面形狀影響較大,準確度和靈敏度較低[1]。③ 采取電阻尺(直線位移傳感器),即在導軌的一側放置一根繃直的電阻絲,而導軌的另一側放置一根繃直的細銅絲。當小球(實心的金屬球)在導軌上滾動時,就會與電阻絲和細銅絲接觸,導軌和小球自然就形成了一個簡易的滑動變阻器,當給電阻絲一個電壓值時,可以對細銅絲的一端采集A/D值,小球在導軌上的位置就可以通過該A/D值計算得到[2]。此方法雖然做起來很簡單,對于單片機來說也方便處理。但是由于小球和金屬絲時常接觸不好,從而導致實時檢測出來的小球位置存在很大的誤差。④ 采用激光傳感器對小球的位置進行檢測,該傳感器能檢測到很微弱的激光信號,這是對小球位置最為精確的檢測。但是,由于市場上的激光傳感器價格都過于昂貴,這樣會使該實驗平臺的市場競爭力下降[3]。
綜上所述,球桿控制實驗系統的控制方法雖然發展的較為完善,但小球位置的檢測裝置有待優化。在本設計中,將一種新的方法應用于對小球的位置檢測,即采用數字攝像頭。這樣既可以解決紅外光電傳感器和超聲波傳感器等方法在小球位置檢測中存在的缺陷,也可以避免直線電位器接觸不好以及激光傳感器設備費用投入過高等問題,有利于該實驗平臺的推廣和發展。
球桿控制實驗系統的結構如圖1所示,本結構主要由碳纖導軌、直流減速電動機、帶坐軸承、支架等組成。導軌是由兩根長65 cm, 寬0.8 cm的碳纖管組成,可以繞其一側的帶坐軸承旋轉,導軌另一側通過細線懸掛在減速電動機的轉軸上,通過電動機正反轉控制導軌上下運動,實現導軌角度的變化。其中小球采用的是實心鋼球[4]。

圖1 球桿實驗系統簡易結構示意圖
球桿控制實驗系統的硬件結構如圖2所示,本系統的硬件部分主要包括BTN7970電動機驅動、減速電動機、位置檢測攝像頭、OLED顯示、STM32微處理器、矩陣鍵盤和電源等。本設計最為重要的是對小球位置的實時檢測,其中電動機驅動器由兩片BTN7970構成,數字攝像頭OV7725用來采集圖像信息,處理器根據小球在導軌中的位置計算出控制量,控制減速電動機轉過一定的角度,從而實時調整導軌的傾角,使小球在導軌上運動,改變小球在導軌上的位置,并且依據設定的小球位置值讓小球運動并穩定在某個范圍之內。同時,能夠將實時檢測到的小球位置通過微處理器在OLED上顯示出來[5]。

圖2 球桿控制系統硬件結構圖
STM32系列單片機是一種高性能的ARM單片機。其本身具有AD轉換功能,且具有多個計時器(定時器),具有PWM輸出功能,同時運算數據的速率很高。編程也較為方便,能滿足本系統要運行的一些控制算法,支持處理圖像數據。因此,本設計采用STM32系列單片機中的STM32F103VET6芯片作為球桿控制實驗系統的控制中心[6]。
直流電動機的機械特性好,且控制起來較為方便,能在很短時間內實現電動機運動方向的轉變。同時相對于步進電動機,直流電動機的驅動設計較為簡單。因此,在本系統設計中采用直流減速電動機作為運動執行部件。
位置顯示模塊選用ILI9235觸摸屏和有機發光二極管(OLED)。ILI9235觸摸屏顯示面積8.13 cm(3.2 in),能夠動態顯示彩色圖片、漢字等,而且具有觸摸屏功能,易于程序調試。但是彩屏要占用較多的IO接口,這是與其他顯示屏相比的劣勢。OLED顯示屏和單片機之間數據傳輸采用的是四線SPI接口,其傳輸原理非常簡單。由于調試時需要先精確獲得小球的像素點值,因此需要使用觸屏顯示便于調試,但是如果顯示整幀圖片,又會降低處理速度。因此,本系統選擇觸摸屏作為調試工具,在調試完成后,選擇OLED作為顯示。
OV7725數字攝像頭其本身帶有許多寄存器,通過讀寫這些寄存器能根據設計者的需要調節攝像頭輸出的數據格式,而且能夠通過調節焦距控制拍攝圖片的清晰度。圖像數據輸出采用SCCB協議,且受環境變化的干擾較小。在引言部分提到的當前球桿控制實驗系統大多采用測距傳感器,原理是反射式的,但是由于小球的反射面是弧狀的,會對被反射物質形成散射,這樣會干擾傳感器對于障礙物位置判斷,不宜采用。因此,本系統設計采用OV7725攝像頭作為小球位置檢測模塊。
BTN7970是一款電動機驅動芯片,且芯片允許流過的最大電流達到43 A。一塊BTN7970芯片只能控制一路PWM,如果要控制一個電動機正反轉,那么就需要兩塊BTN7970芯片。使用時,只需要設計一些簡單的電路將兩塊芯片和控制芯片連接起來。因此,本系統設計采用兩片BTN7970作為電動機驅動模塊。
本系統需要控制小球在一條直線上運動,所以采用矩陣按鍵作為系統的輸入設備,矩陣按鍵一共具有16個按鍵,卻僅僅占用單片機8個I/O接口,且編程簡單,占用CPU資源少[7]。
軟件系統設計包括STM32單片機內部自帶功能的軟件設計、數字攝像頭OV7725驅動程序、OLED相應的程序設計、數字圖像處理程序設計、減速電動機PID控制算法程序。系統軟件流程如圖3所示。

圖3 系統程序流程圖
OV7725攝像頭存儲圖像的流程如下:當時鐘信號到達上升沿,OV7725攝像頭開始采集圖像, OV7725首先輸出一個場中斷信號(VSYNC),緩存芯片(FIFO)得到中斷信號后,緩存芯片開始復位、使能,緩存芯片開始緩存攝像頭采集到的圖像數據,當1幀圖像數據緩存結束之后,攝像頭就會輸出第2個場中斷信號,這時就可以禁止緩存芯片使能,關閉VSYNC,開始讀取緩存的攝像頭圖像數據。這樣周而復始就可以完成攝像頭圖像數據的采集。
接下來介紹如何從存儲器中讀取攝像頭存儲的圖像數據:當得到第2個場中斷信號時,先把緩存芯片復位,然后將I/O口模擬時鐘脈沖輸出給緩存芯片,就可以讀取數據,由于每1個像素點的值是16位,所以在讀取數據時先獲得高8位,再獲得低8位。這樣一直讀取320×240次就能夠把1幀圖像數據全部讀取出來。
此外,本設計在每次讀取緩存芯片中數據時,讀取一個數據就判斷這個數據是否是程序所需要的,在讀取到需要的數據之后,就把緩存芯片中剩下的數據全部清空,同時開始下1幀數據的緩存,這樣就可以節省大量的時間。
采用OLED顯示屏和單片機傳送數據是4線SPI接口,主要通過以下4個引腳在主從設備之間進行通信,即CS、SCLK、MOSI、MISO 4個引腳。在圖4引腳圖中的CS為OLED的片選引腳,DC是OLED命令/數據標志,即寫入命令和數據的引腳;RST是硬件復位引腳;OLED顯示屏在每次程序運行之前(初始化)都要進行一次復位,即給RST引腳一個低電平。D0 信號線作為串行時鐘線 SCLK。D1 信號線作為串行數據線 SDIN。

圖4 OLED模塊接口圖
OLED驅動芯片采用的是SSD1306控制器。SSD1306的顯示內存要比5110等液晶屏大很多,其顯示內存容量一共是128×64個Byte。由于OLED液晶屏的顯示容量高達128×64個Byte,而OLED的地址線數量較少,無法直接尋址這么多的內存空間,所以需要用較少的地址線尋址到液晶屏所有的存儲空間,因此需要將SSD1306液晶屏的顯示內存分成8塊,其對應關系如表1 所示。
SSD1306初始化步驟:復位SSD1306;驅動SPI初始化代碼;開啟顯示;清零顯示;開始顯示。
OLED顯示函數:由于本系統設計只用到OLED去顯示簡單的位置信息,因此只需要簡單的顯示函數void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)即可完成,不再贅述[8]。
若要在攝像頭所采集的圖片中給小球定位,那么首先要知道白色小球的像素值是多少。所以在調試過程中,先采用ILI9235觸摸屏作為顯示模塊,將攝像頭采集到的圖像動態的顯示出來。然后通過觸摸屏,點擊圖像中的小球,點擊的點在液晶屏中會有一個坐標,因此可以通過這個坐標尋找到小球的像素值。
找到小球在圖像中的像素值后,接下來就是去處理數字攝像頭所采集的圖像數據。因為OV7725采集數據的速度太快且1幀圖像數據太多,所以單片機的I/O口無法跟上攝像頭采集數據的速度,因此本系統采用先緩存后處理的辦法處理圖像數據。當1幀圖像數據采集完后,會完整地存儲在攝像頭的緩存芯片中,接著開始讀取緩存芯片中的數據,讀取1個像素值就馬上該此像素值做相應的處理,如果找到了需要的像素點,則立刻把這個像素點的相應坐標記錄下來。當找到需要的像素點坐標之后,就不再讀取緩存中剩余的圖片數據,并立即將緩存中的數據清空,進行下1幀數據的采集。這樣既節約了圖像處理的時間,提高了速度,也不會丟失需要的數據。

表1 SSD1306 顯存與屏幕對應關系表
由于ILI9235觸摸屏顯示圖像需花費大量時間,因此在得到小球的像素值之后,為了提高圖像處理的速度,后續過程中將不再采用ILI9235觸摸屏顯示圖像,只需采用OLED顯示圖像處理后的結果。
最后是如何通過采集的像素點坐標得到小球在導軌上的位置,計算的思路是實物中小球在導軌上的相對位置與攝像頭圖片中小球在導軌中的相對位置成比例。因此,只需要計算出攝像頭圖片中小球的距離占圖片中導軌長度的比例,再以該比例乘以導軌的實際長度就得到了小球的實際距離[9-10]。
判斷小球位置占導軌長度的比例,前提需要知道小球實時的位置坐標、導軌首尾的位置坐標,但是由于導軌是運動的,所以本系統采取了下面的方法去檢測導軌首尾的坐標:在系統開始運行之前,首先將導軌放置到水平位置,然后把白色小球分別放置到導軌的首端和尾端,通過程序檢測攝像頭采集的圖片中小球的坐標,然后通過OLED把這兩個坐標顯示出來,通過這種方法獲得導軌首尾的坐標之后,就可以把這兩個坐標固定的寫入程序中。由于導軌在系統運行中傾斜角度不是很大,所以這種方法不會造成很大的誤差。因為此種方法在系統運行過程中,只需找到攝像頭每1幀圖像中小球的位置即可,找到小球的坐標后,該幀圖像的其他數據均可舍棄,這樣可以提高單片機處理攝像頭數據的速度[11]。
在本系統中采用的是湊試法對PID控制器的3個參數進行給定。首先只整定比例部分,賦予比例參數P一個較小的值,然后逐步加大P的值,并觀察響應曲線,直到得到反應快、超調小的響應曲線。如果在比例調節的基礎上,系統的靜差不能滿足設計要求,則需要加入積分環節。在給積分參數賦值之前應該把事先調好的比例參數P的值修改成原來的80%,積分參數也是從較小的值開始逐步增加,直到被控系統的響應曲線能夠達到穩態。最后,如果對系統的抗干擾性能不是很滿意的話,可以給系統增加一個適當的微分參數[12-13]。圖5所示為PID控制算法的程序設計流程圖[14]。

圖5 PID控制算法流程圖
在球桿控制實驗系統設計中,將小球的實時位置作為實際輸出值,把矩陣鍵盤輸入的位置作為設定值。兩者做差求出的誤差值作為PID控制器的輸入,經過PID控制器的比較運算得到輸出值,然后將輸出值賦值給電動機驅動器,以此達到對電動機的實時控制[15]。
本設計完成了一個球桿控制實驗系統。在本系統中,小球位置的檢測方式并沒有采用之前普遍采用的檢測方式,例如紅外傳感器、直線電位器、超聲波等,因為這些檢測方式或多或少存在一些缺陷。在本設計中采用一種新的檢測方式,即通過數字攝像頭檢測小球在導軌上的位置,這種新型檢測方式的使用克服了之前一些檢測方法的缺點,也提高了檢測精度。通過PID控制算法能使小球運動到指定位置的誤差范圍之內,且在OLED上準確顯示小球的實時位置。經使用,取得了良好的教學效果,平臺所使用的技術方案也可以為后續實驗系統的開發提供參考[16]。