domingo, 27 de mayo de 2012

5.- Sensores y primera prueba de elevacion

Bien, para haber llegado hasta este punto necesitas tener:
* Esqueleto del quadcopter con motores, drivers y hélices montados
* Funcionamiento de los 4 motores con un solo PWM mínimo (como se vio en las entradas pasadas) con un Arduino




Para esta entrada se necesita 


* 1 arduino que mínimo soporte 4 PWM (UNO, MEGA etc... que es lo que venimos usando desde la primera entrada):
* 1 Acelerometro de 3 ejes (ADXL335 o cualquier otro que tenga una salida analógica por eje, en México puedes conseguirlo aqui, ese usaremos para este proyecto)
* 1 Sensor de Proximidad con salida analógica (En México puedes conseguirlo aquí, ese usaremos para este proyecto)

Arduino UNO. Usado para este proyecto (Imagen Propiedad de Arduino)

Acelerometro (Sensor de Inclinacion) tres ejes ADXL335 usado en este proyecto. Salida analoga (0 - 3.3V)

Sensor de proximidad ultrasonico Maxbotics usado en este proyecto salida analoga (0 - 5V)
Coloco a continuación el esquemático de las conexiones (pueden usar tanto MEGA como UNO o cualquier otro arduino, solo asegúrense de colocar en un pin PWM la señal al driver del motor y hacer lo cambios en el void setup() del código)


Esquemático para la primera prueba de elevación
Descarga esquemáticos aquí: aquí_pdf, aquí_jpg


Codigo para Arduino:


/*********************************************************************************
*  Hazael Fernando Mojica García, San Nicolás de los Garza, México NL
*  12 de Mayo del 2012
*  Prueba de elevacion 1
*  Licencia GPL 2012
*********************************************************************************/

#include <servo.h>

Servo outrunner1;
Servo outrunner2;
Servo outrunner3;
Servo outrunner4;


int instruccion = 's';
int MAXPWMDC = 2500;
int MINPWMDC = 1300;



void setup()
{
  Serial.begin(115200);
  outrunner1.attach(11);
  outrunner2.attach(10);
  outrunner3.attach(9);
  outrunner4.attach(3);
  
  outrunner1.write(0);
  outrunner2.write(0);
  outrunner3.write(0);
  outrunner4.write(0);  
  
  instruccion = RecibeInstruccion();
  //instruccion = 'c';
}


void loop()
{
  switch(instruccion)
  {
    case 'q':
      Stop();
      instruccion = RecibeInstruccion();      
    break;
    
    case 'c':
      Controla();
      instruccion = RecibeInstruccion();      
    break;
    
    default:
      instruccion = 'q';
    break;
  }
}

void Controla()
{
    int instruc = 's';
    boolean bucle = 1;
    int DC = MINPWMDC;
    
    Serial.println("Controlando");
    Stop();
    //Inicializa();
    Barrido_To_MINPWMDC();
    Serial.println("Presiona 'a' para subir la velocidad, 'z' para bajarla y 's' para salir");
    while(bucle)
    {
      if(Serial.available())
      {
        instruc = Serial.read();
        switch(instruc)
        {
           case 's':
              bucle = false;
            break; 
          
           case 'a':
              DC = DC + 5;
              outrunner1.writeMicroseconds(DC);    
              outrunner2.writeMicroseconds(DC);    
              outrunner3.writeMicroseconds(DC);    
              outrunner4.writeMicroseconds(DC);                  
              Serial.print("Subiendo velocidad ");
              Serial.print("DC: ");
              Serial.println(DC);
            break; 
  
             case 'z':
              DC = DC - 5;
              outrunner1.writeMicroseconds(DC);    
              outrunner2.writeMicroseconds(DC);    
              outrunner3.writeMicroseconds(DC);    
              outrunner4.writeMicroseconds(DC);                  
              Serial.print("Bajando velocidad ");              
              Serial.print("DC: ");              
              Serial.println(DC);              
            break;                     
        }
      }
      LecturaSensores();
    }
}

void LecturaSensores()
{
  int ejeX = 0;
  int ejeY = 0;
  int ejeZ = 0;
  int altura = 0;
  
  ejeX = analogRead(5);
  ejeY = analogRead(4);
  ejeZ = analogRead(3);
  altura = analogRead(6);
  
  Serial.print("EjeX: ");
  Serial.print(ejeX);
  Serial.print(" EjeY: ");
  Serial.print(ejeY);
  Serial.print(" EjeZ: ");
  Serial.print(ejeZ);
  Serial.print(" Altura:");
  Serial.println(altura);  
}

void Barrido_To_MINPWMDC()
{
  int MINPWMDC_aux = 0;
  Serial.println("Inicializando Driver...");
  while(MINPWMDC_aux < MINPWMDC)
  {
    outrunner1.writeMicroseconds(MINPWMDC_aux);
    outrunner2.writeMicroseconds(MINPWMDC_aux);
    outrunner3.writeMicroseconds(MINPWMDC_aux);
    outrunner4.writeMicroseconds(MINPWMDC_aux);    
    MINPWMDC_aux = MINPWMDC_aux + 10;    
    Serial.println(MINPWMDC_aux);
    delay(30);
  }   
}

int RecibeInstruccion()
{
  int instruc = 's';
  
  Serial.println("Presiona 'q' para Stop y 'c' para controlar");
  Serial.print("Recibiendo instruccion: ");
  
   while(1)
  {
     if(Serial.available())
     {
        instruc = Serial.read();
        break;
     }
  } 
  Serial.println(instruc);
  return instruc;
}


void Stop()
{
  Serial.println("Stop, detendiendo, espera...");
  outrunner1.write(0);
  outrunner2.write(0);
  outrunner3.write(0);
  outrunner4.write(0);  
  delay(2000);
}

Codigo aqui.



Bien, sólo les queda conectar y probar.






Coloco a continuación un video de nuestra prueba:




Y unas imágenes:

Se observa nuestro lindo Quadcopter y la fuente de poder usada para pruebas (Las baterías LiPo de 2500mAh estan muy caras).

Nuestro Quadcopter con sensores y todo el rollo. Falto el Modulo Bluetooth





Tags:




  • Arduino
  • Outrunner brushless motor
  • Controlar un outrunner brushless motor con arduino
  • Como controlar un motor sin escobillas
  • Motor sin escobillas
  • Controlar un motor sin escobillas con arduino
  • Como hacer un quadcopter
  • Como hacer mi propio helicoptero

9 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. Si taladras los brazos de forma consecutiva, puedes reducir peso sin comprometer mucho la resistencia...

    ResponderEliminar
    Respuestas
    1. =) :O
      Sii,, ya había pensado en hacerle hoyos jaja!!
      Gracias por el tip!! ;)

      Para el proximo proyecto le hare las mejoras

      Eliminar
  3. hola porque cuando abro el monitor serial me pone pura basura

    ResponderEliminar
  4. Hola! Muy interesante el proyecto, podrias poner algo mas acerca del funcionamiento del acelerometro y como es que se programa para controlar la inclinación y vuelo del cuadri?

    ResponderEliminar
    Respuestas
    1. Proximamente continuare con el proyecto, porque me falto implementar el control de estabilidad con el acelerometro.

      La teoria es sencilla, si marca inclinacion en uno de los ejes aumenta/disminuye la velocidad en el motor o los motores que correspondan para poder nivelarse.
      Es un sistrema de control de lazo cerrado.

      Eliminar