'아두이노'에 해당되는 글 7건

  1. 2015.06.11 컨트롤용 보드용 코드를 짜다.
  2. 2010.12.09 ArduinoIMU #1. 소스 수정..
  3. 2010.08.02 아두이노 - 내장 라이브러리 사용 스테핑 모터 구동 소스.
  4. 2010.08.02 아두이노 - 스테핑 모터 컨트롤러(SLA7062M) 소스
  5. 2010.07.21 Micro quad - wii copter 만들기 #2 schematic & 준비물
  6. 2010.07.21 micro qaud - wii copter 를 만들기 시작.#1
  7. 2010.07.16 아두이노 wmp 소스

컨트롤용 보드용 코드를 짜다.

#include <Wire.h>
#include <EEPROM.h>
#include <pins_arduino.h>


#define MOTOR_1   (3)
#define MOTOR_2   (9)
#define MOTOR_3   (10)
#define MOTOR_4   (11)

//PIN assignment
#define  CHANNEL_NUM  (3)  // use ar7000 satelite receiver - spektrum

#define THROTTLEPIN      (2)
#define STEERPIN      (4)
#define AUXPIN          (5)


#define RECIEVER_SENSITIVITY  (10)
#define MOTOR_SENSITIVITY  (10)

int16_t rcCommand1 = 0;
int16_t rcCommand2= 0;
int16_t rcCommand3= 0;
int16_t rcCommand4 =0;

uint8_t pinRcChannel[3] = {THROTTLEPIN,STEERPIN,AUXPIN};
uint8_t PCintLast = 0;


// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// main loop
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
uint32_t previousTime = 0;
uint32_t currentTime = 0;
uint32_t deltaTime = 0;
uint32_t meanTime = 0;
uint32_t rcTime = 0;

uint8_t armed = 0;


short commandFilter(short old_val, short new_val)
{
  short ret;
  ret = constrain(new_val,old_val-RECIEVER_SENSITIVITY,old_val+RECIEVER_SENSITIVITY);
  return ret;
}

short MotorFilter(short old_val,short new_val) {
  short ret;
  ret= constrain(new_val,old_val-MOTOR_SENSITIVITY,old_val+MOTOR_SENSITIVITY);
  return ret;
}


typedef struct {
  uint16_t edgeTime;
  int16_t Width;
} pinTimingData; 

pinTimingData pin1;
pinTimingData pin2;
pinTimingData pin3;
pinTimingData pin4;

SIGNAL(PCINT2_vect) {
  uint8_t mask;
  uint16_t cTime;
  uint16_t  temp;

  cTime = micros();
  mask = PIND ^ PCintLast;
  PCintLast = PIND;
  // mask is pins [D0-D7] that have changed.
  // chan = pin sequence of the port. chan begins at D2 and ends at D5
  // because we are here, at least one pin [D2-D5] changed
  // avoiding a for() is more than twice faster !
  if (mask & (1<<THROTTLEPIN)) {
    if (!(PIND & 0x01 << THROTTLEPIN)) temp = cTime - pin1.edgeTime;
    pin1.Width = (int16_t)(temp - 1120);  // minimum throttle
    pin1.edgeTime = cTime;
  }
  if (mask & (1<<STEERPIN)) {
    if (!(PIND & 0x01 << STEERPIN))  temp = cTime - pin2.edgeTime;
    pin2.Width = (int16_t)(temp - 1500);
    pin2.edgeTime = cTime;
  }
  if (mask & (1<<AUXPIN)) {
    if (!(PIND & 0x01 << AUXPIN)) temp = cTime - pin3.edgeTime;
    pin3.Width = (int16_t)(temp - 1500);
    pin3.edgeTime = cTime;
  }
}

// Configure each rc pin for PCINT
void configureReceiver() {
  uint8_t chan;
  PCMSK2 = 0;
  for (chan=0; chan < 4; chan++) {
    pinMode(pinRcChannel[chan], INPUT);
    // PCINT activated only for specific pin inside [D0-D7]  , [D2-D5] for this tricopter
    PCMSK2 |= digitalPinToBitMask(pinRcChannel[chan]);
  }
  PCICR = 0x01 << 2; // PCINT activated only for [D0-D7] port
}


