Go Down

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

EscuderoKevin

Feb 15, 2015, 04:16 am Last Edit: Feb 25, 2015, 08:36 pm by EscuderoKevin
Buenas noches a todos !

Estoy en un nuevo proyecto Un Multirotor o como es mas conocido "QUADCOPTER"

Cuento con los Siguientes materiales para el mismo

  • 2 Arduino Mega
  • 1 Arduino Uno
  • 1 MPU 6050
  • Mando a Distancia con receptor RC
  • 4 Motores , 4 ESC , 4 Helices,
  • 1 Estructura en MDF 3 MM
  • Sensonres de Temperatura , Reloj, Luz
  • Tamibien cuento con una LIPO de 5200 Mah
  • Cuento con nrf24L01 Los voy a usar para enviar y recibir datos entre arduinos use ESTOS ejemplos a seguir que fueron dados por max_seta


Creo que por ahora son esas cosas las que tengo.


Eh probado muchos Ejemplos y muchas cosas , los motores funcionan. Los Esc funciona , LOS ESC conectados directos al control remoto , funcionan, Los 6 canales funcionan.


La idea de este proyecto es hacer un Quadcopter que sea Estable , poder darle de 20 a 30 minutos de vuelo.

Pero bueno se me complico mucho el tema de hacer el ESTABILIZADOR , Soy de ARGENTINA y muchas de las piezas para comprar que todos suguieren son de AFUERA DE ARGENTINA , y bueno como sabran ARGENTINA esta muy mal con el tema de las importaciones , la semana  pasada me llegaron unas pulseras que compre en el "2013" !!!!!!! asique no puedo esperar tanto tiempo para algunas cosas , por eso trato de hacrlo con lo que tengo.


Prube los codigos del BlueCopter Pero no eh logrado que funcione.

Creo que Primero tendria que empezar a Revisar el tema del CONTROL REMOTO , tomar bien los datos y luego tratar de tener algun algoritmo para poder estabilizarlo a las velocidades que yo le doy.

Lo que estoy realmente necesitado es hacer la estabilizacion con el MPU 6050.


Yo esta noche voy a trabajar en el codigo  SIN la estabilizacion voy a ver que tal me sale , luego se los subo

PD: Este edit fue realizado el dia 21/02/2015 a las 21:40 PM ARGENTINA.

ehrja

#1
Feb 15, 2015, 08:37 am Last Edit: Feb 15, 2015, 09:19 am by ehrja
Dejo fotos , Mi codigo que uso ahora al cual debo implementarle el MP6050


¿Y las fotos?

Edit:
-----
Podrias dar un poco de contexto sobre como funciona todo esto y que hardware estas usando como se comporta y como debería comportarse.

ademas que quieres decir con esto (el nombre de la variable me distrae un poco):
   ordenTeclado =OrdenSubirBajar ();
   ordenTeclado1 =OrdenSubirBajar ();
   ordenTeclado2 =OrdenSubirBajar ();
   ordenTeclado3 =OrdenSubirBajar ();
... -cuestion de leer mas abajo, pero dejas de lado muchas variables, ¿porqué?

Hola buenos días!

EscuderoKevin

Hola ehrja , gracias por siempre ser tan atento con todos. Tenemos varios mensajes privados ! jajaja


Bueno te comento un poco no pude subir fotos ya que no las tengo aca , pero si tengo un VIDEO.


https://www.dropbox.com/s/bm5toend0yvx4sg/VID-20150214-WA0002.mp4?dl=0


Funciona excelente , se eleva pero no se mantiene ya que no se como ponerle el MPU 6050.



Te comento los componentes que estan AHORA:


Arduino Mega
4 ESC 20 A
4 Brusheless 3,500kv
4 Helices
1 Fuente de PC 1000W

Y mucho cable jajaja



Lo que quiero terminar armandolo es con

Todos los elementos mencianados antes
Pero sumarle el mando a distancia echo por mi mismo con

Otro arduino mega , Xbee.



Yo necesito ahora que los brusheless se balanceen,

Osea que ademas de las velocidades que les DOY , se mantengan derechos y a esa altura.

Con respecto al codigo que te pase falta trabajarlo mucho como te nombre antes lo saque de un lugar , Copy & paste y agregue las cosas que necesito , aunque todavia no saque las cosas que no necesito.


El codigo funciona mediante SERIAL.


Mediante A , aumenta cada 1 PUNTO la velocidad de PWN, con la letra S, vuelve todo al inicio y con la letra Z baja la velocidad del PWN.

El codigofunciona bien , responde bien.


Pero bueno como te decia antes necesito agregar el gyroscopio para mantenerlo estable ya que al elevarse sale disparado para cualquier lado , porque suben todos los moteres aparte de desparejos , cuando uno se inclina y el otro no baja su velocidad el quad se mueve en esa direccion..


