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

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

3天内不再提示

如何使用Arduino构建一个电子动画眼睛

科技观察员 来源:circuitdigest 作者:Debashis Das 2022-07-10 09:52 次阅读

在这个项目中,我们将使用 Arduino 构建一个动画眼睛。在网上寻找新的项目创意时,我萌生了制作动画眼睛的想法,这个项目立即引起了我的注意。首先,它看起来很酷,并且有一个简单的机制,我在做这个项目时学到了很多关于机电一体化的知识。非常感谢Will Cogley构建 3D 模型并让社区可以访问所有源文件,用他的话来说,他想设计它,以便制造商社区更容易访问它。这个动画眼睛设计有两个版本,一个简单的和一个高级的,对于这个项目,我们认为构建简单的,在这个过程中,我们会告诉你构建经验以及我们遇到的问题。

构建 3D 打印电子动画眼睛所需的组件

这个项目的 BOM 非常小,因为所有的辛苦工作都是由 3D 打印机完成的,我们只需要一些螺丝和粗体,大部分你可以在当地的爱好商店找到。下面给出了 BOM 的完整列表。

六台SG90伺服电机

螺钉 M2、M3 和 M4

Arduino UNO

跨接电缆

面包板

针头机

PLA 灯丝和 3D 打印机

后处理和组装 - 电子动画眼睛机构

要使用这个项目,我们需要首先打印所有 3D 模型,您可以在Ikkalebob instructables中找到 3D 模型。打印完所有 3D 部件后,您需要打磨眼睛和其他一些顺利合作所需的部件,一旦这些部件完成,我们就可以继续进行组装过程。如果您正确打印了每个部分,您的产品应该类似于下图。

pYYBAGLKMFaAXnc8AAThsAVqw_U153.png

我们将通过将 6 个伺服电机中的 5 个连接到Servo_Block模块来开始构建,如下图所示。为了捕捉图像,我必须使用黑色作为背景,因为它增加了图像的细节层次。

poYBAGLKMEGAetU-AAeUnBKQBCo185.png

现在我们将Servo_Block连接到Main_Base,如下图所示。我们还使用了四个 12 毫米 M3 内六角螺钉来制作设备的支腿。

pYYBAGLKMECAIzHIAAbNPmU2pvQ767.png

接下来,我们将为双眼连接 Eye-Adaptor 和 Fork。完成后,我们将 Eye-Holder 与 Eye-Adaptor 和Three-point_Connector与 Fork 连接。完成所有这些过程后,它将如下图所示。

pYYBAGLKMDyAOnV2AAW_4NhpUkQ564.png

完成后,我们将第六个和最后一个伺服器连接到Sub_Base,然后用螺丝将Sub_Base连接到Main_Base。在此之后,我们将 PlaceHolder Eye 弹出到眼睛适配器。我们还用螺钉连接了 X 臂和 Y 臂。

poYBAGLKMDWAImZJAAclABb6buA882.png

现在我们将眼睑连接器连接到眼睑,我们使用 M3 螺钉从两侧将眼睑固定到位。

pYYBAGLKMDKAFmVdAAbrzxZcfKo911.png

如果您已正确完成所有操作,图像将类似于上图所示的图像 ,您可以看到我们已将所有眼睑与眼睑连接器连接起来,并且我们已将它们与伺服电机的臂拧紧。完成后,我们可以进入编码过程。

3D打印的Animatronic眼睛电路图

DIY 3D 打印的仿真眼示意图如下图所示,您可以看到它非常简单易懂。虽然项目设计者和作者提供的原理图中使用了 PCA9685 IC,一个 16 通道 12 位 PWM 伺服电机驱动器,但我们不会在这个项目中使用它,因为 Arduino 的伺服库可以轻松处理六个伺服器。

pYYBAGLKMCyAIwsgAAGQuQ8Daas618.png

正如我们之前所说,硬件连接非常简单。我们使用 Arduino 的六个引脚来控制六个伺服电机。如果我们快速浏览一下 Arduino 的规格,您会发现 Arduino 有六个 PWM 引脚,我们正在使用所有这些引脚来控制所有六个伺服电机。

用于控制动画眼睛的 Arduino 代码

动画眼睛 Arduino 代码非常简单易懂。为了使这段代码正常工作,我们将使用 Arduino 的Servo.h 库。

我们通过包含所需的库并定义控制所有六个伺服电机所需的所有实例来开始我们的代码。

#include <伺服.h>
伺服 top_left_eyelid;
伺服底部_左眼睑;
伺服 top_right_eyelid;
伺服bottom_right_eyelid;
伺服纱线;
伺服 Xarm

