Arduino探索漫遊車3—程式設計

ardurover

歡迎回到ArduRover系列!在第一部分第二部分中,我們已經構建了一個Arduino六輪驅動漫遊車。在最後一部分內容中,我們將致力於編寫一個用於機器人控制的程式。在第二部分中,我們已經介紹了一些代碼,但是那些代碼僅僅是用於控制馬達運行的。這一次,我們希望能夠得到所有感測器的資料,並且能夠透過使用Android手機來實現實際遠端操控!

硬體

軟體

  • Arduino IDE 1.8.1
  • Android Studio 3.0
  • Arduino 程式館:
  • Arduino 設計圖 – GitHub
  • Android 應用程式 – GitHub

 

對接線的修正

在本系列的上一部分裡,除了零件的製作,我還介紹了邏輯電路(所有感測器和模組)的接線。那時,我只測試了馬達,因為VNH5019驅動器是其中唯一我沒使用過的子系統,當然,我使用的代碼也只能用來控制它們。由於馬達運行得很好,我就以為直接把其他所有函數(例如控制感測器、相機和伺服器的代碼)添加上去是沒有問題的。所以您可以想像出當我看到所有馬達在添加了那些函數後馬上就停止運行時,我有多麼驚訝。

當類似這種問題發生的時候,我們必須返回上一步,回顧一下一切運行正常時的情況。我更改了代碼,這很簡單,只需要上傳一個不同的Arduino設計圖就可以了,然後查看一下問題是出在硬體還是軟體上。果然,馬達在之前的代碼下恢復了運行。透過對新代碼進行謹慎的添加和刪除,我發現Servo程式館在某種程度上導致了該錯誤的發生。在調用servo.attach()函數後,馬達就會停止運轉。這似乎很奇怪,直到我意識到了訊號傳輸的問題:使用Servo程式館的時候,馬達控制部分好像完全沒有訊號輸出。

VNH5019允許您透過使用脈衝寬度調製(PWM)來控制馬達轉速。伺服器也使用PWM來將小型馬達設定在某一位置並保持不變。事實證明,在Arduino Mega上,PWM控制具有一些沒有在官方檔中提及的特點。起初,我的伺服器PWM輸入端連接到Arduino Mega的引腳8和9上,馬達PWM連接到引腳44和46。根據Arduino官方檔,這些引腳都是支援PWM的。但是,這些檔沒有提及的是,當您透過引腳2和13使用Servo程式館時,會失去引腳44和46的PWM功能支援。這是因為Servo程式館使用了一個ATmega2560計時器,該計時器同樣用於控制引腳44到46上的PWM,那麼自然而然,計時器一次只能執行一個任務。

考慮到這一點,我修正了接線原理圖。如下圖所示,用於馬達的PWM移至引腳5和6。經過這次更改,伺服器和馬達就可以同時工作了。

ardurover

圖1:修正後的邏輯端原理圖

 

Arduino程式結構

在編寫控制如此複雜的系統的程式時,最好把所有需要考慮的因素都寫下來。對於ArduRover,需要考慮的有以下內容:

  • 馬達控制 – 這可能是最重要的部分,因為顯然我們需要控制機器人的行進方向。
  • 感測器控制 – 我們需要從連接在機器人上的所有感測器中獲取一些資料。
  • 相機控制 – 這部分包括拍攝、傳輸圖片,以及透過伺服器支架來轉動相機。
  • 資料記錄 – 我們有一個板載SD卡,可以透過它來記錄從感測器和GPS獲取的資訊。

一個潛在的問題是回傳圖像資料。正如我們在Arduino課程JPEG解碼中所講的那樣,傳輸圖像資料會花費很長時間。如果機器人突然決定一次把整個圖像都傳送過去,那麼它將會在相當長的一段時間內處於無響應狀態。因此,在每次運行主迴圈時,我們都需要決定是否傳輸圖像中的某些部分,或者是否對上次迴圈執行期間傳達回來的最終指令作出響應。

以上述要求為要領,我總結出了以下程式邏輯電路方塊圖。

ardurover

圖2:Arduino程式邏輯電路方塊圖

在主迴圈函數的每次反覆運算過程中,Arduino會首先更新所有當前的感測器資料,並把它們記錄到SD卡中,包括ROHM感測器、GPS以及流經每個馬達驅動器的電流。然後,會檢查LoRa模組是否接收到了新的套裝程式。如果接收到了,那麼套裝程式中的指令將會被執行,作出的響應將會再次透過LoRa模組進行傳輸。如果沒有接收到新的指令,程式會檢查是否有圖片需要被傳輸,如果有的話,就會傳輸一個圖片資料包,如果沒有需要傳輸的圖片,這一步會被跳過。最後,程式回到迴圈的開始,然後重複該過程。

我們必須意識到,使用這個邏輯結構,處理新的指令會比JPEG傳輸擁有更高的優先順序。這樣的話,我們就可以巧妙地避免上文中提到的機器人無響應的問題。指令與響應之間的最長延遲時間只會是傳輸一個圖像資料包的時間。

既然已經有了程式邏輯結構的總體思路,那麼我們需要關注另一個關鍵的步驟了:這些指令將會是什麼樣子?