드론

1-6 아두이노 드론 YMFC-3D_receiver 인터럽트 과정

coding art 2017. 10. 24. 13:46
728x90

아두이노 우노 보드에서의 YMFC-3D 코드 수신기로 사용되는 RX 701의 수신 데이타를 어떻게 처리하는지 알아보자. RX 701의 4채널 데이터 ELEV, AILE, THRO, YAW 는 디지털 데이터 핀 8, 9, 10, 11 번에 연결된다. 이 4개의 배선은 항상 빠른 속도로 스캔을 통해서 데이터 수신이 가능하도록 해당 핀 별로 인터럽트 레지스터 세팅 상태로 처리가 되어 있어야 한다.


아울러 전역 변수들로 설정된 4개의 변수들(int receiver_input_channel_1,∙∙∙) 을 대상으로 volatile 선언을 추가하도록 하자.

인터럽트가 일어나게 되면 아두이노 메인 코드에서 ISR() 루틴 즉 Interupt Service Routine이 포함되어 있으면 인터럽트 처리 작업을 하여 예를 들자면 전역 변수 즉 receiver_input_channel_1에 필요한 값을 저장한다.



ISR() 루틴의 채널 1 코드 if 문에서 사용되는 && 와 & 연산자는 각각 불리언(Boolean) AND 와 비트별 AND를 뜻한다. 명제 PINB & B00000001에서 PINB 는 PORTB 즉 디지털 핀 8,9,10,11,12,13을 처리하는 읽기 전용(read only) 레지스터인데 즉 첫 번째 비트가 ‘1’인가 즉 & B00000001를 테스트한다. 참(True)이면 즉 B00000000에서 B00000001로 바뀌었으면 이 명제의 시험 결과는 참이 된다. 아울러 last_channel_1 의 값이 0 이면서 앞서 시험한 명제가 참이라면 불리언 연산 && 에 의해 그 결과는 참이므로 뒤따르는 if 문을 실행하게 된다.
즉 last_channel_1을 1로 두고 지금 현재의 시간을 μsec 단위로 체크하기 위해서 micros()를 불러 그 값을 timer_1에 저장한다. micros()는 millis() 와 마찬가지로 아두이노에서 다루는 가장 큰 정수 즉 unsigned int로 선언되어 있어야 한다.

이어지는 else if에서는 !(PINB & B00000001) 즉 명제 (PINB & B00000001) 의 부정 즉 거짓(False) 여부를 체크한다. 즉 거짓이라면 이미 PORTB 의 첫 번째 비트 값이 1에서 0으로 바뀌었다는 뜻이며 동시에 last_channel_1이 1이라면 채널의 인터럽트 과정이 완료되었으므로 micros()를 불러 현재까지의 경과 시간을 체크하고 앞서 인터럽트 시작때 체크했던 timer_1 의 값을 빼면 순수 경과 시간이 계산된다. 즉 RX 701 수신기에서 입력된 1000∼2000 μsec 단위인 PITCH 스틱의 듀티 시간 값이 얻어지게 되는데 여기서는 receiver_input_chammel_1 로 명명했는데 YMFC-3D_setup 코드에서는 receiver_input[] 어레이 형식으로 저장해 두었다가 convert_receiver_channel() 루틴에서 불러서 사용한다.

이와 같이 인터럽트 핀 상태 변화가 감지 될 때마다 한번씩 ISR() 루틴이 호출되어 PITCH, ROLL, THRO, YAW 값을 체크하게 된다.

YMFC-3D_receiver 코드를 실행 시킨 상태에서 스틱의 최대 최소값을 조사해 보면 아래의 결과를 얻을 수 있다.
 
            1100≤   PITCH   ≤1900
            1100≤    ROLL   ≤ 1900
            1100≤ THROTTLE≤ 1900
            1100≤    YAW   ≤ 1900 

코드에서 PITCH 는 Nick THROTTLE은 GAS 로 표현됨에 유의한다. 스틱의 중앙 값은 다음과 같다.



여기서 주의할 점은 YMFC-3D 싸이트에서 Futaba 송신기를 사용하여 수신기를 체크하는 과정에서 스틱 별 + 및 _ 방향 설정에 유의해야 한다. DEVO 7 송신기와 YMFC-3D 싸이트 Futaba 송신기와 Nick에서 부호의 차이점이 체크되었다.  YMFC-3D 싸이트에서는 우측 스틱을 아래로 당기면 PITCH + 방향으로 설정하고 있는데 반해 DEVO 7 에서는 우측 스틱을 위로 밀면 + 방향이 된다. 따라서 DEVO 7 송신기에서 PITCH에 해당하는 ELEV(ELEVATOR) 값을 REV(역전, 반대)로 설정해야 한다.



YMFC-3D_V2 코드는  Futaba 송신기를 사용하는 YMFC-3D 코드와는 달리  DEVO 7  송신기에서 실제로 생성되는 1100∼1900 사이의 스틱 신호 값을 막바로 receiver_input_channel_3 와 receiver_input_channel_4 에 입력하는 것이 아니라 convert_receiver_channel() 루틴을 거쳐서 1000∼2000 사이의 신호 값으로 환산하여 입력하게 되어 있다. 즉 송신기의 종류에 관계없이 사용할 수 있도록 스마트하게 처리하는 과정이다.
_____________________________________________________________?????
DEVO 7 송신기 신호를 convert_receiver_channel() 루틴을 사용해 변환해 주는 과정에 관해서 살펴보자. 아래의 데이터는 YMFC-3d_setup 코드 실행과정에서 생성된 좌우 스틱의 데이터로서 setup 이 성공적이라면 아두이노의  eeprom 메모리에 정되어 비해제어 코드 실행 시에 eeprom 메모리에서 불러내어 사용하게 된다.


방금 읽은 특정 채널의 receiver_input[] 값에 대해서 각 채널별로 eeprom 메모리에 저장되어 있는 PITCH, ROLL, THRO, YAW 스틱의 LOW,CENTER,HIGH 값들을 YMFC-3D_V2_Flight_controller 코드 시작단계에서 모두  eeprom에서  불러내 어레이에 저장하였다가 필요한 값을 불러 변환을 수행한다.