void setup() {
  pinMode (13, OUTPUT);
  Serial.begin(115200);
  delay(100);
  configureReceiver();

  previousTime= micros();
  meanTime = 1500;
  digitalWrite(13,HIGH);
}


const  long windUp = 1000;

void loop() {
  int numc;
  short temp1, temp2;
  float error;
  float dTerm;
  float timeFactor;
  float invTimeFactor;
  float tmp;

  rcCommand1 = commandFilter(rcCommand1,pin1.Width);
  rcCommand2 = commandFilter(rcCommand2,pin2.Width);
  rcCommand3 = commandFilter(rcCommand3,pin3.Width);
  rcCommand4 = commandFilter(rcCommand4,pin4.Width);
 
  Serial.print(rcCommand1);
  Serial.print(",");
  Serial.print(rcCommand2);
  Serial.print(",");
  Serial.print(rcCommand3);
  Serial.print(",");
  Serial.print(rcCommand4);
  Serial.println();

  currentTime = micros();
  deltaTime = currentTime - previousTime;
  previousTime = currentTime;
  meanTime = (39*meanTime + deltaTime)/40;

  timeFactor = deltaTime/meanTime;
  invTimeFactor = meanTime/deltaTime;
 
  //++++++ motor control ++++++++++++++++++++++++++++++++++
 
  temp1 = rcCommand1;
  constrain(temp1,0,255);
  analogWrite(MOTOR_1,temp1);
 
  temp1 = rcCommand2;
  constrain(temp1,0,255);
  analogWrite(MOTOR_2,temp1);
 
  temp1 = rcCommand3;
  constrain(temp1,0,255);
  analogWrite(MOTOR_3,temp1);

  temp1 = rcCommand4;
  constrain(temp1,0,255);
  analogWrite(MOTOR_4,temp1);
 
  delay(100);
}

 

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 



아두이노 - 내장 라이브러리 사용 스테핑 모터 구동 소스.

왜인지 몰라도 탈조가 있다
마찬가지로 GND로 풀다운된 4개의 스위치에 의해 동작한다.
회로도는 아두이노 홈피에 나온 회로도를 이용


풀브릿지 칩은손쉽게 구할 수 있는 모터 구동용 칩 L298N 을 사용하자.
결선은 소스를 참조.

#include <Stepper.h>

#define    _DEBUG_PRINT_

#define    EN_PIN         (3)
#define    LED_PIN        (13)
#define    MOTOR_INPUT1_PIN      (5)
#define    MOTOR_INPUT2_PIN      (4)
#define    MOTOR_INPUT3_PIN      (6)
#define    MOTOR_INPUT4_PIN      (7)
#define    KEY1_PIN          (10)
#define    KEY2_PIN          (11)
#define    KEY3_PIN          (12)
#define    KEY4_PIN          (9)

const int analogInPin = 0;  // Analog input pin that the potentiometer is attached to

int sensorValue = 0;        // value read from the pot
Stepper step1 = Stepper(200,MOTOR_INPUT1_PIN,MOTOR_INPUT2_PIN,MOTOR_INPUT3_PIN,MOTOR_INPUT4_PIN);
short output = 0;
void setup() {
  // initialize serial communications at 9600 bps:
  pinMode(EN_PIN, OUTPUT);     
  pinMode(LED_PIN, OUTPUT);
  
  pinMode(KEY1_PIN,INPUT);
  pinMode(KEY2_PIN,INPUT);
  pinMode(KEY3_PIN,INPUT);
  pinMode(KEY4_PIN,INPUT);

  #ifdef _DEBUG_PRINT_
  Serial.begin(9600); 
  Serial.println("Start step motor contorller ver 0.1 (made by Kim Hyuk)");
  #endif // _DEBUG_PRINT_
}

int outputValue;
unsigned long  t;

