回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【Arduino 动手做】使用伺服电机的基于 Arduino 的 PVC 人形机器人 简单

头像 驴友花雕 2025.07.09 8 0

这是我的第一个人形机器人,由 PVC 泡沫板制成。它有各种厚度可供选择。在这里,我使用了 0.5 毫米。现在这个机器人在我开机时就可以走路了。现在我正在努力通过蓝牙模块连接 Arduino 和 Mobile。我已经为 Windows Phone 制作了一个像 Cortana 和 Siri 这样的应用程序,可以在 App Store https://www.microsoft.com/en-us/store/apps/patrick...成功连接后,我可以通过 Windows Phone 中的语音命令来控制它。
我花了很多月来解决电池超重问题,但由于预算问题以史诗般的失败告终。所以,最后我决定从外部铅酸电池供电。
让我们看看我是如何为机器人找到完美的身体设计的。

起初,我对处理电池和电路的伺服电机和电子电气的功率一无所知。我最初计划制作一个真人大小的机器人,大约有 5 到 6 英尺长。在尝试了将近 6 或 7 次后,我意识到了伺服器的最大扭矩,并将机器人的总高度降低了 2 到 3 英尺。
然后,我尝试从机器人的臀部向上检查行走算法。

所需组件
1) 塑料片材
2) 强力胶
3) 15 - 高扭矩伺服电机 ( 我用的是 TowerPro MG995 )
4) Arduino Atmega 2560 或其他 Arduino 板
5) 6V 电池 (最少 3 节每个电池最多 5 个电机)
6) 用于通信的 HC-05 蓝牙模块
7) 每个业余爱好者都有的其他基本东西!

你可以看到,我一开始只用了 11 个伺服电机。由于超重问题,它在测试过程中掉落并破裂。因此,我在每个腿的连接处增加了 4 个伺服器。

但是校准旋转度数并决定在每条腿的运动期间哪些电机应该运行是编码中最棘手的部分。它可以由另一个名为 (Servo_Test) 的 Sketch 来完成。通过 Arduino 板的串行通信测试每个电机的旋转度,我们可以校准每个电机。
最后,机器人在串口监视器窗口中输入值 “0” 后开始行走。
我还提供了一个示例,Windows Phone 8.1 示例源代码,用于使用蓝牙连接 Arduino 和 Mobile。
 

01.jpg
02.jpg
03.jpg
04.jpg
05.jpg
06.jpg
07.jpg

项目代码

 

代码
#include <Servo.h>
char val = '0';
int stop_flag = 3, flag = 70, lp1 = 100, lp2 = 115, lp22 = 95, lp3 = 76, lp33 = 90 , lp4 = 80;
int rp1 = 90, rp2 = 115, rp22 = 90, rp33 = 90;
int  rp3 = 60, rp4 = 150, cp = 84, lhp = 90, rhp = 90;
Servo L1, L2, L22, L3, L33, L4, R1, R2, R22, R3, R33, R4, C, LH, RH;

