ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3. 추력 편향 베인
    만들어보기/모노콥터 2023. 4. 9. 18:31

    EDF 밑에 붙어서 전후좌우로 추력 편향을 해줄 베인(vane)을 설계해 보자.

    4엽

    처음에는 Bell Drone이나 AIM-9X 미사일처럼 4개의 베인을 사용하고자 했다.

    노즐 안에 보이는 노란색 판이 추력 편향 베인이다.

    두 개의 판이 같은 각도로 위치하여, 두 쌍의 베인이 만들어 내는 벡터의 합으로 롤(roll) 방향에 영향을 주지 않고 손쉽게 피치(pitch), 요(yaw)의 제어가 가능하다.

    같은 각도의 베인 두 개를 서로 다른 방향으로 움직이면 롤 제어가 가능하다.

     

    그러니까 머리를 쓸 필요가 없다. 원하는 방향과 베인 사이의 각도에 sin값만 넣으면 된다.

    그런데...

     

    예상 밖의 문제

    서보모/터

    모터의 축에 브라켓을 고정하던 중, 축이 그대로 모터와 분리되어 버렸다.

     

    생존한 모터 3개

    모터를 다시 주문해야 하나... 싶었지만

    잘 생각해 보면 3개의 베인으로도 원하는 바를 이룰 수 있을 것 같다.

    오히려 베인이 줄어드는 만큼 무게와 전체 추력에서는 이득을 보는 게 아닐까?

     

    3엽으로 설계

    그래서 3개의 방향으로 필요한(pitch, yaw, roll) 제어를 전부 할 방법을 찾아보기로 하였다.

     

    4개의 베인을 사용할 때와 가장 다른 것은, 롤 중심축을 기준으로 마주보는 베인이 없어 롤 평형을 맞추어 줄 필요가 있다는 것이다.

    대충 이런 느낌?

    4엽의 경우는 같은 방향의 베인 두 개를 동일하게 움직이면 어떠한 돌림힘도 만들어지지 않는다.

    따라서 두 그룹의 베인이 만들어내는 힘의 합으로 간단하게 원하는 제어량을 얻을 수 있는 반면,

    3엽의 경우는 한 베인이 만들어내는 돌림힘을 각도가 다른 두 베인이 상쇄시켜야 한다.

    그러면서 동시에 원하는 방향으로 전체 합력이 존재하여야 한다.

     

    그런데 대충 그려놓고 보니 어라?

    적당히 끼인각의 sin값의 비만큼 제어하면 되는 게 아닐까? 싶어졌다.

    어차피 머리 굴리는 건 공짜니까 빠르게 계산해보자.

    어째 맞는 것 같다?

    얼추 맞는 것 같은 느낌... 수능 기하 문제를 그림만 보고 찍어 맞춘 내 직감이 이게 맞다고 한다.

    이렇다면 제어 로직도 쉽게 만들 수 있겠다.

    #include <Servo.h>
    
    #define SERVO_ANGLE_MIN -45.0
    #define SERVO_ANGLE_MAX 45.0
    #define SERVO_RAW_MIN 1000
    #define SERVO_RAW_MAX 2000
    #define SERVO_1_ANGLE 30.0
    #define SERVO_2_ANGLE 150.0
    #define SERVO_3_ANGLE 270.0
    
    Servo servo1;
    Servo servo2;
    Servo servo3;
    
    double target_angle;
    double target_power;
    
    double servo1_angle;
    double servo2_angle;
    double servo3_angle;
    double servo1_pos;
    double servo2_pos;
    double servo3_pos;
    
    void setup() {
      servo1.attach(9, SERVO_RAW_MIN, SERVO_RAW_MAX);
      servo2.attach(10, SERVO_RAW_MIN, SERVO_RAW_MAX);
      servo3.attach(11, SERVO_RAW_MIN, SERVO_RAW_MAX);
    
      Serial.begin(9600);
    }
    
    void loop() {
      // 목표 각도 지정
      target_angle = random(0, 360);
      target_power = random(0, 100) * 0.01;
    
      // 각 서보 모터의 각도를 지정
      servo1_angle = 45.0 * sin(radians(target_angle - SERVO_1_ANGLE)), -1, 1, SERVO_ANGLE_MIN, SERVO_ANGLE_MAX;
      servo2_angle = 45.0 * sin(radians(target_angle - SERVO_2_ANGLE)), -1, 1, SERVO_ANGLE_MIN, SERVO_ANGLE_MAX;
      servo3_angle = 45.0 * sin(radians(target_angle - SERVO_3_ANGLE)), -1, 1, SERVO_ANGLE_MIN, SERVO_ANGLE_MAX;
    
      // 동작에 필요한 펄스 시간 계산
      servo1_pos = servo1_angle * target_power * (500.0 / 45.0) + 1500.0;
      servo2_pos = servo2_angle * target_power * (500.0 / 45.0) + 1500.0;
      servo3_pos = servo3_angle * target_power * (500.0 / 45.0) + 1500.0;
    
      // 각 서보 모터에 입력 값을 적용
      servo1.writeMicroseconds(servo1_pos);
      servo2.writeMicroseconds(servo2_pos);
      servo3.writeMicroseconds(servo3_pos);
    
      Serial.println();
      Serial.println(servo1_angle);
      Serial.println(servo2_angle);
      Serial.println(servo3_angle);
    
      delay(1000);
    }

    대충 이런 느낌으로.

     

    뭔가 돌아가는 걸 테스트해보려면 빨리 컨트롤러 연결을 구현해야 할 것 같다.

    EDF 때처럼 시리얼 입력으로 하나하나 하기에는 어림도 없을 것 같으니...

    '만들어보기 > 모노콥터' 카테고리의 다른 글

    5. 가조립  (0) 2023.04.30
    4. 컨트롤러 구성  (0) 2023.04.24
    2. EDF 테스트  (0) 2023.03.30
    1. 부품 선정  (0) 2023.03.13
    0. 들어가며  (0) 2023.03.07
Designed by Tistory.