接下来,我们有我们的setup()函数。在 setup 函数中,我们已经声明了眼睛的哪个部分连接到 Arduino 的哪个引脚。这非常有用,因为我们可以拔下所有连接器并按原样连接。

  top_left_eyelid.attach(10);
  bottom_left_eyelid.attach(11);
  top_right_eyelid.attach(5);
  bottom_right_eyelid.attach(6);
  Yarm.attach(9);
  Xarm.attach(3);

接下来,我们初始化串口进行调试,并调用一些函数以保持眼睛睁开并位于中心,我们还添加了一些延迟以保持稳定性。

  序列号.开始(9600);
  开眼();
  眼球中心();
  延迟(2000);

接下来,我们有我们的loop()函数,但在我们解释循环函数之前,我们将解释一些更重要的函数,这些函数对于理解循环函数内部的内容是必要的。这些功能是最重要的功能,有了这些,我们将移动系统的眼球。首先,我们有open_eye()函数。如果你看硬件,你需要顺时针移动一个伺服器,逆时针方向移动另一个伺服器,我们对左右眼睑都做同样的事情。

无效的开眼(){
  top_left_eyelid.write(55);
  bottom_left_eyelid.write(36);
  top_right_eyelid.write(2);
  bottom_right_eyelid.write(160);
}

接下来是close_eye()函数,在close_eye函数中,我们将做与open_eye函数完全相同的事情,但相反。

无效 close_eye() {
  top_left_eyelid.write(2);
  bottom_left_eyelid.write(120);
  top_right_eyelid.write(46);
  bottom_right_eyelid.write(55);
}

接下来,我们有look_up()和look_down()函数。如果您查看硬件,移动设备的 Y 臂会使眼球上下移动。

无效查找(){
  Yarm.write(132);
}
无效look_down(){
  Yarm.write(45);
}

接下来,我们有eye_ball_left()和eye_ball_right()函数,它们与 up 和 down 函数相同,唯一的区别在于设备的角度。

无效 eye_ball_left() {
  Xarm.write(50);
}
无效的eye_ball_right(){
  Xarm.write(130);
}

接下来我们有eye_ball_centert()函数。在此功能中,我们将 X 臂和 Y 臂设置为 90 度角,以便我们可以将眼睛移动到死点。

无效的eye_ball_centert(){
  Xarm.write(90);
  Yarm.write(90);
}

现在我们有了一些我编写的其他函数,以使我们的生活更轻松。在该列表中,我们首先有synchronous_close()函数,调用此函数将关闭并打开一次眼睛。

无效同步关闭(){
  close_eye();
  延迟(420);
  开眼();
  延迟(222);
}

然后我们有random_close()函数,它将随机打开和关闭眼睛。这将产生很酷的效果。

无效随机关闭(){
  close_eye();
  延迟(随机(220、880));
  开眼();
  延迟(随机(220、880));
}

接下来,我们有random_movement()函数。在这个函数中,我们在延迟函数中使用了 Arduino 的random()函数来使眼睛随机移动。

无效随机运动(){
  Xarm.write(60);
  延迟(随机(250、340));
  Yarm.write(80);
  延迟(随机(250、340));
  Xarm.write(120);
  延迟(随机(250、340));
  Yarm.write(140);
  Xarm.write(60);
  延迟(随机(250、340));
  Yarm.write(80);
  延迟(随机(250、340));
  Xarm.write(120);
  延迟(随机(250、340));
  Yarm.write(140);
  眼球中心();
  延迟(300);
  同步关闭();
  随机关闭();
}

现在我们将解释 void 循环功能,它是 Arduino 的主要功能。在这个函数中,我们将眼睛向左、向右和居中移动,然后上下移动,然后我们会让眼睛眨眼。我们将这样做几次并做出随机动作。最后,我们有两个 for 循环。for 循环是如何实现平滑运动或移动眼球的示例。

无效循环(){
  eye_ball_left();
  延迟(680);
  eye_ball_right();
  延迟(680);
  眼球中心();
  延迟(450);
  同步关闭();
  眼球中心();
  延迟(450);
  抬头();
  延迟(400);
  向下看();
  延迟(400);
  眼球中心();
  延迟(300);
  随机关闭();
  延迟(450);
  抬头();
  延迟(400);
  向下看();
  延迟(400);
  随机运动();
  延迟(400);
  眼球中心();
  延迟(300);
  top_left_eyelid.write(2);
  bottom_left_eyelid.write(120);
  延迟(200);
  top_left_eyelid.write(55);
  bottom_left_eyelid.write(36);
  延迟(200);
  开眼();
  延迟(500);
  对于 (int i = 60; i < 120; i++)
  {
    Xarm.write(i);
    Yarm.write(i - 5);
    延迟(10);
  }
  眼球中心();
  延迟(400);
  同步关闭();
  for (int i = 120; i > 60; i--) {
    Xarm.write(i);
    Yarm.write(i - 5);
    延迟(10);
  }
}

