1。 OWI機器人手臂邊緣
2。 Arduino紅板
3。電機護罩(用于控制機器人的電機)
4。公針頭(用于堆疊Arduino上方的電機屏蔽)
5。很少有跳線
6。 5V-12V外部電源(理想情況下為9V)
7。一盆水
8。油畫
9。紙張(吸收圖案)
10。 BitVoicer軟件(僅適用于Windows)
步驟1:組裝OWI機械臂
OWI機械臂已售出作為單獨的組件。我們必須組裝不同的部分。
完全組裝好手臂之后,我們得到了上面完成的輸出。
可以看出,它有一個可以握筆的夾子,或者在我們的情況下是一個油漆瓶,當夾具盡可能閉合時,可以擠壓。
要運行手臂電機,需要4‘D’電池。
第2步:在Arduino上堆疊電機護罩
OWI機械臂有五個自由度,因此有5個直流電機。其中1個電機負責夾具的打開和關閉,2個電機用于左右移動,另外2個電機用于上下移動。 Arduino只能處理1個電機,也無法完全為電機供電。為了使兩個或更多電機同時運動,我們使用電機屏蔽。
電機屏蔽層使用公針頭堆疊在Arduino上方。為了獲得更好的連接,引腳接頭的一側焊接到電機屏蔽層上的相應引腳。引腳接頭的另一端插入Arduino板的數字引腳。 此外,電機屏蔽使用外部電源單獨供電。 Arduino由USB或槍管插孔供電。
電機屏蔽可以一次控制4個電機。由于我們不希望所有5臺電機因任何原因同時運行,我們在這里不會遇到任何問題。
移動電機的示例代碼如下所示:
#include
#include Adafruit_DCMotor *myMotor4 = AFMS.getMotor(4); myMotor4-》setSpeed(150);
myMotor4-》run(FORWARD);
delay(3000);
myMotor4-》setSpeed(0);
delay(300);
步驟3:連接電機護罩和機械臂
將機器人的電機連接到電機護罩。我們需要這種跳線。
在電機護罩上,有4個插槽(M1,M2,M3,M4)用于連接4個電機。對于這個項目,由于我們只需要有限的運動,我們排除了兩個有助于上下移動的電機中的一個。
步驟4:編碼
我們的代碼執行以下功能:
機器人具有固定的起始位置。它從那里移動,從支架(它旁邊)抓住一瓶油漆,打開抓手,抓住瓶子并收緊瓶子的把手。
從這里開始,它移動到水桶的位置,就在抓手的正下方,移動到水池的最右端,擠壓瓶子一次,移動到中心,擠壓,移動到最左邊的位置,然后再滴一滴油漆。
然后它回到初始位置
接下來又回來再采取另一種顏色的顏色
再次執行(2),但這次只是下降了2滴油漆在不同于先前油漆掉落的位置。
/*參考文獻:Adafruit motor屏蔽直流電機示例稱為MotorTest
BitVoicer用于切換LED的軟件示例程序。我們使用此示例中的對象僅用于實例化*/
#include
#include
#include“ utility/Adafruit_PWMServoDriver.h“
#include
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor * myMotor1 = AFMS.getMotor(1);
Adafruit_DCMotor * myMotor2 = AFMS.getMotor(2);
Adafruit_DCMotor * myMotor3 = AFMS.getMotor (3);
Adafruit_DCMotor * myMotor4 = AFMS.getMotor(4);
BitVoicerSerial bvSerial = BitVoicerSerial();
boolean sampleTest = false;
byte dataType = 0;
void setup(){
Serial.begin(9600);
Serial.println(“Adafruit Motorshield v2 - DC Motor test!”);
AFMS.begin();
myMotor4-》 setSpeed(150);
myMotor4-》 run(FORWARD);
//打開電機
myMotor4 - 》 run(RELEASE);
myMotor2-》 setSpeed(150);
myMotor2-》 run(FORWARD);
//打開電機
myMotor2-》 run(RELEASE);
bvSerial.setAnalogReference(BV_EXTERNAL);
bvSerial.setAudioInput(0);
Serial.begin(9600);
}
void loop(){
if(sampleTest == true)
{
bvSerial.processAudio(46);
}
if(bvSerial.engineRunning)
{
bvSerial.processAudio(46);
}
}
void serialEvent()
{
dataType = bvSerial.getData();
if(dataType == BV_COMMAND)
sampleTest = bvSerial.cmdData;
if(dataType == BV_STATUS&& bvSerial.engineRunning == true)
bvSerial.startStopListening();
if(dataType == BV_STR)
func1();
}
void func1()///3滴
{
if(bvSerial.strData ==“five”)
{
myMotor4-》 run(FORWARD);//來拾取顏色
myMotor4-》 setSpeed(150);
延遲(3000);
myMotor4-》 setSpeed(0);
延遲(300);
myMotor2-》 run (后退);//打開抓手
myMotor2-》 setSpeed(150);
延遲(380);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor2-》 run (FORWARD);//關閉夾子
myMotor2-》 setSpeed(150);
延遲(600);
myMotor2-》 setSpeed(0);
延遲(400);
myMotor3-》 run (向后);//將抓手移到頂部
myMotor3-》 setSpeed(150);
延遲(600);
myMotor3-》 setSpeed(0);
延遲(300);
myMotor4-》 run (后退);
myMotor4-》 setSpeed(150);
延遲(4000);
myMotor4-》 setSpeed(0);
延遲(300);
myMotor2-》 run (FORWARD);//擠壓抓手
myMotor2-》 setSpeed(200);
延遲(300);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor2-》 run(BACKWARD);//Unqueezing
myMotor2-》 setSpeed(250);
延遲(50);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor4-》 run (前進);
myMotor4-》 setSpeed(150);
延遲(1000);
myMotor4-》 setSpeed(0);
延遲(300);
myMotor2-》 run (FORWARD);//擠壓抓手
myMotor2-》 setSpeed(150);
延遲(300);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor2-》 run (后退);//不壓縮
myMotor2-》 setSpeed(150);
延遲(50);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor4-》 run (前進);
myMotor4-》 setSpeed(150);
延遲(1000);
myMotor4-》 setSpeed(0);
延遲(300);
myMotor2-》 run (FORWARD);//擠壓抓手
myMotor2-》 setSpeed(150);
延遲(300);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor2-》 run (后退);//不壓縮
myMotor2-》 setSpeed(150);
延遲(50);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor4-》 run(FORWARD);
myMotor4-》 setSpeed(150);
延遲(2000);
myMotor4-》 setSpeed(0);
延遲(300);
myMotor3-》 run (前進);
myMotor3-》 setSpeed(150);
延遲(600);
myMotor3-》 setSpeed(0);
延遲(300);
myMotor2-》 run (后退);//打開抓手
myMotor2-》 setSpeed(150);
延遲(400);
myMotor2-》 setSpeed(0);
延遲(400);
myMotor4-》 run (后退);//打開抓手
myMotor4-》 setSpeed(150);
延遲(4000);
myMotor4-》 setSpeed(0);
延遲(400);
func2();
}
否則if(bvSerial.strData ==“two”)
{
two_drops();
}
其他
{
bvSerial.startStopListening();
bvSerial.sendToBV(“ERROR:”+ bvSerial .strData);
bvSerial.startStopListening();
}
}
void func2()///2 drop
{
myMotor4-》 run(FORWARD);//來拾取顏色
myMotor4-》 setSpeed(150);
延遲(4000);
myMotor4-》 setSpeed(0);
延遲(300);
myMotor2-》 run (后退);//打開抓手
myMotor2-》 setSpeed(150);
延遲(380);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor2-》 run (FORWARD);//關閉夾子
myMotor2-》 setSpeed(150);
延遲(600);
myMotor2-》 setSpeed(0);
延遲(400);
myMotor3-》 run (向后);//將抓手移到頂部
myMotor3-》 setSpeed(150);
延遲(600);
myMotor3-》 setSpeed(0);
延遲(300);
myMotor4-》 run (后退);
myMotor4-》 setSpeed(150);
延遲(3500);
myMotor4-》 setSpeed(0);
延遲(300);
myMotor2-》 run (FORWARD);//擠壓抓手
myMotor2-》 setSpeed(150);
延遲(300);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor2-》 run (后退);//不壓縮
myMotor2-》 setSpeed(150);
延遲(50);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor4-》 run (后退);
myMotor4-》 setSpeed(150);
延遲(1000);
myMotor4-》 setSpeed(0);
延遲(400);
myMotor4-》 run(FORWARD);
myMotor4-》 setSpeed(150);
延遲(2000);
myMotor4-》 setSpeed(0);
延遲(400);
myMotor3-》 run (向前);//將抓手移到頂部
myMotor3-》 setSpeed(150);
延遲(600);
myMotor3-》 setSpeed(0);
延遲(300);
myMotor3-》 run (向后);//將夾子移到下面
myMotor3-》 setSpeed(150);
延遲(600);
myMotor3-》 setSpeed(0);
延遲(300);
myMotor3-》 run (向前);//將抓手移到頂部
myMotor3-》 setSpeed(150);
延遲(600);
myMotor3-》 setSpeed(0);
延遲(300);
myMotor3-》 run (向后);//將夾子移到下面
myMotor3-》 setSpeed(150);
延遲(600);
myMotor3-》 setSpeed(0);
延遲(300);
myMotor3-》 run (向前);//將抓手移到頂部
myMotor3-》 setSpeed(150);
延遲(600);
myMotor3-》 setSpeed(0);
延遲(300);
myMotor3-》 run (向后);//將夾子移到下面
myMotor3-》 setSpeed(150);
延遲(600);
myMotor3-》 setSpeed(0);
延遲(300);
myMotor4-》 run(FORWARD);
myMotor4-》 setSpeed( 150);
延遲(1000);
myMotor4-》 setSpeed(0);
延遲(300);
myMotor2-》 run (FORWARD);//擠壓抓手
myMotor2-》 setSpeed(150);
延遲(300);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor2-》 run (后退);//不壓縮
myMotor2-》 setSpeed(150);
延遲(50);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor4-》 run (前進);
myMotor4-》 setSpeed(150);
延遲(2500);
myMotor4-》 setSpeed(0);
延遲(300);
myMotor3-》 run (前進);
myMotor3-》 setSpeed(150);
延遲(600);
myMotor3-》 setSpeed(0);
延遲(300);
myMotor2-》 run (后退);//打開抓手
myMotor2-》 setSpeed(150);
延遲(400);
myMotor2-》 setSpeed(0);
延遲(400);
myMotor4-》 run (后退);
myMotor4-》 setSpeed(150);
延遲(3000);
myMotor4-》 setSpeed(0);
延遲(400);
}
void two_drops()
{
myMotor4-》 run(FORWARD);//來拾取顏色
myMotor4-》 setSpeed(150);
延遲(3000);
myMotor4-》 setSpeed(0);
延遲(300);
myMotor2-》 run (后退);//打開抓手
myMotor2-》 setSpeed(150);
延遲(380);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor2-》 run (FORWARD);//關閉夾子
myMotor2-》 setSpeed(150);
延遲(600);
myMotor2-》 setSpeed(0);
延遲(400);
myMotor3-》 run (向后);//將抓手移到頂部
myMotor3-》 setSpeed(150);
延遲(600);
myMotor3-》 setSpeed(0);
延遲(300);
myMotor4-》 run (后退);
myMotor4-》 setSpeed(150);
延遲(3500);
myMotor4-》 setSpeed(0);
延遲(300);
myMotor2-》 run (FORWARD);//擠壓抓手
myMotor2-》 setSpeed(150);
延遲(300);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor2-》 run (后退);//不壓縮
myMotor2-》 setSpeed(150);
延遲(50);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor4-》 run(FORWARD);
myMotor4-》 setSpeed(150);
延遲(1500);
myMotor4-》 setSpeed(0);
延遲(300);
myMotor2-》 run (FORWARD);//擠壓抓手
myMotor2-》 setSpeed(150);
延遲(300);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor2-》 run (后退);//不壓縮
myMotor2-》 setSpeed(150);
延遲(50);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor4-》 run (前進);
myMotor4-》 setSpeed(150);
延遲(2000);
myMotor4-》 setSpeed(0);
延遲(300);
myMotor3-》 run (前進);
myMotor3-》 setSpeed(150);
延遲(600);
myMotor3-》 setSpeed(0);
延遲(300);
myMotor2-》 run (后退);//打開抓手
myMotor2-》 setSpeed(150);
延遲(400);
myMotor2-》 setSpeed(0);
延遲(400);
myMotor4-》 run (后退);
myMotor4-》 setSpeed(150);
延遲(3000);
myMotor4-》 setSpeed(0);
延遲(400);
}
void brush()
{
myMotor4-》 run(BACKWARD);
myMotor4-》 setSpeed(150);
延遲(3000);
myMotor4-》 setSpeed(0);
延遲(400);
myMotor2-》 run (后退);//打開抓手
myMotor2-》 setSpeed(150);
延遲(380);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor2-》 run (FORWARD);//關閉夾子
myMotor2-》 setSpeed(150);
延遲(600);
myMotor2-》 setSpeed(0);
延遲(400);
myMotor4-》 run (前進);
myMotor4-》 setSpeed(150);
延遲(3000);
myMotor4-》 setSpeed(0);
延遲(400);
myMotor1-》 run (后退);
myMotor1-》 setSpeed(150);
延遲(600);
myMotor1-》 setSpeed(0);
延遲(400);
myMotor4-》 run (后退);
myMotor4-》 setSpeed(150);
延遲(1000);
myMotor4-》 setSpeed(0);
延遲(400);
myMotor4-》 run (FORWARD);
myMotor4-》 setSpeed(150);
延遲(2000);
myMotor4-》 setSpeed(0);
延遲(400);
myMotor1-》 run (前進);
myMotor1-》 setSpeed(150);
延遲(600);
myMotor1-》 setSpeed(0);
延遲(400);
myMotor4-》 run (后退);
myMotor4-》 setSpeed(150);
延遲(4000);
myMotor4-》 setSpeed(0);
延遲(400);
myMotor2-》 run (后退);//打開抓手
myMotor2-》 setSpeed(150);
延遲(380);
myMotor2-》 setSpeed(0);
延遲(200);
myMotor4-》 run (前進);
myMotor4-》 setSpeed(150);
延遲(3000);
myMotor4-》 setSpeed(0);
延遲(400);
}
步驟5:與BitVoicer集成
下一步是在任何Windows機器上下載并安裝BitVoicer軟件。
在上一步中提到了將Arduino代碼與BitVoicer集成的代碼。
在此之后,我們必須在BitVoicer窗口中獲得語音字及其映射的內容。對于這個項目,演講詞是‘現代藝術’和‘簡單藝術’。
命令‘MODERN ART’,映射到一個從油漆瓶中擠出3組油漆滴的功能。因此,與“SIMPLE ART”功能相比,我們在紙上獲得了更深的彩色圖案。
命令SIMPLE ART‘,僅丟棄2組油漆滴。
步驟6:工作和最終圖像的視頻
視頻顯示機器人使用聲控命令執行大理石繪畫。大理石畫可以在圖片中看到,它顯示了兩種不同顏色的畫作。
-
Arduino
+關注
關注
189文章
6497瀏覽量
190558 -
機械臂
+關注
關注
13文章
553瀏覽量
25324
發布評論請先 登錄
GZCOM-NET:為機械臂測試帶來高效無線解決方案!

如何使用PLC控制myCobot 320機械臂

使用myCobot 280機械臂結合ROS2系統搭建機械分揀站

深度解析!RK3568 加持機械臂是如何實現顏色識別與抓取的?

凌科電氣新品發布:揭秘機械臂高可靠連接器解決方案
“雙保險”鎖緊機制:YM28系列連接器為機械臂提供高牢靠的大電流連接

機械臂的高效運作,連接器起關鍵作用

【原創】 drawbot 平面機械臂scara寫字畫畫機器人DIY教程貼
OrangePi AIpro應用:機械臂應用開發指南

評論