
專案設計目的 : 機器手臂廣泛應用於各種工業4.0場景,例如建立智慧工廠,透過系統互連交換數據、整合整個生產鏈並做出分散式決策。我們希望開發一個簡單的機器手臂控制軟體(帶有使用者介面),讓使用者可以遠端控制Braccio++ Robot Arm 透過序列埠、UDP或TCP,並讓機器手臂執行一些複雜的動作序列(例如抓取箱子並將箱子轉移到帆布輸送帶上)。該程式的設計與實施旨在達成以下目的:
-
測試 : 供想要嘗試、學習和測試其 Braccio++ 機器手臂的使用者。
-
教育 : 供 ICS / IOT 課程講師展示機器手臂使用案例,或用於機器人/自動控制相關課程的實作演示/實驗/作業。
-
開發/演示 : 供想要建立更複雜場景(例如用於演示和研究的智慧工廠模型)的人員。
# Author: Yuancheng Liu
# Version: v_0.2.0
# Created: 2023/09/01
# Copyright: Copyright (c) 2023 LiuYuancheng
# License: MIT License
1. 簡介
1.1 專案概述
Braccio_Plus_Robot_Arm_Controller 提供 Arduino 韌體和基於使用者介面的控制器程式,讓使用者可以透過序列埠、UDP 或 TCP 遠端控制 Braccio ++ Robot Arm,並讓機器人執行一些複雜的動作/任務。這是一個讓機器手臂執行箱子轉移任務(抓取一個小箱子並將其放入一個大箱子)的範例:

欲觀看完整高清影片,請參考此連結:線上影片連結
1.2 背景知識介紹
-
工業 4.0 : 工業 4.0,或稱第四次工業革命,是透過開發新技術而實現的,例如網路實體系統、物聯網、雲端運算、認知運算和人工智慧。
-
Braccio ++ Robot Arm : Arduino Braccio ++ 從一開始就提供了多種擴展可能性,包括帶有 LCD 螢幕的新 Braccio Carrier、新的 RS485 伺服馬達,以及全面提升的使用體驗。詳細介紹請參考 Braccio 官方網站:https://store.arduino.cc/products/braccioplusplus
1.3 專案詳細介紹
Braccio_Plus_Robot_Arm_Controller 包含兩個部分:
Braccio ++ Arduino firmware : 運行在 Braccio 的Arduino Nano RP2040 Connect 韌體程式,用於接收來自控制器的控制請求,然後驅動 Braccio++ 伺服馬達,使機器手臂完成動作。
Braccio ++ Controller UI : 帶有圖形使用者介面 (GUI) 的控制器,供使用者透過有線連接(序列通訊)或無線連接(WIFI TCP/UDP 通訊)遠端控制機器手臂。它將為使用者提供以下功能:
-
顯示 Braccio++ 機器手臂六個可動部件(
gripper,wristRoll,wristPitch,elbow,shoulder,base)的即時電位計位置/狀態。 -
控制 6 個伺服馬達(M1 ~ M6)來移動手臂。
-
允許使用者重置 Braccio++ 機器手臂位置,並載入其手臂動作「劇本」以使手臂完成一些複雜動作。
這是 Braccio ++ 控制器使用者介面的螢幕截圖:

version v0.1.1
2. 程式設計
本節將介紹 Braccio ++ Arduino 韌體和 Braccio ++ 控制器使用者介面的詳細設計。這兩個程式的工作流程圖如下所示:

2.1 Braccio ++ Arduino firmware
Braccio ++ Arduino 韌體將被載入/燒錄到 Braccio++ 機器手臂的 Arduino 載板上的 Arduino Nano RP2040 開發板中,它包含 2 個主要部分:
-
通訊處理模組 : 對於不同的韌體(
Braccio_serial_comm.ino,Braccio_tcp_comm.ino,Braccio_udp_comm.ino),它們將提供不同的通訊協定處理器,以接收來自控制器的控制請求並回傳動作執行結果/狀態。 -
使用者請求處理模組 : 根據控制器發送的請求,韌體主程式將呼叫不同的 API 來控制機器手臂和 Arduino 載板上的其他組件(例如迷你 LCD 螢幕和 LED 燈)。
2.2 Braccio ++ Controller UI
使用者將使用 Braccio ++ 控制器使用者介面遠端控制機器手臂,該程式將在使用者電腦上以 2 個平行執行緒運行:
-
GUI 執行緒 : 用於處理使用者控制動作的使用者介面。
-
請求與回應管理器執行緒 : 將使用者的動作轉換為機器手臂控制請求命令,將請求發送給 Braccio ++ Arduino 韌體並將回傳數據/動作執行結果顯示到使用者介面。
使用者介面設計細節如下所示:

