DJI F450 조종 신호 분석

by Taylor
1 comment

[본 글은 드론 파일럿 커뮤니티 서비스 종료로 이관된 글 입니다]

[작성일 : 2015.01.26 01:26]


DJI F450 NAJA M PWM Signal Analysis


DJI F450 의 조종신호를 분석해 본 내용에 대해 정리 해보았습니다.

처음에 제가 DJI F450을 구매를 했을땐 Futaba 조종기와 연결이 되있었습니다.

최종적인 목표는 쿼드콥터를 ARM 리눅스 보드로 제어하는 것 이었기 때문에 제가 선택할 수 있는 방법은 두가지가 있었습니다.

첫째는 DJI F450 컨트롤러인 NAJA-M를 제거한 뒤 모터를 수동으로 제어하는 법

두번째는 DJI F450의 컨트롤러 NAJA-M를 사용하면서 조종기가 발생시키는 신호를 시뮬레이션 해서 제어하는 법

이었습니다.

많은 분들은 첫번째 방법으로 많이 하시는것 같습니다만 저는 프로젝트 기간이 그리 길지 않았고 하나의 소프트웨어로 다양한 기종에 적용하고 싶었기 때문에 두번째 방법을 사용하였습니다.

여기서 다양한 기종에 적용을 할 수 있다는 것은 하나의 조종기를 쿼드콥터와 비행기에 장착시켜도 작동하는 것과 같이 여러 기체에서 공용으로 사용되는 연결방식(인터페이스)를 지원하게 되면 다양한 기종에서도 사용할 수 있다는 뜻 입니다.

따라서 저는 기존 조종기가 발생시키는 신호를 분석해서 조종을 하는 가장 기본적인 것 부터 시작하였습니다.

일단은 분석하기에 앞서 구글에 검색을 해서 일을 조금 덜어보려 했지만 아무리 검색해도 신호분석에 대한 글은 없더군요..

제가 유별난건지 아니면 사람들이 관심이 없었던건지 모르겠습니다.

그래서 오실로스코프로 조종기 수신기에서 나오는 신호를 분석하기 시작하였습니다.


확인해보니 1.5ms 동안 신호를 보내고 있네요!

한칸이 500us 입니다 (1000us = 1ms)

그럼 조종기를 한번 움직여볼까요 

확인해보니 최소 1.0ms 최대 2.0ms 를 보내고 있는것을 확인하였습니다.

1.0ms 일 경우 최소 2.0ms 일 경우 최대인것이죠

1.0ms 일 경우엔 스로틀이 최저 2.0ms 일 경우 스로틀이 최대가 되는것 입니다.

주기는 20ms

즉 20ms 마다 1.0ms ~ 2.0ms 의 신호를 보내어 쿼드콥터를 조종을 하는것 입니다.

20ms 마다 반복되는 모습 보이시죠?

한 칸이 5ms입니다.

조금 더 테스트를 해보았는데 그 결과는 이렇게 나왔습니다.

1.0 ms   <---------->   2.0ms

오른쪽                       왼쪽

기수상승                기수하강

스로틀최저            스로틀최대

일반적으로는 1.0 이 왼쪽 2.0이 오른쪽 일 것 같은데 반대네요 이 부분은 주의하셔야 할 것 같습니다.

AILE, ELEV, THRO, RUDD 는 위를 참고하시면 됩니다.

AUX1 의 경우는 비행모드 설정에 대한 신호입니다.

모드는 총 3가지가 있습니다.

ms신호는 F450 시스템 셋팅에 따라 다를수 있으니 참조 하시어 수정하시기 바랍니다.

GPS 모드 – 1.86ms – 자동으로 고도,위치 고정 / 자동으로 수평유지

Attitude 모드 – 1.52ms – 자동으로 고도 고정 / 자동으로 수평유지

Manual 모드 – 1.20ms – 수동모드 / 수평유지 안함


AUX2 의 경우는 기체의 기수방향 모드에 대한 신호입니다.

모드는 총 2가지가 있습니다.

일반모드 – 1.86ms – 기체 앞 부분이 향하는 곳이 앞쪽 방향으로 인식

고정모드 – 1.20ms – 북쪽방향이 기체의 앞쪽 방향으로 인식 (라디오 조종기를 사용할때 어느부분이 기체의 앞쪽방향인지 모를때 유용한 기능인것 같습니다)

저는 일반모드로 해놓고 계속 사용하였고 아두이노 코드도 그렇게 되어있습니다.

EXT1 은 사용하지 않습니다.

그럼 이제 분석한 결과를 토대로 ARM 보드로 쿼드콥터를 제어해보려 합니다.

제가 사용한 ARM보드는 ODROID-X2 모델입니다.

쿼드코어라서 성능에 걱정은 없었습니다.

그럼 이 보드의 GPIO포트(신호 출력을 위한 포트)와 NAJA 컨트롤러를 연결해보도록 하겠습니다.


그리고 GPIO PIN MAP에 따라 리눅스 디바이스 드라이버를 만들어서 시도를 했습니다만..

대실패를 하고 말았습니다.

제가 사용한 OS가 Ubuntu 12.04 였는데 일반적인 리눅스에서는 시스템 커널이 최우선이고 커널단에서 여러가지 프로그램들이 돌아가고 있기 때문에 Clock 신호(위의 조종신호와 같은 주기적인 신호)와 같은 정밀한 신호는 출력하기가 힘들다고 합니다.

