Go Down

Topic: Proyecto N°1: Quadcopter Arduino (Read 21779 times) previous topic - next topic

EscuderoKevin

Ahora que me sente un rato mas , busque y encontre esto:


https://github.com/TKJElectronics/KalmanFilter


Es algo bastante interesante , pero sinecramente los VALORES no los entiendo jaja. Ya no se que buscar , o que leer , esto me tira muy abajo y me dan ganas de dejar el proyecto




Jopapa

Jopapa
www.jopapa.me

EscuderoKevin

Por $25 lo tienes hecho

http://www.mhobbies.com/brand-new-kk-5-5-multicopter-tripcopter-quadcopter-flight-control-unit.html

Y hay muchos otros

Buenos dias, Esto es un foro arduino.

La idea es hacerlo por mi mismo o en todo caso donde me quede trabado con ayuda de otras personas.

por $25 si y 3 meses de demora. Se pierde toda gracia y creatividad asi.


surbyte

Entonces ponte a estudiar giroscopos-acelerómetros y filtro Kalman y dicho sin mala intención.
No hay manera de entender algo que no se conoce.

De todas formas hay mucha gente que esta con los quad, algunos por acá pero hay foros mas dedicados al tema que este que es mas genérico.
No es para hecharte, para nada, es para que inviertas bien el tiempo.

Busca en este foro este mismo tema. Se  ha debatido en meses anteriores precisamente este sensor.

EscuderoKevin

Entonces ponte a estudiar giroscopos-acelerómetros y filtro Kalman y dicho sin mala intención.
No hay manera de entender algo que no se conoce.

De todas formas hay mucha gente que esta con los quad, algunos por acá pero hay foros mas dedicados al tema que este que es mas genérico.
No es para hecharte, para nada, es para que inviertas bien el tiempo.

Busca en este foro este mismo tema. Se  ha debatido en meses anteriores precisamente este sensor.
Sabes que ? , te pido por favor que te retires y no comentes mas , anoche revise mas de 200 post en el foro y todos estas vos CON TODOS TUS PROBLEMAS.

Aver , Si te parece que esta mal redactado o algo por el estilo no respondas y listo.

Lei mas de 150 paginas en la web para poder entenderlo y me decis que lea mas ?  lei todo lo que pude y puedo , trato pero no lo entiendo. Nose que mas queres que te diga,  lo que pregunto es si alguien  ya lo habia echo y que me de una mano para entenderlo , NO PIDO EL CODIGO SERVIDO ya que tengo maquinaria y ya realize MUCHOS trabajos con Arduino , tengo la capacidad suficiente para entenderlos y poder trabajarlos

surbyte

#20
Feb 18, 2015, 05:53 pm Last Edit: Feb 18, 2015, 06:15 pm by surbyte
No hay problema o si lo hay.

Porque tu no puedes prohibirme opinar en este post ni en ninguno, es mi decisión hacerlo o no.
Y no tengo problemas con nadie, si con la ignorancia, y creo que no es tu caso, pero todos somos ignorantes en algo que desconocemos por eso te sugería que estudiaras mas el tema.
Al menos si has leido todos los post, verás que hay algunos en los que yo no opino.

Leiste esto post que te puse antes?
MPU6050 Orientación y control para Quadracópteros..
Usa Chrome, lo traduces o lo lees en inglés y si no lo comprendes es porque te falta matemáticas, y si te falta matemáticas de nivel universitario entonces debes estudiar. Se entiende o no?

Suerte con tu proyecto!!
Por cierto, yo puedo opinar tanto como desee. En tanto sea para sumar.
Nunca lo hago con otro interés que no sea ese, por eso opino en todos los post que puedo y cuando no se, no opino.

EscuderoKevin

Ya lo lei  eso , pero no sigo sin entenderlo de como traducirlo , osea como hacer el calculo con los Servos...


Y solo dice como cuadras los datos o valores nada mas.

EscuderoKevin

#22
Feb 19, 2015, 03:43 am Last Edit: Feb 19, 2015, 03:50 am by EscuderoKevin
Bueno como no encontre mucha vuelta , decidi Pausar el proyecto hasta encontrar un poco mas de informacion

EDIT:


Encontre esto , pero es muy complejo para mi nivel ya que no uso RC,  pero no entiendo como sacar las partes del MPU


