驴友花雕 发表于 昨天 19:52

【Arduino 动手做】跺脚式哺乳动物型的四足机器人

认识 Stompy,Arduino 四足机器人。
我见过的大多数四足动物都使用“昆虫”型的腿,但我想尝试一下“哺乳动物”型的腿。结果是 Stompy,一个使用八个伺服系统的四足动物,每条腿由一个髋关节和一个踝关节(没有膝盖)组成。Stompy 使用“小跑”型步态,其中右前腿与左后腿同步,这两个肢体与其他两个肢体逆相移动。结果是一种跺脚式的步行,但它完成了工作。控制所有舵机需要 8 个 PWM 引脚,而标准 Arduino 只有 6 个,因此我决定使用 Arduino Mega。Stompy 使用红外距离传感器来防止撞到物体,并且能够自主移动。

第 1 步:材料清单
Arduino Mega(带可选的 proto 扩展板))
8 个舵机
4 个伺服 C 型支架
4 个长伺服 C 型支架
4 个伺服侧支架
4 个侧支架安装套件
大型塑料平台
红外距离传感器和支架
微型伺服和支架
激光

第 2 步:机器人构建
腿部组件如上图所示。为了使机器人正确移动,伺服系统需要居中。有关如何将我使用的伺服系统居中的信息可在此处获得。我使用的侧支架安装套件带有两个塑料板。其中较大的可以完美地用作机器人的脚。我在板的每个角落放置了四个小的粘合橡胶片以提高牵引力。这些橡胶片还为将脚固定到位的螺母和螺栓提供了间隙。然后将四条腿对称地连接到形成机器人主体的大型塑料平台上。伺服电缆穿过塑料平台上的孔并连接到 Arduino。Arduino 本身也用螺栓固定在塑料平台上。连接到微型伺服的 IR 距离传感器构成了机器人的头部。这允许 Stompy 自由漫游。

第 3 步:前进
在下面给出的 Arduino 代码中,肢体的运动由变量 flex1 控制,该变量设置肢体弯曲的角度。我将其设置为 45,但可以增加或减少以延长或缩短步幅。在代码的设置部分,我最初将 Stompy 定位为左前腿和右后腿向前,右前腿和左后腿向后放置。将 0 到 90 之间的值写入髋部伺服系统对应于向前位置,而 90 到 180 之间的值对应于向后位置。由于踝部伺服器与髋部伺服器呈 180 度对齐,因此将相同的值写入髋部和踝部伺服器将导致脚与地板平行。设置部分以 5 秒的暂停结束,以便有时间定位机器人。
代码的 loop 部分包含行走算法。首先,我伸直左前腿和右后腿。变量 smoothnessDelay 控制此运动的速度和平滑度。左前腿和右后腿现在是伸直的,右前腿和左后腿在向后的位置离开地面。我分三步将这些腿向前移动。首先,我将脚踝一直向前弯曲,使它们尽可能远离地面。接下来,我向前摆动臀部,在此期间,Stompy 的脚后跟会跳过地面。最后,我调平脚踝,让它们准备好着地。现在,左前腿和右后腿移动到后方位置。在这个动作之后,Stompy 已经完成了一个完整的步行周期。现在,我使用命令重复该过程,以切换对角线对数。

第 4 步:左转、右转、倒车
Stompy 在转弯时不太优雅。基本上,为了让 Stompy 转身,我使他身体一侧的步幅比另一侧短。例如,要向左转,我使身体左侧的步幅是身体右侧的步幅的三分之一。代码中的变量 multiplier 对此进行控制。它看起来有点尴尬,但它让 Stompy 从 A 点到 B 点。右转以类似的方式完成。Reverse 是对 forward walking 算法的简单修改。这三种代码都包含在附件中。

第 5 步:自主移动
前两个步骤中给出的四个步态文件以及一些距离传感器代码可以合并为一个文件,以允许自主避障移动。我使用 IR 距离传感器来测量到 Stompy 前面的障碍物的距离。如果距离低于设定的容差,Stompy 将停止,向左和向右看以再测量两次距离,然后继续沿更清晰的路径方向移动。由于 Stompy 无法一毛钱转动,因此方向的改变是通过首先后退 3 步,然后向清晰方向转动 5 步来完成的。然后 Stompy 继续直线前进,直到遇到另一个障碍物。方向变化序列中的步数由变量 reverseTime 和 turnTime 控制。我用激光来指示 Stompy 看的方向。













驴友花雕 发表于 昨天 19:54

【Arduino 动手做】跺脚式哺乳动物型的四足机器人

项目代码

/*
Quadraped gait file
*/


#include <Servo.h>

// Define servo objects for the four ankle joints
Servo ankleFL;
Servo ankleFR;
Servo ankleBL;
Servo ankleBR;

