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