Ahora googleando un buen rato encontre esto que me va a servir mucho, pero igual sigo con la duda de como adaptarlo.


PD: la idea es hacerlo con un "JOYSTICK" pero el joystick cambia muy rapido de valores , asique por el momento va a ser por SERIAL  luego conseguire o tratare de hacerlo con algun tipo de potencimientro con escalas.



Este es el codigo que encontre:

Code: [Select]
<pre>#include <Wire.h>
#include <I2Cdev.h>
#include <MPU6050.h>
 
#include <AFMotor.h>
AF_DCMotor motor1(1, MOTOR12_64KHZ); // create motor #2, 64KHz pwm
AF_DCMotor motor2(2, MOTOR12_64KHZ);
 
MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;
 
int valMotor1;
int valMotor2;
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("Initialize MPU");
mpu.initialize();
Serial.println(mpu.testConnection() ? "Connected" : "Connection failed");
 
motor1.setSpeed(100); // set the speed to 200/255
motor2.setSpeed(100);
 
}
void loop()
{
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
 
ax = map(ax, -17000, 17000, -125, 125);
 
valMotor1 = 125+ax;
valMotor2 = 125-ax;
 
Serial.println(valMotor1, DEC);
Serial.println(valMotor2, DEC);
 
if(valMotor1 > 0 && valMotor1 < 255){
motor1.setSpeed(valMotor1);
}
if(valMotor2 > 0 && valMotor2 < 255){
motor2.setSpeed(valMotor2);
}
 
motor1.run(FORWARD); // turn it on going forward
motor2.run(BACKWARD);
 
delay(200);
 
}



Hay muchas partes que no me sirven, pero la parte del estabilizador me SIRVE


osea la idea es

Tener un Maximo de velocidad
Tener un minimo de veocidad

y a eso sumar el moviento que yo le deje y correguir los ejes X e Y para que se mantega estable en el lugar.


Gracias como siempre por tu ayuda


PD2: emitan la parte del sonido y mas al final ya que el video lo mande por wsp a un amigo....

ehrja

bueno pero ademas falta agregarle la dirección.
También la nave debería tener un frente y una parte trasera, me parece que con esto tenemos derecha e izquierda.

para hacer esto es mejor cambiar las variables para que el codigo sea mas semantico. es decir que las variables se describan a si mismas.


Como tu nave es de cuatro motores te sugiero esto:

cambiar
motor1 por motorNO ó motorFI(frente izquierdo)
motor2 por motorNE ó motorFD(frente derecho)
motor3 por motorSO ó motorTI(.... ya me entiendes!, ¿no?
motor4 por motorSE


mira esta imagen que revela mejor mi idea.


 bueno voy a chequearlo a ver que puedo sacar.
Hola buenos días!

migarve55

Mira creo que soy el mas indicado para ayudarte 8)
Estoy haciendo el mismo proyecto que tu, con dos xbees para la comunicación y una arduino para manejarlo.

Mi código es mucho mas avanzado que el tuyo, porque yo puedo mandar una velocidad concreta a cada motor y paralo cuando quiera.

Yo uso procesing para mover los motores, me aparecen cuatro sliders (desliadores) en una ventano y moviendo los puedo regular la velocidad instantáneamente. Seguro que el código te sera muy útil para mejorar el tuyo y sacar ideas. También he desarrollado un código para usar un joystick de ordenador y mover mi cuadricoptero en varias direcciones. Te aviso qe l código es mucho mas complejo que el tuyo y todavía no tengo implementado el estabilizador mediante el giroscopio. Una cosa que debes saber es que el mpu6050 tiene mucho "ruido". Me refiero a que cuando hay vibraciones las mediciones son muy caóticas. Te aseguro por experiencia que seguro que vas a tener vibraciones, por eso todavía no puedo ayudarte en lo de la estabilización.

Para empezar un detalle: la configuración de mi quadcopter es X, no +.

Te explico:
Dependiendo de la posición de los rotores en función de los rotores.

  Forma X:         Forma +:

  R        R              R
     \   /                 |
       A               R-A-R
     /   \                 |
  R        R              R


Puede que parezca la misma pero no lo es, la X esta en diagonal, y si quieres moverte hacia delante         necesitas modificar la velocidad de diferente manera que la +.
Aclaro esto para que comprendas el código.
Te dejo mi código del arduino (Ya se que es muy extenso pero lo llevo desarrollando durante meses):

Code: [Select]

#include <Ultrasonic.h>
#include <SoftwareSerial.h>
#include <Servo.h>

SoftwareSerial xbee(2, 3); // RX, TX
Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN)

#define PARACAIDAS true
#define maxTiempoSinSenal 10000
#define DB_S false
#define AlturaM 30

#define minS 30
#define maxS 300