Code: [Select]
#ifndef QUADARDU
#define QUADARDU

#include <Servo.h>
#include <Wire.h>
#include <I2Cdev.h>
#include <helper_3dmath.h>
#include <MPU6050_6Axis_MotionApps20.h>
#include <PID_v1.h>
#include <PinChangeInt.h>
#include <PinChangeIntConfig.h>

#define DEBUG


/*  Arduino Pin configuration
 * 
 */

#define ESC_A 9
#define ESC_B 6
#define ESC_C 5
#define ESC_D 3

#define RC_1 13
#define RC_2 12
#define RC_3 11
#define RC_4 10
#define RC_5 8
#define RC_PWR A0


/* ESC configuration
 *
 */

#define ESC_MIN 22
#define ESC_MAX 115
#define ESC_TAKEOFF_OFFSET 30
#define ESC_ARM_DELAY 5000

/* RC configuration
 *
 */

#define RC_HIGH_CH1 1000
#define RC_LOW_CH1 2000
#define RC_HIGH_CH2 1000
#define RC_LOW_CH2 2000
#define RC_HIGH_CH3 1000
#define RC_LOW_CH3 2000
#define RC_HIGH_CH4 1000
#define RC_LOW_CH4 2000
#define RC_HIGH_CH5 1000
#define RC_LOW_CH5 2000
#define RC_ROUNDING_BASE 50

/*  PID configuration
 * 
 */

#define PITCH_P_VAL 0.5
#define PITCH_I_VAL 0
#define PITCH_D_VAL 1

#define ROLL_P_VAL 2
#define ROLL_I_VAL 5
#define ROLL_D_VAL 1

#define YAW_P_VAL 2
#define YAW_I_VAL 5
#define YAW_D_VAL 1


/* Flight parameters
 *
 */

#define PITCH_MIN -30
#define PITCH_MAX 30
#define ROLL_MIN -30
#define ROLL_MAX 30
#define YAW_MIN -180
#define YAW_MAX 180
#define PID_PITCH_INFLUENCE 20
#define PID_ROLL_INFLUENCE 20
#define PID_YAW_INFLUENCE 20


/*  MPU variables
 *
 */

MPU6050 mpu;                           // mpu interface object


uint8_t mpuIntStatus;                  // mpu statusbyte
uint8_t devStatus;                     // device status   
uint16_t packetSize;                   // estimated packet size 
uint16_t fifoCount;                    // fifo buffer size   
uint8_t fifoBuffer[64];                // fifo buffer

Quaternion q;                          // quaternion for mpu output
VectorFloat gravity;                   // gravity vector for ypr
float ypr[3] = {0.0f,0.0f,0.0f};       // yaw pitch roll values
float yprLast[3] = {0.0f, 0.0f, 0.0f};

volatile bool mpuInterrupt = false;    //interrupt flag

/* Interrupt lock
 *
 */
 
boolean interruptLock = false;

/*  RC variables
 *
 */

float ch1, ch2, ch3, ch4, ch5;         // RC channel inputs

unsigned long rcLastChange1 = micros();
unsigned long rcLastChange2 = micros();
unsigned long rcLastChange3 = micros();
unsigned long rcLastChange4 = micros();
unsigned long rcLastChange5 = micros();

/*  Motor controll variables
 *
 */

int velocity;                          // global velocity

float bal_ac, bal_bd;                 // motor balances can vary between -100 & 100
float bal_axes;                       // throttle balance between axes -100:ac , +100:bd

int va, vb, vc, vd;                    //velocities
int v_ac, v_bd;                        // velocity of axes

Servo a,b,c,d;

/*  PID variables
 *
 */

PID pitchReg(&ypr[1], &bal_bd, &ch2, PITCH_P_VAL, PITCH_I_VAL, PITCH_D_VAL, REVERSE);
PID rollReg(&ypr[2], &bal_ac, &ch1, ROLL_P_VAL, ROLL_I_VAL, ROLL_D_VAL, REVERSE);
PID yawReg(&ypr[0], &bal_axes, &ch4, YAW_P_VAL, YAW_I_VAL, YAW_D_VAL, DIRECT);


/*  Filter variables
 *
 */
 
float ch1Last, ch2Last, ch4Last, velocityLast;

/*  Setup function
 *
 */

