DIY及创意
直播中

听风说梦

9年用户 911经验值
擅长:可编程逻辑 嵌入式技术 EMC/EMI设计
私信 关注

DIY推荐!基于 ESP32 做的三舵机机械蚂蚁

图片

蚂蚁是一种神奇的生物,它们需要很少的资源,却能做很多的事情。

一般来说,许多六条腿的机器人每条腿最多需要三个舵机,那么总共就需要 18 个舵机,这会消耗了大量的能量,也与蚂蚁本身的体型相冲突。

但在这个项目中只用到三个舵机、一个夹爪和一点机械设备,就实现了一只极简主义的蚂蚁机器人,除开电池,重量约 114 克。

图片.png

组件清单

图片

  • SG90 舵机 x 3
  • ESP32/ESP8266 板 x 1
  • 回形针 x 若干
  • 小螺丝 x 若干
  • 5V 降压转换器 MP1584 x 1
  • 9V 或 7.4锂电池 x 1

3D 打印部件

所有的零部件使用 Tinkercad 设计并使用 Ultimaker Cura 制作。

图片

3D 打印文件可以在文末下载。

安装蚂蚁躯干部分

使用钳子或者锯和锉刀拆下所有舵机上的凸起。

图片

图片

如图所示,将打印底部支架用两个尖头螺钉固定到舵机 2 上,舵机的中间是可以摆动。它还有一个小盖子,稍后用螺丝固定。

图片

图片

再用热熔胶固定舵机 1 和舵机 3 以及舵机 2 的盖子。

图片

图片

安装腿部零件之前,舵机必须居中。这边可以使用程序<span>centregs.ino</span>(同样可以在文末下载)将舵机设置为<span>90</span>

安装舵机和腿部

每个舵机带动一对腿,前后移动几度。舵机 1 和舵机 3 会同时移动,所以可以考虑在微控制器上使用相同的引脚去控制。

图片

舵机 2 是以相反的方向移动,并且摆动时会将腿正确的牵引到地面。这种摆动是由连接到舵机 1 的回形针产生的。将每个支腿安装到舵机上,这边你可能还需要钻孔。

图片

安装机械部分

安装时使用螺钉和回形针,通过腿的安装板将舵机 1 连接到舵机 2 的盖子上。这样就可以跟舵机 1 同步同角度倾斜。

图片

图片

安装头部和夹子

图片

头部的夹子造型其实不是必须的,但它有很好的额外功能。

将不带臂的舵机安装到框内。首先将舵机设置为 90(可参考<span>centreslegs.ino</span>)。将合适的夹子零件放在齿轮上,并用舵机螺钉固定。然后把第二部分放在轴上。

图片

用热胶水将夹子倒置地粘在头部,然后合上头部。把头放在躯干的顶部,并用胶水粘牢。

图片

安装尾部电池

将尾部连接到躯干上并粘合。它将容纳电池和微控制器。

图片

图片

威廉希尔官方网站 和软件

9V 的电池能够为舵机提供足够的能量,但电压必须通过降压转换器降低到 5V。

图片四个舵机的电源通过 5V 并联运行,数据线连接到 ESP32 开发板。它不需要更多的连接。不过,它还可以连接到传感器或 LED。

图片

图片

将文件名为<span>Blue_Ant-RemoteXY.ino</span>传输到 ESP32 开发板。同时遥控器已经包含在程序中。可参考<span>https://www.instructables.com/Getting-Started-With-ESP32-C3-XIAO/</span>

适用于 ESP32-C3 的舵机库:<span>ESP32C3Servo</span>

如果你使用的是其他ESP32或ESP8266,你需要在<span>// ************************* Servos</span>这块位置更改库:

/*
/ Blue Ant (2023) Markus Opitz
*/
// ************ RemoteXY *************
#define REMOTEXY_MODE__ESP32CORE_BLE
#include <BLEDevice.h>
#include <RemoteXY.h>

// RemoteXY connection settings
#define REMOTEXY_BLUETOOTH_NAME "ESP32-C3_Remote"

// RemoteXY configurate  
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =   // 43 bytes
  { 255,3,0,0,0,36,0,16,202,1,5,32,17,37,30,30,2,26,24,4,
  128,13,23,37,6,2,78,129,0,3,3,24,6,165,66,108,117,101,32,65,
  110,116,0 };
// this structure defines all the variables and events of your control interface
struct {

    // input variables
  int8_t joystick_1_x; // from -100 to 100  
  int8_t joystick_1_y; // from -100 to 100  
  int8_t slider_1; // =0..100 slider position
    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0
} RemoteXY;
#pragma pack(pop)
// *************************