/*

    Modo de funcionamiento

    1 - Normal
    2 - DEBUG: De Xbee a monitor Serial
    3 - Setup de rotores y test
    4 - Test de Xbee
    5 - Controlado desde monitor Serial
    6 - Automatico

*/

//Creo los rotores

Servo N, W, S ,E;

int Ns = 50;
int Ss = 50;
int Ws = 50;
int Es = 50;

int SELECT = 7;
int INTRO = 4;

char incom;
int MODO = 1;
long int count;
int altura, alturaMx, AlturaSoporte;

void setup() //---------------------------------SETUP-------------------------------//

{
  
Serial.begin(9600);
xbee.begin(9600);

// Pines de los servos

N.attach(5);
S.attach(6);
W.attach(9);
E.attach(10);

//pinMode(SELECT, INPUT); pinMode(INTRO, INPUT);
pinMode(13, OUTPUT);

xbee.println("PruebaXbee");
Serial.println("Setup completado");

digitalWrite(13, HIGH);
delay(150);
digitalWrite(13, LOW);

arm();

AlturaSoporte = ultrasonic.Ranging(CM);
alturaMx = AlturaM;

//MODO = selec();

}

void loop() //------------------------------------LOOP--------------------------------//

{
  
switch (MODO) //Modo
{

case 1: // Modo 1 normal
  
 while (xbee.available() > 0)
  
  {
   if (xbee.read() == '%')
   {
    // look for the next valid integer in the incoming serial stream:
    Ns = xbee.parseInt();
    // do it again:
    Ss = xbee.parseInt();
    // do it again:
    Ws = xbee.parseInt();
    // do it again:
    Es = xbee.parseInt();

    // look for the newline. That's the end of your
    // sentence:
    if (xbee.read() == '\n')
    
    {

      N.write(Ns);
      S.write(Ss);
      W.write(Ws);
      E.write(Es);  
        
      printD(DB_S);  
    }  
   }    
  }  

break; // Fin modo 1

case 2: // Xbee al monitor serial

if (xbee.available() > 0)
{
 incom = xbee.read();
 Serial.println(incom);
}
delay(100);

break; // Fin modo 2

case 3:   //motores

 N.write(50);
 S.write(50);
 W.write(50);
 E.write(50);

delay(5000);

 N.write(100);
 S.write(100);
 W.write(100);
 E.write(100);

delay(5000);

 N.write(200);
 S.write(200);
 W.write(200);
 E.write(200);
 
delay(5000);

 N.write(40);
 S.write(40);
 W.write(40);
 E.write(40);
 
 delay(1000);
 
while (true) {} //Aqui fnaliza el test hasta que se para.
 
break; // Fin modo 3

case 4: // Test de la Xbee

xbee.println("Probando transmision inalambrica por Xbee");
delay(1500);

break; // Fin modo 4

case 5: // Desde monitor Serial

 while (Serial.available() > 0)
  
  {

    // look for the next valid integer in the incoming serial stream:
    if (Serial.read() == '%')
    {
    Ns = Serial.parseInt();
    // do it again:
    Ss = Serial.parseInt();
    // do it again:
    Ws = Serial.parseInt();
    // do it again:
    Es = Serial.parseInt();
    // look for the newline. That's the end of your
    // sentence:
     if (Serial.read() == '\n')
    
     {

      N.write(constrain(Ns,minS,maxS));
      S.write(constrain(Ss,minS,maxS));
      W.write(constrain(Ws,minS,maxS));
      E.write(constrain(Es,minS,maxS));  
        
      printD(DB_S);  
     }
    }    
  }  
 
break; // Fin modo 5

case 6: //Modo Automatico

if (xbee.available()) //Coje los datos que les mandas
{
alturaMx = Serial.parseInt();
}

nivelar(alturaMx);

xbee.print(altura); //Lo devuelve a la xbee para saber la altura

break; //Fin modo 6

} //Modo

//parachute(PARACAIDAS);

} //Loop

//------------------------------------FUNCIONES--------------------------------------//


void arm()

{                            // Funcion del armado del ESC
 N.write(0);
 S.write(0);
 W.write(0);
 E.write(0);
 delay(100);
 N.write(20);
 S.write(20);
 W.write(20);
 E.write(20);
 delay(5000);
 
 Serial.println("Setup de motores hecho");
}

void parachute(boolean p)

{
 if (p) //Si el protcolo esta activado
 {
  
   if (xbee.available()) {count = 0;} else {count += 1;}//Cada vez que no hay señal suma 1 al count
  
   if (count = maxTiempoSinSenal)
 
    {
      
      N.write(constrain(Ns,minS,maxS));
      S.write(constrain(Ss,minS,maxS));
      W.write(constrain(Ws,minS,maxS));
      E.write(constrain(Es,minS,maxS));
      
      Serial.println("Protocolo de aterrizaje");
    } //Se activa el protocolo
 }
}

void printD(boolean t)

