본문 바로가기

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

[ZMR250] 4. MPU6050 센싱 + 변속기 제어하기

앞서 송수신기를 연결하고, 그 값을 읽어들이는 것까지 무선조종의 모든 것을 제작하였다.

이번에는 MPU6050 IMU의 값을 읽어들여 변속기를 제어하는 것까지 해볼 것이다.

수신기 코드에서 [ 새 탭 ]을 눌러 [ Sensor ]라는 이름의 탭을 추가해준다.

위 5개의 변수를 만들어준다. 순서대로 각도를 저장하는 변수, 각가속도를 저장하는 변수, 루프 주기를 저장하는 변수, 센서의 초기보정값을 저장하는 변수와 주기를 저장할 때 사용하는 시간 변수이다.

그리고 센서를 초기화하기 위해서 InitMPU() 라는 함수를 만들어 주었다.

MPU6050의 레지스터 제어 및 데이터시트 분석에 관한 포스팅을 다음 포스팅을 참고하고 다시 오길 바란다.

 

[MPU6050] 1. 데이터 시트를 통해 센서 값 확인하기

구글에 MPU6050 데이터 시트를 검색하면 다음과 같은 파일을 찾을 수 있다. 최상단의 파일은 말 그대로 데이터 시트로 센서에 관한 스펙과 통신 방식, 전력 등에 관한 것을 제조사에서 정리한 것이

chigun.tistory.com

 

 

[MPU6050] 2. 각도값 계산 및 진동 제거하기

지난 게시글에서 데이터시터의 기본 정보를 확인하여 센서로부터 값을 읽어오는 것을 해보았다. 이번에는 읽은 값을 계산하여 각도를 계산해보자 MPU6050은 칩에 점의 방향으로 X, Y, Z축을 찾을

chigun.tistory.com

위 과정을 충분히 이해했다면 다음 코드는 바로 해석할 수 있을 것이다.

RAW[0] ~ RAW[2] 는 가속도를 저장하는 변수, RAW[3]은 온도값을 저장, RAW[4] ~ RAW[6]은 각가속도 값을 저장하는 변수이다.

각 RAW값을 읽어 RAW[0] ~ RAW[6]의 값이 다음과 같이 유지되도록 *Offset 값을 설정해주도록 한다.

MPU6050을 사용할 수 있도록 초기화 해주고, 루프에서 센서 값을 실시간으로 계산할 수 있도록 하자

업로드하고 시리얼 창으로 RAW의 값을 다음 기주에 맞추어 설정할 수 있도록하자

순서대로 RAW[0] [1] [2] [4] [5] [6] 이다. RAW[2] 값의 경우는 16384의 값이 되도록 맞추고, 나머지는 0의 값을 가지도록 최대한 Offset 값을 설정한다.

물론 이 작업은 평평한 바닥에 고정하고, 진동이 없는 곳에서 측정 및 보정을 진행해야한다.

 

보정 후 위와 같이 Angle 값을 출력하면 다음과 같이 안정적인 0도에 수렴하는 값을 얻을 수 있다.

 

이제 변속기를 제어하여 모터를 구동시켜보자

변속기는 PWM 신호를 통해 브러쉬리스 모터의 속도를 제어한다.

PWM 신호는 50Hz 주기로 1000us ~ 2000us의 값을 통해 제어할 수 있다.

그래서 우리는 아두이노에 공식으로 제공되는 Servo.h 라이브러리를 사용할 것이다.

해당 라이브러리는 50Hz로 PWM 제어를 해주기 때문에 ESC 제어에 있어 간편하게 사용할 수있다.

[ Motor ] 탭을 추가하여 위와 같이 코드를 작성해보자

*Servo.attach() 함수는 해당 클래스의 PWM 출력 포트를 결정하는 것 뿐아니라 PWM 제어 범위를 설정할 수 있다.

그리고 위에서 부터 초기화 함수, 단일 제어 함수, 모든 모터 제어함수, 그리고 쓰로틀과 롤, 피치, 요에 관한 제어함수이다.

드론 기체는 위 그림처럼 롤, 피치, 요로 나누어 기준 축을 잡아 얘기한다.

현재 제작하는 드론은 쿼드콥터로 4개의 로터를 사용해서 쿼드콥터라고 말한다.

쿼드콥터의 비행원리를 알아야 위 마지막 함수를 이해할 수 있다.

- 위키백과 -

위 이미지처럼 X 형 기체에 마주보는 모터의 방향이 같고, 반대편 모터의 경우 반대로 돌아 각 모터가 회전하며 기체에 작용하는 힘을 상쇄한다. 따라서 마주보는 한 쌍의 모터 회전이 강해지면 그 모터의 반발력으로 기체가 반대방향으로 회전하게 되는 것이다. 위 그림은 모터의 회전방향이 드론의 헤더를 기준으로 프로펠러가 감아지는 방향이지만 모터의 반발력이 상쇄되는 조건이라면 상관없다. 물론 빠르고 날쌘 드론을 만들기 위해서라면 위와 같이 제작하는 것이 전진하는 것에 있어서 속도에 이득이 될 것이다.

본론으로 돌아와서 해당 함수를 해석해보자!

Throttle은 전체 추력을 담당하는 값으로 기체와 모터 추력이 평형을 이루는 값에서는 드론이 공중에 멈출 것이고, 그 이상의 값은 드론이 공중으로 상승, 이하를 입력하면 하강할 것이다.

Roll 값의 경우 드론이 우측으로 이동하기 위한 값

Pitch 값은 드론이 앞으로 전진하기 위한 값

Yaw의 경우 드론이 우회전하기 위한 값이다.

모두 -값을 입력하면 반대로 움직일 것이다.

CW는 시계방향 CCW는 반시계방향을 뜻한다.

상수 1000을 더한 이유는 모터 제어의 최저값 기준이 1000 Microseconds 이기 때문이다.

위와 같이 수정해주고, 모든 모터를 8, 9, 10, 11 번에 연결해주자

쓰로틀의 값을 모터에 전달하여 속도를 제어할 수 있을 것이다.

 

변속기를 처음 작동시키기 때문에 변속기에 PWM 기준을 설정해주어야 할 것이다.

이 작업은 조금 어려울 수도 있다. 그러니 다음 영상을 참고해보자

PWM의 최고/최저 기준을 설정해주는 것인데, ESC 캘리브레이션이라고 한다.

송신기와 수신기가 바인딩이 되어있어야하고, 송신기의 쓰로틀을 최대로 세팅하고 변속기에 전원을 연결한다.

쓰로틀의 최대 값을 모터에 전달하고 삐~ 소리가 나면 쓰로틀 스틱을 최저로 내려 캘리브레이션을 마친다.

캘리브레이션이 끝나면 위 영상처럼 모터를 제어할 수 있을 것이다.

 

그러면 쓰로틀 스틱으로 모든 모터를 제어할 수 있을 것이다.

8, 9, 10, 11번 포트를 모두 ESC와 연결하고 조종기로 제어하면 쓰로틀 값에 따라 속도가 제어될 것이다!

물론 전원 모듈이 있어 배터리를 연결하면 자동으로 제어기에 전원이 들어가서 별도의 전원 구성이 필요없다.

 

다음으로는 기체 상태를 브리핑하여 기체를 평행하게 유지할 수 있는 PID 제어에 대해 다뤄볼 것이다.

ZMR250.zip
0.00MB