만약 리눅스를 사용하면서 Clock를 출력하고 싶다면 리눅스를 커널단 부터 수정해서 직접 빌드한 후 사용하거나 RTOS를 사용해야 하는데 커널단부터 수정하기에는 시간도 너무 오래걸리고 안정성을 보장을 할 수가 없어서 불가능하고 RTOS를 사용하게 되면 Ubuntu 의 장점인 여러가지 어플리케이션들을 사용할 수 없게 되어 이것도 불가능했습니다.

그래서 한참을 고민하다 결국 처음부터 생각하고 있었던 차선책인 아두이노를 Clock신호를 발생시키는 용도로 사용하기로 하였습니다.

이 부분에 있어서 만약 호스트 머신인 ARM보드가 시스템 에러로 죽어도 재부팅 되는 동안 아두이노가 계속 쿼드콥터를 조종해 줄 수 있기 때문에 더 안전한 구조가 되었습니다.

한정적인 배터리 자원에서 전력을 사용하는 기기가 더 늘어 비행시간은 줄어들겠지만 여러가지 요인을 따져보면 이 방법이 가장 최선이었던것 같습니다.

이렇게 아두이노와 NAJA-M 컨트롤러를 연결해 주었습니다.


이렇게되면 NAJA-M 컨트롤러는 조종기가 연결된 것으로 인식하게 됩니다.

위에 적었던 신호 분석결과에 맞추어 아두이노를 프로그래밍 한 뒤 실행시키자 F450 LED가 노란색(조종기 탐색중)에서 초록색(조종기 찾음)으로 바뀌었습니다.

잘 인식되는것을 확인하고 아두이노를 종료시키니 F450 LED가 빨간불로 바뀌며 조종기 연결이 끊어졌다는걸 표시합니다.

일단 임시로 이렇게 올려두었는데 실제 비행때는 잘 고정시켜야 할 듯 합니다.

그리고 이제 실제 조종을 위해 아두이노 코드를 실제 사용을 위해 ARM보드에서 보내오는 조종신호를 NAJA-M 컨트롤러로 보내는 코드로 프로그래밍 한 뒤 ARM 보드에 연결하고 Ubuntu 위에 간단한 Python 서버와 PC에서 C#으로 클라이언트를 만들었습니다.

위의 사진은 PC에서 조이스틱을 통해 쿼드콥터를 조종하게 해 줄 클라이언트 입니다.

이 사진은 프로젝트가 많이 진행되었을 때의 사진인데 이해를 위해 가져왔습니다.

ARM보드에 카메라를 달아 실시간 영상도 볼 수 있습니다.


오른쪽에 숫자가 많은것이 ARM보드에 올라가있는 Python 서버로 가운데 PC 클라이언트에서 보내는 조종신호를 받아 아두이노로 전송하여 최종적으로 쿼드콥터를 조종하게 됩니다.

내부망에서 테스트를 해서 딜레이는 거의 없었고 아주 매끄럽게 잘 조종되었습니다.

이제 이 코드를 응용해서 실제 비행을 위한 코드를 만들면 될 것 같습니다.

– 첨부

DJI NAZA-M 컨트롤러 제어에 사용된 아두이노 코드입니다.

https://github.com/taylor224/DJI-Naja-M-Remote-Controller/blob/master/arduino.c

아두이노에 해당 코드를 컴파일하여 넣어주신후

아두이노 디지털 핀 2, 3, 4, 5, 6, 7, 8 번 포트에 각각 DJI NAZA-M 의 

AILE, ELEV, THRO, RUDD, MODE, AUX1, AUX2 와 연결하여 주시면 됩니다.

그리고 NAZA-M 컨트롤러의 접지( – 단자) 를 아두이노의 GND(Ground) 에 연결하여 주셔야 합니다.

NAZA-M 의 AILE 등 조종기를 연결하는 부분의 핀이 2개씩 있는데 그 중 어떤핀이 접지이고 어떤핀이 신호를 넣는 핀인지 확인을 하셔야 합니다.

위처럼 하신 후 아두이노를 115200bps 시리얼로 연결하신 후 아래와 같은 신호를 보내주시면 됩니다.

>1000:1000:1000:1000:1/

> 는 시작을 뜻하고 /는 끝을 뜻합니다.

순서는 첫번째부터 AILERON, ELEVATOR, THROTTLE, RUDDER, MODE 입니다.

값은 0~1000 까지 있습니다.

MODE와 THROTTLE을 제외한 모든값은 위에서 말한 방식이 적용됩니다(왼쪽은 높은값, 오른쪽은 낮은값).

예시: 

왼쪽으로 최대 1000

오른쪽으로 최대 0

THROTTLE 의 경우 0이 최저 1000이 최대입니다.

MODE 는 1 (GPS) , 2 (Attitude) , 3 (Manual) 입니다.

멀티콥터 모터 시동은 일반 조종기처럼 신호를 보내주시면 됩니다.

1 comment

lhwdev 2017-04-03 - 20:58

안녕하세요 쿼드콥터 제작중인학생입니다.
pc로 드론을 조종하려 하고 있습니다.
관련자료가 절실한 상황인데, 혹시나 도움 주실 수 있으시다면
답글이나 [email protected] 메일 부탁드립니다..
좋은하루되세요!

Reply

Leave a Comment