void setup(){
 
  initRC();                            // Self explaining
  initMPU();
  initESCs();
  initBalancing();
  initRegulators();
 
  #ifdef DEBUG                        // Device tests go here
 
  Serial.begin(9600);                 // Serial only necessary if in DEBUG mode
  Serial.flush();
 
  #endif
}

/* loop function
 *
 */

void loop(){
 
  while(!mpuInterrupt && fifoCount < packetSize){
     
    /* Do nothing while MPU is not working
     * This should be a VERY short period
     */
     
  }
 
  getYPR();                         
  computePID();
  calculateVelocities();
  updateMotors();
 
}

/*  computePID function
 *
 *  formats data for use with PIDLib
 *  and computes PID output
 */

void computePID(){

  acquireLock();
 
  ch1 = floor(ch1/RC_ROUNDING_BASE)*RC_ROUNDING_BASE;
  ch2 = floor(ch2/RC_ROUNDING_BASE)*RC_ROUNDING_BASE;
  ch4 = floor(ch4/RC_ROUNDING_BASE)*RC_ROUNDING_BASE;

  ch2 = map(ch2, RC_LOW_CH2, RC_HIGH_CH2, PITCH_MIN, PITCH_MAX);
  ch1 = map(ch1, RC_LOW_CH1, RC_HIGH_CH1, ROLL_MIN, ROLL_MAX);
  ch4 = map(ch4, RC_LOW_CH4, RC_HIGH_CH4, YAW_MIN, YAW_MAX);
 
  if((ch2 < PITCH_MIN) || (ch2 > PITCH_MAX)) ch2 = ch2Last;
  if((ch1 < ROLL_MIN) || (ch1 > ROLL_MAX)) ch1 = ch1Last;
  if((ch4 < YAW_MIN) || (ch4 > YAW_MAX)) ch4 = ch4Last;
 
  ch1Last = ch1;
  ch2Last = ch2;
  ch4Last = ch4;
 
  ypr[0] = ypr[0] * 180/M_PI;
  ypr[1] = ypr[1] * 180/M_PI;
  ypr[2] = ypr[2] * 180/M_PI;
 
  if(abs(ypr[0]-yprLast[0])>30) ypr[0] = yprLast[0];
  if(abs(ypr[1]-yprLast[1])>30) ypr[1] = yprLast[1];
  if(abs(ypr[2]-yprLast[2])>30) ypr[2] = yprLast[2];
 
  yprLast[0] = ypr[0];
  yprLast[1] = ypr[1];
  yprLast[2] = ypr[2];

  pitchReg.Compute();
  rollReg.Compute();
  yawReg.Compute();
 
  releaseLock();

}

/*  getYPR function
 *
 *  gets data from MPU and
 *  computes pitch, roll, yaw on the MPU's DMP
 */

void getYPR(){
 
    mpuInterrupt = false;
    mpuIntStatus = mpu.getIntStatus();
    fifoCount = mpu.getFIFOCount();
   
    if((mpuIntStatus & 0x10) || fifoCount >= 1024){
     
      mpu.resetFIFO();
   
    }else if(mpuIntStatus & 0x02){
   
      while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
 
      mpu.getFIFOBytes(fifoBuffer, packetSize);
     
      fifoCount -= packetSize;
   
      mpu.dmpGetQuaternion(&q, fifoBuffer);
      mpu.dmpGetGravity(&gravity, &q);
      mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
   
    }

}

/*  calculateVelocities function
 * 
 *  calculates the velocities of every motor
 *  using the PID output
 */

void calculateVelocities(){

  acquireLock();

  ch3 = floor(ch3/RC_ROUNDING_BASE)*RC_ROUNDING_BASE;
  velocity = map(ch3, RC_LOW_CH3, RC_HIGH_CH3, ESC_MIN, ESC_MAX);
 
  releaseLock();

  if((velocity < ESC_MIN) || (velocity > ESC_MAX)) velocity = velocityLast;
 
  velocityLast = velocity;
 
  v_ac = (abs(-100+bal_axes)/100)*velocity;
  v_bd = ((100+bal_axes)/100)*velocity;
 
  va = ((100+bal_ac)/100)*v_ac;
  vb = ((100+bal_bd)/100)*v_bd;
 
  vc = (abs((-100+bal_ac)/100))*v_ac;
  vd = (abs((-100+bal_bd)/100))*v_bd;
 
  Serial.println(bal_bd);
 
  if(velocity < ESC_TAKEOFF_OFFSET){
 
    va = ESC_MIN;
    vb = ESC_MIN;
    vc = ESC_MIN;
    vd = ESC_MIN;
 
  }
 
}

void updateMotors(){

  a.write(va);
  c.write(vc);
  b.write(vb);
  d.write(vd);

}

void arm(){

  a.write(ESC_MIN);
  b.write(ESC_MIN);
  c.write(ESC_MIN);
  d.write(ESC_MIN);
 
  delay(ESC_ARM_DELAY);

}

void dmpDataReady() {
    mpuInterrupt = true;
}

void initRC(){
  pinMode(RC_PWR, OUTPUT);
  digitalWrite(RC_PWR, HIGH);
 
  // FIVE FUCKING INTERRUPTS !!!
  PCintPort::attachInterrupt(RC_1, rcInterrupt1, CHANGE);
  PCintPort::attachInterrupt(RC_2, rcInterrupt2, CHANGE);
  PCintPort::attachInterrupt(RC_3, rcInterrupt3, CHANGE);
  PCintPort::attachInterrupt(RC_4, rcInterrupt4, CHANGE);
  PCintPort::attachInterrupt(RC_5, rcInterrupt5, CHANGE);
 
}

void initMPU(){
 
  Wire.begin();
  mpu.initialize();
  devStatus = mpu.dmpInitialize();
  if(devStatus == 0){
 
    mpu.setDMPEnabled(true);
    attachInterrupt(0, dmpDataReady, RISING);
    mpuIntStatus = mpu.getIntStatus();
    packetSize = mpu.dmpGetFIFOPacketSize();
   
  }
}

void initESCs(){

  a.attach(ESC_A);
  b.attach(ESC_B);
  c.attach(ESC_C);
  d.attach(ESC_D);
 
  delay(100);
 
  arm();

}

void initBalancing(){

  bal_axes = 0;
  bal_ac = 0;
  bal_bd = 0;

}

void initRegulators(){

  pitchReg.SetMode(AUTOMATIC);
  pitchReg.SetOutputLimits(-PID_PITCH_INFLUENCE, PID_PITCH_INFLUENCE);
 
  rollReg.SetMode(AUTOMATIC);
  rollReg.SetOutputLimits(-PID_ROLL_INFLUENCE, PID_ROLL_INFLUENCE);
 
  yawReg.SetMode(AUTOMATIC);
  yawReg.SetOutputLimits(-PID_YAW_INFLUENCE, PID_YAW_INFLUENCE);

}

void rcInterrupt1(){
   if(!interruptLock) ch1 = micros() - rcLastChange1;
   rcLastChange1 = micros();
}

void rcInterrupt2(){
  if(!interruptLock) ch2 = micros() - rcLastChange2;
  rcLastChange2 = micros();
}

void rcInterrupt3(){
  if(!interruptLock) ch3 = micros() - rcLastChange3;
  rcLastChange3 = micros();
}

void rcInterrupt4(){
  if(!interruptLock) ch4 = micros() - rcLastChange4;
  rcLastChange4 = micros();
}

void rcInterrupt5(){
  if(!interruptLock) ch5 = micros() - rcLastChange5;
  rcLastChange5 = micros();
}

void acquireLock(){
  interruptLock = true;
}

void releaseLock(){
  interruptLock = false;
}

#endif


surbyte

Te vas a enojar de nuevo pero.. jopapa tenía razón o no? (no lo digo con ánimo de molestarte) solo para que sumes y no abandones tu objetivo de tener tu quad.

Por $25 lo tienes hecho

http://www.mhobbies.com/brand-new-kk-5-5-multicopter-tripcopter-quadcopter-flight-control-unit.html

migarve55

Max_saeta, yo no tengo una MEGA tengo una arduino UNO. Por eso no puedo. Por otra parte tendre un código listo de estabilización pronto, asi que espera.
Pero de paso e puedo dejar unos datos para que investigues:

