-
3. 추력 편향 베인만들어보기/모노콥터 2023. 4. 9. 18:31
EDF 밑에 붙어서 전후좌우로 추력 편향을 해줄 베인(vane)을 설계해 보자.
4엽
처음에는 Bell Drone이나 AIM-9X 미사일처럼 4개의 베인을 사용하고자 했다.
두 개의 판이 같은 각도로 위치하여, 두 쌍의 베인이 만들어 내는 벡터의 합으로 롤(roll) 방향에 영향을 주지 않고 손쉽게 피치(pitch), 요(yaw)의 제어가 가능하다.
같은 각도의 베인 두 개를 서로 다른 방향으로 움직이면 롤 제어가 가능하다.
그러니까 머리를 쓸 필요가 없다. 원하는 방향과 베인 사이의 각도에 sin값만 넣으면 된다.
그런데...
예상 밖의 문제
모터의 축에 브라켓을 고정하던 중, 축이 그대로 모터와 분리되어 버렸다.
모터를 다시 주문해야 하나... 싶었지만
잘 생각해 보면 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