int speed_table1[] = {
  10,20,30,40,50,60,70,80,90,100,      //20
  100,100,100,100,100,100,100,100,100,100, 
  100,100,100,100,100,100,100,100,100,100, 
  100,100,100,100,100,100,100,100,100,100, 
  100,100,100,100,100,100,100,100,100,100, 

  100,100,100,100,100,100,100,100,100,100, 
  100,100,100,100,100,100,100,100,100,100, 
  100,100,100,100,100,100,100,100,100,100, 
  100,100,100,100,100,100,100,100,100,100, 
  100,90,80,70,60,50,40,30,20,10};          // 200
  
void loop() {
   uint8_t i;
  // read the analog in value:
  t = millis();
  
  if(t % 500 > 200) digitalWrite(LED_PIN,LOW);
  else if(t % 500 < 200) digitalWrite(LED_PIN,HIGH);
  
  if(digitalRead(KEY1_PIN)) { // defaut == 0;
  #ifdef _DEBUG_PRINT_
    Serial.println("Key 1");
  #endif // _DEBUG_PRINT_
    digitalWrite(EN_PIN, HIGH);
    step1.setSpeed(100);
    step1.step(100);
  } else if(digitalRead(KEY2_PIN)) {
  #ifdef _DEBUG_PRINT_
    Serial.println("Key 2");
  #endif // _DEBUG_PRINT_
    digitalWrite(EN_PIN, HIGH);
    for(i =0; i< 100;i++) {
      step1.setSpeed(speed_table1[i]);
      step1.step(2);
    }
  } else if(digitalRead(KEY3_PIN)) {
  #ifdef _DEBUG_PRINT_
    Serial.println("Key 3");
  #endif // _DEBUG_PRINT_
    digitalWrite(EN_PIN, HIGH);
    for(i =0; i< 100;i++) {
      step1.setSpeed(speed_table1[i]);
      step1.step(-2);
    }
  } else if(digitalRead(KEY4_PIN)) {
  #ifdef _DEBUG_PRINT_
    Serial.println("Key 4");
  #endif // _DEBUG_PRINT_
    digitalWrite(EN_PIN, HIGH);
    step1.setSpeed(100);
    step1.step(-100);
  } else {
    digitalWrite(EN_PIN, LOW);
  }
}

아두이노 - 스테핑 모터 컨트롤러(SLA7062M) 소스

간단하게..

// SLA7260 DATASHEET , 11page 회로도와 동일하게 구성
// 각각의 핀 연결은 다음과 같다.

#define  MOPIN      (7)
#define  M1PIN      (6)
#define  M2PIN      (2)
#define  SYNCPIN    (8)
#define  CWPIN      (4)
#define  CLKPIN      (3)
#define  RSTPIN      (5)
#define  ENPIN      (13)

// 4개의 택스위치를 연결한다. 평상시 vdd로 풀업되어 있다.

#define  INPUT1  (9)    // TACK SWTICH INPUT
#define  INPUT2  (10)
#define  INPUT3  (11)
#define  INPUT4  (12)

void setup()
{
  pinMode(MOPIN,INPUT);
  pinMode(M1PIN,OUTPUT);
  pinMode(M2PIN,OUTPUT);
  pinMode(CWPIN,OUTPUT);
  pinMode(CLKPIN,OUTPUT);
  pinMode(SYNCPIN,OUTPUT);
  pinMode(ENPIN,OUTPUT);
  pinMode(INPUT1,INPUT);
  pinMode(INPUT1,INPUT);
  pinMode(INPUT1,INPUT);
  pinMode(INPUT1,INPUT);
  pinMode(RSTPIN,OUTPUT);
  
  digitalWrite(M1PIN,LOW);    // 1/16 step
  digitalWrite(M2PIN,LOW);
  
  digitalWrite(SYNCPIN,HIGH);    // sync mode
  digitalWrite(RSTPIN,LOW);
  Serial.begin(9600);
  Serial.println("SLA7206M controller start..(made by Kim H)");
}