使用者的控制請求將被放入控制器的任務管理器動作佇列中,並以 FIFO 順序發送給 Braccio ++ 機器手臂,因此使用者可以在手臂移動時動態改變馬達角度,當手臂完成一個動作後,它將回傳動作完成回應,然後控制器將從佇列中取出一個新任務並發送給 Braccio ++ 機器手臂(直到動作佇列中沒有新任務為止)。如果使用者按下重置按鈕,任務佇列將立即被清除,程式將向 Braccio ++ 機器手臂發送重置命令。為了監控機器手臂位置,每個手臂部件的角度和電位計讀數將顯示在相關手臂部件的控制面板上。
使用者動作、控制器狀態和 Braccio ++ 韌體執行狀態的時序 UML 圖如下所示:

重要 : 當使用者將動作劇本載入控制器並按下「執行」按鈕時,如果任務佇列已滿或沒有足夠的空間儲存劇本中的所有動作,程式將「等待」直到佇列有足夠的空間容納劇本中的所有動作,然後將所有劇本動作排入佇列並發送給 Arduino。
2.3 序列通訊命令/訊息格式
通訊請求/回應位元組將遵循以下格式(字串 => 在「utf-8」編碼下的位元組)
| 序號 | 描述 | 來源 | 目的 | 格式 | 範例訊息 |
|---|---|---|---|---|---|
| 1 | 獲取所有電位計數據 | Controller | Arduino | POS |
POS |
| 2 | 回覆所有電位計讀數 | Arduino | Controller | POS: |
POS:157.5;157.5;157.5;157.5;157.5;90;117422.00 |
| 3 | 將伺服馬達移動到特定角度 | Controller | Arduino | MOV |
MOVgrip120.5 |
| 4 | 伺服馬達轉動完成 | Arduino | Controller | MOV |
MOVgripDone |
| 5 | 重置機器手臂 | Controller | Arduino | RST |
RST |
| 6 | 執行錯誤或命令錯誤 | Arduino | Controller | error/ notSupportAct |
error/ notSupportAct |
所有馬達 ID 鍵均為 4 個字元的字串,其映射關係如下所示:
gripper = grip
wristRoll = wrtR
wristPitch = wrtP
elbow = elbw
shoulder = shld
base = base
3. 程式設定
使用者在使用程式前需要完成程式/環境設定部分,例如組裝機器手臂、安裝程式所需的函式庫和程式編輯 IDE。
組裝 Braccio++ 機器手臂
請依照以下連結組裝 Braccio++ 機器手臂,並使用 micro USB 線將 Arduino Nano 連接到電腦。
https://docs.arduino.cc/retired/getting-started-guides/Braccio
如果您使用 Windows 作業系統,請選擇「裝置管理員」=>「COM 埠」,記錄 COM 埠號碼,然後將序列通訊頻寬設定為9600。
3.2 設定 Braccio ++ Arduino Firmware
開發/執行環境 : C++
額外所需的函式庫/軟體:Arduino IDE 2.2.1
所需硬體:
程式檔案列表:
| 程式檔案 | 執行環境 | 描述 |
|---|---|---|
src\Braccio_src\Braccio_serial_comm.ino |
C++ | Braccio ++ Arduino 韌體,提供序列通訊埠 [有線連接] 通訊。 |
src\Braccio_src\Braccio_tcp_comm.ino |
C++ | Braccio ++ Arduino 韌體,提供網路 TCP [無線連接] 通訊。(開發中) |
src\Braccio_src\Braccio_tcp_comm.ino |
C++ | Braccio ++ Arduino 韌體,提供網路 UDP [無線連接] 通訊。(開發中) |
3.3 設定 Braccio ++ Controller UI
開發/執行環境 : python 3.7.4+
額外所需的函式庫/軟體:
-
序列埠通訊函式庫:pySerial
所需硬體:micro USB 線,用於連接 Arduino
程式檔案列表:
| 程式檔案 | 執行環境 | 描述 |
|---|---|---|
src\Controllers\BraccioController.py |
python | 主控制器使用者介面框架。 |
src\Controllers\BraccioControllerPnl.py |
python | 此模組將為控制器提供馬達滑塊和電位計讀數顯示面板。 |
src\Controllers\BraccioCtrlGlobal.py |
python | 此模組用作本地設定檔,用於設定將在其他模組中使用的常數和全域參數。 |
src\Controllers\BraccioCtrlManger.py |
python | 此模組是通訊和數據管理器,用於連接 Arduino 以發送控制請求並獲取電位計數據。 |
src\Controllers\serialCom.py |
python | 此模組將繼承 Python 的 serial 模組,並具有自動序列埠搜尋和連接功能。 |
src\Controllers\Scenario\* |
json | 任務劇本儲存資料夾。 |
4. 程式使用
完成程式設定部分後,您可以按照以下步驟開始使用 Braccio++ 機器手臂:
4.1 載入 Braccio ++ Arduino Firmware
如果您是第一次使用 Braccio ++ 機器手臂,您需要將韌體程式上傳/燒錄到 Arduino 中。打開 Arduino IDE,點擊函式庫圖示,然後搜尋關鍵字「Braccio ++」並安裝 Braccio ++ API 函式庫(目前我們強烈建議您使用 web-IDE,這樣您就不需要解決函式庫版本問題):

