Datos personales

Mi foto
Algun dia, las maquinas también tendrán sueños...

miércoles, 4 de noviembre de 2015

base autoestable basada en arduino y giroscopio MPU 6050

Bueno, como seguramente vienen de You Tube, lo prometido es deuda, aqui esta el codigo completo del proyecto, la mayoría del mismo viene del excelente trabajo de Transductor el cual podran encontrar aqui, si es que quieren saber mas sobre como funciona la IMU, como podrán observar los servos están conectados al los pines 5 y 6 ,  los baudios pueden cambiarse a un rango inferior, el acelerómetro debe estar en la base inferior para evitar interferencias, y el ajuste está a cargo de ustedes en base a la posición en la que sitúen el mpu6050



El código utilizado es el siguiente:




//código original de Transductor, código modificado por El_Xed
#include <Wire.h>
#include <Servo.h>

 Servo servo1;
 Servo servo2;

//Direccion I2C de la IMU
#define MPU 0x68

//Ratios de conversion
#define A_R 16384.0
#define G_R 131.0

//Conversion de radianes a grados 180/PI
#define RAD_A_DEG = 57.295779

//MPU-6050 da los valores en enteros de 16 bits
//Valores sin refinar
int16_t AcX, AcY, AcZ, GyX, GyY, GyZ;
int val1;
int val2;
//Angulos
float Acc[2];
float Gy[2];
float Angle[2];


void setup()
{
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
servo1.attach(5);
servo2.attach(6);
Serial.begin(38400);

}

