這篇文章來源于DevicePlus.com英語網站的翻譯稿。
在本系列的第三部分也就是最后一部分,我們將為機器人添加最后一個部件:遙控器。此外,我們對支腳進行了一些細微的改進,使它們能夠在任何類型的基底表面都能更加穩定。首先,我們會介紹經過細微修改的支腿機制,然后將HC-05藍牙連接到Arduino以實現無線控制。最后,我們將編寫一個Processing應用程序,這樣我們就不必為ArduPod的每次移動使用書面指令了。
如果您第一次知道該項目,請先參考本項目的第一部分和第二部分,然后再進行下一步的操作:Arduino六足機器人第一部分—機械與布線 以及 Arduino六足機器人第二部分:編程。
硬件
? 第一部分獲得的六足機器人
? HC-05 藍牙模塊
? 1 kΩ 電阻和 1.8 kΩ (or 2.2 kΩ) 電阻
軟件
? Arduino IDE
? Processing 3.2.3
? GitHub – 包含最新源代碼
? Release 1.0.0 – 或者,您可以在此處下載v1.0.0的源代碼。如果GitHub上的代碼有重要的API破壞性更新,這些代碼仍然可以像本文描述的那樣運行。
工具
? 烙鐵
改善支腿
我自己制造六足機器人的時候,面臨的最大難題是支腿在光滑表面上很不穩定。通常,在支腿上添加某種防滑材料就可以很輕松地解決這個問題。但是,這個機器人的支腿與地面間的接觸面積太小了。增大支腿與地面的接觸面積對防滑效果大有幫助,同時還能改善支腿的整體穩定性。
圖1:舊的支腿(左)和新的支腿(右)
在上圖中,您可以看到支腿的底部增加了一個支撐零件。與其他零件一樣,該零件也是使用黑色ABS材料通過3D打印機制造的。在我的GitHub上可以找到其他零件的模型。
圖2:添加到支腿上的新零件。請注意底部的深綠色防滑層
現在我們可以在支腳底部添加防滑層了。我用了一塊綠色的凝膠墊。這種材料即使在非常輕的負載下也不會發生打滑。如果您無法獲取這種材料,其他選擇就非常少了(比如橡膠)。可以試試看哪種材料最適合您的機器人。然后從材料上切下六個圓圈,將這些圓圈粘在腳上,這一步就完成了!
我要做的下一個改進比支腳要復雜一些。在當前系統中,伺服只在一個地方與支腿連接。這會使結構中產生一個薄弱點,該薄弱點將會承受大部分的負載,這可能導致在某個時刻發生斷裂。在圖3中,您可以看到當前的附著系統和旁邊新的附著系統。
圖3:舊的附著系統(左)和新的附著系統(右)
我們注意到所添加的新零件使伺服可以在兩個位置進行連接:軸上(之前的連接點)和伺服的相對側。將帶有旋鈕的小墊子粘貼到伺服上可以為伺服提供額外的支撐。現在,伺服連接在兩個位置上,負載分配在這兩點之間。這樣就可以進行更好的運動控制。
無線 Arduino
現在我們已經解決了支腿的問題,可以來連接HC-05藍牙模塊了,通過該模塊可以對機器人進行無線控制。由于所有的控件都由Arduino來操控,我們的主要任務是向其發送指令。
與Arduino之間進行無線通信的方法主要有以下幾種:
1.RF 模塊 – 這是最基本的(也是最便宜的)無線通信方式。通常,它們在單個無線電頻帶(433, 868 或915 MHz)中運行,并且需要在用戶端進行一些設置。RF模塊的主要優點是通信距離遠(可達數百米)和功耗相對較低。
2.LoRa – LoRa模塊類似于上述RF模塊,但使用了特殊的調制方式,使其在相同功耗的前提下可以實現更大范圍的通信(可達幾千米)。當然,代價是傳輸速度極慢,最大傳輸速度僅為每秒幾百位。
3.WiFi – WiFi 模塊是使Arduino可以連接到網絡的快速簡便的方法,但是范圍通常相當有限。而且,該模塊的功耗會很高。
4.GSM – 這是使您的手機可以正常工作的技術。GSM模塊相對于其他選項具有很大的優勢:只要有信號就可以實現通信,即使Arduino和目標PC相距數百公里。GSM的最大缺點是它需要大量電源—在某些情況下,電流消耗可能會上升到幾安培,這時僅使用電池就很難完成供電了。
5.ZigBee 技術 – XBee模塊通常比此處提到的其他模塊要貴,但是它們很容易與Arduino交互。這些模塊是作為藍牙的替代產品而開發的,通常來說通信距離可達75米。
6.藍牙 – 這就是我在本項目中最后決定使用的模塊。藍牙非常易于使用,在本項目中,范圍有限并不是什么大問題:我們沒有打算讓ArduPod去跑到距離計算機幾十米以外的地方進行一次大型探險。并且,大多數智能手機都具有藍牙功能,如果您打算編寫一個智能手機應用程序,那么通過該模塊就可以輕松完成。
因此,我們將在該項目中使用藍牙模塊。我使用HC-05藍牙模塊,主要是因為它是最便宜、最常見的模塊。由于該模塊的作用就像一個串行COM端口,因此HC-05與Arduino的連接非常容易,如下面的Fritzing示意圖所示:
圖4:HC-05藍牙模塊和Arduino Mega的接線圖
圖5:將HC-05藍牙模塊連接到Arduino Mega
該模塊由Arduino供電。HC-05的TX引腳直接連接到Arduino上的RX1引腳。但是,因為HC-05的邏輯電平為3.3V,而Arduino在5V下運行,所以HC-05的RX引腳上必須有一個簡易分壓器來降低電壓。R1的值應為1 kΩ,R2的值可以為1.8 kΩ或2.2 kΩ。我使用2.2 kΩ的電阻,因為找不到阻值為1.8 kΩ的電阻,但是對于該模塊,使用兩種電阻的任何一個都可以正常工作。
目前,Arduino還不知道它正在通過藍牙模塊進行通信。從Arduino的角度來說,這跟通過電纜連接完全相同。這就是為什么我們不需要在Arduino上進行任何設置,因為該模塊自行處理所有事情—至少在最常見的情形下是這樣。
下一步是設置HC-05藍牙模塊。我使用的PC沒有內置的藍牙接口,因此必須使用USB藍牙適配器。
對于Windows 10,請參考以前的教程,該教程提供了有關將HC-05連接的PC的分步指南:制作自己的Arduino RFID門鎖—第二部分; 步驟1:連接藍牙。
首先,我們必須將PC與藍牙模塊配對。
? 將適配器連接到PC,并在完成驅動程序的安裝后,在“控制面板”中找到“設備和打印機”窗口。然后,打開已經連接了HC-05的Arduino。HC-05上的紅色LED燈將開始迅速閃爍。這意味著HC-05當前沒有連接到任何其他設備上。
? 在“設備和打印機”中,單擊“添加設備”,您的計算機會自動找到HC-05,單擊該圖標,當彈出“選擇配對設備”窗口時,選擇中間的選項(“輸入設備的配對代碼”)。HC-05的默認配對代碼為1234。這并不是很安全,我們可以隨時更改此代碼。不過,控制六腳機器人又需要多少安全性呢?
? 成功添加設備后,HC-05上的LED燈現在應該每兩秒鐘閃爍一次—這表示它已經連接到另一臺設備。
此時,最好驗證一下所有連接是否正確。啟動Arduino IDE并上傳以下草圖:
void setup() { Serial1.begin(9600); while(!Serial1); Serial1.println("Hello world!"); } String input; void loop() { if(Serial1.available() > 0) { input = Serial1.readString(); Serial1.println(input); } }
上傳完成后,返回“設備和打印機”窗口,找到我們之前與PC配對的HC-05模塊。右鍵單擊HC-05圖標,然后點擊“硬件”選項。在這里,您會找到Windows分配給該模塊的COM端口編號。這將是我們用于與ArduPod通信的COM端口。返回Arduino IDE,在菜單>工具>端口中選擇正確的COM端口,然后啟動串行監視器。輸入幾個字符,然后按下Enter鍵。這些字符將被發送到您剛剛指定的COM端口,并出現Arduino的響應。
到目前為止一切正常嗎?很好!現在我們已經完成了“困難”的部分,讓我們進行一些有趣的部分:在Processing中編寫圖形應用程序。
Processing
我假設正在閱讀本文的您已經對Processing的語言有基本的了解。雖然Processing的語言與Arduino語言非常相似 – setup、loop/draw這些主函數都相同—但是它們還是不同的。Arduino語言幾乎與C++相同,而Processing是基于Java語言。因此,雖然語法相似,兩者之間還是存在重大差異。下面,我會盡我所能地把我所創建的應用程序描述出來。
顯然,我們希望該應用程序具有良好的圖形用戶界面(GUI)。Processing非常著重于繪圖形狀(因此主循環函數名稱為 – draw),所以對于圖形設計人員而言使用Processing很便捷。但是,我幾乎不具有該領域的任何技能,因此我將通過使用庫來幫助我創建外觀精美的GUI。
Processing有幾種庫,可以提供不同的設計方案,但是我個人最喜歡的是controlP5庫。您可以點擊此處訪問該網站,以詳細了解該庫的更多信息。另外,該庫中幾乎包含了所有示例。您可以在網站上找到另一個有用的東西是完整版JavaDoc參考。網站上的下載版本已經有些過時,因此強烈建議您使用Processing的庫管理器。在編寫程序時我們將使用最新版的Processing,即Processing 3.2.3。該應用程序以及源代碼可在我的GitHub上找到。
現在,讓我們來看一下應用程序的實際外觀。
圖6:ArdupodRemote Processing 應用程序
好吧,控件有點多是不是?左側有一個大的灰色神秘盒子,有很多可以按下的按鈕,而右側則有點奇怪,看起來像是雷達。如您所見,我用紅色數字標記了所有部件,這是每個控件的作用:
1.串行輸出: 這是提供運行狀況信息的主要來源。串行端口上顯示的所有內容都會被寫入這里,同時還有來自應用程序本身的通知。
2.串行輸入和命令提示符:如果要直接向串行端口發送內容,可以在此處輸入并按下Enter鍵發送。這主要在調試應用程序的時候用的,但是會保留在界面上,以防什么時候您極其需要直接向機器人發送某些內容。
3.超聲波掃描儀:就我個人來說,這是所有功能中最酷的一個。當您按下“掃描”按鈕(數字7)時,超聲波傳感器將旋轉180度并在每個角度進行距離測量。距離數據被發送到應用程序,然后被可視化。
圖7:掃描輸出示例。掃描區域為狹窄的走廊。
即使沒有相機,您也可以通過該功能快速簡便地了解周圍環境。
4.手動旋轉傳感器:不言自明,通過該滑塊可以將帶有超聲波傳感器的伺服設置到特定位置。
5.距離輸出:每次進行距離測量,測量結果都會在此處顯示。
6.測量按鈕:按下該按鈕時,傳感器將進行一次距離測量并將其顯示在距離輸出區域中。
7.掃描按鈕:如上所述,按下該按鈕將開始對周圍區域進行超聲波掃描。
8.COM端口選擇:啟動應用程序后,您必須選擇適當的COM端口以用于所有的通信。所有可用的COM端口將在此處顯示。
9.連接按鈕:選擇正確的COM端口后,按此按鈕進行連接 。如果運行出現問題,相關的錯誤將會被打印到串行輸出區域,以幫助您進行修復。
10.斷開連接按鈕:當您出于任何原因需要從端口斷開連接時,就可以按下此按鈕。
11.移動控制:這是構建該應用程序的目的所在。W鍵向前移動,S鍵向后移動,A和D鍵控制左轉和右轉。就是這么簡單!可以單擊這些按鈕,或者按下相應鍵盤。單擊后,機器人將朝向對應的方向邁出一步。按住鍵盤鍵時,機器人將持續朝該方向移動,直到您松開當前按鈕或按下一個新按鈕。
您可能已經想到了,這個應用程序比我們實際所需要的復雜得多,實在無法逐條解釋所有的內容。因此,我們將僅了解代碼中最重要的以下部分:控制事件處理,串行通信和Arduino端。
控制事件處理
使用GUI編寫應用程序時,我們需要了解的第一件事是:“單擊按鈕后會發生什么?”幸運的是,controlP5庫為我們處理了大多數事宜。讓我們從以下代碼中看一個簡單場景。
import controlP5.*; ControlP5 cp5; void setup() { size(400,400); cp5 = new ControlP5(this); cp5.addButton("click me!") .setValue(0) .setColorForeground(color(215, 0, 0)) .setColorBackground(color(175, 0, 0)) .setColorActive(color(255, 0, 0)) .setPosition(100,100) .setSize(200,200) ; } public void controlEvent(ControlEvent theEvent) { if(theEvent.getController().getName().equals("click me!")) { println("Why would you trust a big red button?!"); } } void draw() {}
圖8:controlP5示例
首先,我們必須導入庫并創建controlP5類的實例。然后,在setup函數中,我們創建一個名為“click me!”的新按鈕。最后一部分是 controlEvent函數。每當任何 controlP5的元素創建事件時(在我們的示例中,是每次單擊按鈕時),都會調用該函數。然后,我們可以檢查是哪個元素導致了該事件的發生,如果是出于“click me!”按鈕,那么將會打印出一些文本。controlP5庫包含了有關解釋如何使用其所提供的控制元素的示例,所以我們將會來簡單了解一下遠程控制應用程序中實際所包含的內容。
基本事件處理與上面的示例完全相同,都是通過controlEvent函數進行處理。除此之外,還增加了兩個函數 – keyPressed 以及 keyReleased,用于處理鍵W、A、S和D的輸入,以允許使用鍵盤進行移動控制。您可能會注意到,與示例不同,在setup函數中并沒有設置任何的控制元素。所有的元素設置都被移到了第二個選項卡guiElements中,并通過setupGui函數進行調用。因此,在主選項卡ardupodRemote中的代碼很少。通常,對不同的內容設計分隔的代碼塊是一種很好的編程習慣,因為這樣更易于閱讀和理解代碼。
現在,我們對圖形和控件的工作原理有了基本的了解,可以嘗試解義那些將要通過端口傳輸的所有數據了。
串行通信和狀態碼
我們已經在兩端都設置了藍牙連接,但是還需要創建雙方都遵循的某種盡可能簡明快捷的“協議”。由于所有從串行端口傳入的數據在兩端都會被釋義為字符串數據類型,因此我創建了一個非常簡單的“數據包”結構。“輸入”數據包(Arduino發送給PC的數據包)的結構如下所示:
XYpayload
前兩個字符X 和 Y是該數據包的狀態碼,作用是讓應用程序知道有效負載中所包含信息的種類。例如,如果應用程序接收到數據包“82Starting PWM … ”,它將在串行輸出框中寫入以下內容:“[INFO] [SETUP] Starting PWM … ”。下表列出了當前已經實現的代碼:
0 | |
1 | [ECHO] |
2 | [SETUP] |
3 | [TRACE] |
4 | [SR04] |
5 | [PWM] |
6 | [ERROR] |
7 | [WARN] |
8 | [INFO] |
9 | > |
10 | [CMD] |
11 | [APP] |
請注意,在該應用程序中,代碼40用于掃描數據,代碼41用于單次的距離測量。
“輸出”數據包(應用程序發送到Arduino的數據包)的結構更簡單一些:
Xpayload
像之前一樣,第一個字符X將用于確定如何處理有效負載。但是,這次我們只使用了少數的指令。
t | 將傳感器轉到有效負載中的指定位置 |
m | 測量距離 |
n | 開始掃描 |
w[s] | 向前一步 |
a[s] | 向左一步 |
s[s] | 向后一步 |
d[s] | 向右一步 |
Arduino 端
到目前為止,我們已經成功將藍牙連接到Arduino端和PC端,還編寫了一個很酷的GUI的應用程序,并創建了一個與Arduino通信的協議,但是仍然缺少一些東西:可能在我們發送數據的時候Arduino沒有響應。我們需要Arduino運行一個程序來定期檢查串行端口,以在出現可用數據時進行處理。讓我們來看一下之前用于驗證藍牙連接的代碼草圖:
void setup() { Serial1.begin(9600); while(!Serial1); Serial1.println("01Hello sir!"); } String input; void loop() { if(Serial1.available() > 0) { input = Serial1.readString(); switch(input.charAt(0)) { case ‘n’: //ultrasonic scan case ‘m’: //measure distance //and so on... } } }
一旦將數據設置為input中的變量,我們就可以使用它來進行所有操作了。例如,如果要查看剛剛到達的指令類型,我們可以使用input.charAt(0)。此內置函數將返回字符串輸入的第一個字符,該字符將與上表中的指令之一相對應。
請注意,通常,每次要將新的草圖上傳到Arduino時,都必須斷開HC-05模塊的連接,但是由于我們使用的是Arduino Mega,就有了四個單獨的硬件串行端口!因此,我們只需要將藍牙連接到剩余的端口之一就可以同時進行這些操作了。
需要記住的另外一件事是,與使用USB的連接不同,通過藍牙將Arduino連接到PC不會經常重置Arduino。為了正確啟動,您必須手動按下Arduino的重置按鈕!
結論
六足機器人是一個相當復雜的項目。與往常一樣,該項目還有很大的提升空間。目前,唯一板載的傳感器是超聲波測距儀,但是由于我們使用的Arduino Mega還有很多閑置處理能力,我們可以添加其他傳感器以獲取更高級的功能。
對,您已經通過ArduPod的上一篇教程實現了!本教程分為三部分來盡可能全面地講述所有內容。如果您有任何疑問或者改進的建議,請隨時在我的GitHub上與我分享您的想法。您可以前往“Issues”區域創建一個新的問題。如果您已經進入到我的頁面中并且喜歡該項目,可以留下一顆星。當然,如果您打算構建自己的ArduPod,請一定要與世界分享您的創造!
Jan Gromes
Jan目前就讀于布爾諾理工大學電氣工程專業,擁有多年Arduino和其他微控制器專業經驗,尤其對機器人系統的機械設計感興趣。
審核編輯黃宇
-
傳感器
+關注
關注
2552文章
51217瀏覽量
754606 -
機器人
+關注
關注
211文章
28501瀏覽量
207473 -
Arduino
+關注
關注
188文章
6472瀏覽量
187320
發布評論請先 登錄
相關推薦
評論