45浏览
查看: 45|回复: 1

[项目] 【Arduino 动手做】使用舵机的 PVC 人形机器人

[复制链接]
这是我的第一个人形机器人,由 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。

【Arduino 动手做】使用舵机的 PVC 人形机器人图3

【Arduino 动手做】使用舵机的 PVC 人形机器人图1

【Arduino 动手做】使用舵机的 PVC 人形机器人图2

【Arduino 动手做】使用舵机的 PVC 人形机器人图4

【Arduino 动手做】使用舵机的 PVC 人形机器人图5

【Arduino 动手做】使用舵机的 PVC 人形机器人图6

【Arduino 动手做】使用舵机的 PVC 人形机器人图7

驴友花雕  中级技神
 楼主|

发表于 2025-7-9 18:24:08

【Arduino 动手做】使用舵机的 PVC 人形机器人

项目代码

  1. #include <Servo.h>
  2. char val = '0';
  3. int stop_flag = 3, flag = 70, lp1 = 100, lp2 = 115, lp22 = 95, lp3 = 76, lp33 = 90 , lp4 = 80;
  4. int rp1 = 90, rp2 = 115, rp22 = 90, rp33 = 90;
  5. int  rp3 = 60, rp4 = 150, cp = 84, lhp = 90, rhp = 90;
  6. Servo L1, L2, L22, L3, L33, L4, R1, R2, R22, R3, R33, R4, C, LH, RH;
  7. void setup()
  8. {
  9.   L1.attach(2);
  10.   L2.attach(3);
  11.   L3.attach(4);
  12.   L4.attach(5);
  13.   R1.attach(6);
  14.   R2.attach(7);
  15.   R3.attach(8);
  16.   R4.attach(10);
  17.   L22.attach(22);
  18.   L33.attach(23);
  19.   R22.attach(24);
  20.   R33.attach(25);
  21.   C.attach(28);
  22.   LH.attach(26);
  23.   RH.attach(27);
  24.   Serial.begin(9600);
  25.   Serial.println("Ready");
  26. }
  27. void loop()
  28. {
  29.   initiate();
  30.   command();
  31. }
  32. void initiate()
  33. {
  34.   L1.write(lp1);
  35.   L2.write(lp2);
  36.   L3.write(lp3);
  37.   L4.write(lp4);
  38.   R1.write(rp1);
  39.   R2.write(rp2);
  40.   R3.write(rp3);
  41.   R4.write(rp4);
  42.   L22.write(lp22);
  43.   L33.write(lp33);
  44.   R22.write(rp22);
  45.   R33.write(rp33);
  46.   C.write(cp);
  47.   LH.write(lhp);
  48.   RH.write(rhp);
  49.   flag = 0;
  50.   delay(2500);
  51. }
  52. void command()
  53. {
  54.   if (Serial.available() > 0)
  55.   {
  56.     val = {
  57.       Serial.read()
  58.     };
  59.   }
  60.   if (val == '0')
  61.   {
  62.     walk();
  63.     Serial.write("check");
  64.   }
  65.   if (val == '1')
  66.   {
  67.     stand();
  68.   }
  69.   if (val == '2')
  70.   {
  71.     leftt();
  72.   }
  73.   if (val == '3')
  74.   {
  75.     rightt();
  76.   }
  77. }
  78. void walk()
  79. {
  80.   while (val == '0')
  81.   {
  82.     if (flag == 0)
  83.       ini();
  84.     if (flag == 1)
  85.     {
  86.       //C.write(94);
  87.       left();
  88.       //command();
  89.     }
  90.     if (flag == 2)
  91.     {
  92.       //C.write(76);
  93.       right();
  94.       //command();
  95.     }
  96.   }
  97. }
  98. void ini()
  99. {
  100.   L2.write(105);
  101.   L3.write(64);
  102.   R2.write(125);
  103.   R3.write(72);
  104.   L22.write(105);
  105.   L33.write(102);
  106.   R22.write(80);
  107.   R33.write(78);
  108.   flag = 1;
  109.   rp2=125;
  110.   rp3=72;
  111.   rp22=80;
  112.   rp33=78;
  113.   Serial.println("Ini");
  114. }
  115. void left()
  116. {
  117.   while (flag == 1) //Left Leg
  118.   {
  119.     if (rp1 < 110)
  120.     {
  121.       rp1 = rp1 + 2;
  122.       R1.write(rp1);
  123.       //Serial.println(rp1);
  124.     }
  125.     if (lp2 > 95)
  126.     {
  127.       lp2--;
  128.       L2.write(lp2);
  129.       //Serial.println(lp2);
  130.     }
  131.     if (lp3 > 54)
  132.     {
  133.       lp3--;
  134.       L3.write(lp3);
  135.       //Serial.println(lp3);
  136.     }
  137.     if (lp22 < 115)
  138.     {
  139.       lp22++;
  140.       L22.write(lp22);
  141.       //Serial.println(lp22);
  142.     }
  143.     if (lp33 < 112)
  144.     {
  145.       lp33++;
  146.       L33.write(lp33);
  147.       //Serial.println(lp33);
  148.     }
  149.     LH.write(110);
  150.     RH.write(140);
  151.    
  152.     if (rp2 > 115)
  153.     {
  154.       rp2--;
  155.       R2.write(rp2);
  156.       //Serial.println(rp2);
  157.     }
  158.     if (rp3 > 62)
  159.     {
  160.       rp3--;
  161.       R3.write(rp3);
  162.       //Serial.println(rp3);
  163.     }
  164.     if (rp22 < 90)
  165.     {
  166.       rp22++;
  167.       R22.write(rp22);
  168.       //Serial.println(rp22);
  169.     }
  170.     if (rp33 < 88)
  171.     {
  172.       rp33++;
  173.       R33.write(rp33);
  174.       //Serial.println(rp33);
  175.     }
  176.     //Serial.println(++count);
  177.     if (lp2 == 95 && lp3 == 54 && rp1 == 110 && rp2 == 115 && rp3 == 62 && lp22 == 115 && lp33 == 112 && rp22 == 90 && rp33 == 88)
  178.     {
  179.       //Serial.write("Check");
  180.       //for (cp; cp < 84; cp++)
  181.       //{
  182.        // C.write(cp);
  183.         //delay(30);
  184.       //}
  185.       for (rp1; rp1 > 90; rp1--)
  186.       {
  187.         R1.write(rp1);
  188.         delay(30);
  189.       }
  190.       Serial.println("Left_Leg");
  191.       flag++;
  192.       stop_flag = 0;
  193.       delay(120);
  194.     }
  195.     delay(25);
  196.   }
  197. }
  198. void right()
  199. {
  200.   while (flag == 2) //Right leg
  201.   {
  202.     if (lp1 > 74)
  203.     {
  204.       lp1 = lp1 - 2;
  205.       L1.write(lp1);
  206.     }
  207.     if (lp2 < 115)
  208.     {
  209.       lp2++;
  210.       L2.write(lp2);
  211.     }
  212.     if (lp3 < 74)
  213.     {
  214.       lp3++;
  215.       L3.write(lp3);
  216.     }
  217.     if (lp22 > 95)
  218.     {
  219.       lp22--;
  220.       L22.write(lp22);
  221.     }
  222.     if (lp33 > 92)
  223.     {
  224.       lp33--;
  225.       L33.write(lp33);
  226.     }
  227.     LH.write(50);
  228.     RH.write(70);      
  229.    
  230.     if (rp2 < 135)
  231.     {
  232.       rp2++;
  233.       R2.write(rp2);
  234.     }
  235.     if (rp3 < 82)
  236.     {
  237.       rp3++;
  238.       R3.write(rp3);
  239.     }
  240.     if (rp33 > 68)
  241.     {
  242.       rp33--;
  243.       R33.write(rp33);
  244.     }
  245.     if (rp22 > 70)
  246.     {
  247.       rp22--;
  248.       R22.write(rp22);
  249.     }
  250.     if (lp1 == 74 && lp2 == 115 && lp3 == 74 && rp3 == 82 && rp2 == 135 && lp22 == 95 && lp33 == 92 && rp33 == 68 && rp22 == 70)
  251.     {
  252.       //for (cp; cp < 84; cp++)
  253.       //{
  254.       //  C.write(cp);
  255.       //  delay(30);
  256.       //}
  257.       for (lp1; lp1 < 100;)
  258.       {
  259.         lp1++;
  260.         L1.write(lp1);
  261.         delay(30);
  262.       }
  263.       Serial.println("Right_Leg");
  264.       flag = 1;
  265.       stop_flag = 1;
  266.       delay(120);
  267.     }
  268.     delay(25);
  269.   }
  270. }
  271. void stand()
  272. {
  273.   while (stop_flag == 0)
  274.   {
  275.     if (lp2 > 94)
  276.     {
  277.       lp2--;
  278.       L2.write(lp2);
  279.     }
  280.     if (lp3 > 52)
  281.     {
  282.       lp3--;
  283.       L3.write(lp3);
  284.     }
  285.     if (lp2 == 94 && lp3 == 52)
  286.     {
  287.       for (rp1; rp1 < 100; rp1++)
  288.       {
  289.         R1.write(rp1);
  290.         delay(12);
  291.       }
  292.       flag = 70;
  293.       stop_flag = 2;
  294.       Serial.println("STOP");
  295.     }
  296.     delay(25);
  297.   }
  298.   while (stop_flag == 1)
  299.   {
  300.     if (rp2 > 130)
  301.     {
  302.       rp2--;
  303.       R2.write(rp2);
  304.     }
  305.     if (rp3 < 80)
  306.     {
  307.       rp3++;
  308.       R3.write(rp3);
  309.     }
  310.     if (rp2 == 130 && rp3 == 80)
  311.     {
  312.       for (lp1; lp1 > 110; lp2--)
  313.       {
  314.         L1.write(lp1);
  315.         delay(12);
  316.       }
  317.       flag = 70;
  318.       stop_flag = 2;
  319.       Serial.println("STOP");
  320.     }
  321.     delay(25);
  322.   }
  323.   if (Serial.available() > 0)
  324.   {
  325.     val = {
  326.       Serial.read()
  327.     };
  328.   }
  329.   command();
  330. }
  331. void leftt()
  332. {
  333.   left();
  334.   val = 1;
  335.   command();
  336. }
  337. void rightt()
  338. {
  339.   right();
  340.   val = 1;
  341.   command();
  342. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail