본문 바로가기
로봇프로젝트

파란 로봇 개미 - Blue Robot Ant

by 모빌리티키즈 2023. 11. 27.
728x90

개미는 놀라운 생물입니다. 적은 자원만으로도 많은 일을 할 수 있습니다.

많은 육각형 로봇은 한 다리당 최대 세 개의 서보 모터가 필요합니다. 이는 총 18개의 서보 모터로, 엄청난 양의 에너지를 소모합니다. 이는 개미의 경제와 상충됩니다.

오직 세 개의 서보 모터(+1 그리퍼)와 약간의 기계 구조만으로, 저는 최소주의적인 개미 로봇을 만들어 냈습니다. (114g + 배터리)

이 프로젝트를 진행하기 위해서는 아두이노에 대한 기본적인 지식이 필요합니다.

 

이 프로젝트를 수행하려면 Arduino에 대한 기본 지식이 필요합니다.

공급

3 (+1) 자동 귀환 제어 장치 SG90

ESP32-C3 XIAO 또는 다른 ESP32 / ESP8266 (더 많은 공간이 필요함)

클립

작은 나사

5V 벅 컨버터 MP1584

9V 또는 7.4LiPo 배터리

3D 프린터

모든 부품은 Tinkercad로 설계 되고 Ultimaker Cura로 준비되었습니다.

Blue+Robot+Ant-Tail.stl
0.66MB
Blue+Robot+Ant-Cap.stl
0.00MB
Blue+Robot+Ant-Leg.stl
0.07MB
Blue+Robot+Ant-Torso.stl
0.02MB
Blue+Robot+Ant-Head.stl
0.35MB

1단계: 몸통

펜치/톱으로 모든 서보의 탭을 제거하고 file.

섀시를 인쇄하고 그림과 같이 두 개의 뾰족한 나사로 서보 2를 고정합니다. 중앙 서보는 스윙할 수 있어야 합니다. 또한 나중에 나사를 고정할 수 있는 작은 캡이 있습니다.

서보 1과 3과 서보 2의 캡을 뜨거운 접착제로 고정합니다.

다리를 장착하기 전에 서보가 중앙에 있어야 합니다! 이렇게 하려면 작은 프로그램 centerlegs.ino를 사용하여 서보를 90으로 설정합니다.

centerlegs.ino
0.00MB

2단계: 서보 및 다리 부품

각 서보는 다리 쌍을 가지고 있으며 앞뒤로 몇 도만 움직입니다. 서보 1과 3은 동시에 움직이기 때문에 둘 다 마이크로 컨트롤러에서 동일한 핀을 사용하는 것에 대해 생각할 수 있습니다.

서보 2는 반대 방향으로 움직이며 스윙하여 다리의 오른쪽 견인력을 지면에 가져와야 합니다. 이 스윙은 클립으로 연결된 서보 1에 의해 발생합니다.

다리를 인쇄하고 각각을 서보에 장착합니다. 구멍을 약간 뚫어야 할 수도 있습니다.

3단계: 메카닉 설치

나사와 종이 클립을 사용하여 서보 1 다리의 장착 플레이트를 서보 2의 캡에 연결합니다. 이제 서보 1과 함께 리듬에 맞게 기울어져야 합니다.

4단계: 헤드 및 그리퍼

그리퍼는 실제로 필요하지는 않지만 좋은 추가 기능입니다.

암이 없는 서보를 프레임에 삽입합니다. 먼저 서보를 90(2단계의 "centrelegs.ino")으로 설정합니다. 일치하는 그리퍼 부분을 기어 휠에 놓고 서보 나사로 고정합니다. 그런 다음 두 번째 부분을 축에 놓습니다.

뜨거운 접착제로 그리퍼를 머리 꼭대기에 거꾸로 붙이고 헤드를 닫습니다. 머리를 몸통 끝에 대고 붙입니다.

Gripper2.stl
0.02MB
Gripper1.stl
0.16MB

4단계: 헤드 및 그리퍼

그리퍼는 실제로 필요하지는 않지만 좋은 추가 기능입니다.

암이 없는 서보를 프레임에 삽입합니다. 먼저 서보를 90(2단계의 "centrelegs.ino")으로 설정합니다. 일치하는 그리퍼 부분을 기어 휠에 놓고 서보 나사로 고정합니다. 그런 다음 두 번째 부분을 축에 놓습니다.

뜨거운 접착제로 그리퍼를 머리 꼭대기에 거꾸로 붙이고 헤드를 닫습니다. 머리를 몸통 끝에 대고 붙입니다.

6단계: 전자 및 소프트웨어

9V 배터리는 서보에 충분한 에너지를 공급하지만 전압은 벅 컨버터에 의해 5V로 감소해야 합니다.

5개의 서보용 전원 공급 장치는 32V를 통해 병렬로 실행되며 데이터 와이어는 ESP32에 연결됩니다. 더 많은 연결이 필요하지 않습니다. 또한 센서나 LED를 부착할 수 있습니다.

소프트웨어 "Blue_Ant-RemoteXY.ino"는 ESp32로 전송되어야 합니다. 이에 대한 정보는 ESP32-C3 시작하기에서 찾을 수 있습니다.

또는

https://www.instructables.com/Getting-Started-With-ESP32-C3-XIAO/

7단계의 리모컨은 이미 프로그램에 포함되어 있습니다.

 

ESP32-C3용 서보 라이브러리: https://github.com/songzhishuo/ESP32C3Servo

 

ESP32 또는 ESP8266를 사용하는 경우 라이브러리 를 변경해야합니다.

**************** 서보

 

/*
/ 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);
  }
}

Blue_Ant-RemoteXY.ino
0.00MB

7단계: RemoteXY 제어

원격 comtrol은 이미 코드에 포함되어 있습니다(표시된 코드 줄 참조).

https://remotexy.com/ 스마트폰 리모컨을 위한 자신만의 인터페이스를 만들어 "Blue_Ant-RemoteXY.ino" 프로그램에 삽입할 수 있습니다. 이 자습서에서 자세한 정보를 찾을 수 있습니다.

https://www.instructables.com/RemoteXY-Editor-How-to-Control-DC-Motor-With-Smart/

 

스마트폰용 앱은 여기에서 사용할 수 있습니다.

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

https://apps.apple.com/us/app/remotexy/id1168130280

 

스마트폰에 앱을 설치하고, 블루투스를 활성화하고, "RemoteXY"를 열고, 검색 및 페어링

"ESP32-C3_Remote"입니다.

Ant를 켜고 잠시 기다렸다가 앱을 활성화하십시오.

 

728x90