void loop()
{
   //valores del Acelerometro de la IMU
   Wire.beginTransmission(MPU);
   Wire.write(0x3B); //Pedir el registro 0x3B - corresponde al AcX
   Wire.endTransmission(false);
   Wire.requestFrom(MPU,6,true); //A partir del 0x3B, se piden 6 registros
   AcX=Wire.read()<<8|Wire.read(); //Cada valor ocupa 2 registros
   AcY=Wire.read()<<8|Wire.read();
   AcZ=Wire.read()<<8|Wire.read();

    //angulos Y, X respectivamente.
   Acc[1] = atan(-1*(AcX/A_R)/sqrt(pow((AcY/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;
   Acc[0] = atan((AcY/A_R)/sqrt(pow((AcX/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;
// proximamente mas proyectos en  http://elxedelectronics.blogspot.mx

   //valores del Giroscopio
   Wire.beginTransmission(MPU);
   Wire.write(0x43);
   Wire.endTransmission(false);
   Wire.requestFrom(MPU,4,true); //A diferencia del Acelerometro, solo se piden 4 registros
   GyX=Wire.read()<<8|Wire.read();
   GyY=Wire.read()<<8|Wire.read();

   //Calculo del angulo del Giroscopio
   Gy[0] = GyX/G_R;
   Gy[1] = GyY/G_R;

   //Filtro Complementario
   Angle[0] = 0.98 *(Angle[0]+Gy[0]*0.010) + 0.02*Acc[0];
   Angle[1] = 0.98 *(Angle[1]+Gy[1]*0.010) + 0.02*Acc[1];

   //Mostrar valores
 
 
  int Uangle0 = Angle[0] * 100;
  int Uangle1 = Angle[1] * 100;

   Serial.print("Angle X: "); Serial.print(Uangle0); Serial.print("\n");
   Serial.print("Angle Y: "); Serial.print(Uangle1); Serial.print("\n------------\n");


    ////// establecer datos de angulos y adaptarlos a los servos
    //// podrían variar según los servos utilizados

   float val1 = Uangle0;
   val1 = map(val1, -3500, 4500, 48, 132); ///30, -30, 12, 220
   servo1.write(val1);

   float val2 = Uangle1;
   val2= map(val2, -4000, 4000, 48, 132); ///-25, 32, 12, 220
   servo2.write(val2);
 
delay(10);
 
}




25 comentarios:

  1. i notice this has the gyro at the bottom. How would this be affected if the gyro was on the top plate?

    ResponderEliminar
  2. amigo, gracias por proporcionar la biblioteca . Pero ¿cuál es el esquema de conexión de la placa Arduino y el criado ? donde esta MPU6050 en el proyecto?
    Gracias.

    ResponderEliminar
    Respuestas
    1. Hola, no creí que fuera necesario poner el esquema por que en el código puedes ver los pines declarados para los servos y saber en donde van conectados, el mpu6050 va en los pines A5 y A4, si no sabes algo tan básico como eso te recomiendo que primero aprendas a programar y conectar correctamente los servos y a usar la librería, también te recomiendo ver los tutoriales del mpu6050 que hay en youtube, una vez que lo tengas todo claro intenta hacer este proyecto /

      / Hi!. I do not think it was necessary to put the scheme cos in the code you can see the pins declared for the servos and whit that you know where are connected, the MPU6050 is on the A5 and A4 pins, if you dont know something as basic as that, I recommend first you learn to program and properly connect the servos and how use the servo library, I also recommend you see tutorials on youtube about the MPU6050, once you have everything clear attempts to do this project

      Eliminar
    2. Yo vine a aprender no a que me humillen

      Eliminar
    3. amigo, lo que los chavos de ahora quieren con cuchara y a la boca, lo quieren todo echo, jaja, gracias por el codigo

      Eliminar
  3. Yo quiero realizar un proyecto parecido a este, solo que no necesariamente una figura plana estabilizada.
    habría que cambiarle algo a la librería? Ya que es desde otro ángulo.

    ResponderEliminar
    Respuestas
    1. No estoy seguro que es lo que quieras hacer pero cuando yo lo hice estaba pensado para una base que se mantuviera recta, así que no sabría decirte si hay que cambiar el codigo

      Eliminar
    2. No estoy seguro que es lo que quieras hacer pero cuando yo lo hice estaba pensado para una base que se mantuviera recta, así que no sabría decirte si hay que cambiar el codigo

      Eliminar
    3. Hola El Xed, muy buen proyecto, tengo una duda, has probado a utilizarlo sin imprimir los datos por serial en el computador?, mejora la velocidad de respuesta?. muchas gracias

      Eliminar
    4. Este comentario ha sido eliminado por el autor.

      Eliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. Hola, solo quiero editar la parte en la que se establecen los ángulos a los servos, cuando el sensor gire de 0 a -30 ° quiero que el servo 1 gire como máximo + 75° y cuando el sensor gire de 0 a +30° el servo 2 gire como máximo a -75 °, podrías orientarme por favor

    ResponderEliminar
  6. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  7. amigo estoy haciendo algo muy similar y quisiera saber si estasd alimentando los servos de forma externa yo estoy utilizando mg 995
    pero se enloquecen por momentos y no se pq???

    ResponderEliminar
    Respuestas
    1. Si, es necesario usar una fuente externa, de lo contrario podrías dañar el arduino, y si aun así se enloquecen es que necesitas una fuente con mayor corriente

      Eliminar
    2. si los alimento de forma externa con una fuente de 2A PERO igual a veces se enloquecen, deho el mpu6050 quieto y se mueven solos o empiezan a hacer ruidos como si se forzaran

      Eliminar
    3. Si conectas solo 1 y funciona bien entonces les falta corriente, intenta con una fuente mas grande o con otros servos

      Eliminar
  8. en tu codigo no encuentro en que parte le puedo modificar la sensibilidad al sersor??

    ResponderEliminar
    Respuestas
    1. hola el_xed me podrias ayudar, es q no se como puedo najarle la sensibilidad al sensor??

      Eliminar
  9. Lo que se utilizan los servos si lo desean ??

    ResponderEliminar
  10. que tal amigo, tengo una duda quiero incluir otro servo en la parte donde operas los ángulos dedo cambiar algo?

    me gustaria tener esos tres grados de librertad

    ResponderEliminar
  11. hola muy buen proyecto, lo hice y funciono a la perfección, incluso coloque los servomotores en otra posicion y el sistema funciono muy bien.
    Quisiera preguntarte como puedo hacer para ajustar la posicion "cero" a la que me gustaria que siempre se encontrara la base.
    Saludos!

    ResponderEliminar
  12. Muy bueno el proyecto, me ha gustado mucho, gracias por compartir estas cositas, lo voy a realizar en clase con los alumnos de robótica, voy a imprimir en 3d las piezas. Tenia entendido que los cables que unen el mpu y arduino debian ser lo mas cortos posibles para evitar interferéncias y lecturas erróneas, pero veo que no es así en tu proyecto, de nuevo muchas gracias.

    ResponderEliminar
  13. usuaste algun controlador? (P, PD, PI O PID)

    ResponderEliminar