int steps[] = {
  200,190,180,170,160,150,140,130,120,110,
  100,90,80,70,60,50,50,50,50,50,
  50,50,50,50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,50,50,50,

  50,50,50,50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,50,50,50,

  50,50,50,50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,50,50,50,

  50,50,50,50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,50,50,50,
  50,50,50,50,50,60,70,80,90,100,
  110,120,130,140,150,160,170,180,190,200,
};


int steps2[] = {
  200,190,180,170,160,150,140,130,120,110,
  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,

  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,

  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,

  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,
  100,100,100,100,100,100,100,100,100,100,
  110,120,130,140,150,160,170,180,190,200,
};


void loop()
{
  int i,j;
  if(digitalRead(INPUT1) == 0) {
    Serial.println("Input1 key..");
    digitalWrite(ENPIN,HIGH);
    digitalWrite(CWPIN,HIGH);
    for(i = 0;i < 200;i++) {
      for(j = 0; j < 16;j++) {
        digitalWrite(CLKPIN,HIGH);
        delayMicroseconds(steps[i]);
        digitalWrite(CLKPIN,LOW);
        delayMicroseconds(steps[i]);
      }
    }
  } else if(digitalRead(INPUT2) == 0) {
    Serial.println("Input2 key..");
    digitalWrite(ENPIN,HIGH);
    digitalWrite(CWPIN,HIGH);
    for(i = 0;i < 200;i++) {
      for(j = 0; j < 16;j++) {
        digitalWrite(CLKPIN,HIGH);
        delayMicroseconds(steps2[i]);
        digitalWrite(CLKPIN,LOW);
        delayMicroseconds(steps2[i]);
      }
    }
    
  } else if(digitalRead(INPUT3) == 0) {
    Serial.println("Input3 key..");
    digitalWrite(ENPIN,HIGH);
    digitalWrite(CWPIN,LOW);
    for(i = 0;i < 200;i++) {
      for(j = 0; j < 16;j++) {
        digitalWrite(CLKPIN,HIGH);
        delayMicroseconds(steps[i]);
        digitalWrite(CLKPIN,LOW);
        delayMicroseconds(steps[i]);
      }
    }
    
  } else if(digitalRead(INPUT4) == 0) {
    Serial.println("Input4 key..");
    digitalWrite(ENPIN,HIGH);
    digitalWrite(CWPIN,LOW);
    for(i = 0;i < 200;i++) {
      for(j = 0; j < 16;j++) {
        digitalWrite(CLKPIN,HIGH);
        delayMicroseconds(steps2[i]);
        digitalWrite(CLKPIN,LOW);
        delayMicroseconds(steps2[i]);
      }
    }
  } else {
    digitalWrite(ENPIN,LOW);
  }    
}


Micro quad - wii copter 만들기 #2 schematic & 준비물

사용자 삽입 이미지

구상한 회로도이다.

필요한 준비물

아두이노 프로 미니 보드  - 19불 -> 23000원
만능 pcb(18 x 18)  - 1000원
모션 위 플러스 - 15000원
리폴 1셀 138mA - 1.3불 - 1600원
기어드 브러쉬 모터(GPS-6) x4 - 18.2불 - 22000원
프롭 GWS4025 x 10 - 2.6불 - 3100원
스펙트럼 위성 수신기 - 36불 - 43200원
기타 코넥터 및 케이블 - 10불 - 12000원

도합 :  12만9백원(수신기를 재활용하면 77,700원)

기타 필요한 기자재
FTDI 케이블 - 15불 : 18000원
스펙트럼 조종기(dx7 이상) - 200불 - 24만원


micro qaud - wii copter 를 만들기 시작.#1

동기
tri- wii copter 에 자극을 받아, micro quad-wii copter 를 만들기 시작했다.

전체 디자인.
1. ARDUINO PRO MINI 보드를 메인보드로 삼고, 가속도 센서는 사용하지 않으며,
-> WII MOTION PLUS 에 내장된 3축 자이로 센서를 쓰기로 결정(15천원)
비록 DELAY 가 있지만, TWI 인터페이스를 그대로 사용하기로 결정

