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