- Yo, para que se estabilice activo la función cuando todos los valores de los motores son iguales, quiero decir que cuando no estoy moviendo el joystick(osea esta centrado).
-Para esto le añado una respuesta (un delay) que yo sepa en aeromodelismo esto sirve para que el modelo no haga movimientos bruscos, es decir, que no mas soltar se mueva a la posición recta. Este valor depende del usuario, así que modifícalo a tu gusto. Intentaste probar mi código en tu modelo? Al menos para que veas que funciona mucho mejor.

Te dejo el código de procesing para controlar los motores con 4 sliders. Si tienes dudas de como funciona, me lo preguntas.

Code: [Select]

//import org.firmata.*;
//import cc.arduino.*;

import controlP5.*;
import processing.serial.*;

int port = 1; //El perto desde donde mandas los datos (no te fijes en COMX, es el orden de los puertos, no la X)
int valorParada = 21;

Serial xbee;
ControlP5 cp5;
//Arduino arduino;

int Servo_1 = 90;
int Servo_2 = 90;
int Servo_3 = 90;
int Servo_4 = 90;

int count;

int frecuencia = 10;

String pos1, pos2, pos3, pos4;

int TI, TF, pin;
color verde = color(0, 200, 0);
color rojo = color(200, 0, 0);
color colorR;
boolean modo = true;

void setup()

{
  size(250, 250);
  noStroke();
  cp5 = new ControlP5(this);
 
  println(Serial.list());
  //println(Arduino.list());
 
  //arduino = new Arduino(this, Arduino.list()[1], 57600);
 
  //arduino.pinMode(5, Arduino.SERVO);
  //arduino.pinMode(6, Arduino.SERVO);
  //arduino.pinMode(9, Arduino.SERVO);
  //arduino.pinMode(10, Arduino.SERVO); 
 
  frame.setTitle("Control Serial");

  colorR = rojo;
 
  // Sliders de los grados
 
     cp5.addSlider("Servo_1")
     .setSize(100, 20)
     .setPosition(50, 50)
     .setRange(30,300)
     ;
     
     cp5.addSlider("Servo_2")
     .setSize(100, 20)
     .setPosition(50, 80)
     .setRange(30,300)
     ;
     
     cp5.addSlider("Servo_3")
     .setSize(100, 20)
     .setPosition(50, 110)
     .setRange(30,300)
     ;
     
     cp5.addSlider("Servo_4")
     .setSize(100, 20)
     .setPosition(50, 140)
     .setRange(30,300)
     ;
   
  // Boton de paper
 
     cp5.addButton("Parar")
     .setValue(0)
     .setPosition(70,170)
     .setSize(60, 20)
     ;
     
  // Boton de Modo
 
     cp5.addButton("Modo")
     .setValue(0)
     .setPosition(70,200)
     .setSize(60, 20)
     ;         
     
  String portName = Serial.list()[port];
  xbee = new Serial(this, portName, 9600);   
 
}
 
void draw()

{

fill(colorR); 
rect(150, 200, 20, 20);

  pos1 = str(Servo_1);
  pos2 = str(Servo_2);
  pos3 = str(Servo_3);
  pos4 = str(Servo_4);
 
  if (modo) {mandar();}

}

public void Parar(int theValue)

{
 
  int Servo_1 = valorParada;int Servo_2 = valorParada;int Servo_3 = valorParada;int Servo_4 = valorParada; 
  pos1 = str(Servo_1);pos2 = str(Servo_2);pos3 = str(Servo_3);pos4 = str(Servo_4);

  xbee.write('%'); 
  xbee.write(pos1 + ",");
  xbee.write(pos2 + ",");
  xbee.write(pos3 + ",");
  xbee.write(pos4); 
  xbee.write('\n');
 
  println("Parado de motores");
  modo = false; //para el envio hasta nueva orden

}

void medirPin(int ti, int tf)
   
{

pin = tf - ti;
println("Pin: " + pin);

}   
 
public void Modo(int theValue)

{

if (modo) {modo = false; colorR = rojo;}
else {modo = true; colorR = verde;}

}

void esperar(char c)

{

 while(xbee.read() != c) {}

}

void mandar()

{

  count++;
  if (count == frecuencia) 
  {
 
  count = 0; 
  TI = millis();
 
  xbee.write('%'); 
  xbee.write(pos1 + ",");
  xbee.write(pos2 + ",");
  xbee.write(pos3 + ",");
  xbee.write(pos4); 
  xbee.write('\n');
 
  TF = millis();
  medirPin(TI, TF);
 
  }
 
}

