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

描述

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

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

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

  六台SG90伺服电机

  螺钉 M2、M3 和 M4

  Arduino UNO

  跨接电缆

  面包板

  针头机

  PLA 灯丝和 3D 打印机

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

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

3D打印

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

3D打印

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

3D打印

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

3D打印

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

3D打印

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

3D打印

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

  3D打印的Animatronic眼睛威廉希尔官方网站 图

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

3D打印

  正如我们之前所说,硬件连接非常简单。我们使用 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之间存在很多摩擦。

3D打印

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

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

3D打印

  代码

  #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);
}

 

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分