首页 / 行业
怎样让机械臂绘画
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:工作和最终图像的视频
视频显示机器人使用声控命令执行大理石绘画。大理石画可以在图片中看到,它显示了两种不同颜色的画作。
最新内容
手机 |
相关内容
简述SMT贴片点料机的基础知识和应
简述SMT贴片点料机的基础知识和应用,运动,精度,操作,类型,系统,视觉,SMT贴片点料机(Surface Mount Technology Pick and Place Machi基于深度强化学习的视觉反馈机械臂
基于深度强化学习的视觉反馈机械臂抓取系统,视觉,系统,机械臂,强化学习,图像,运动,摘要:本文提出了一种基于深度强化学习的视觉反馈隐藏在PCB设计中的七个DFM问题
隐藏在PCB设计中的七个DFM问题,引脚,夹具,器件,确保,检查,测试点,隐藏在PCB设计中的七个DFM问题当我们完成设计并将其送到制造厂后,塑料光纤 电缆和附件 多功能链接
塑料光纤 电缆和附件 多功能链接,链接,光纤,模块,夹具,步骤,连接器,特征兼容敏捷通用链接家庭连接器与光纤成分1毫米塑料直径双光纤塑料光纤 电缆和附件 多功能链接
塑料光纤 电缆和附件 多功能链接,链接,光纤,模块,夹具,步骤,连接器,特征兼容敏捷通用链接家庭连接器与光纤成分1毫米塑料直径双光纤机器视觉技术集成,市场前景广阔
机器视觉技术集成,市场前景广阔,集成,机器视觉,行业,智能机器人,商品,夹具,在智能机器人的指导下,随机事件商品甚至混合在一起,任何积如何赋予机器人接管重复性任务的能
如何赋予机器人接管重复性任务的能力是协作机器人的杀手锏?,杀手锏,协作,能力,重复性,智能,目标,更加智能,功能更加丰富的机械臂尾端富唯智能视觉+AI+机器人集成整体解
富唯智能视觉+AI+机器人集成整体解决方案,解决方案,集成,视觉,智能,高精度,算法,在AI+机器人时代,工业机器人应用广泛,智能技术在一般