瞿志二,袁良祺,吐魯遜江·克熱木,顧淑琪,夏潤秋
(北京信息科技大學儀器科學與光電工程系,北京100192)
由于當前不斷興起的汽車無人駕駛技術,相應的智能車實驗也更加受業內人士青睞[1],由此應運而生的各種智能小車比賽也接踵而至。智能小車的功能建立在使用者模塊使用上,通常具有自動尋跡、尋光、跟蹤、顯示、避障、紅外控制、語音控制等功能,智能小車不需要使用者實時的操控,可以根據既定的程序執行設置的要求。智能小車的出現代替了人們很多復雜而繁重的勞動,也運用在許多危險且人類無法出現的領域。隨著智能小車智能化、模塊化、通用化、普及化的實現,智能小車將運用在人類生活生產的方方面面。
2018 年7 月在北京理工大學舉辦全國大學生光電設計競賽(“光電尋的競技車”)要求制作一款“智能小車”要求完成自動尋找探測并追蹤熄滅信標燈。因此基于OpenMV 和Arduino Teensy 開發出一套針對第六屆全國大學生光電設計競賽要求,使用尋光小車對12個同樣形狀、同樣顏色、同樣亮度、不同位置的信標燈進行熄滅作業。
Arduino 平臺特點主要有:①成本廉價。②跨平臺性。③圖形化編程方式。④開源的硬件及軟件[2],而且Arduino 只需要了解各個端口的作用和使用方法即可,不需要了解它的硬件結構設計,也不需要自己編寫復雜的底層代碼,使用方面很簡單。
光電小車使用單片機作為主控模塊,控制光電小車轉動,從而控制光電小車行走與制動,還需要控制滅燈擋板的舵機的轉動,使光電小車完成滅燈的功能,同時還需要控制測距模塊,實現近距離的測距功能。并且需要使單片機與圖像處理系統建立良好的通信環境,接收處理圖像處理系統傳遞的方位信號,使光電小車實現自動追蹤功能。光電小車的大體工作框架如圖1 所示。

圖1 光電小車工作框圖
競技車比賽常用舵機一般有兩種如圖2 所示,一種是飛思卡爾小車的普通輪舵機如圖2(a)所示,一種是麥克納姆輪小車的舵機如圖2(b)所示。本系統所選用的是麥克納姆輪小車的舵機。

圖2 競技車舵機選型
相比于飛思卡爾小車的普通輪舵機,麥克納姆輪小車的舵機更加靈活,麥克納姆輪是一種全向輪,能夠使競技車進行全方位的移動,可以在行進時節省很多時間,例如:對于側方向的信標燈的追蹤,理論上可以直接橫向追蹤,無需調轉車頭;探測信標燈時,飛思卡爾小車的普通輪舵機需要后輪鎖死,前輪舵機控制方向,在通過前輪的驅動電機帶動車身轉動,尋找信標燈;而麥克納姆輪舵機可以直接原地轉彎,尋找信標燈,控制方法上更為簡單、執行上更為快速。因此本文中選用麥克納姆輪小車舵機作為競技車的舵機。
麥克納姆輪如圖3 所示是瑞典麥克納姆公司設計的一款能夠實現前后移動、左右橫移、斜前、斜后、原地旋轉的輪胎,三個或以上的麥克納姆輪之間的組合可實現平臺的全方位自由移動。它的外形結構與常見的普通輪胎有所區別,麥克納姆輪輪胎的外部輪廓是由許多傾斜成45 度角的小輥子組合而成的,雖然看上去這些小輥子之間有所間斷,但它實際的外形上又符合理論圓周的形狀,因此能夠正常旋轉。而車輪上的每個小輥子也可以自由旋轉,通過輥子的與輪子整體的相對運動,再由多個輪子之間組合實現平臺的全向運動。
在電機選擇方面有兩種不同的方案,直流有刷電機和步進電機這兩種。直流有刷電機具有良好的啟動性能和調速性能,控制電路簡單,在自動化控制設備中得到了廣泛的應用[3]且其結構簡單、應用成熟、運行平穩、調速范圍廣、響應速度快、起動扭矩大、起制動效果好、成本低、過載能力強,因此系統中選用的是直流有刷電機。