// ************************* Servos
#include <ESP32C3_Servo.h>   //for ESP32-C3
//#include <Servo.h>         //for ESP8266
//#include <ESP32Servo.h>    //for ESP32-Wroom
Servo servo1;  Servo servo2;  Servo servo3;  // Servo3 is attacheched to same pin as Servo1 !!!
Servo Jaws;
int pos1, pos2;    // variable to store the servo position
int centerpos = 90;
int minpos = centerpos-12;
int maxpos = centerpos+12;
int gripper;
//int speed1;


void setup() {
  Serial.begin(115200);
  servo1.attach(2); servo2.attach(3); servo3.attach(4);  //Servo3 can be attached to same pin as Servo1 //GPIOs on ESP32-C3!
  Jaws.attach(5);
  delay(2);
  servo1.write(centerpos);servo2.write(centerpos-7);servo3.write(centerpos);  //center all servos
  Jaws.write(centerpos);
 delay(3000);

 RemoteXY_Init ();
}


void loop() {
   RemoteXY_Handler ();

    if ((RemoteXY.joystick_1_x) < -30) {
      //Serial.println("<-- left   ");
      left(16);
    }
    if ((RemoteXY.joystick_1_x) > 30) {
      //Serial.println("  right -->");
      right(16);
    }
    if ((RemoteXY.joystick_1_y) < -30) {
      //Serial.println(" backwards ");
      // not yet installed
    }
    if ((RemoteXY.joystick_1_y) > 30) {
      //Serial.println(" ^forward^ ");
      forward(16);
    }
    gripper = map((RemoteXY.slider_1), 0, 100, 75,105);
    Jaws.write(gripper);
    delay(1);
}


void forward(int speed1) {       //speed1 in ms as delay between steps

  for (pos1 = minpos; pos1 <= maxpos; pos1 += 2) {
    pos2 = map(pos1, minpos, maxpos, maxpos, minpos);

    servo1.write(pos1);servo3.write(pos1);Serial.print(pos1);Serial.print("  ");  // front/rear legs
    servo2.write(pos2);  Serial.print(pos2); Serial.println("");                  // center legs
    delay(speed1);
  }

  for (pos1 = maxpos; pos1 >= minpos; pos1 -= 2) {
    pos2 = map(pos1, minpos, maxpos, maxpos, minpos);

    servo1.write(pos1);servo3.write(pos1);      // front/rear legs
    servo2.write(pos2);
    delay(speed1);
  }
}


void right(int speed1) {           //speed1 in ms as delay between steps

  for (pos1 = minpos; pos1 <= maxpos; pos1 += 2) {
    pos2 = map(pos1, minpos, maxpos, maxpos, minpos);

    servo1.write(pos1+10);servo3.write(pos1+10);  // front/rear legs
    servo2.write(pos2+10);                           // center legs
    delay(speed1);
  }

  for (pos1 = maxpos; pos1 >= minpos; pos1 -= 1) {
    pos2 = map(pos1, minpos, maxpos, maxpos, minpos);

    servo1.write(pos1+10);servo3.write(pos1+10);      // front/rear legs
    servo2.write(pos2+10);            
    delay(speed1);
  }
}

void left(int speed1) {               //speed1 in ms as delay between steps

    //pos2 = maxpos + 1 -7; //-8 is to correct center position
  for (pos1 = minpos; pos1 <= maxpos; pos1 += 1) {
    pos2 = map(pos1, minpos, maxpos, maxpos, minpos);

    servo1.write(pos1-10);servo3.write(pos1-10);  // front/rear legs
    servo2.write(pos2-10);                           // center legs
    delay(speed1);
  }

  for (pos1 = maxpos; pos1 >= minpos; pos1 -= 2) {
    pos2 = map(pos1, minpos, maxpos, maxpos, minpos);

    servo1.write(pos1-10);servo3.write(pos1-10);      // front/rear legs
    servo2.write(pos2-10);            
    delay(speed1);
  }
}

源码文件可以在文末打包下载。

远程控制

图片

遥控器已包含在代码中。在<span>https://remotexy.com/</span>中,你可以为智能手机遥控器创建自己的界面,并将其插入到程序<span>Blue_Ant-RemoteXY.ino</span>中。

图片

手机APP可参考:

<span>https://play.google.com/store/apps/details?id=com.shevauto.remotexy.free</span>

<span>https://apps.apple.com/us/app/remotexy/id1168130280</span>

在手机上安装APP,激活蓝牙,打开<span>RemoteXY</span>,搜索并与配对<span>ESP32-C3_Remote</span>

完成

图片

现在你可以启动这只蚂蚁,等待片刻,激活APP,它就可以跑起来了。

更多回帖

发帖
×
20
完善资料,
赚取积分