ArduinoIMU #1. 소스 수정..
쿼드콥터-완성/arduIMU 2010. 12. 9. 20:25
0. 준비물
ArduinoIMU 보드 (ver 2.0) - (http://store.diydrones.com/ArduIMU_V2_Flat_p/kt-arduimu-20.htm)
Quad1_mini_20( ver 2.0) 소스 -(http://diydrones.com/profiles/blogs/arduimu-quadcopter-part-ii)
FTDI 케이블(Sparkfun 에서 파는 ftdi 쪽보드도 괜찮다 5V )
Arduino 프로그램(arduino.cc 에서 다운받을 수 있다)
(1) RC 파트를 해당 수신기에 맞게끔 수정한다.
내가 만든 PWM2PPM 보드는 후타바 방식의 출력을 지원한다. 그리고 5채널이다.
- 해당 부분 찾아서 코드 수정 필요
#define MAX_CHANNELS 5 // Number of radio channels to read (7 is the number if you use the PPM encoder from store.diydrones.com)
#define MIN_THROTTLE 1037 // Throttle pulse width at minimun...
#define CHANN_CENTER 1500
#define SPEKTRUM 0 // Spektrum radio
(2) 지자기 센서 3.3v 로 선택되어 있는지 확인(쪽보드 윗면에 납땜으로 설정한다)
ARDUINOIMU의 경우 3.3V 로 선택되어 있다.
(3) 쓰로틀 최소값을 1100 이상으로 잡아야 한다.
- 내 조종기는 쓰로틀의 최소값이 1130 정도이다. 그러나 원래 소스의 최소값은 1030 정도이다.
- 해당 부분 찾아서 코드 수정 필요.
#define MIN_THROTTLE 1100 // Throttle pulse width at minimun...
(4) 센서 중립값 설정
먼저 adc값을 읽어오기 위하여 해당 부분에 코드 추가
// Telemetry data...
Serial.print(AN[0]);
Serial.print(",");
Serial.print(AN[1]);
Serial.print(",");
Serial.print(AN[2]);
Serial.print(",");
Serial.print(AN[3]);
Serial.print(",");
Serial.print(AN[4]);
Serial.print(",");
Serial.print(AN[5]);
Serial.print(",");
aux = ToDeg(roll)*10;
Serial.print(aux);
Serial.print(",");
aux = (ToDeg(pitch))*10;
Serial.print(aux);
Serial.print(",");
aux = ToDeg(yaw)*10;
Serial.print(aux);
시리얼 통신을 통하여 AN[] 값을 모두 실시간으로 보면서 기록,
보드를 X,Y방향으로 90도 세워서 Z방향 가속도도 측정하여 다음과 같은 값을 구하였다
원래 값이 501 -> 510 으로 바뀐 것으로 매우 큰 차이이다.
보드를 90도로 세우기 전엔 acc-z 값이 대략 618 정도가 출력되어,
센서에서 출력되는 중력 가속도 1G 의 값이 618-510 = 108 정도에 해당함을 알 수 있다.
수정 후엔 디버깅을 위해 첨가했던 코드를 다시 삭제한다.(처리 속도를 향상시키기 위해..)
-> 해당 부분 찾아서 코드 수정 필요
// The IMU should be correctly adjusted : Gyro Gains and also initial IMU offsets:
// We have to take this values with the IMU flat (0º roll, 0ºpitch)
#define acc_offset_x 508.3
#define acc_offset_y 507
#define acc_offset_z 510 // We need to rotate the IMU exactly 90º to take this value
#define gyro_offset_roll 380.5
#define gyro_offset_pitch 372.2
#define gyro_offset_yaw 373.3
로 수정..
(5) ADC.pde 파일 내에 다음 부분 수정
void Read_adc_raw(void)
{
int i;
// int temp1;
// int temp2;
short temp1;
short temp2;
2. X-COPTER 를 위한 믹싱 설정
원래의 믹싱은 쿼드 용이므로 X-COPTER 방식을 위해서는 모터 별 믹싱을 다시 한다.
이 때 주석 부분이 쿼드용 소스이며, 빨갛게 된 부분이 믹싱을 구현한 코드이다.
- 해당 부분 찾아서 코드 수정 필요(두 부분이다)
if (ch3<MIN_THROTTLE)
ch3 = MIN_THROTTLE;
comando_rx_roll = 0; // Stabilize to roll=0, pitch=0, yaw not important here
comando_rx_pitch = 0;
Attitude_control();
// Quadcopter mix
// Servo_Timer2_set(0,ch3 - control_roll - control_yaw); // Right motor
// Servo_Timer2_set(1,ch3 + control_roll - control_yaw); // Left motor
// Servo_Timer2_set(2,ch3 + control_pitch + control_yaw); // Front motor
// Servo_Timer2_set(3,ch3 - control_pitch + control_yaw); // Back motor
Servo_Timer2_set(0,ch3 - control_roll/2 + control_pitch/2 - control_yaw); // Right FRONT motor
Servo_Timer2_set(1,ch3 + control_roll/2 + control_pitch/2 - control_yaw); // Left FRONT motor
Servo_Timer2_set(2,ch3 - control_roll/2 - control_pitch/2 + control_yaw); // RIGHT REAR motor
Servo_Timer2_set(3,ch3 + control_roll/2 - control_pitch/2 + control_yaw); // LEFT REAR motor
}
// Quadcopter mix
if (ch3 > (MIN_THROTTLE+40)) // Minimun throttle to start control
{
// Servo_Timer2_set(0,ch3 - control_roll - control_yaw); // Right motor
// Servo_Timer2_set(1,ch3 + control_roll - control_yaw); // Left motor
// Servo_Timer2_set(2,ch3 + control_pitch + control_yaw); // Front motor
// Servo_Timer2_set(3,ch3 - control_pitch + control_yaw); // Back motor
Servo_Timer2_set(0,ch3 - control_roll/2 + control_pitch/2 - control_yaw); // Right FRONT motor
Servo_Timer2_set(1,ch3 + control_roll/2 + control_pitch/2 - control_yaw); // Left FRONT motor
Servo_Timer2_set(2,ch3 - control_roll/2 - control_pitch/2 + control_yaw); // RIGHT REAR motor
Servo_Timer2_set(3,ch3 + control_roll/2 - control_pitch/2 + control_yaw); // LEFT REAR motor
3. LED 상태
파란색: GPS on/off
빨간색 ON, 노란색 OFF : automatic flight 상태
빨간색 ON, 노란색 ON : position hold 상태
빨간색 OFF,노란색 ON : normal mode