아두이노 나노로 플라이트기어(FlightGear)용 컴팩트 아날로그 트림 탭 휠 만들기
부품 및 소모품
| 아두이노 나노 R3 (또는 호환 보드) |
1개 |
| 로터리 포텐셔미터 (가변저항) |
1개 |
| 전해 커패시터 100µF |
1개 |
| Adafruit SSD1306 0.96인치 OLED (I2C) |
1개 |
| 점퍼 와이어 |
1세트 |
앱 및 온라인 서비스
- 아두이노 IDE
- 아나콘다 (Anaconda) - 파이썬 환경
- 플라이트기어 (FlightGear) 비행 시뮬레이터
프로젝트 개요
플라이트기어에서 항공기의 엘리베이터 트림 탭을 제어하는 작고 저렴한 아날로그 휠 컨트롤러를 만듭니다. 아두이노만으로는 시리얼 통신으로 플라이트기어에 직접 명령을 보낼 수 없어, 파이썬 스크립트를 거쳐 UDP 패킷으로 변환 전송하는 방식입니다.
트림 휠이란?
조종사가 조종간(엘리베이터)에 힘을 주지 않고도 원하는 피치 자세를 유지하도록 트림 탭(보조 날개)을 조절하는 아날로그 장치입니다.
소프트웨어 준비
파이썬 라이브러리 설치 (아나콘다 프롬프트)
>>> conda install -c anaconda pyserial
# socket, sys도 필요시 설치
코드 구성 (3개 파일)
1. 아두이노 스케치 (arduinoElevatorTrimOLED.ino)
포텐셔미터 값을 읽어 -100~100 범위로 매핑하고, OLED에 게이지와 수치를 표시합니다. U8glib 라이브러리 필요. 디스플레이 없이도 동작 가능.
#include
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);
int potPin = A6;
int p, w, m; // 원시값, 매핑값(-100~100), 게이지 각도(0~90)
void loop() {
p = analogRead(potPin);
w = map(p, 0, 1023, 100, -100); // 방향 반대로 하려면 100, -100 순서 변경
m = map(p, 0, 1023, 90, 0); // 게이지 바늘 각도
Serial.print((p - 512.0) / 512.0); // -1.0 ~ 1.0 정규화 값 전송
Serial.print("\n");
// OLED 게이지 그리기 루틴...
delay(10);
}
2. 파이썬 스크립트 (arduinoElevatorTrim.py)
아두이노 시리얼 데이터를 읽어 UDP로 플라이트기어에 전송합니다. 포트와 시리얼 포트(예: COM4) 설정이 필요합니다.
#!/usr/bin/python
import sys, serial
from socket import *
host = "localhost"
port = 21567
addr = (host, port)
UDPSock = socket(AF_INET, SOCK_DGRAM)
tty = "COM4" # 아두이노 포트로 변경
ser = serial.Serial(tty, 9600)
prevline = ""
while 1:
line = ser.readline()
if line != prevline:
print(line)
UDPSock.sendto(line, addr)
prevline = line
3. 플라이트기어 프로토콜 XML (arduinoElevatorTrim.xml)
<FlightGearRoot>/data/protocol 폴더에 한 번만 복사하면 됩니다.
\n
,
Elevator trim
/controls/flight/elevator-trim
float
실행 방법
- 아두이노 스케치 업로드 (디스플레이 타입에 맞게 2번째 줄 수정)
- 파이썬 스크립트 실행:
python arduinoElevatorTrim.py
- 플라이트기어 실행 시 다음 인자 추가 (띄어쓰기 없음!):
--generic=socket,in,30,localhost,21567,udp,arduinoElevatorTrim
회로도
프리칭 회로도 참조. OLED 그라운드 선은 아두이노 나노 아래로 배선 가능.
참고 자료
깃허브 저장소에서 전체 코드와 파일 다운로드 가능.