int selec()

{
 
int com = 0;
boolean seleccionando = true;

while(seleccionando)
{

if (key == 'a')
{seleccionando = false;}

}

return com;
 
}


P.D: Necesitas instalar la libreria controlP5 (Se instala en Sketch>Import library>add library>La buscas y la añades)

EscuderoKevin

Max_saeta, yo no tengo una MEGA tengo una arduino UNO. Por eso no puedo. Por otra parte tendre un código listo de estabilización pronto, asi que espera.
Pero de paso e puedo dejar unos datos para que investigues:

- Yo, para que se estabilice activo la función cuando todos los valores de los motores son iguales, quiero decir que cuando no estoy moviendo el joystick(osea esta centrado).
-Para esto le añado una respuesta (un delay) que yo sepa en aeromodelismo esto sirve para que el modelo no haga movimientos bruscos, es decir, que no mas soltar se mueva a la posición recta. Este valor depende del usuario, así que modifícalo a tu gusto. Intentaste probar mi código en tu modelo? Al menos para que veas que funciona mucho mejor.

Te dejo el código de procesing para controlar los motores con 4 sliders. Si tienes dudas de como funciona, me lo preguntas.

Code: [Select]

//import org.firmata.*;
//import cc.arduino.*;

import controlP5.*;
import processing.serial.*;

int port = 1; //El perto desde donde mandas los datos (no te fijes en COMX, es el orden de los puertos, no la X)
int valorParada = 21;

Serial xbee;
ControlP5 cp5;
//Arduino arduino;

int Servo_1 = 90;
int Servo_2 = 90;
int Servo_3 = 90;
int Servo_4 = 90;

int count;

int frecuencia = 10;

String pos1, pos2, pos3, pos4;

int TI, TF, pin;
color verde = color(0, 200, 0);
color rojo = color(200, 0, 0);
color colorR;
boolean modo = true;

void setup()

{
  size(250, 250);
  noStroke();
  cp5 = new ControlP5(this);
 
  println(Serial.list());
  //println(Arduino.list());
 
  //arduino = new Arduino(this, Arduino.list()[1], 57600);
 
  //arduino.pinMode(5, Arduino.SERVO);
  //arduino.pinMode(6, Arduino.SERVO);
  //arduino.pinMode(9, Arduino.SERVO);
  //arduino.pinMode(10, Arduino.SERVO); 
 
  frame.setTitle("Control Serial");

  colorR = rojo;
 
  // Sliders de los grados
 
     cp5.addSlider("Servo_1")
     .setSize(100, 20)
     .setPosition(50, 50)
     .setRange(30,300)
     ;
     
     cp5.addSlider("Servo_2")
     .setSize(100, 20)
     .setPosition(50, 80)
     .setRange(30,300)
     ;
     
     cp5.addSlider("Servo_3")
     .setSize(100, 20)
     .setPosition(50, 110)
     .setRange(30,300)
     ;
     
     cp5.addSlider("Servo_4")
     .setSize(100, 20)
     .setPosition(50, 140)
     .setRange(30,300)
     ;
   
  // Boton de paper
 
     cp5.addButton("Parar")
     .setValue(0)
     .setPosition(70,170)
     .setSize(60, 20)
     ;
     
  // Boton de Modo
 
     cp5.addButton("Modo")
     .setValue(0)
     .setPosition(70,200)
     .setSize(60, 20)
     ;         
     
  String portName = Serial.list()[port];
  xbee = new Serial(this, portName, 9600);   
 
}
 
void draw()

{

fill(colorR); 
rect(150, 200, 20, 20);

  pos1 = str(Servo_1);
  pos2 = str(Servo_2);
  pos3 = str(Servo_3);
  pos4 = str(Servo_4);
 
  if (modo) {mandar();}

}

public void Parar(int theValue)

{
 
  int Servo_1 = valorParada;int Servo_2 = valorParada;int Servo_3 = valorParada;int Servo_4 = valorParada; 
  pos1 = str(Servo_1);pos2 = str(Servo_2);pos3 = str(Servo_3);pos4 = str(Servo_4);

  xbee.write('%'); 
  xbee.write(pos1 + ",");
  xbee.write(pos2 + ",");
  xbee.write(pos3 + ",");
  xbee.write(pos4); 
  xbee.write('\n');
 
  println("Parado de motores");
  modo = false; //para el envio hasta nueva orden

}