2. 3개의 브러쉬리스 모터 + 1서보 모터 대신 -> 4개의 브러쉬 모터를 사용 (간단하게 구현
 -> 이를 위하여 4개의 PWM 이 필요하나, ARDUINO 에서 제공하는 내장 함수 analogWrite() 펑션을 사용하기로 하였다.이를 위해서는 제약이 있는데 매뉴얼에 따르면 490Hz 정도 구동이며, 3,5,6,9,10,11 핀 중 하나를 써야한다.

3. 4개의 핀으로 조종기 신호를 받아들이는 대신, 스펙트럼 수신기의 위성 수신기를 사용하기로 함 
-> 장점은 3.3V 구동이 가능하며 직렬 통신(115200bps) 를 사용하므로 빠른 통신이 가능
-> 경량화 가능하며 가지고 있는 수신기 활용할 수 있음
-> 이를 위해 MikroCopter 의 소스를 참조하기로 하였다.

4.전원은 리폴 1셀로 구현.
-> 스위치는 IRMLML2502 mosfet n-ch 으로 결정(Vgs 3.3V로 스위칭 가능한 장점, 3A, 20V)
-> 메인보드의 경우 atmega328P은  1.8~5.5V에서 ~20MHz 까지 지원
-> 위 모션 플러스의 경우에도 3.3V 구동 가능
-> 수신기의 전원 또한 3.3V
-> 이를 위하여 ultra LDO 가 필요하였다. SPX3819 로 결정(340mV dropout at full load)
리폴1셀의 전압을 4.2V ~ 3.7V 까지만 사용하기로 하였을 때에 3.3V 출력 가능

5. 모터는 하비시티에서 판매중인 Micro Power system w/ Gearbox GPS-6 으로 결정
thrust 가 16g 이므로 x4 => 64g. 
조종을 위해 기체의 무게를 32g 이하로 맞춰야 한다.
(모터2g+프롭(-gws4025)1.3g) x4 = 13.2g
메인보드+wii motion plus = 6.8g
base plate + 수신기 = 15.2g
배터리 = 3.5g
기타 잡자재 = 5g

총 38.6g 으로 6.6g 오버하지만, 경량화 등으로 해결 가능해 보임



아두이노 wmp 소스

#include <Wire.h>
byte data[6]; //six data bytes
int yaw, pitch, roll; //three axes
int yaw0, pitch0, roll0; //calibration zeroes

void wmpOn(){
Wire.beginTransmission(0x53); //WM+ starts out deactivated at address 0x53
Wire.send(0xfe); //send 0x04 to address 0xFE to activate WM+
Wire.send(0x04);
Wire.endTransmission(); //WM+ jumps to address 0x52 and is now active
}

void wmpSendZero(){
Wire.beginTransmission(0x52); //now at address 0x52
Wire.send(0x00); //send zero to signal we want info
Wire.endTransmission();
}

void calibrateZeroes(){
for (int i=0;i<10;i++){
wmpSendZero();
Wire.requestFrom(0x52,6);
for (int i=0;i<6;i++){
data[i]=Wire.receive();
}
yaw0+=(((data[3]>>2)<<8)+data[0])/10; //average 10 readings
pitch0+=(((data[4]>>2)<<8)+data[1])/10;
roll0+=(((data[5]>>2)<<8)+data[2])/10;
}
Serial.print("Yaw0:");
Serial.print(yaw0);
Serial.print(" Pitch0:");
Serial.print(pitch0);
Serial.print(" Roll0:");
Serial.println(roll0);
}

void receiveData(){
wmpSendZero(); //send zero before each request (same as nunchuck)
Wire.requestFrom(0x52,6); //request the six bytes from the WM+
for (int i=0;i<6;i++){
data[i]=Wire.receive();
}
yaw=((data[3]>>2)<<8)+data[0]-yaw0; 
pitch=((data[4]>>2)<<8)+data[1]-pitch0; 
roll=((data[5]>>2)<<8)+data[2]-roll0; 
}

prev 1 next