void setup()
{
  L1.attach(2);
  L2.attach(3);
  L3.attach(4);
  L4.attach(5);
  R1.attach(6);
  R2.attach(7);
  R3.attach(8);
  R4.attach(10);
  L22.attach(22);
  L33.attach(23);
  R22.attach(24);
  R33.attach(25);
  C.attach(28);
  LH.attach(26);
  RH.attach(27);
  Serial.begin(9600);
  Serial.println("Ready");
}
void loop()
{
  initiate();
  command();
}
void initiate()
{
  L1.write(lp1);
  L2.write(lp2);
  L3.write(lp3);
  L4.write(lp4);
  R1.write(rp1);
  R2.write(rp2);
  R3.write(rp3);
  R4.write(rp4);
  L22.write(lp22);
  L33.write(lp33);
  R22.write(rp22);
  R33.write(rp33);
  C.write(cp);
  LH.write(lhp);
  RH.write(rhp);
  flag = 0;
  delay(2500);
}
void command()
{
  if (Serial.available() > 0)
  {
    val = {
      Serial.read()
    };
  }
  if (val == '0')
  {
    walk();
    Serial.write("check");
  }
  if (val == '1')
  {
    stand();
  }
  if (val == '2')
  {
    leftt();
  }
  if (val == '3')
  {
    rightt();
  }
}
void walk()
{
  while (val == '0')
  {
    if (flag == 0)
      ini();
    if (flag == 1)
    {
      //C.write(94);
      left();
      //command();
    }
    if (flag == 2)
    {
      //C.write(76);
      right();
      //command();
    }
  }
}
void ini()
{
  L2.write(105);
  L3.write(64);
  R2.write(125);
  R3.write(72);
  L22.write(105);
  L33.write(102);
  R22.write(80);
  R33.write(78);
  flag = 1;
  rp2=125;
  rp3=72;
  rp22=80;
  rp33=78;
  Serial.println("Ini");
}
void left()
{
  while (flag == 1) //Left Leg
  {
    if (rp1 < 110)
    {
      rp1 = rp1 + 2;
      R1.write(rp1);
      //Serial.println(rp1);
    }
    if (lp2 > 95)
    {
      lp2--;
      L2.write(lp2);
      //Serial.println(lp2);
    }
    if (lp3 > 54)
    {
      lp3--;
      L3.write(lp3);
      //Serial.println(lp3);
    }
    if (lp22 < 115)
    {
      lp22++;
      L22.write(lp22);
      //Serial.println(lp22);
    }
    if (lp33 < 112)
    {
      lp33++;
      L33.write(lp33);
      //Serial.println(lp33);
    }

    LH.write(110);
    RH.write(140);
   
    if (rp2 > 115)
    {
      rp2--;
      R2.write(rp2);
      //Serial.println(rp2);
    }
    if (rp3 > 62)
    {
      rp3--;
      R3.write(rp3);
      //Serial.println(rp3);
    }
    if (rp22 < 90)
    {
      rp22++;
      R22.write(rp22);
      //Serial.println(rp22);
    }
    if (rp33 < 88)
    {
      rp33++;
      R33.write(rp33);
      //Serial.println(rp33);
    }
    //Serial.println(++count);
    if (lp2 == 95 && lp3 == 54 && rp1 == 110 && rp2 == 115 && rp3 == 62 && lp22 == 115 && lp33 == 112 && rp22 == 90 && rp33 == 88)
    {
      //Serial.write("Check");
      //for (cp; cp < 84; cp++)
      //{
       // C.write(cp);
        //delay(30);
      //}
      for (rp1; rp1 > 90; rp1--)
      {
        R1.write(rp1);
        delay(30);
      }
      Serial.println("Left_Leg");
      flag++;
      stop_flag = 0;
      delay(120);
    }
    delay(25);
  }
}
void right()
{
  while (flag == 2) //Right leg
  {
    if (lp1 > 74)
    {
      lp1 = lp1 - 2;
      L1.write(lp1);
    }
    if (lp2 < 115)
    {
      lp2++;
      L2.write(lp2);
    }
    if (lp3 < 74)
    {
      lp3++;
      L3.write(lp3);
    }
    if (lp22 > 95)
    {
      lp22--;
      L22.write(lp22);
    }
    if (lp33 > 92)
    {
      lp33--;
      L33.write(lp33);
    }

    LH.write(50);
    RH.write(70);      
    
    if (rp2 < 135)
    {
      rp2++;
      R2.write(rp2);
    }
    if (rp3 < 82)
    {
      rp3++;
      R3.write(rp3);
    }
    if (rp33 > 68)
    {
      rp33--;
      R33.write(rp33);
    }
    if (rp22 > 70)
    {
      rp22--;
      R22.write(rp22);
    }
    if (lp1 == 74 && lp2 == 115 && lp3 == 74 && rp3 == 82 && rp2 == 135 && lp22 == 95 && lp33 == 92 && rp33 == 68 && rp22 == 70)
    {
      //for (cp; cp < 84; cp++)
      //{
      //  C.write(cp);
      //  delay(30);
      //}
      for (lp1; lp1 < 100;)
      {
        lp1++;
        L1.write(lp1);
        delay(30);
      }
      Serial.println("Right_Leg");
      flag = 1;
      stop_flag = 1;
      delay(120);
    }
    delay(25);
  }
}
void stand()
{
  while (stop_flag == 0)
  {
    if (lp2 > 94)
    {
      lp2--;
      L2.write(lp2);
    }
    if (lp3 > 52)
    {
      lp3--;
      L3.write(lp3);
    }
    if (lp2 == 94 && lp3 == 52)
    {
      for (rp1; rp1 < 100; rp1++)
      {
        R1.write(rp1);
        delay(12);
      }
      flag = 70;
      stop_flag = 2;
      Serial.println("STOP");
    }
    delay(25);
  }
  while (stop_flag == 1)
  {
    if (rp2 > 130)
    {
      rp2--;
      R2.write(rp2);
    }
    if (rp3 < 80)
    {
      rp3++;
      R3.write(rp3);
    }
    if (rp2 == 130 && rp3 == 80)
    {
      for (lp1; lp1 > 110; lp2--)
      {
        L1.write(lp1);
        delay(12);
      }
      flag = 70;
      stop_flag = 2;
      Serial.println("STOP");
    }
    delay(25);
  }
  if (Serial.available() > 0)
  {
    val = {
      Serial.read()
    };
  }
  command();
}
void leftt()
{
  left();
  val = 1;
  command();
}
void rightt()
{
  right();
  val = 1;
  command();
}

【Arduino 动手做】使用伺服电机的基于 Arduino 的 PVC 人形机器人
项目链接:https://www.instructables.com/Arduino-Based-Humanoid-Robot-Using-Servo-Motors/
项目作者:BlackStar Vvek
项目参考:
https://www.youtube.com/watch?v=7LGLk2pbdOs
https://www.youtube.com/watch?v=L9re7I3pF1s
项目视频 :
https://www.youtube.com/watch?v=NVbsse3AOtY
https://www.youtube.com/watch?v=vg5OI3jVH0w
项目代码:
https://content.instructables.com/FQH/EI1F/IJD55XMI/FQHEI1FIJD55XMI.ino
https://content.instructables.com/FAV/ZH0V/IJD55ZLR/FAVZH0VIJD55ZLR.ino
https://content.instructables.com/FB8/IGV7/IZYGLZ4G/FB8IGV7IZYGLZ4G.zip
 

11.jpg
00185--.gif

评论

user-avatar
icon 他的勋章
    展开更多