圖3 麥克納姆輪
競技車的舵機驅動模塊本文中設計了兩種驅動方案。一種是用L298 芯片作為驅動模塊,另一種是用TB6612FNG 直流電機驅動芯片作為驅動模塊。
TB6612FNG 是一種基于MOSFET 的H 橋集成電路。每個通道具有600 毫安的平均輸出電流和1.2A峰值電流,這使其輸出負載容量加倍。而且TB6612FNG 不需要外部散熱片,外圍電路搭建簡單。只需要外部電源和濾波電容就可以直接驅動電機,這有利于減小系統尺寸和設計難度。對于PWM 信號,它支持高達100KHz 的頻率,優于L298N 芯片。因此,本文中選用TB6612FNG 作為競技車的驅動模塊。
競技車主控模塊采用單片機控制,本系統所選用的是Arduino Teensy 3.2 單片機如圖4 所示作為競技車的主控模塊。

圖4 Arduino Teensy 3.2單片機
一般的Arduino 單片機在使用時都需要安裝相應的驅動,而Arduino Teensy 3.2 單片機是不用安裝驅動的,直接進行擦寫、編程、調試即可,節省了部分操作。并且相較于常用的Arduino Mega 2560 單片機,Arduino Teensy 3.2 單片機的主頻提升到了72MHz,Mega 2560僅為16MHz。而且較為重要的是Teensy 3.2 的內存提升到了64KB,Mega 2560 的內存僅為8KB,內存太小,可能會不夠用。在程序方面Teensy 3.2 與Mega 2560的庫文件兼容,編寫上同樣簡單,因此選用內存更大的Arduino Teensy,如圖5 所示是Arduino Teensy 3.2 引腳圖。

圖5 Arduino Teensy3.2引腳圖
由于這一屆光電競賽要求競技車停在LED 燈外圍10 厘米的黑線外,不允許碰撞信標燈,所以需要設計一個測距系統。測距模式通常情況下分為超聲波測距與紅外測距。本系統選用的是HC-SR04 超聲波傳感器,外部形狀如圖6 所示。

圖6 HC-SR04超聲波傳感器
HC-SR04 模塊包括超聲波發射器、接收器和控制電路。采用I/O 口TRIG 觸發測距,給至少10μs 的高電平信號,模塊自動發送8 個40KHz 的方波,并自動檢測是否有信號返回,一旦檢測到有回波信號則輸出回響信號,回響信號的脈沖寬度與所測的距離成正比[4]。超聲波探測器測距的計算公式:

式中L 為探測到的前方距離,T 為信號脈沖寬度,v 為聲速,由此公式經過計算便可得到超聲波探測器測量距離。

表1 HC-RS04 超聲波測距模塊電氣參數表
這一屆光電競賽要求不能直接碰撞信標燈,需要在信標燈外10 厘米用擋板將信標燈擋滅,并且擋板伸出車體部分不得超過15 厘米。擋板設計方面有創意加分。經過多方查詢,初步設計了三種方案。
方案一:水平方向旋轉擋板。通過一個舵機控制,在水平方向向車頭方向旋轉出一定角度,實現滅燈。這種擋板可覆蓋范圍廣,角度自由,可通過程序方面調整角度,以增大擋板覆蓋面積,十分方便。
方案二:翻轉擋板。由一個舵機控制,像風車一樣從后向車頭方向翻轉至水平,實現滅燈。這種擋板覆蓋面積比較固定,基本上是由擋板自身面積決定,難以更改。并且由于競技車車身高度有所限制,只能向后水平放置,占用競技車空間較大。
方案三:水平方向伸縮擋板。由一個舵機和傳送帶控制,水平向車頭伸縮,實現滅燈。這種擋板和翻轉擋板一樣,覆蓋范圍由擋板本身大小決定。并且在設計上,相比于前兩種擋板,這個方案的設計制作較為復雜。占用車體空間也不小。
水平伸縮擋板結構上先比方案一、方案二的擋板要復雜,并且如果信標燈坐標標定由偏差,水平伸縮擋板覆蓋面積較小,可能會發生信標燈在覆蓋面積外的情況,而無法實現滅燈功能;翻轉擋板占的位置較大,在具體實施中會影響車身上的單片機、鏡頭,所以最后決定采用水平旋轉擋板。占用面積小、結構簡單、設計制作較為方便。由于是旋轉控制,可通過程序上改變舵機旋轉角度,以增加其覆蓋面積,如圖7 所示。
擋板設計安裝在競技車車頭位置,在超聲波探測器側方,因為如果在超聲波探測器正上方,理論上想要滅燈就需要至少旋轉90 度,而安裝在競技車側方一些,就可以減小滅燈所需的旋轉角度,較少滅燈所需時間。

圖7 擋板結構設計圖
在擋板的外形設計上,本文中設計了幾款不同的能夠適應水平旋轉的擋板形狀。分別是:圓形擋板、T形擋板和扇形擋板。經過多次實驗,發現圓形擋板最為合適,T 形擋板在信標燈坐標探測有所偏差,導致競技車停在信標燈側方時,會有無法擋住信標燈的情況;而扇形擋板在其他競技車中使用較多,所以最終選用圓形擋板,如圖8 所示。

圖8 擋板形狀設計圖
擋板驅動舵機采用的是輝盛MG90 微伺服舵機(圖9)進行控制。伺服舵機具有制動迅速、旋轉慣量小、啟動力矩大等特點,且可以使得擋板轉動遮擋信標燈角度更加精確、快速。因此在擋板舵機選擇上,采用了微伺服舵機。

圖9 Mg90s微伺服舵機
競技車電路部分由競技車舵機模塊、超聲波測距模塊、擋板舵機模塊這三部分組成。
通過上一章競技車的選材,最終確定了由Arduino Teensy 3.2 單片機作為競技車的主控,分別控制這三個模塊的運行。Arduino Teensy 3.2 單片機通過PWM 控制競技車舵機模塊的運行;超聲波測距模塊與Arduino Teensy 3.2 單片機的SDA 和SCL 端口相連;擋板舵機模塊由Arduino Teensy 3.2 單片機的伺服電機控制端口控制。
根據競賽規則,小車采用采用Arduino 做驅動,OpenMV 做圖像處理。OpenMV 找到裁判燈并把中心坐標發給Arduino,Arduino 驅動電機找到裁判燈并控制舵機進行滅燈。Arduino 用了最新版本的Teensy 開發板,運行速度快。車輪為麥克納姆輪,此輪的好處就是可以讓小車不僅前后運行,還能左右平移,大大減少了小車在轉彎時的時間,如圖10 為小車尋的程序流程圖。

圖10 小車尋的程序流程圖
競技車控制方面本文中設計如下方案:開始時,給競技車通電,Arduino 單片機控制競技車開始原地旋轉,直至Arduino 單片機接收到圖像處理系統傳輸方位信號后,并對方位信號進行處理,在使競技車在短時間內加速到最大速,朝向解析出的坐標方位行駛;超聲波探測器同時開始工作,在超聲波探測到距離信標燈50厘米時,競技車開始迅速減速到設定運行速度,在超聲波探測到距離信標燈10 厘米時,競技車剎車,輪胎抱死,同時滅燈擋板復位,在競技車停穩后,滅燈擋板伸出滅燈,停留1 秒,滅燈擋板再收回,競技車再次啟動,向后退一小段距離(大約50 厘米,防止競技車做后續動作時碰撞信標燈),競技車再次原地旋轉,尋找下一個信標燈,重復以上動作,直到比賽結束。
OpenMV 程序的設計主要包括兩個方面一個是色塊的尋找,一個是數據的發送。在色塊尋找方面,通過找到色塊中心位置來判斷裁判燈的位置。在競賽場地,人眼看到裁判燈為紅色,但是OpenMV 看到的不是紅色,并且在場地也會有很多因素影響會影響色塊的尋找。在尋找裁判燈是可以采用閾值來尋找色塊再判斷出色塊中心位置x,y 的坐標。在發送數據方面,OpenMV 有兩個串口通信接口,可以同時發送x,y 坐標的值。如果采用一個串口發送坐標的話,第一速度慢了,第二需要先將數據打包再發送,在Arduino 里也需要進行解壓讀數據。在Arduino 里也有兩個串口,可以同時接收兩組數據。
通過第六屆全國大學生光電設計競賽,基于本設計的光電尋的小車在47 秒內滅燈5 盞符合競賽要求完成比賽獲得二等獎。由于比賽時間緊任務重,小車還有用很多可以改進的地方,例如圖像質量,電機扭力,車身在運動過程中顛簸導致圖像不清晰,色塊尋找算法本身存在的問題等。

圖11 競賽小車及硬件