• 1
  • 2
  • 3
  • 4

首页 / 行业

怎样让机械臂绘画

2019-08-07 17:41:00

怎样让机械臂绘画

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:工作和最终图像的视频

视频显示机器人使用声控命令执行大理石绘画。大理石画可以在图片中看到,它显示了两种不同颜色的画作。

机械臂能闭夹具合时

  • 1
  • 2
  • 3
  • 4

最新内容

手机

相关内容

  • 1
  • 2
  • 3

猜你喜欢