Con esto se hace la plataforma de autobalanceo o el gimbal de Arduino y funciona bien como se esperaba. Lo que queda es echar un vistazo al programa.
Código Arduino
El código Arduino para este ejemplo es una modificación del ejemplo MPU6050_DMP6 de la biblioteca i2cdevlib de Jeff Rowberg.
Aquí puedes descargar el código:
Descripción del código: Por lo tanto, estamos utilizando la guiñada, el cabeceo y el balanceo legibles de salida.
// Get Yaw, Pitch and Roll values
#ifdef OUTPUT_READABLE_YAWPITCHROLL
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
// Yaw, Pitch, Roll values - Radians to degrees
ypr[0] = ypr[0] * 180 / M_PI;
ypr[1] = ypr[1] * 180 / M_PI;
ypr[2] = ypr[2] * 180 / M_PI;
// Skip 300 readings (self-calibration process)
if (j <= 300) {
correct = ypr[0]; // Yaw starts at random value, so we capture last value after 300 readings
j++;
}
// After 300 readings
else {
ypr[0] = ypr[0] - correct; // Set the Yaw to 0 deg - subtract the last random Yaw value from the currrent value to make the Yaw 0 degrees
// Map the values of the MPU6050 sensor from -90 to 90 to values suatable for the servo control from 0 to 180
int servo0Value = map(ypr[0], -90, 90, 0, 180);
int servo1Value = map(ypr[1], -90, 90, 0, 180);
int servo2Value = map(ypr[2], -90, 90, 180, 0);
// Control the servos according to the MPU6050 orientation
servo0.write(servo0Value);
servo1.write(servo1Value);
servo2.write(servo2Value);
}
#endif
Code language: Arduino (arduino)
Una vez que obtengamos los valores, primero los convertimos de radianes a grados.
// Yaw, Pitch, Roll values - Radians to degrees
ypr[0] = ypr[0] * 180 / M_PI;
ypr[1] = ypr[1] * 180 / M_PI;
ypr[2] = ypr[2] * 180 / M_PI;
Code language: Arduino (arduino)
Luego esperamos o hacemos 300 lecturas, porque el sensor todavía está en proceso de autocalibración durante este tiempo. Además, capturamos el valor de guiñada, que al principio no es 0 como los valores de cabeceo y balanceo, sino que siempre es un valor aleatorio.
// Skip 300 readings (self-calibration process)
if (j <= 300) {
correct = ypr[0]; // Yaw starts at random value, so we capture last value after 300 readings
j++;
}
Code language: Arduino (arduino)
Después de las 300 lecturas, primero establecemos el Yaw en 0 restando el valor aleatorio capturado anteriormente. Luego mapeamos los valores de Yaw, Pitch y Roll, de -90 a +90 grados, en valores de 0 a 180 que se utilizan para controlar los servos.
// After 300 readings
else {
ypr[0] = ypr[0] - correct; // Set the Yaw to 0 deg - subtract the last random Yaw value from the currrent value to make the Yaw 0 degrees
// Map the values of the MPU6050 sensor from -90 to 90 to values suatable for the servo control from 0 to 180
int servo0Value = map(ypr[0], -90, 90, 0, 180);
int servo1Value = map(ypr[1], -90, 90, 0, 180);
int servo2Value = map(ypr[2], -90, 90, 180, 0);
// Control the servos according to the MPU6050 orientation
servo0.write(servo0Value);
servo1.write(servo1Value);
servo2.write(servo2Value);
}
Code language: Arduino (arduino)
Finalmente usando la función de escritura, enviamos estos valores a los servos como señales de control. Por supuesto, puede deshabilitar el servo Yaw si solo desea estabilización para los ejes X e Y, y usar esta plataforma como estabilizador de cámara.
Tenga en cuenta que esto está lejos de ser un buen cardán de cámara. Los movimientos no son suaves porque estos servos no están hechos para tal fin. Los cardanes de cámara reales utilizan un tipo especial de motores BLDC para obtener movimientos suaves. Por lo tanto, considere este proyecto solo con fines educativos.
Eso sería todo por este tutorial, espero que lo hayan disfrutado y aprendido algo nuevo. Siéntase libre de hacer cualquier pregunta en la sección de comentarios a continuación y no olvide consultar mi colección de proyectos Arduino.