然後打開檔案Braccio_serial_comm.ino(檔案 => 開啟 => 選擇 .ino 檔案),點擊編譯按鈕。等待片刻,編譯完成後,按下「上傳 (->)」按鈕將編譯好的韌體傳輸到 Arduino:

運行機器手臂控制器程式
完成韌體載入並將手臂連接到您的電腦後,打開「Controllers」資料夾並使用以下命令運行控制器使用者介面程式:
python BraccioController.py
連接到 Braccio ++ Arduino
在使用者介面頂部的通訊選擇下拉選單中,選擇連接類型:

當控制器成功連接到 Braccio ++ Arduino 後,連接指示器將從灰色變為綠色,並且所有電位計讀數和馬達位置將顯示在使用者介面上:

要使特定馬達轉動到某個角度/位置,請拖動相關馬達控制器的滑塊,當您釋放滑塊時,角度/位置移動請求將發送給機器手臂:

然後您會看到 Braccio ++ 機器手臂將開始移動。(詳細資訊請查看影片,連結在線上影片連結)
4.4 讓機器手臂執行複雜動作
我們還提供功能,讓使用者設定/編輯「劇本」,使手臂執行一些複雜動作,例如抓取一個小箱子並將其放入另一個大箱子。
您可以參考 Scenarios 資料夾中的揮手範例,所有劇本都是 JSON 格式。使用者可以建立自己的劇本檔案,並按照以下格式添加動作:
{
"act": "MOV",
"key": "grip",
"val": "220"
},
-
目前一個劇本支援使用者設定最多 50 個動作。
使用者完成劇本編輯後,在使用者介面中選擇「載入動作情境」按鈕,將會彈出一個劇本選擇對話框(您的新劇本將顯示在列表中):

選擇劇本,然後按下「確定」按鈕。然後您會看到您的劇本將顯示在「當前情境:xxx.json」中,當您按下「執行情境」按鈕時,您的劇本將由機器手臂執行。

如果您編輯劇本檔案(例如添加更多動作),您不需要重新啟動控制器或相關劇本,只需再次按下「執行情境」按鈕,您新添加的動作將由機器手臂執行。
如果您想將機器手臂變更到初始位置,請按下「重置位置」按鈕。
問題與解決方案
請參考doc/ProblemAndSolution.md
專案原始碼與設定
欲查看原始碼,請參考連結:
https://github.com/LiuYuancheng/Braccio_plus_robot_arm_control
授權類型:
MIT License
Thanks for spending time to check the article detail, if you have any question and suggestion or find any program bug, please feel free to message me. Many thanks if you can give some comments and share any of the improvement advice so we can make our work better ~
Last edit by LiuYuancheng([email protected]) at 05/11/2023, if you have any problem, please send me a message.
No comment for this article.