{
   if (t)
  
   {
      Serial.print("Rotores: ");
      Serial.print(Ns);
      Serial.print(" | ");
      Serial.print(Ss);
      Serial.print(" | ");
      Serial.print(Ws);
      Serial.print(" | ");
      Serial.println(Es);

   }  

}

void nivelar(int aM)

{

int altura = ultrasonic.Ranging(CM) - AlturaSoporte;
int velocidad;

if (altura < aM) //Los rotores bajan
{velocidad = 100;}
if (altura == aM) //Los rotores mantienn la altura
{velocidad = 80;}
if (altura > aM) //Los rotores suben
{velocidad = 75;}

      N.write(velocidad);
      S.write(velocidad);
      W.write(velocidad);
      E.write(velocidad);

}


return modo;

}


migarve55

El de procesing:

Code: [Select]


/*

   CODIGO DE CONTROL DE MULTIROTOR ARDUINO

   POR: Miguel Garnacho Vélez
   FECHA: 24/12/2014
   
   VERSION: Alpha 0.7
   PROXIMO CAMBIOS:
   
   Modos 2 y 3 (VERSION Alpha 1.0)

*/

import controlP5.*;
import org.firmata.*;

//Configuracion

int XBEE = 1; // Xbee
int CONT = 2; // Joystick

int Modo = 1;

float factorMod = 1.8;
float factorRes = 200;

int maxMod = 10;

int count;
int frecuencia = 10;
int mod;

int pin, TI, TF;

/*

 1 - Control por Joystick
 2 - Por teclado
 3 - Por interfaz
 4 - TeleTest de rotores (A traves de Serial) NO OPERATIVo HASTA VERSION 1.1
 5 - Modo calibracion de giroscopio (Poner el arduino como modo 6) NO OPERATIVO HASTA VERSION 1.5
 6 - Debug del GPS NO OPERATIVO HASTA VERSION 2.5

*/

import procontroll.*;
import net.java.games.input.*;

//import class to set up serial connection with wiring board
import processing.serial.*;
Serial xbee;

  ControllIO controllIO;
  ControllDevice joypad;
  ControllSlider slider1; //X
  ControllSlider slider2; //Y
  ControllSlider potencia;

  int Nspeed;
  int Sspeed;
  int Wspeed;
  int Espeed;
 
  String strNspeed;
  String strSspeed;
  String strWspeed;
  String strEspeed;
 
  int restaX;
  int restaY;
  int pot;
 
  int ejeX;
  int ejeY;
 
  boolean modo = false;
 
  color verde = color(0, 200, 0);
  color rojo = color(200, 0, 0);
  color colorR = rojo;

void setup()

{

  size(640, 400);
  background(color(204));
 
  println(Serial.list());
  String portName = Serial.list()[XBEE];
  xbee = new Serial(this, portName, 9600);
 
//           Joystick

 

  controllIO = ControllIO.getInstance(this);
  controllIO.printDevices();
 
  joypad = controllIO.getDevice(CONT);
  joypad.plug(this, "handleButton1Press", ControllIO.ON_PRESS, 3);
  joypad.plug(this, "handleButton2Press", ControllIO.ON_PRESS, 6);
 
  slider1 = joypad.getSlider(4); //Eje X (4)
  slider1.setMultiplier(128);
  slider1.setTolerance(0.06f);
  println(slider1.getName());

  slider2 = joypad.getSlider(3); //Eje Y (3)
  slider2.setTolerance(0.06f);
  slider2.setMultiplier(128);
  println(slider2.getName());
 
  potencia = joypad.getSlider(0); //Potencia (0)
  potencia.setTolerance(0.06f);
  potencia.setMultiplier(90);
  println(potencia.getName());

 
   //Creación de la interfaz

//Variables
   
 float transX;
 float transY;
 
}
void draw()

{

switch (Modo) //Eliges un modo

{

  case 1: //Por Joystick
  ModoJoystick();
  break;

  case 2:
  teclado();
  break;
 
  case 3:
  interfaz();
  break;
 
  case 4:
  TeleTest();
  break;
 
  case 5:
  Calib();
  break;
 
  case 6:
  DebugGPS();
  break;
 
}
 
 
  // Manda la velocidad de los rotores a Arduino

  if (modo) {mandar();} //Si has pulsado el modo, se manda los datos

} //Draw

void mousePressed()

{ // Botones
  if ( mouseX >= 220 && mouseX <= 300 && mouseY >= 340 && mouseY <= 360 ) // chekea si pulsa modo
  {
    if (modo) {modo = false; colorR = rojo;}
    else {modo = true; colorR = verde;}
  }
  if ( mouseX >= 340 && mouseX <= 420 && mouseY >= 340 && mouseY <= 360 ) // lo mismo con aterrizar
  {
  //xbee.write('A');       //Aterrizaje   
  println("Aterrizaje"); 
  }     

}

