讓我們逐步開發一個控制和編程機械臂的項目,模擬工業機器人的基本功能。
第 1 步:規格
機器人有兩個基本功能:
程序:記錄三個維度的手臂位置(每個記錄是一個“步驟”)
運行:依次執行“程序”中記錄的位置。機器人將運行程序,直到使用命令“ABORT”。
主要特征:
該項目可用于控制具有 3 或 4 DOF(“自由度”)的機器人。
機器人可以在“本地”和“遠程”模式下控制(最后一個通過 Android 設備)
在程序階段,用戶可以將控制模式從“LOCAL”更改為“REMOTE”,反之亦然。
將通過彩色 LED、2 行 LED 顯示屏和聲音(蜂鳴器)向用戶提供信息。
聲音警報也可以遠程觸發。
第 2 步:項目
上一步的框圖顯示了將在此項目中使用的“材料清單”。
我選擇了 Arduino MEGA,以免擔心可用的 Arduino 端口 (I/O) 的數量。例如,UNO 可以正常工作,但應使用端口擴展方法。有幾個選項可以在 Internet 上輕松找到,例如 74138 解碼器。
用于“ remote mode”的Android應用程序是使用MIT Appinventor2工具開發的,該工具是基于Android設備的此類應用程序的強大單一平臺。
第 3 步:開發
機械臂可以根據它們擁有的“關節”或“自由度”(DOF)的數量進行分類。
“底座”或“腰部”通常可以將手臂轉動 180o 或 360o,具體取決于所使用的伺服類型(在此項目中,使用了 180o 伺服)。
“肩”,負責垂直“抬高或降低”手臂。
“肘”將使手臂“向前或向后”。
“爪”或“抓手”通過打開或關閉來“抓取東西”。
第 4 步:電路
上圖顯示了完整的電路。
伺服電機將用于驅動關節,直接連接到 Arduino。請注意,在底座上使用“步進電機”以獲得更大的扭矩和精度并不少見。舵機的正確選擇非常重要。
舵機的直流電源應與 Arduino 和其他組件分開。5 或 6V 的外部電源應該可以正常工作(檢查伺服器的數據表以驗證正確的電壓范圍)。一種常見的做法是在 VCC 和 GND 之間使用 470uF 電容器,以最大限度地減少伺服器內部直流電機產生的噪聲。確保連接所有“接地”(外部電源與 Arduino GND 引腳)。
如果伺服系統有問題并且振動很大,請在代碼的“延遲”處進行調整。重要的是,伺服系統在接收新命令之前有時間到達某個點。同樣值得檢查的是舵機是數字的還是模擬的,就好像它們在機械上相似,數字的工作頻率為 300Hz,而模擬的工作頻率為 50Hz。標準 Arduino 庫“ Servo.h”是為模擬舵機開發的,必要時可以進行修改,以便更好地使用數字舵機。
第 5 步:代碼
這個項目并不復雜,但它有很多變數。最謹慎的做法是明確定義它們并將備注留在唯一的文件中:
ArmDefine.h
該文件還應設置最小、最大和初始伺服角度。本文中包含的代碼有兩組參數,用于我在項目中測試的機械臂(當然應該只使用一組常量):
// MeArm 4-DOF
#define minGrip 15
#define minBase 0
#define minShou 60
#define minElbw 60
#define maxGrip 45
#define maxBase 170
#define maxShou 180
#define maxElbw 150
#define midGrip 30
#define midBase 87
#define midShou 138
#define midElbw 100
/* SS 3-DOF
#define minGrip 75
#define minBase 5
#define minShou 5
#define minElbw 0
#define maxGrip 125
#define maxBase 150
#define maxShou 155
#define maxElbw 0
#define midGrip 100
#define midBase 90
#define midShou 90
#define midElbw 0
*/
每種類型的手臂都有一組不同的參數,重要的是找到適合自己的。我的建議是,最初電位器(電位器)保持在其中點,PWM 輸出的映射設置為默認值:Max = 255和Min = 0(Mid = 126上面的“ #defines”)。然后,開始改變電位器(一個接一個)并在串行監視器(或 LCD)中跟蹤手臂正常工作的最小值和最大值。這些將是用于設置的最終值(將我的原始值更改為ArmDefine.h).
為了“記錄”機器人應該播放的坐標(或步數)集,我將使用數據數組:
int gripPosition[100];
int basePosition[100];
int shouPosition[100];
int elbwPosition[100];
int positionIndex = 0; // Index to be used at position array used for recorded tasks
請注意,我沒有保留“存儲”位置,并且在“機器人”程序結束時,索引回到零,機器人將等待新序列的記錄(程序丟失)。或者,您可以將這些數據陣列保存在 Arduino EEPROM 中。這樣做程序將被再次執行,甚至您可能擁有多個存儲的程序。
第 6 步:程序邏輯
主塊(“循環”)非常簡單:
檢查是否使用了執行“程序”(步驟序列)的命令。
如果是這樣,請運行它。
否則,“程序”是不完整的,仍然必須編寫新的步驟。
如果定義了“新位置”,請將其添加到程序中。
首先,檢查來自 Android 設備的到達串行緩沖區的消息。
接下來,驗證控制模式是“本地”還是“遠程”(默認為本地)。
回到開頭并再次執行步驟 1。
void loop ()
{
checkBTcmd ();
defineLocalRemote () ;
execTaskCmd = digitalRead (execTaskPin);
if (execTaskCmd == || HIGH command == "runon")
{
RunProgram () ;
}
else recArmPosition () ;
command = "";
}
函數checkBTcmd()使用來自 BT 模塊的單個字符組裝一個字符串。這個字符串被傳遞給變量“ command ”。
函數defineLocalRemote()考慮變量“ command ”檢查是否接收到將模式更改為遠程的命令,反之亦然。報警命令也在這里分析。對于程序邏輯,如果在Android設備中觸發了“Alarm”,則arm一定要進入Remote模式。
函數RunProgram()執行準備工作,打開/關閉 LED 等,特別是調用函數:ExecuteTask()。后者是包含步驟序列的執行邏輯的函數。該函數使用工具將位置數據發送到手臂的“位置索引”增加: armPosition(grip, base, Shoulder, E肘)。
最后,真正指揮舵機并編寫“步驟”的函數是recArmPosition()。根據接收到的 Android 命令,該函數將定義舵機的定位,可以通過罐子,也可以通過 Android 應用程序的“滑塊”。隨著每個位置的變化,此功能使用功能(握把、底座、肩部、肘部)將坐標發送到伺服系統。armPosition在觸發“SAVE”或“PROGRAM”命令時,會讀取電位器或滑塊的實際位置以及相應的伺服激活。在那一刻,數組的位置索引增加并存儲步驟。
為了簡化理解,所有的代碼都是基于它的特定功能。“ Setup”、“ Loop”和上面描述的函數幾乎都在文件:MJRoBot_Arm_Robot_Task_Prgm.ino 中,并可在本文下方找到。
更通用的函數如讀取 BT 命令:void checkBTcmd();聲音發生器:void beep(int pin,int freq,long ms)和去抖:boolean debounce(int pin);存檔:General_Functions.ino
一個重要的事實:由于 Arduino 基于 16Mhz 時鐘執行指令,預計控制按鈕每秒讀取數百甚至數千次,因此制作一個設置記錄步驟的“去抖動”按鈕很重要。
第四個也是最后一個文件是:Arm_Ctrl_and_Display.ino
在這個文件中是電位器的讀取函數:bool readPotenciometers() ; 讀取 Android 滑塊:bool readSliders() ; 伺服系統的放置:void armPosition (int gripp, int basee, int肩部, 肘部 int)。文件中包含的其他功能是用于 LCD 上的數據顯示、串行監視器、警報等。
第 7 步:結論
-
控制
+關注
關注
4文章
1010瀏覽量
122628 -
編程
+關注
關注
88文章
3592瀏覽量
93596 -
機械臂
+關注
關注
12文章
509瀏覽量
24493
發布評論請先 登錄
相關推薦
評論