// Define servo objects for the four hip joints
Servo hipFL;
Servo hipFR;
Servo hipBL;
Servo hipBR;

// Define variables
int flex1 = 45;// Determines the length of each stride
int delayTime = 500; // Delay between limb movements
int startPause = 5000; // Delay to allow robot placement before movement
int pos = 0;// Loop counter
int smoothnessDelay = 15;

void setup()
{

   hipFL.attach(10);
   ankleFL.attach(11);

   hipFR.attach(4);
   ankleFR.attach(5);

   hipBL.attach(6);
   ankleBL.attach(7);

   hipBR.attach(8);
   ankleBR.attach(9);
   
// Put legs in starting position with
// front left and back right legs in forward position and
// front right and back left legs in rearward position
   hipFL.write(90-flex1);
   ankleFL.write(90-flex1);
   
   hipFR.write(90+flex1);
   ankleFR.write(90+flex1);
   
   hipBL.write(90+flex1);
   ankleBL.write(90+flex1);
   
   hipBR.write(90-flex1);
   ankleBR.write(90-flex1);
   
   delay(startPause);
}


void loop()
{

// Straighten front left and back right legs
delay(delayTime);
for(pos = 0; pos < flex1; pos +=1)
{
    hipFL.write(90-flex1+pos);
    ankleFL.write(90-flex1+pos);

    hipBR.write(90-flex1+pos);
    ankleBR.write(90-flex1+pos);
   
    delay(smoothnessDelay);
}

// Bring front right and back left legs forward in three steps
// First flex ankles forward
delay(delayTime);
ankleFR.write(180);

ankleBL.write(180);

// Second, swing the front right and back left legs forward
delay(delayTime);
hipFR.write(90-flex1);

hipBL.write(90-flex1);

// Third, reset front right and back left ankles
delay(delayTime);
ankleFR.write(90-flex1);

ankleBL.write(90-flex1);

// Bring front left and back right legs rearward
delay(delayTime);
for(pos = 0; pos < flex1; pos += 1)
{
    hipFL.write(90+pos);
    ankleFL.write(90+pos);

    hipBR.write(90+pos);
    ankleBR.write(90+pos);
   
    delay(smoothnessDelay);
}

// Straighten front right and back left legs
delay(delayTime);
for(pos = 0; pos < flex1; pos += 1)
{
    hipFR.write(90-flex1+pos);
    ankleFR.write(90-flex1+pos);

    hipBL.write(90-flex1+pos);
    ankleBL.write(90-flex1+pos);
   
    delay(smoothnessDelay);
}

// Bring front left and back right legs forward in three steps
// First flex ankles forward
delay(delayTime);
//ankleFL.write(180);
hipFL.write(180);

ankleBR.write(180);

// Second, swing the front left and back right legs forward
delay(delayTime);
//hipFL.write(90-flex1);
ankleFL.write(90-flex1);

hipBR.write(90-flex1);

// Third, reset front left and back right ankles
delay(delayTime);
//ankleFL.write(90-flex1);
hipFL.write(90-flex1);



ankleBR.write(90-flex1);

// Bring front right and back left legs rearward
delay(delayTime);
for(pos = 0; pos < flex1; pos += 1)
{
    hipFR.write(90+pos);
    ankleFR.write(90+pos);

    hipBL.write(90+pos);
    ankleBL.write(90+pos);
   
    delay(smoothnessDelay);
}
}

驴友花雕 发表于 昨天 20:11

【Arduino 动手做】跺脚式哺乳动物型的四足机器人

【Arduino 动手做】跺脚式哺乳动物型的四足机器人
项目链接:https://www.instructables.com/Arduino-Quadruped-Robot/
项目作者:joesinstructables

项目视频 :
https://www.youtube.com/watch?v=SwB7RWXjyCU
https://www.youtube.com/watch?v=oXWQwphZxS8
https://www.youtube.com/watch?v=Cw9iWIKEhLQ&t=8s
https://www.youtube.com/watch?v=0sKflmxnyJ0
项目代码:https://content.instructables.com/FHQ/0D90/IX6FOVXG/FHQ0D90IX6FOVXG.txt
https://content.instructables.com/FM5/8K7Q/IX6FOVXJ/FM58K7QIX6FOVXJ.txt
https://content.instructables.com/FFT/6ZR6/IX6FOVXP/FFT6ZR6IX6FOVXP.txt
https://content.instructables.com/F1Q/CNNY/IX6FOVXN/F1QCNNYIX6FOVXN.txt
https://content.instructables.com/FD5/C7SH/IX6FOVXE/FD5C7SHIX6FOVXE.txt









页: [1]
查看完整版本: 【Arduino 动手做】跺脚式哺乳动物型的四足机器人