void handleButton1Press() //Modo
{
 
if (modo) {modo = false; colorR = rojo;}
else {modo = true; colorR = verde;}
 
}

void handleButton2Press() //Aterrizar
{println("Aterrizaje");}

//---------------------------------------------------------FUNCIONES DE TECLADO-----------------------------------------------------------

void DrawJoystick()
{
 background(0);
 
 stroke(0);
 fill(0,255,0);
 rect(220, 340, 80, 20, 7); // FeedBack
 rect(340, 340, 80, 20, 7); // Aterrizar
 fill(0);
 text("Modo", 230, 340, 80, 20);
 text("Aterrizar",350, 340, 80, 20);
 fill(colorR); //Piloto del modo
 rect(600,350,20,20);
 fill(0);
 stroke(0,255,0);
 rect(50, 50, 256, 256); // Panel del jostick
 stroke(0,255,0); // Ejes X y Y
 line(50, 178, 306, 178); // X
 line(178, 50, 178, 306); // Y
 fill(0,255,0);
 ellipse( 178, 178, 5, 5); // Puntero
 fill(0,255,0);
 stroke(0,255,0);
 rect(520, 60, 80, 20, 7); // E
 rect(360, 250, 80, 20, 7); // W
 rect(360, 60, 80, 20, 7); // N
 rect(520, 250, 80, 20, 7); // S
 rect(500, 300, 80 , 20, 7); //Potencia
 fill(0);
 line(400, 70, 560, 260); //Ejes
 line(560, 70, 400, 260); //Ejes
 fill(0,255,0);
 text("Interfaz del DronArduino", 10, 10, 100, 80);  // Título
 text("X:          Y:", 60, 310, 140, 100); //Coordenadas de los ejes
}
 void DrawTeclado()
 
 {}

//------------------------------------------------------------MODOS-------------------------------------------------------------//

void ModoJoystick()

{
 
    DrawJoystick();
 
//                       Puntero
  fill(255,0,0);
  ellipse(slider1.getValue() + 178, slider2.getValue() + 178, 5, 5);
 
  fill(0,255,0);
  text("     " + int(slider1.getValue()) + "           " + int(-slider2.getValue()), 60, 310, 140, 100); //Coordenadas de los ejes
  fill(0);
  text(int(potencia.getValue() + 90), 515, 315);   //Potencia
//                       Calculo
   ejeX = int(slider1.getValue());
   ejeY = -int(slider2.getValue());

   mod = int(sqrt(sq(ejeX) + sq(ejeY))/factorMod)

   pot = int(potencia.getValue() + 90);
   restaX = int(abs(ejeX * pot / factorRes));
   restaY = int(abs(ejeY * pot / factorRes));
   
   //println(mod);

   if (ejeX > 0 && ejeY > 0) // 1
   {
   Espeed = pot - mod;
   Nspeed = pot - restaY;
   Sspeed = pot - restaX;
   Wspeed = pot;
   }
   if (ejeX < 0 && ejeY > 0)  // 2
   {
   Nspeed = pot - mod;
   Espeed = pot - restaY;
   Wspeed = pot - restaX;
   Sspeed = pot;
   }     
   
   if (ejeX < 0 && ejeY < 0) // 3
   {
   Wspeed = pot - mod;
   Nspeed = pot - restaY;
   Sspeed = pot - restaX;
   Espeed = pot;
   }
   if (ejeX > 0 && ejeY < 0)  // 4
   {
   Sspeed = pot - mod;
   Espeed = pot - restaY;
   Wspeed = pot - restaX;
   Nspeed = pot;
   }
     
   if (ejeX == 0) //Se mueve por el eje Y
   {
    if (ejeY > 0)
    {Nspeed = pot - restaY;Espeed = pot - restaY;Wspeed = pot;Sspeed = pot;}
    else
    {Wspeed = pot - restaY;Sspeed = pot - restaY;Nspeed = pot;Espeed = pot;}
   }
   if (ejeY == 0) //Se mueve por el eje X
   {
    if (ejeX > 0)
    {Espeed = pot - restaX;Sspeed = pot - restaX;Nspeed = pot;Wspeed = pot;}
    else
    {Wspeed = pot - restaX;Nspeed = pot - restaX;Sspeed = pot;Espeed = pot;}
   }   

   if (ejeX == 0 && ejeY == 0) //Origen
   {Nspeed = pot;Sspeed = pot;Wspeed = pot;Espeed = pot;}
   
// Finaliza con constrain

Nspeed = constrain(Nspeed,0,200);
Sspeed = constrain(Sspeed,0,200);
Wspeed = constrain(Wspeed,0,200);
Espeed = constrain(Espeed,0,200);
 
// Display rotores

   text(Nspeed, 395, 75); //N
   text(Sspeed, 555, 265); //S
   text(Wspeed, 395, 265); //W
   text(Espeed, 555, 75); //E     
 
}

