486
技術社區[雲棲]
《仿人機器人原理與實戰》一1.3 反射弧實驗入門
本節書摘來異步社區《仿人機器人原理與實戰》一書中的第1章 ,第1.3節,作者布萊恩·伯傑倫(Bryan Bergeron) 托馬斯B. 塔爾博特(Thomas B. Talbot) 王偉 魏洪興 劉斐 譯, 更多章節內容可以訪問雲棲社區“異步社區”公眾號查看。
1.3 反射弧實驗入門
現在到了你卷起衣袖運用理論的時間了,我們從一個簡單的反射弧模擬器開始。該模擬器可以模仿之前詳述的簡單反射,但是兩者之間有一些區別:在脊髓中的突觸被隱藏了,而紡錘體纖維中的牽引傳感器首先由瞬時接觸開關代替,再由力傳感器代替。事實上,你們會發現將模擬裝置簡單化的設計方法可以應用在任何一個仿人機器人的設計上。
1.3.1 器材清單
為了構建在本章的第一部分提到的一係列簡單反射弧,我們需要以下器材:
- 模擬量舵機(2個)
- 瞬時接觸開關(2個)
- 10kΩ電位器(2個)
- Arduino Uno微控製器
- 5V直流電源
- 10kΩ,1/4W電阻
- 力敏電阻(1個)
- 跳線或電線
現成的擴展板(可選)
這些產品的外形和品牌無關緊要,任何開關、舵機、電位器和Arduino兼容的微控製器都可以。例如,我們可以用一個微型按鈕作為瞬時接觸開關,也可以用兩根裸電線、簧片開關和觸發磁鐵,或者光敏晶體管和發光二極管(LED)觸發器進行替換。對於電位器,你可以用音量調節電位器代替,因為它更類似於關節在肌肉收縮下的運動。但與舵機連接使用時,音量調節電位器的反應太過靈敏,所以我們一般選用線性電位器。
如果你發現缺少一些零件,可以參考我們實驗裝置中的零件進行訂購,如圖1-5所示。在接線端我們安裝了一對模擬量舵機、一對瞬時接觸開關、一對10kΩ分壓器和一個安裝在端子上的力敏電阻(稍後詳述)。Arduino Uno微控製器隱藏在Grove底座擴展板下。
我們通常對於不需要焊接的現成擴展板情有獨鍾,因為安裝和拆卸都輕而易舉。但正如圖1-5所示,Grove擴展板有一個缺點:它沒有麵包板區,沒有為附加組件留下足夠的安裝空間。另一個選擇是利用Sparkfun和Maker Shed生產的螺紋擴展板,它為每一個Arduino接口留出螺絲端子接頭和中央成型區,但是又缺少外部零件的插口。如果你不使用擴展板,那麼至少要選擇兩邊插頭的跨接線,這樣才能把舵機和微控製器連在一起。而Sparkfun 和Maker Shed也生產大量色彩鮮豔、容易辨別的跨接線,包括兩邊插頭、一邊插頭一邊內孔、兩邊內孔三種配置。
雖然我們已經看到過一些用Arduino上的5V電源驅動舵機的例子,但這不是好主意。我們要麼為舵機配備獨立的5V電源,要麼為整個係統提供外部的5V電源。如果不為舵機配備獨立電源,那麼你可能會燒壞Arduino上的5V穩壓器。考慮到Arduino Uno的每一引腳額定電流約40mA,而以HiTec HS-422為例,在無負荷的狀態下,驅動一個模擬量舵機需要140mA。如果舵機處於重載狀態,電流就會更大。
此外,我們標準的實驗裝置是安裝在刨花板上的一對Arduino和公用電源。其中一個Arduino用於工作,另外一個用來測試代碼和硬件。隻有這樣,我們才能把一個Arduino維持在最新版本,用於跟進項目,而另一個用於解決突發問題。配備兩個微控製器不是必須選擇,但我們發現這樣做確實能節約很多時間。
1.3.2 電路
電路圖如圖1-6所示,模擬了一個簡單的反射弧。其中,一套模擬量舵機充當肌肉,瞬時接觸開關模擬肌肉紡錘體纖維,而電位器可以設置“肌肉”位置。Arduino Uno用於模擬紡錘體纖維或伸縮感受器的信號,以及肌肉的運動信號。
10kΩ線性電位器P1起分壓作用,現將觸頭用導線連接至輸入端A0。當開關接通時,瞬時接觸開關S1將數字輸入引腳D7與地接通。舵機1從引腳P9上接收脈寬調製信號。注意,5V直流電源直接與模擬量舵機相連,同時也與板上的5V穩壓器接通。
1.3.3 構造
構建這個模型十分簡單。你可以把舵機放在塑料或鋁製支架上,或者簡單地擺在桌麵上。如果你配備了支架,那麼可以選擇把開關安裝到模擬量舵機的臂上。還有一些零件我們沒有用到,別擔心,在接下來的實驗中將一一用到。
1.3.4 編程
編寫一個簡單反射弧模擬器的Arduino程序需要調用舵機庫,如清單1-1所示。舵機庫隱藏了生成PWM信號的複雜過程, PWM信號不僅可以控製模擬舵機的位置,而且可以操控其運動速度。
清單1-1是對一個舵機例程的改寫,這個例程包含在Arduino 1.0編程環境中。關鍵不同之處在於,當按下S1按鈕時,保存舵機的當前位置,然後反射流程開始運行。反射完成之後,舵機回到對應電位器P1值的位置。
我們從頭開始看一下這段代碼,首先要調用舵機庫,然後定義Arduino中使用的常數和引腳。本例中,係統輸入端A0能讀取電位器旋鈕P1的位置,而通過數字引腳D7連接開關接口S1。D9連接舵機引腳servo1pin,PWM信號輸出接驅動舵機。
servoDelay和servoReflexDelay變量定義了舵機的響應。為了使模擬舵機產生適當的響應,你可以調整延遲變量的值。實驗顯示,表中提供的值適用於初級的HiTec和TowerPro舵機。如果舵機在不工作的狀態下抖動,你可以將延遲變量增加幾毫秒。事實上,舵機反射延遲時間servoReflexDelay比舵機延遲時間servoDelay短,否則,相對正常的舵機速度來說,反射的運動速度較慢。
在安裝過程中,首先按照舵機庫的要求,把舵機和伺服對象連接在一起。其次,把牽引按鈕引腳當作一個輸入端,該端口內部自帶上拉啟動。或者,你也可以將10kΩ、0.125W電阻與5V電源連接起來實現輸入,但這僅僅降低了編程的難度,對於外部硬件來說沒有什麼好處。
主循環函數首先從電位器的觸頭上讀出一個0~5V的電壓值。然後,map函數將A0輸入端的值轉化成0~1023個刻度,用來對應模擬量舵機的轉角範圍,一般為180°。當按下按鈕S1時,通常為高電平的D7端口接地,同時反射被觸發。
在模擬肌肉真實活動時,反射的幅度取決於舵機的初始位置。當舵機處於一個極限位置時—相當於肌肉完全收縮,反射僅剛好可以察覺。在另一極限位置時—相當於肌肉完全伸展,反射活動就會包含舵機的180°轉角的大部分區域。
在調試係統時,直接在編程部分修改無法直觀地看到舵機位置的微小變化。而Serial.println函數可以直接觀察到任何變量的瞬時變化,所以,利用這一函數我們可以盡量減少調試時間。例如:
輸出變量FSRValue的值。注意,需要打開串行監視窗口並將Serial.begin函數加入啟動程序,如
define DEBUG聲明應該出現在程序的開頭,你可以很方便地找到它,並且在調試完成後將其注釋掉而不需要編譯。同樣,如果在本例中你調用該函數的波特率為默認值9600,那麼串口監控器的波特率也應設置為9600。
1.3.5 操作
這樣的模擬器或機電能近似模擬之前所描述的牽張反射觸發時所發生的現象。模擬裝置運轉時,旋轉電位器P1可以調整、校正舵機搖臂的轉動位置,當按下開關S1時,反射立即觸發。此時,反射的作用是通過旋轉搖臂,躲避或阻擋物體的撞擊,這取決於開關的安裝位置。在反射發生後的1~2秒內,由於電位器P1的控製,舵機回到初始位置。更進一步,上載程序軟件,確認在電位器P1的不同阻值下,搖臂能在180°範圍內控製自如。接著,旋轉電位器旋鈕P1使得舵機搖臂處於中間位置,接著按下按鈕S1。如果進展順利,舵機將快速旋轉至終點,緊接著回到中間位置。
接下來,你需要解決係統中存在的問題。如果你的舵機抖動,則嚐試改變servoDelay變量的值。如果你聞到什麼東西燒焦了,大概是Arduino的穩壓器燒壞了。這是一個很好的機會,你們可以嚐試不同型號的舵機和電位器。
最後更新:2017-06-21 09:32:08