这标志着代码部分的结束,我们可以继续阅读本文的下一部分。

测试和调试 3D 打印的电子动画眼睛

由于项目的机械部分有点忙,有很多事情在第一次开始时没有奏效,所以在本节中,我想讨论这些话题

我们遇到的第一个问题是eye_place_holders移动不顺畅,并且eye_place_holders和eye_lids之间存在很多摩擦。

poYBAGLKMCKAKbGPAAbkhoEa7Bk751.png

解决此问题的方法是丢失固定眼支架和设备底座的螺钉,这些螺钉是上面所示的标记螺钉。

下一个问题是如何将伺服臂连接到eye_lid和X-arm和Y-arm 的臂。这是一个大问题,因为如果没有适当的接头,设备将无法顺利工作,因此在下图中您可以看到所有伺服臂的图片。

poYBAGLKMCKAfbUOAAL7THKBYlw355.png

代码

#include <伺服.h>


伺服 top_left_eyelid;
伺服底部_左眼睑;
伺服 top_right_eyelid;
伺服bottom_right_eyelid;
伺服纱线;
伺服 Xarm;
无效设置(){
top_left_eyelid.attach(10);
bottom_left_eyelid.attach(11);
top_right_eyelid.attach(5);
bottom_right_eyelid.attach(6);
Yarm.attach(9);
Xarm.attach(3);
序列号.开始(9600);
开眼();
眼球中心();
延迟(2000);
}
无效循环(){
eye_ball_left();
延迟(680);
eye_ball_right();
延迟(680);
眼球中心();
延迟(450);
同步关闭();
//同步关闭();
眼球中心();
延迟(450);
抬头();
延迟(400);
向下看();
延迟(400);
眼球中心();
延迟(300);
随机关闭();
延迟(450);
抬头();
延迟(400);
向下看();
延迟(400);
随机运动();
延迟(400);
眼球中心();
延迟(300);
top_left_eyelid.write(2);
bottom_left_eyelid.write(120);
延迟(200);
top_left_eyelid.write(55);
bottom_left_eyelid.write(36);
延迟(200);
开眼();
延迟(500);
对于 (int i = 60; i < 120; i++)
{
Xarm.write(i);
Yarm.write(i - 5);
延迟(10);
}
眼球中心();
延迟(400);
同步关闭();
for (int i = 120; i > 60; i--) {
Xarm.write(i);
Yarm.write(i - 5);
延迟(10);
}
}
无效随机运动(){
Xarm.write(60);
延迟(随机(250、340));
Yarm.write(80);
延迟(随机(250、340));
Xarm.write(120);
延迟(随机(250、340));
Yarm.write(140);
Xarm.write(60);
延迟(随机(250、340));
Yarm.write(80);
延迟(随机(250、340));
Xarm.write(120);
延迟(随机(250、340));
Yarm.write(140);
眼球中心();
延迟(300);
同步关闭();
随机关闭();
}
无效随机关闭(){
close_eye();
延迟(随机(220、880));
开眼();
延迟(随机(220、880));
}
无效同步关闭(){
close_eye();
延迟(420);
开眼();
延迟(222);
}
无效 eye_ball_left() {
Xarm.write(50);
}
无效的eye_ball_right(){
Xarm.write(130);
}
无效的eye_ball_centert(){
Xarm.write(90);
Yarm.write(90);
}
无效查找(){
Yarm.write(132);
}
无效look_down(){
Yarm.write(45);
}
无效 close_eye() {
top_left_eyelid.write(2);
bottom_left_eyelid.write(120);
top_right_eyelid.write(46);
bottom_right_eyelid.write(55);
}
无效的开眼(){
top_left_eyelid.write(55);
bottom_left_eyelid.write(36);
top_right_eyelid.write(2);
bottom_right_eyelid.write(160);
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Arduino
    +关注

    关注

    187

    文章

    6465

    浏览量

    186729
  • DIY设计
    +关注

    关注

    2

    文章

    59

    浏览量

    19798
  • 3D打印
    +关注

    关注

    26

    文章

    3544

    浏览量

    108911
收藏 人收藏

    评论

    相关推荐

    如何使用Arduino构建计算器

    在本教程中,我们将使用 Arduino 构建自己的计算器。这些值可以通过键盘(4×4 键盘)发送,结果可以在 LCD 屏幕上查看(16×2 点阵)。该计算器可以执行简单的运算,例如整数的加法,减法,乘法和除法。但是旦你理解了这
    的头像 发表于 11-21 17:43 5923次阅读
    如何使用<b class='flag-5'>Arduino</b><b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>计算器

    如何使用Arduino Nano构建金属探测器

    在这个项目中,我们将使用线圈和电容器来检测金属。在这里,我们使用Arduino Nano来构建这个金属探测器项目。对于所有电子爱好者来说
    的头像 发表于 11-22 17:15 3569次阅读
    如何使用<b class='flag-5'>Arduino</b> Nano<b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>金属探测器

    如何构建Arduino官方开发环境

    本系列教程将向大家讲述,在自己的计算机上构建完善的嵌入式系统开发环境的方法。本文将向大家讲述构建Arduino官方开发环境的方法。Arduino简介:
    发表于 12-24 06:44

    使用Arduino构建数字罗盘

    方向。在本文中,您将学习如何使用 Arduino 构建自己的数字罗盘。通过它,您将能够了解HMC5883L传感器的完整操作,来检测它的方位方向。此外,您将学习如何构建自己的电子罗盘板并
    发表于 08-25 06:11

    如何利用Arduino构建功率计

    我们可能会想自己制作仪表。例如,当我们准备做一个太阳能光伏项目时,我们想计算负载的功耗,在这种情况下,我们就可以用
    的头像 发表于 04-12 16:23 3252次阅读
    如何利用<b class='flag-5'>Arduino</b><b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>功率计

    如何使用Arduino构建无线门铃

     在这个项目中,我们将使用 Arduino 构建无线门铃。我们将有按钮,按下该按钮将无线
    发表于 08-19 15:57 1776次阅读
    如何使用<b class='flag-5'>Arduino</b><b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>无线门铃

    Arduino控制时钟和动画开源分享

    电子发烧友网站提供《Arduino控制时钟和动画开源分享.zip》资料免费下载
    发表于 10-27 09:23 1次下载
    <b class='flag-5'>Arduino</b>控制时钟和<b class='flag-5'>动画</b>开源分享

    带有Neopixel环形动画Arduino时钟

    电子发烧友网站提供《带有Neopixel环形动画Arduino时钟.zip》资料免费下载
    发表于 11-07 16:16 1次下载
    带有Neopixel环形<b class='flag-5'>动画</b>的<b class='flag-5'>Arduino</b>时钟

    Arduino Nano构建SN76489 USB MIDI合成器

    电子发烧友网站提供《用Arduino Nano构建SN76489 USB MIDI合成器.zip》资料免费下载
    发表于 11-10 14:24 0次下载
    用<b class='flag-5'>Arduino</b> Nano<b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>SN76489 USB MIDI合成器

    使用Alexa和Arduino动画智能灯

    电子发烧友网站提供《使用Alexa和Arduino动画智能灯.zip》资料免费下载
    发表于 12-09 10:23 0次下载
    使用Alexa和<b class='flag-5'>Arduino</b>的<b class='flag-5'>动画</b>智能灯

    构建Arduino交通灯模块

    电子发烧友网站提供《构建Arduino交通灯模块.zip》资料免费下载
    发表于 12-13 10:39 0次下载
    <b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>Arduino</b>交通灯模块

    Arduino简单的滑块构建电子设备

    电子发烧友网站提供《Arduino简单的滑块构建电子设备.zip》资料免费下载
    发表于 12-30 09:45 0次下载
    <b class='flag-5'>Arduino</b>简单的滑块<b class='flag-5'>构建</b><b class='flag-5'>电子</b>设备

    构建小型工作电子动画

    电子发烧友网站提供《构建小型工作电子动画头.zip》资料免费下载
    发表于 06-09 14:41 0次下载
    <b class='flag-5'>构建</b>小型工作<b class='flag-5'>电子</b><b class='flag-5'>动画</b>头

    使用Raspberry Pi和Arduino实现Web控制的LED动画

    电子发烧友网站提供《使用Raspberry Pi和Arduino实现Web控制的LED动画.zip》资料免费下载
    发表于 07-03 14:52 0次下载
    使用Raspberry Pi和<b class='flag-5'>Arduino</b>实现Web控制的LED<b class='flag-5'>动画</b>

    Arduino动画矩阵骰子

    电子发烧友网站提供《Arduino动画矩阵骰子.zip》资料免费下载
    发表于 07-06 09:05 0次下载
    <b class='flag-5'>Arduino</b><b class='flag-5'>动画</b>矩阵骰子