void teclado()

{
 
  //Dibujar el teclado
  DrawTeclado();
 
   if (keyPressed)

   {
     if  (key == 'w' || key == 'W') {if (Nspeed >= 15) {Nspeed =- 15;}} else {Sspeed = pot;}
     if  (key == 'a' || key == 'A') {if (Wspeed >= 15) {Wspeed =- 15;}} else {Espeed = pot;}
     if  (key == 's' || key == 'S') {if (Sspeed >= 15) {Sspeed =- 15;}} else {Nspeed = pot;}
     if  (key == 'd' || key == 'D') {if (Espeed >= 15) {Espeed =- 15;}} else {Wspeed = pot;}
         
     if (key == CODED)
     {
     if  (keyCode == UP) {if (pot < 180) {pot =+ 5;}}
     if  (keyCode == DOWN) {if (pot > 0) {pot =- 5;}} 
     }
     
   }
}

void mandar()

{

  count++;
  if (count == frecuencia) 
  {
 
  count = 0; 
  TI = millis();
 
  //Pasa la velocidad a una string
 
  strNspeed = str(Nspeed);
  strSspeed = str(Sspeed);
  strWspeed = str(Wspeed);
  strEspeed = str(Espeed);
 
  xbee.write('%'); 
  xbee.write(strNspeed + ",");
  xbee.write(strSspeed + ",");
  xbee.write(strWspeed + ",");
  xbee.write(strEspeed); 
  xbee.write('\n');
 
  TF = millis();
  medirPin(TI, TF);
 
  }
 
}

void interfaz()

{}

void TeleTest()

{}

void Calib()

{}

void DebugGPS()

{}

void medirPin(int ti, int tf)
   
{

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

}

/*
   if (slider1.getValue() == 0) // X
   {
      Wspeed = pot;
      Espeed = pot;
   }
   
   if (slider2.getValue() == 0) // Y
   {
      Nspeed = pot;
      Sspeed = pot;
   }   
*/


ehrja

#6
Feb 17, 2015, 02:04 am Last Edit: Feb 17, 2015, 02:05 am by ehrja
migarver55

Me parece que eres el indicado para ayudar a Escuderokevin yo estuve leyendo algo sobre el mpu6050 pero como no tengo el hardware no lo puedo reproducir.

He leído que la combinación del giroscopio + el acelerometro disminuyen el ruido.
si solo utilizas el acelerometro si que hay mucho ruido.

Algo que no encotre por ningún lado fue el porque de los valores que utilizan en el map:

 ax = map(ax, -17000, 17000, -125, 125);
seguiré por aquí.
Hola buenos días!

EscuderoKevin

migarve55



Tu code esta GENIAL. Justo compre los xbee , asique voy a trabajar mucho en eso , Ahora te hago una pregunta , lo hiciste volar (? , osea VUELA ?


Porque para mi  es imposible hacero volar , ya que no tiene estabilidad , osea si lo sostengo con la mano , se queda flotando , pero donde lo suelto y se inclina para un lado , sale disparado para ese lado , es mas lo solte sin querer cuando estaba probando el MPU6050 y un motor se ve que le envie mucho valor y disparo me corto la mano jajajaj , me corto bastante profundo , y la helice no se rompio.


Con respecto a la forma de hacer el QUAD, yo uso la misma modo X.


Osea Si quiero que valla para adelante. Le vajo la velocidad del NE y NO y le subo al SE y SO.


Osea que va de costado no derecho. pero bueno eso ya lo tengo IDEADO la principal es hacerlo volar y que se mantenga en ese lugar.

Sinceramente te agradesco mucho por tu codigo me sirve muchisimo ya que igualmente LO ENTENDI porque me lei mucho sobre xbee ya que no estaba seguro si xbee o xbee wifi , o RF , no estaba seguro. pero compre XBEE de 3.kms de alcanse asique espero terminarlo.


Ayer estube 6 horas probando el MPU 6050 y sigo sin entenderlo , debido a los VALORES y eso no puedo entenderlo , y para estabilizarlo seria algo asi


Code: [Select]

servone.Write(Velocidad+x)
servono.Write(Velocidad-x)
servose.Write(Velocidad+y)
servoso.Write(Velocidad-y)


Pero bueno , probe de esa forma y no me fue nada bien , jajaja , tengo que sacarle las helices y probar y testear todo.


Gracias por todo!

surbyte

Tu problema es saber buscar buena información.
Usa siempre esta secuencia de palabras en GOOGLE y obtienes de todo (en inglés generalmente)

Google: MPU 6050 quadcopeter

Quadcompter Hecho en casa
Using the MPU6050 for Quadcopter Orientation Control

Esta todo, solo debes aprender a buscarlo.
Si es algo para Arduino, usa la palabra arduino y lo que quieres.

EscuderoKevin

jaja , si igualmente buscando asi como vos me dijiste me pasa estas cosas:




con este codigo:


Code: [Select]

// MPU-6050 Short Example Sketch
// By Arduino User JohnChi
// August 17, 2014
// Public Domain
#include<Wire.h>
const int MPU=0x68;  // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);
}
void loop(){
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,14,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)   
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  Serial.print("AcX = "); Serial.print(AcX);
  Serial.print(" | AcY = "); Serial.print(AcY);
  Serial.print(" | AcZ = "); Serial.print(AcZ);
  Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);  //equation for temperature in degrees C from datasheet
  Serial.print(" | GyX = "); Serial.print(GyX);
  Serial.print(" | GyY = "); Serial.print(GyY);
  Serial.print(" | GyZ = "); Serial.println(GyZ);
  delay(333);
}


