본문 바로가기

프로젝트 (Project)/쿼드콥터 (Quadcopter)

[ZMR250] 3. 인터럽트 수신 및 송수신기 세팅, 바인딩

기체 프레임과 모든 부품의 준비는 끝났다. 이제는 송수신기를 연결하고, 제어기로 값을 읽어 기체를 제어하기만 하면 된다.
먼저 송신기와 수신기를 연결하여 서로가 통신이 되도록 하여야한다.
바인딩은 송신기와 수신기의 주파수를 동일하게하여 연결하는 작업을 말하는데, 그 작업은 간단하다.

조종기에는 왼쪽하단에 [ BIND KEY ] 가 있고, 수신기의 경우 바인드를 위한 쇼트핀을 함께 제공한다.
수신기의 [ B/VCC ] 포트에 쇼트핀을 연결하고 전원을 켠다. 이후 송신기의 [ BIND KEY ]를 누른 상태로 전원을 켜면 두 송수신기 사이에 연결이 성공적으로 된 것이다.

조종기에는 총 10개의 신호를 보낼 수 있는 부품들이 있는데, 조이스틱 4개, 토글 스위치 4개, 가변저항 2개이다.
FS-IA6 수신기는 6개의 신호를 받을 수 있는 수신기로 비행을 하는 것에 있어 4개의 신호만 있어도 된다.

나는 토글 스위치로 드론의 시동 역할을 구현할 것이기 때문에 6개의 신호를 모두 사용할 것이다.
그러기 위해서는 조종기의 기본 설정을 수정해야한다.

[ OK ] 버튼을 길게 누르면 설정 메뉴가 나온다.
[ System Setup ] 으로 들어가서 다음 사진을 참고해 설정해주면 된다.
이건 각자 조종, 코딩 등의 취향이니 어디까지나 참고자료이다.

스틱 모드를 들어가면 조이스틱의 값을 각각 몇 채널에 송신할 것인지를 선택한다.

스위치 설정을 통해 송수신에 사용할 스위치를 설정한다.

메인설정에서 [ Functions Setup ] 으로 들어가면 채널 설정이 나오는데 앞서 설정한 조이스틱 외의 채널 값을 설정할 수 있다.
만약 앞에 스위치 설정에서 채널을 10개로 설정했다면 추가적인 채널 역시 수정이 가능하다.
하지만 6채널의 수신기를 사용하기 때문에 6개를 설정했다.

수신기는 기본적으로 PWM 신호로 값을 전달하는데, 필요에 따라서 i-BUS 프로토콜 통신을 사용하여 값을 전달할 수도 있다. 이 역시 조종기에서 설정할 수 있다. i-BUS 프로토콜 통신은 따로 포스팅 하겠다.

PWM 신호를 제어기에서 수신받아 사용하면 된다.
아두이노에서 알려진 PWM 신호를 읽는 방법은 pulseIn 함수를 사용하는 것이다.
하지만 드론은 실시간 처리를 하고, pulseIn 함수를 사용하는 동안에는 아무것도 할 수가 없기 때문에 PWM 신호를 읽는 기능을 따로 만들어야한다.

아두이노 나노는 Atmega 칩으로 제작되어 모든 핀에 한에 PinChange 인터럽트를 사용할 수 있다.
공식 레퍼런스는 다음 주소를 참고하자
https://playground.arduino.cc/Main/PinChangeInterrupt/

 

Arduino Playground - PinChangeInterrupt

Simple Pin Change Interrupt on all pins It is possible to use pin change interrupts on "all" pins of the arduino using Pin Change Interrupt Requests. The example below uses some macros from the pins_arduino.h library. The interrupt can be enabled for each

playground.arduino.cc

위 방식이 사용하기 어렵다면 다음 주소의 레퍼런스를 참고해보자
https://playground.arduino.cc/Main/PinChangeIntExample/

 

Arduino Playground - PinChangeIntExample

PinChangeInt Example This code counts the number of times pin 15 (aka Analog 1) changes state and prints the count when it recives a p on the serial port. /* Copyright 2011 Lex.V.Talionis at gmail This program is free software: you can redistribute it and/

playground.arduino.cc


나는 2, 3, 4, 5, 6, 7번 포트 총 6개를 수신기로부터 읽을 것이다.

위 처럼 인터럽트를 설정하여 코딩하면 loop() 함수를 진행하는 동안에도 딜레이에 관계없이 수신기의 값을 읽을 수 있다.

배선의 경우 전원 5V, GND, CH1 ~ CH6번 핀을 연결하면 된다. CH1 ~ CH6번 핀은 2번 ~ 7번 핀을 사용하였다.

위 제어기는 다른 드론을 제작하며 사용했던 참고가 되길 바란다.

제어기와 전원을 연결하고 나머지 모든 핀은 단일 포트로 연결하면 된다.

더 자세한 사항은 위 영상으로 참고하면 좋을 것 같다.
PinChange 인터럽트는 아두이노 또는 제어기 칩셋의 데이터시트를 참고하면 알 수 있다.

다음으로는 MPU6050을 추가하여 모터를 제어해볼 것이다.
해당 포스팅에서 사용한 코드이다.

sketch_aug08a.ino
0.00MB