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
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);
}
i notice this has the gyro at the bottom. How would this be affected if the gyro was on the top plate?
ResponderEliminaramigo, 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?
ResponderEliminarGracias.
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 /
Eliminar/ 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
Yo vine a aprender no a que me humillen
Eliminaramigo, lo que los chavos de ahora quieren con cuchara y a la boca, lo quieren todo echo, jaja, gracias por el codigo
EliminarYo quiero realizar un proyecto parecido a este, solo que no necesariamente una figura plana estabilizada.
ResponderEliminarhabría que cambiarle algo a la librería? Ya que es desde otro ángulo.
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
EliminarNo 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
EliminarHola 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
EliminarEste comentario ha sido eliminado por el autor.
EliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarHola, 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
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarmuy bueno tu tutorial
ResponderEliminaramigo estoy haciendo algo muy similar y quisiera saber si estasd alimentando los servos de forma externa yo estoy utilizando mg 995
ResponderEliminarpero se enloquecen por momentos y no se pq???
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
Eliminarsi 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
EliminarSi conectas solo 1 y funciona bien entonces les falta corriente, intenta con una fuente mas grande o con otros servos
Eliminaren tu codigo no encuentro en que parte le puedo modificar la sensibilidad al sersor??
ResponderEliminarhola el_xed me podrias ayudar, es q no se como puedo najarle la sensibilidad al sensor??
EliminarLo que se utilizan los servos si lo desean ??
ResponderEliminarque tal amigo, tengo una duda quiero incluir otro servo en la parte donde operas los ángulos dedo cambiar algo?
ResponderEliminarme gustaria tener esos tres grados de librertad
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.
ResponderEliminarQuisiera preguntarte como puedo hacer para ajustar la posicion "cero" a la que me gustaria que siempre se encontrara la base.
Saludos!
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.
ResponderEliminarusuaste algun controlador? (P, PD, PI O PID)
ResponderEliminar