y conectado de esta forma:




me tira estos resultados.


EL QUAD TOLTAMENTE QUIETO




Esas cosas no entiendo porque esos valores ?

Jopapa

Siento hacer de abogado del diablo.
Pero...Hacer la parte mecánica de un quadcopter es una cuestión fútil.

El comprender en profundidad la conjunción giroscopio-acelerómetro e integrarlos en la estabilización del aparato es harina de otro costal. No son solo los valores en bruto que obtienes, tienes que integrarlos con filtros Kalman (para empezar).

Aquí tienes un pequeño ejemplo de firm ya hecho.

http://www.scoutuav.com/2011/12/13/low-cost-arduino-based-auto-stabilizing-system/


Suerte

Jopapa
www.jopapa.me

P.D. Se venden placas de control para conectar directamente a lo que ya tienes construido.

Jopapa
www.jopapa.me

surbyte

Eso es porque te metiste con un tema como dice jopapa sin haberlo estudiado debidamente.
En todos los casos que he leido la gente se queja de lo dificil que es entender este sensor. Pero funciona.
Solo que requiere trabajo.  Te hemos pasado buenos links.
El que dice queadcopter hecho en casa tiene todo.
Asi que toma una base que funcione y sigue a partir de ahi.
El filtro kalman es todo en un giroscopio-acelerómetro.

Stop. Revisa los links y continúa desde ahi.

migarve55

Mira, yo he encontrado un código que usaba el pin INT del mpu6050 para fitrar la señal. Por desgracia yo no puedo usar ese código dado que mi shield ocupa los pines que necesito para el programa. Son los pines 2 y 3, que al parecer tienen una característica especial. Me temo que yo no voy a usar ese código, pero bueno, a ti igual ter sirve te dejo el enlace.

Por otra parte, he de decir que si, si consigo que se levante pero la estabilidad no es adecuado. Ten en cuenta que facilitas mucho al software si las partes físicas de tu copter esta bien centrada y estabilizadas. Ademas, he leído que te has hecho daño al probarlo. Ten mucho cuidado, en una de estas te cortas en serio y no lo cuentas. Yo siempre trabajo con un código que al cortarse la transmisión los motores se paran, y puedo pararlas adecuadamente desde mi teclado, y puedes montar fácilmente una base para que no salga volando pero que si se levante lo suficiente. Yo lo tengo unido a una base de madera con un peso de 5kg mediante gomas elásticas, y créeme, es mucho mejor así.

Tienen razón con lo de que no googleaste lo suficiente. Existe una libreria para el mpu6050, que te ahorra mucho trabajo. Seguramente ya lo habrás visto en mi código. Necesitas para funcionar las librerias Wire.h, I2Cdev.h y MPU6050.h. Las dos últimas están en la lista del enlace, y Wire.h esta preistalada en el IDE de arduino.

El codigo de la estabilizacion con filtro lo tendre preparado dentro de poco, no te preocupes. Es útil saber vectores y algo de fisica para estas cosas. Me gustaría al final compara nuestros proyectos, a ver que tal quedan. Sigue en contacto en este post.

max_saeta

#13
Feb 17, 2015, 09:07 pm Last Edit: Feb 17, 2015, 09:09 pm by max_saeta
Migarve55, yo se poco de quadcoteros, y me gustaria armar uno pronto. Ahora mi aporte si estas usando una tarjeta MEGA como veo en la foto, la MEGA tiene mas pines de interrupciones 2,3,21,20,19 y 18 en ese orden son las interrupciones 0,1,2,3,4 y 5.

Revisa aqui y aqui.

Digo esto para la librería que usa INT.

EscuderoKevin

#14
Feb 17, 2015, 09:51 pm Last Edit: Feb 17, 2015, 09:53 pm by EscuderoKevin
Siento hacer de abogado del diablo.
Pero...Hacer la parte mecánica de un quadcopter es una cuestión fútil.

