0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎样让机械臂绘画

454398 来源:工程师吴畏 2019-08-07 17:41 次阅读

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
    +关注

    关注

    184

    文章

    6427

    浏览量

    184824
  • 机械臂
    +关注

    关注

    9

    文章

    471

    浏览量

    23820
收藏 人收藏

    评论

    相关推荐

    机械‘步步惊心’,安全地毯‘保驾护航’”

    机械
    jf_18500570
    发布于 :2024年04月03日 10:00:51

    机械的搭档 安全地毯

    自动化机械
    jf_18500570
    发布于 :2024年03月30日 10:04:42

    安全地毯接机械测试

    保护装置机械
    jf_18500570
    发布于 :2024年03月26日 11:21:21

    机械专用安全地毯

    保护装置机械
    jf_18500570
    发布于 :2024年03月26日 11:13:36

    机械作业时 安全模拟演示

    自动化机械
    jf_18500570
    发布于 :2024年03月21日 12:59:54

    【国产FPGA+OMAPL138开发板体验】(原创)2.手把手玩转游戏机械

    相应的动作。 可以添加反馈机制,使机械能够根据实际情况调整其行为。通过API与ChatGPT集成,机械根据ChatGPT的输出作出响应
    发表于 02-01 20:18

    51单片机怎么处理机械数据?

    51单片机怎么处理机械数据
    发表于 10-31 06:29

    【Start_DSC28034PNT湖人开发板免费体验】(开源)控制机械小游戏3

    接上4篇:【Start_DSC28034PNT湖人开发板免费体验】(开源)控制机械小游戏2 【Start_DSC28034PNT湖人开发板免费体验】(开源)控制机械小游戏
    发表于 07-30 14:48

    机械游戏

    机械
    还没吃饭
    发布于 :2023年07月21日 14:29:00

    00031 基于Jetson打造的ROS六轴总线机械—DOFBOT

    机械
    学习电子知识
    发布于 :2023年07月02日 13:20:57

    挑战300块做一个四轴视觉定位scrar机械

    机械
    YS YYDS
    发布于 :2023年05月30日 21:34:35

    【CW32饭盒派开发板试用体验】+机械游戏项目(开源)(5)加红外游戏操控机

    接上几篇: 【CW32饭盒派开发板试用体验】+机械游戏项目(开源)(1)开箱试验舵机 - 武汉芯源MCU - 电子技术论坛 - 广受欢迎的专业电子论坛! 【CW32饭盒派开发板试用体验】+机械
    发表于 05-24 22:27

    【CW32饭盒派开发板试用体验】+机械游戏项目(开源)(4)多加点东西

    接上三篇,继续本项目开发。【CW32饭盒派开发板试用体验】+机械游戏项目(开源)(1)开箱试验舵机 - 武汉芯源MCU - 电子技术论坛- 广受欢迎的专业电子论坛! https
    发表于 05-08 18:40

    【CW32饭盒派开发板试用体验】+机械游戏项目(开源)(3)开动机械

    接上两篇,继续本项目开发。 机器调试。 机械连线。 速度调整。 代码: #include \"../inc/main.h\" int32_t main(void) { int
    发表于 04-28 23:44

    【CW32饭盒派开发板试用体验】+机械游戏项目(开源)(1)开箱试验舵机

    我很高兴能得到 CW32饭盒派开发板试用体验机会,想利用业余时间,做个机械游戏项目,用咱们的这个开发板,更多的人了解此国产芯片的项目,了解此开发板,此项目开源,可以为更多的工程师上手提供经验
    发表于 04-28 20:10