自走車MQTT控制架構

2022/11/9 作品以完成

26界TDK以結束,本作品不再維護

# 專案檔案結構


|--PYTHON
    |--arduino
        |--bl300-0
            |--bl300-0.ino #利用i2c通訊接收取球機構與發球機構的控制指令
        |--i2cToNx
            |--i2cToNx.ino #nx與arduino uno 透過i2c通訊測試文件
        |--trace
            |--trace.ino #接收尋跡模組測量訊號,並將pid計算結果透過i2c回傳
    |--main
        |--chassis_movement
            |--MQTT_TEXT
                |--text.py # 測試mqtt的檔案
            |--chassis_movement.py #底盤控制串口輸出程式,包含校驗方法
            |--MQTT.py #負責接收底盤控制的主程式
            |--README.md
        |--Order_record #腳本回放以及決策
            |--File_operations.py #檔案操作讀取json腳本
            |--log.py    #主要訂閱以及發布的主程式
        |--pitching
            |--MQTT_Pitching.py # 接收伺服馬達控制指令
            |--PitchingSerial.py # 伺服馬達控制Modbus主程式
        |--runAll
            |--run.py # 負責啟動所有程式以及gpio讀取按鈕選擇模式
        |--sensor
            |--i2c.py # 控制取球機構與發球機構線性制動器主程式
            |--MQTT_I2C.py # 接收指令
        |--tracking_sensor
            |--i2c_01.py #發送級接收尋跡模組偏移數據
            |--MQTT_I2C_t.py #控制底盤運動進行校正與接收指令
|--Image-recognit
    |--TDK_Chars_Recognition_yolo4-tiny_vedio_sort.py #影像辨識主程式
    |--MqttUp.py 透過mqtt發送結果

# 系統設計概念

  • 將所有機構與計算程式分離以節點為單位
    • 透過mqtt伺服器交換所有節點的資料。
    • mqtt傳輸有順序性無須而外撰寫FIFO(先進先出)。
    • 程式故障可立即透過看門狗程序進行自動化重起。
  • 所有程式都是獨立個體不會發生依賴衝突問題
    • 所有程式只需要負責自己單一的工作。
    • 解決PYTHON在並行處理上不易實現的問題,最大化利用處理核心。
  • 有效即時發現錯誤源
    • 所有機構的控制程式都是獨立所以錯誤也是獨立報出
    • 可以容易發現是哪個機構出現問題
    • 問題容易聚焦
    • 且有效避免單一錯誤造成所有程序崩潰的問題

# 系統建構

  • MQTT
    • 本系統中最重要的核心
    • 本次使用EMQX進行本機安裝伺服器
      • 選用原因
        • 開源系統
        • 已經過長期測試相對穩定
        • 安裝容易
        • 完整度高
        • 免費
    • 使用本機端通訊,延遲較低
  • 底盤運動
    • 使用麥克納姆輪
      • 可輕鬆實現多方向平移等高難度動作
    • 購買現成底盤控制器
      • 具有PID閉還控制
      • 可自動完成四輪速度控制
      • 高速
      • 精準
      • 透過串口進行通訊
    • 本次因底盤控制無位置控制功能,只能使用積分來計算位置
    • 缺點:時間如發生誤差,就容易發生偏移。
    • 避震器
      • 能夠解決高速運動急停打滑的問題
      • 可以緩衝取球掉落衝擊
      • 防止車身因地面不平而造成輪子無法完整貼合路面,定位失準等問題。
  • 車架
    • 使用2020鋁擠型
      • 鋁為目前最廣泛使用,價格便宜的結構材料
      • 擠出成型能夠進一步增強材料結構
      • 公制規格容易購買相關連接件
      • 實現高強度、輕量化、易修復等目的
  • 取球機構
    • 使用拱門形框架
    • 利用3D列印製機構
      • 材料使用petg,有更高的強度與韌性
      • 使用大面積的中置皮帶輪結構提供減速比的同時還能防止大扭矩造成斷裂
    • 使用ARDUINO UNO控制馬達驅動器
      • 馬達使用BLDC搭配30倍減速機驅動取球機構。
      • MCU會使用外部中斷計算BLDC馬達控制器回傳pulse訊號計算取球機構目前的位置。
      • 因為控制器的pulse訊號無相位差只有單方向,只能透過程式手動將方向反轉,只能實現半閉環控制。
      • MCU內部使用EEPROM紀錄參數,可設定抬高位置以及速度
      • 實現透過i2c通訊直接修改取球機構之經驗參數
        • 籃球重量較輕需要慢慢取才能防止滑落到地面
        • 保齡球重量較重需要較高的扭矩,故速度須調整更高
        • 以上需要透過python依照時機動態修改
  • 發射角度控制機構
    • 透過線性制動器驅動
    • 改變發射台之角度
    • 透過arduino控制
      • 與取球機構是同一顆MCU
      • 透過H橋對線性制動器進行控制
      • H橋是透過兩顆具有常開/長閉腳位的繼電器組合而成
      • 為防止錯誤的接線以及大電流白金結合時對線圈的感應電壓干擾MCU的運作,H橋電路使用12V直流繼電器加上光偶進行隔離控制,MCU可直接透過5V 20mA左右控制26V的直流電輸出控制馬達正反轉。
  • 發球機構
    • 透過歐規V形鋁擠型和滑輪組合而成的滑軌機構
    • 馬達使用200W的伺服馬達驅動
    • 驅動器透過串口與主控電腦通訊
    • 通訊有自動重起的能力
    • 使用尼龍繩纏繞的方式進行驅動,雖然會產生一定量的偏移但能有效解決皮帶角度過小與無法拉伸的問題。
    • 為追求輕量化將籃球與保齡球發球機構一體化設計
  • 腳本回放節點
    • 本次採用讀檔的方式進行回放
      • 系動自動讀取JSON檔案
      • 內容包含系統物件名稱、對應送入的資料、執行等待的時間
      • 使用檔案形式進行回放,能夠有效防止後續的路徑修正破壞到程式架構,且增加易讀性
    • 搭配MQTT通訊的特性可直接指定對應的主題下達指令
      • 其中執行到尋跡校正時可以暫時,將底盤控制權轉交至尋跡程式

# 整體控制流程

  1. 開機
  2. 作業系統自動啟動MQTT服務
  3. 作業系統自動啟動PYTHON的看門狗程式
  4. 確認所有節點都以啟動
  5. 切換指示燈號
  6. 等待使用者按下啟動
  7. 判斷模式開關狀態
  8. 依照對應模式讀取不同腳本,做出重置區啟動等應變
  9. 發送指令開始播放腳本
  10. 如中間按下重置按鈕看門狗程式會自動Kill所有程式並重起