El comprender en profundidad la conjunción giroscopio-acelerómetro e integrarlos en la estabilización del aparato es harina de otro costal. No son solo los valores en bruto que obtienes, tienes que integrarlos con filtros Kalman (para empezar).

Aquí tienes un pequeño ejemplo de firm ya hecho.

http://www.scoutuav.com/2011/12/13/low-cost-arduino-based-auto-stabilizing-system/


Suerte

Jopapa

www.jopapa.me

P.D. Se venden placas de control para conectar directamente a lo que ya tienes construido.


Me estas diciendo que no use arduino (?.

Eso es porque te metiste con un tema como dice jopapa sin haberlo estudiado debidamente.
En todos los casos que he leido la gente se queja de lo dificil que es entender este sensor. Pero funciona.
Solo que requiere trabajo.  Te hemos pasado buenos links.
El que dice queadcopter hecho en casa tiene todo.
Asi que toma una base que funcione y sigue a partir de ahi.
El filtro kalman es todo en un giroscopio-acelerómetro.

Stop. Revisa los links y continúa desde ahi.
Si puede ser , pero bueno la idea es ir aprendiendo sobre la marcha, conrespecto a los links que me pasaste los use , los probe y en el post que esta arriba te mostre el resultado de uno.

"El que dice queadcopter hecho en casa tiene todo."

No tiene todo, "Programmed in AVR-GCC with Atmel Studio 6."

Y luego que son solo librerias las que vi ahi.


Mira, yo he encontrado un código que usaba el pin INT del mpu6050 para fitrar la señal. Por desgracia yo no puedo usar ese código dado que mi shield ocupa los pines que necesito para el programa. Son los pines 2 y 3, que al parecer tienen una característica especial. Me temo que yo no voy a usar ese código, pero bueno, a ti igual ter sirve te dejo el enlace.

Por otra parte, he de decir que si, si consigo que se levante pero la estabilidad no es adecuado. Ten en cuenta que facilitas mucho al software si las partes físicas de tu copter esta bien centrada y estabilizadas. Ademas, he leído que te has hecho daño al probarlo. Ten mucho cuidado, en una de estas te cortas en serio y no lo cuentas. Yo siempre trabajo con un código que al cortarse la transmisión los motores se paran, y puedo pararlas adecuadamente desde mi teclado, y puedes montar fácilmente una base para que no salga volando pero que si se levante lo suficiente. Yo lo tengo unido a una base de madera con un peso de 5kg mediante gomas elásticas, y créeme, es mucho mejor así.

Tienen razón con lo de que no googleaste lo suficiente. Existe una libreria para el mpu6050, que te ahorra mucho trabajo. Seguramente ya lo habrás visto en mi código. Necesitas para funcionar las librerias Wire.h, I2Cdev.h y MPU6050.h. Las dos últimas están en la lista del enlace, y Wire.h esta preistalada en el IDE de arduino.

El codigo de la estabilizacion con filtro lo tendre preparado dentro de poco, no te preocupes. Es útil saber vectores y algo de fisica para estas cosas. Me gustaría al final compara nuestros proyectos, a ver que tal quedan. Sigue en contacto en este post.
migarve55 , Muchas gracias por tu ayuda, Voy a investigar mas sobre el tema del INT del mpu6050.

Y con respecto al tema de las librerias ya las tengo todas , y use un EJEMPLO que trae una de las librerias. es mas te comento que use este que trabaje un poco:

Code: [Select]
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"

 
MPU6050 mpu;
 
int16_t ax, ay, az;
int16_t gx, gy, gz;
 


int val2;
int val;
int prevVal;
int prevVal2;
 
void setup()
{
    Wire.begin();
    Serial.begin(38400);
 
    Serial.println("Initialize MPU");
    mpu.initialize();
    Serial.println(mpu.testConnection() ? "Connected" : "Connection failed");
}
 
void loop()
{
    mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
 
    val = map(ay, -17000, 17000, -250, 250);
    val2 = map(ax, -17000, 17000, -250, 250);
    if (val != prevVal)
    {
        prevVal = val;
        Serial.print("Valor Y");
        Serial.println(val);
    }
   
        if (val2 != prevVal2)
    {
        prevVal = val2;
        Serial.print("Valor X");
        Serial.println(val2);
    }
 
    delay(1000);
}


Que sinceramente me esta dando resultados mas estables con vairaciones de 1 o 2 grados nada mas.

Lo que no entiendo es porque resta -17000 ??? en el mapeo.

El tema es que yo por ejemplo uso el mpu de forma horizontal osea que yo de arrbia leo los nombres de los pines y en el codigo  me figura como si estubiera a 90° pero bueno tengo que tratar de leerlo mejor y tratar de traducirlo a un motor. para ver que tal se comporta

PD: Ahora le saque las helices a los motores para probar, jajaj asi no me lastimo mas.

Go Up