void medirPin(int ti, int tf)
   
{

pin = tf - ti;
println("Pin: " + pin);

}   
 
public void Modo(int theValue)

{

if (modo) {modo = false; colorR = rojo;}
else {modo = true; colorR = verde;}

}

void esperar(char c)

{

 while(xbee.read() != c) {}

}

void mandar()

{

  count++;
  if (count == frecuencia) 
  {
 
  count = 0; 
  TI = millis();
 
  xbee.write('%'); 
  xbee.write(pos1 + ",");
  xbee.write(pos2 + ",");
  xbee.write(pos3 + ",");
  xbee.write(pos4); 
  xbee.write('\n');
 
  TF = millis();
  medirPin(TI, TF);
 
  }
 
}

int selec()

{
 
int com = 0;
boolean seleccionando = true;

while(seleccionando)
{

if (key == 'a')
{seleccionando = false;}

}

return com;
 
}


P.D: Necesitas instalar la libreria controlP5 (Se instala en Sketch>Import library>add library>La buscas y la añades)
Todavia no probe tu codigo, ya que vos estas trabajando con XBEE y al final los xbee que yo compre , no sirven ya que uno en el envio se daño, y el importador me dijo 1 a 3 meses, Conrespecto al codigo nuevo que me has pasado , si usas Xbee por lo que veo que si , tampoco me sirve , si podrias Darme simplemente o guiarme como hiciste la parte del MPU 6050 lo adaptaria al mio ya que me compre Un control remoto rf de 6 canales. Con receptor para conectarlo a la arduino y de ahi manejar otras cosas.


Te agradesco mucho por tu ayuda , ya me que mes has ayudado bastante.


En la parte esta "Yo, para que se estabilice activo la función cuando todos los valores de los motores son iguales"


Que funcion ?

migarve55

La función es la de estabilización. Osea que cuando debería estar parado en el aire (con todos los valores de los motores iguales) es cuando debería estabilizarse. Los códigos mas complejos, te permiten estabilizarte en el aire y mientras te estas moviendo, pero eso se me escapa. Lo que si es cierto es que estoy trabajando en lo primero. Lo tendré listo para el martes o el miércoles, por favor ten paciencia.

En cuanto tu control remoto rf. Supongo que te referirás al típico mando de aero modelismo rf que se suele conectar el rf a la controladora de vuelo. Como tu ya aclaraste que no querías comprarla, porque entonces no tiene gracia (comparto tu opinión, aunque yo pienso comprarla para cambiarla por el arduino y moverlo mas fácil, es solo por diversión cuando acabe el proyecto, yo te recomiendo lo mismo para cuando acabes, ya que ya tienes el mando).
Bueno en cuanto a eso creo que ya te dejaron un enlace, pero te lo vuelvo a dejar por si acaso: BlueCopter
El creador del post creó un codigo que consistía en un arduino con un giroscopio (como el mpu6050) y un receptor como el tuyo que controlaba un quadricóptero. Creo que es exactamente lo que necesitas para tu proyecto.

EscuderoKevin

#27
Feb 21, 2015, 03:57 am Last Edit: Feb 21, 2015, 04:01 am by EscuderoKevin
Hola , nuevamente recien me llego Este Producto , jaja , tengo todo lo necesario menos el conocimiento. Intente que el arduino me tome los valores del control , pero no puedo.

Y use este ejemplo tal cual esta :

https://github.com/strangedev/Arduino-Quadcopter

(Perdon por no poner etiquetas pero hice un EDIT rapido.


Y no funciona tampoco.

ehrja

pues yo estoy viendo un vídeo que describe muy bien lo que hay que hacer para calibrar un Quadcopter
https://www.youtube.com/watch?v=l1GWtlRk45Q

en ingles, pero fácil de entender, algo que recomiendan es quitar las hélices para calibrarlo y configurarlo, algo que no has hecho y eso es por seguridad.

si necesitan traducción me tomara un tiempo.
Hola buenos días!

migarve55

Ahora mismo estoy adaptando el código de strangedev para usar dos xbees y un joystick de PC. Paciencia por favor.

Go Up