'쿼드콥터-완성/arduIMU'에 해당되는 글 2건

  1. 2010.12.10 ArduinoIMU #2. 보드 제작
  2. 2010.12.09 ArduinoIMU #1. 소스 수정..

ArduinoIMU #2. 보드 제작

Arduino Pro mini 호환 보드와 ArduinoIMU 보드를 만능 보드에 붙인 모습


좌측부터 수신기, 아두이노 프로 미니 호환 보드, 아두이노IMU 보드가 차례로 붙어 있다.

하단엔 변속기 4채널을 위한 단자가 붙어 있다.

쿼드콥터 본체에는 오링을 가지고 부착할 예정이다 (진동 감소...)

ArduinoIMU #1. 소스 수정..

0. 준비물
FTDI 케이블(Sparkfun 에서 파는 ftdi 쪽보드도 괜찮다 5V )
Arduino 프로그램(arduino.cc 에서 다운받을 수 있다)

1. 체크 리스트


(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 



prev 1 next