步驟1:硬件概述
汽車由以下硬件組件組成:
-RC 1/10履帶式履帶底盤
-軸向競速電子調速器(ESC)
-轉向伺服電機
-鋁底板和用于安裝其他零件的鋁角
-Arduino Mega(此項目需要一個Mega)
-Sparkfun Arduino XBee防護板
-XBee Series 1 Pro(60mW)無線模塊
-Adafruit ADXL335加速度計
-Adafruit NeoPixel搖桿
-具有云臺和紅外夜視功能的IP攝像機
-便攜式Wi-Fi路由器
-7.2V NiMH電池(用于電調和轉向的電源
-11000mAH雙USB移動電源(用于Arduino Mega,Wi-Fi路由器,IP攝像機,NeoPixel棒的電源)
A 筆記本電腦需要與汽車進行通信和控制。筆記本電腦必須具有以下內容:
-Windows 7/8
-至少2個USB端口
-Wi-Fi
-可選-以太網端口(但如果筆記本電腦沒有以太網端口,則需要訪問帶有以太網端口的計算機)
在PC端還需要以下硬件組件:
-XBox 360控制器(有線)
-XBee Series 1 Pro(60mW)無線模塊
-XBee USB Explorer
完整的零件清單是
步驟2:遙控車的選擇和物理改裝
我為該平臺選擇的RC車輛類型為 1/10比例的Electric Rock Crawler 。 RC Rock履帶為4x4,具有鎖定的差速器,(相對)較高的離地間隙和較大的懸架鉸接性,因此在越過障礙物時它們不太可能卡住。但是,它們通常不如普通RC車快(專為高扭矩而不是高速而設計)。我選擇的特定型號是HSP穿山甲,因為它很便宜。它也是Axial Racing AX10的仿制品,因此很容易找到兼容的零件:-P。
該車配備了 7.2V NiMH電池,電子速度控制器( ESC)和有刷電機。原始ESC沒有關于如何對其進行校準或對其功能進行編程的文檔。由于我打算通過Arduino控制ESC,因此我需要可以進行校準和編程的ESC。我發現Axial AE-2 ESC是最合適的替代產品,因為它們有明確的設置和配置說明(請參閱http://www.axialracing.com/blog_posts/787000000)。
要安裝所有零件后,我卸下了原來的塑料電池/ESC托盤。然后,我使用了一些鋁制角鐵和大鋁板來創建平坦的安裝表面。
各個零件都被擰到鋁板上或用電纜綁了起來。對于Arduino等電子組件,將一些塑料放在鋁板上進行絕緣。
將大多數組件安裝到汽車上后,我發現原來的懸架確實可以不能很好地應對增加的重量-汽車從原始高度掉落了約4cm。為了解決這個問題,我購買并安裝了四個超級彈簧。這些彈簧比原始彈簧要好得多(汽車僅下降0.5厘米),但仍然有些過軟-踩下油門會使汽車像下沉的船一樣晃動!
步驟3:電源和接線配置
具有兩節電池-7.2V NiMH電池和11000mAh移動電源。 NiMH電池為 ESC和轉向伺服器供電。請注意,轉向伺服系統由ESC的電池消除器電路(BEC)供電,該電路可提供穩定的5V DC輸出。同樣,驅動電機由ESC供電/控制。
移動電源為 Arduino,WiFi路由器,IP攝像機和NeoPixel搖桿提供電源。 (所有這些設備都使用5V直流電源工作)。我選擇的特定型號是Cygnett 11000mAh Charge Up Pro,因為它具有雙USB端口-一個端口可以提供最高 2A ,而另一個端口可以提供最高 1A 。它也是目前可用的最大容量的移動電源之一,因此我不必擔心在汽車電池沒電之前它會死掉。
由于移動電源只需要用兩個USB端口為四個電池供電,我制造了一些 USB電源分配器。這些可以視為USB電源雙適配器。 NeoPixel棒的USB電源分配器除USB端口外,還具有一些 0.1“母頭母頭,以允許使用剝線的22 AWG實芯線將電源連接到NeoPixel棒。 p》
此外,由于涉及兩個電池,因此連接到這些電池的設備的接地 應該,因此所有信號電壓均基于相同的參考電壓為此,我將ESC電池消除器電路(BEC)的接地引腳連接到ArduinoGND。USB電源分配器和Arduino GND之間也存在連接。此公共接地是必需的,以便轉向伺服
最后一張圖顯示了汽車上電線/電纜的完整概覽,包括所使用的Arduino Mega引腳。
第4步:軟件概述
該項目中的軟件包括一個基于PC的C#程序和一個 Arduino草圖。該程序是WinForms應用程序,具有圖形用戶界面(GUI)。 C#程序執行許多功能,并處理各種輸入和輸出。這些內容的摘要如下:
C#程序
-接收XBox 360控制器輸入
-接收鼠標/鍵盤輸入一些功能
-從IP攝像機接收視頻數據(通過http)
-從Arduino接收遙測/狀態數據(通過串行)
-將指令發送到Arduino(通過串行)
-將指令發送到IP攝像機(通過http)
-將振動指令發送到XBox 360控制器
-GUI-顯示狀態控制器,串行通信,視頻流。
Arduino素描并不像C#程序那么復雜,但是仍然可以做很多事情:
-從C#程序(通過串行)接收指令
-從加速度計模塊接收遙測數據(通過模擬輸入)
-向電子速度控制器發送控制信號
-向轉向伺服器發送控制信號
-將控制數據發送到NeoPixel控制棒(數字輸出)
-將狀態/遙測數據發送到C#程序(通過串行)
我已已附加 C#項目和下面的Arduino草圖。對于接下來的幾個步驟,我建議下載文件并保持打開狀態,以便您可以在步驟和代碼之間進行切換。沒有這些步驟,這些步驟就不是很有用,沒有這些步驟,代碼可能會有些混亂!
注意:如果項目沒有,您可能需要從源文件中手動重新創建C#項目。
第5步:軟件開發環境和實用程序
C#程序是使用Visual Studio Express 2012開發的。這是Visual Studio的免費版本,但提供了足夠的功能來開發復雜的C#應用程序。
不幸的是,在開發C#應用程序時,Microsoft不包括對自己的XBox 360控制器的本機支持。幸運的是,我不是唯一遇到此問題的人,因此有人在“ xinput” 周圍做了一個 C#包裝器(該API允許開發人員與XBox進行通信360控制器)。我使用的特定版本附在下面。可以從github 下載最新版本的包裝器: https://github.com/speps/XInputDotNet。有關詳細的安裝/配置說明,請參閱github頁或自述文件。我的指示摘要是:在C#項目中添加“ XInputDotNetPure.dll”作為參考,并將“ XInputInterface.dll”與.exe文件放在同一文件夾中。
開發了Arduino草圖使用Arduino IDE。為了同時使用NeoPixel操縱桿和兩個伺服輸出(用于轉向和油門),還需要兩個附加的庫。這些庫是Adafruit “ TicoServo” 庫和Adafruit “ NeoPixel” 庫。可以從github 下載這些庫:
https://github.com/adafruit/Adafruit_TiCoServo
https://github.com/adafruit/Adafruit_NeoPixel
每個庫中均提供了安裝說明。有關通用的 Arduino庫安裝指南,請參閱:https://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use/how-to-install-a-庫
注意:由于使用NeoPixel棒,因此無法使用標準的Arduino伺服庫。 Adafruit提供了對此不兼容的解釋:https://learn.adafruit.com/neopixels-and-servos
步驟6:C#應用程序線程和XBox 360控制器輸入
我為此項目編寫的第一部分軟件是針對XBox 360控制器的(您可能已經注意到原始的Visual Studio項目名稱已經沿用了到最后!)。您將在“ Form1.cs”文件的第一部分中找到 XBox控制器代碼。如上一步中所述,僅當配置了Xinput dotnet包裝器(即,已將“ XInputDotNetPure.dll”添加為C#項目中的引用,并且“ XInputInterface.dll”與該文件位于同一文件夾中)時,此代碼才有效。 .exe文件)。
該代碼通過重復輪詢控制器以檢索按鈕和模擬控件的狀態來工作。由于進行了輪詢,我意識到該程序需要多個線程才能正常工作。這是一個挑戰,因為在此之前我并沒有編寫過多線程應用程序。在查看了一些示例和教程之后,我決定將有一個用于圖形用戶界面(GUI)的主應用程序線程,一個用于處理XBox 360控制器的單獨線程以及其他一些用于其他用途的線程。多個線程允許所有這些事情并行運行,而在GUI中沒有任何明顯的滯后。
在Xbox控制器線程中,控制器狀態以大約50Hz的頻率輪詢,因此它始終具有最新數據。該控制器數據也會在GUI上回顯,并且按鈕的按下將以橙色突出顯示。為此,需要跨線程數據傳輸。我使用“代理” 的概念允許線程彼此“影響”。您還會注意到在多個線程中使用的許多“ shared _.。..”變量。
此代碼段還具有一個計數器,用于跟蹤控制器“框架” 即可。在我的代碼上下文中,這些框架指的是何時讀取了控制器狀態。使用計數器“ samplecount”和“ oldsamplecount”,以便正確處理長按按鈕。例如,我分配了一些數字按鈕,以便一按即可激活一項功能,而下一按則可禁用該功能。如果長按操作不正確,程序將連續打開和關閉該功能。該代碼通過將oldsamplecount的值與samplecount進行比較,可以正確地將長按操作作為單按。如果兩個變量之間的差異太小,則長按即可檢測到。
步驟7:串行通訊(第1部分)
I考慮了幾種在筆記本電腦和汽車之間發送控制數據的選項。 Wi-Fi或藍牙似乎是顯而易見的解決方案,但它們都無法提供我想要的范圍。大多數無線arduino項目似乎使用依賴串行通信的 XBee模塊,所以我決定使用串行接口。
汽車/筆記本電腦通信的工作方式如下:
1。 汽車發送一個串行字符串(具有固定結構),并帶有消息字符的開始和結束。
2。 C#程序連續輪詢筆記本電腦的串行接口。
3。當C#程序接收到包含預期的開始和結束字符的序列字符串時,將準備自己的序列字符串(具有固定結構),并將其發送到汽車。
3。 汽車接收到串行字符串,進行快速檢查(基于消息字符的結尾和消息長度),如果消息“有效”,則提取并處理信息,并等待指定的在準備和發送另一條消息之前延遲-,并且循環重復。
注意:如果在Arduino上收到的消息不被視為“有效”,則Arduino草圖將使汽車停下來
通過C#程序發送到汽車的消息的消息結構是:
500,500,F,D00,Z
此字符串的含義是:
第一個字段:油門(以500為中心)
第二個字段:轉向(以中心大約500)
第三場:慢速模式-F:快,S:慢(最大油門為半速)
第四場:前大燈
第一個字符:D :暗(熄滅),L:亮
第二個字符:亮度(0-9)
第三個字符:亮燈序列(0-9)
決賽字段:消息結尾字符(Z)
有關某些字段的更多詳細信息,將在后續步驟中提供
已發送消息的消息結構從汽車到C#程序,是:
A,500,500,F,D00,R,Z
第一個字段:消息字符的開頭(A)
第二個字段:油門(約500個中心)
第三個字段:轉向(約500個中心)
第四個字段:慢速模式-F:快,S:慢(最大油門為半速)
第五個字段:前燈
第一個字符:D:黑暗(熄滅),L:亮起
第二個字符:亮度(0-9)
第三個字符:光序列(0-9)
第六場:隆隆聲(R-隆隆聲,O-關)
最后一個字段:消息結尾字符(Z)
這些字段中的大多數只是呼應 Arduino收到的內容。這是作為串行接口的運行狀況的視覺指示器來完成的。如果接口工作正常,則C#程序中顯示的輸出和輸入字符串應該匹配。
此串行通信方法最初是使用有線串行連接(即使用Arduino USB電纜)開發的。我能夠將Arduino端的延遲設置為20ms,因此消息頻率約為50Hz。使用USB電纜,我的通訊沒有問題,并且可以在兩端獲得穩定的消息接收。波特率設置為 38400 。
步驟8:串行通信(第2部分)-無線串行
為了進行無線串行通信,我最初購買了一些XBee Series 1 1mW模塊,只是為了進行嘗試。 Arduino需要XBee防護罩,而筆記本電腦一側則需要XBee USB Explorer(或等效物)。自從我使用Arduino Mega以來,我將XBee防護罩上的相關引腳連接到了第二個硬件串行接口的Arduino Mega引腳上。
我發現使用 XCTU應用程序(請參見Sparkfun指南:https://learn.sparkfun.com/tutorials/exploring-xbees-and-xctu)。但是,我遇到了一些限制。第一個是顯而易見的-具有1mW的模塊,可用范圍非常有限,并且對于沒有丟失的消息,我最多只能到達3m!使用長USB電纜可以獲得更好的覆蓋范圍。第二個是更重要的限制,似乎是基于硬件的。我發現即使將XBees配置為38400的波特率,也無法以50Hz的頻率進行可靠的通信。我增加了延遲,因此消息速率約為25Hz,并且取得了更好的成功。在25Hz的頻率下,我可以在3m內獲得穩定的通信。我還發現,當我超出范圍時,消息將被丟棄,但是當返回范圍時將立即恢復。為了檢查串行通訊是否正常工作,我在C#程序GUI上觀看了串行輸入/輸出文本框。串行輸入框應顯示一個非常穩定的字符串,該字符串與串行輸出框匹配。如果串行輸入框開始閃爍,顯示空白或損壞的數據,則表明消息沒有通過。
這些模塊正常工作后,我訂購了一些功率更高的模塊。看到高功率的Series 1和Series 2模塊都可用,我選擇了價格稍便宜的XBee Series 2 Pro(63mW)模塊,而不是XBee Series 1 Pro(60mW)模塊。我已經讀到它們很難設置,但是可以像系列1模塊一樣在透明(AT)模式下使用。我配置了這些模塊,并讓它們以38400波特的價格相互通信(注意:一個模塊必須作為“協調器”進行刷新,另一個模塊必須作為“路由器”進行通信)。然后,我將一個安裝到Arduino防護罩中,立即遇到問題。在25Hz時,我根本無法獲得可靠的通信。為了檢查發生了什么,我通過Arduino的第一個串行端口(即USB電纜)回應了Arduino收到的消息。使用筆記本電腦上的Arduino串行監視器,我發現Series 2 XBees將消息切成兩半或將連續的消息混在一起。因此,Arduino有時會收到固定在下一個字符串前半部分的字符串的后半部分。我必須增加延遲,以使頻率降至大約13Hz,然后才能在短距離上獲得看似可靠的串行通信。較低頻率信息的缺點是,它在控制器輸入和汽車運動之間引入了更大的延遲。不幸的是,較低的頻率不能完全解決問題。在更長的距離上,串行數據損壞仍然發生,并且當回到近距離時,接口無法恢復。
因此,面對所有這些問題,我最終購買了一對 Series 1個Pro 60mW模塊。就串行接口而言,它們的工作原理與1mW Series 1模塊一樣好-在范圍內時,沒有數據損壞或奇怪的消息行為。它們的范圍也比1mW模塊好得多(如預期的那樣)。
總之,如果您在項目中使用XBees進行簡單的點對點通信,請系列2中的“遠離” XBee模塊! Series 1模塊的性能無限提高,并且沒有問題(這可能解釋了它們的受歡迎程度和更高的價格)。
(在相關說明中,澳大利亞有誰想要買一些不常用的XBee Series 2 Pro 63mW模塊?:-P)
第9步:汽車油門和轉向
汽車上的節氣門和轉向是“模擬” ,這意味著通過使用XBox控制器,汽車可以在一定的速度范圍內行駛,并在一定的轉向范圍內轉彎角。 右觸發器用于前進,左觸發器用于后退,左指桿用于轉向(這是XBox賽車游戲的標準控件)。為了將這些“模擬”輸入從XBox控制器傳輸到汽車,數據按如下方式通過程序傳播:
油門數據-C#:
1。讀取XBox Controller狀態。左右觸發值保存為浮點數
2。在兩個觸發值之間進行比較。使用較大的值,而忽略較小的值(例如,如果同時按下向前和向后,則較大的值“獲勝”)
3。將該值乘以100,然后對其進行調節,以使0速度等于值500。這意味著反向全速等于值“ 400”,向前全速等于值“ 600”。這樣做是為了避免需要使用負數,并且選擇500作為中心點是完全任意的。
4。新的油門值將轉換為字符串(3位數字)。
5。節流字符串添加到C#輸出字符串中,并在需要時發送到Arduino。
節流數據-Arduino:
1。 Arduino接收完整的字符串,然后將油門字符保存到字符數組中。
2。油門字符數組將轉換為int
3。使用“映射”功能,將油門值轉換為ESC的兼容值。 ESC接受與伺服電動機相同的控制信號,因此使用Servo型將“度”值寫入ESC引腳。已對ESC進行校準,以使0度為全速后退,而180度為全速前進。 90度是0速度。
4。該值將被寫入ESC。
在C#代碼中,您還將看到一些操縱油門的額外功能。這些都是為了改變駕駛特性,但我還沒有發現它們有用。這些功能之一涉及線性/平方/立方節氣門模式。線性模式在觸發位置和速度之間提供1:1關系。因此,將前進觸發器按下一半將導致汽車以其最大速度的一半行駛。方形模式涉及對原始值進行平方運算,因此將觸發開關按下一半會導致汽車以其最大速度的四分之一移動。這在較低速度下提供了更多的控制范圍,而在較高速度下提供了更少的控制范圍。可以使用C#程序GUI上的下拉框(使用鼠標)選擇這些節氣門模式。
另一個功能涉及通過按B上的B按鈕來啟用/禁用“慢速模式”的功能。 XBox控制器。慢速模式將汽車的最高速度限制為最大速度的一半。因此,您可以使用所有觸發器來控制較低的速度。這種模式有時有時會派上用場-非常適合在慢速下進行精確控制。
轉向非常類似于油門。數據傳輸的方式是:
轉向數據-C#:
1。讀取XBox Controller狀態。左指桿的x軸值保存為浮點數
2。該值乘以100,然后相加500。這意味著最左邊等于值“ 400”,最右邊等于值“ 600”。像油門一樣,這樣做是為了避免需要使用負數,并且選擇500作為中心點是完全任意的。
3。新的轉向值將轉換為字符串(3位數字)。
4。將操縱字符串添加到C#輸出字符串中,并在需要時發送給Arduino。
操縱數據-Arduino:
1。 Arduino接收完整的字符串,并將轉向字符保存到字符數組中。
2。轉向字符數組將轉換為int
3。使用“映射”功能,將轉向值轉換為轉向伺服器的兼容值。請注意,轉向伺服器的范圍不是0到180。在我的汽車上,左全是133度,右全是60度,中心值約為96度
4。將該值寫入轉向伺服器。
像油門一樣,可以在C#程序中將轉向配置為線性/平方/立方模式。我發現對于我的車來說,這是沒有意義的,因為轉向角的范圍相對較小。由于輪子不會轉動太遠,因此很容易在線性模式下將它們調整到正確的角度。
關于Arduino Servo庫的注意事項:
當我開發Arduino草圖時,我將標準Arduino伺服庫用于ESC和轉向伺服器。一旦介紹了NeoPixel熒光棒,就無法再使用Servo庫(請參閱https://learn.adafruit.com/neopixels-and-servos)。 TiCoServo庫在我的RC車上也能很好地工作,但是有一些限制-只能同時使用兩個伺服器,只能使用一小部分引腳(即使在Arduino Mega上也是如此),并且只能使用這些引腳中的特定對一起工作。通過反復試驗找出了最后一個。..
步驟10:IP攝像機(第1部分)-硬件
Arduino的視頻功能不足,因此我需要一個自包含的視頻解決方案。這排除了網絡攝像頭,這將需要車載計算機來處理視頻并將其轉發到便攜式計算機。而且,GoPro有點貴,模型(當我在2014年中期開始尋找時)在沒有明顯延遲(3秒)的情況下就沒有直播過。我發現可以以最小的延遲傳輸實時數字視頻的攝像機的最佳選擇是 IP攝像機。這些通常用作監控攝像機,實際上帶來了更多好處,例如紅外夜視。然后,我整理了所需/需要的功能列表:
-以太網和/或Wi-Fi接口
-能夠設置靜態IPv4地址
- MJPEG 視頻流(簡單地包含在C#程序中)
-如何通過http命令控制相機的文檔
-廣角鏡頭
-紅外截止濾光片,用于日光(色彩精度更高)
-紅外夜視
-5V直流輸入
- (可選)云臺控制
我能夠找到一個符合所有這些條件的模型。我選擇的IP攝像機是Foscam FI8910W IP攝像機。這是一個非高清IP攝像機,可以發送MJPEG視頻(最大分辨率:640 x 480)。我沒有選擇HD型號,因為它們通常使用H.264視頻,而且我也不知道如何在C#winforms應用程序中顯示H.264視頻流(是否有可能?
該IP攝像機由 5V DC(需要高達0.7A)供電,使其與USB移動電源兼容。但是,該連接器是桶形連接器,因此我制作了一條定制電纜-一端具有桶形連接器,另一端具有USB連接器。
IP攝像機同時具有Wi-Fi和以太網接口。從理論上講,我可以在筆記本電腦和IP攝像機之間建立直接的臨時Wi-Fi連接,但是我對其Wi-Fi天線的性能存有疑問。因此,我決定在車上添加一個便攜式Wi-Fi路由器。我選擇的型號是Netgear Trek PR2000。我之所以選擇此型號,是因為它很小,可以通過USB電源供電并且具有以太網端口。擁有Wi-Fi路由器還為以后的升級提供了靈活性-可以輕松添加其他基于以太網/Wi-Fi的功能。
IP攝像機配置:
唯一需要設置的是靜態IP地址。我選擇了地址192.168.1.10(子網掩碼255.255.255.0)。要設置相機,我將其插入筆記本電腦的以太網端口,然后首先確保可以自動分配IP地址以進行通信。然后,我打開一個Web瀏覽器,然后鍵入攝像機的IP地址以加載其配置頁面。然后將靜態IP地址設置為192.168.1.10。注意:這將斷開與計算機的連接-為了恢復連接,筆記本電腦的IP地址已手動更改為同一子網(例如192.168.1.11,子網掩碼255.255.255.0)。
還可以配置用戶名和密碼,但是由于僅在專用網絡上使用攝像機,因此我將這些設置保留為默認設置(user = admin,無密碼)。
Wi-Fi路由器配置:
與大多數其他消費級路由器一樣,Netgear Trek路由器通過Web瀏覽器界面進行配置,并且初始設置需要有線以太網連接。為了在汽車上使用,需要將路由器配置為使用子網192.168.1.XXX(子網掩碼255.255.255.0)。路由器還需要啟用DHCP(默認情況下處于啟用狀態),并且需要配置基本的Wi-Fi設置(SSID和密碼)。此配置只需要完成一次。
初始路由器配置非常輕松,但是不幸的是,常規啟動過程并不像我期望的那么簡單。只要路由器打開,它就不會進入運行模式,直到它檢測到連接到其“ Internet”端口的設備或有線計算機。將IP攝像機連接到黃色端口后,路由器似乎可以進入“邊緣”模式。要強制路由器完全啟動,必須斷開攝像機電纜并將其插入藍色的“ Internet”端口。幾秒鐘后,路由器將正常啟動,并且Wi-Fi將打開,從而使筆記本電腦可以進行無線連接。 IP攝像機無法在藍色端口中工作,因此必須拔下電纜,然后將其重新連接到黃色端口。盡可能地邪惡。
-
攝像頭
+關注
關注
60文章
4841瀏覽量
95695 -
遙控車
+關注
關注
9文章
81瀏覽量
23729 -
Arduino
+關注
關注
188文章
6469瀏覽量
187072 -
FPV
+關注
關注
0文章
16瀏覽量
4488
發布評論請先 登錄
相關推薦
評論