Que tal, estoy desarrollando un proyecto el cual consiste en nivelar una mesa automaticamente por medio de 4 pistones electricos con motores DC controlados con L298N, ademas de un sensor MPU6050 para obtener los angulos de nivelacion, quisiera saber que opinan del siguiente codigo y que mejoras podria incluir o cambiar. Lo que hace es primero mover dos pistones para nivelar el eje X, y despues los otros dos para nivelar el eje Y, pero siento que no es tan eficiente.
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
MPU6050 sensor;
// Definiciones de pines
const byte M1IN1 = 2;
const byte M1IN2 = 3;
const byte M2IN3 = 4;
const byte M2IN4 = 5;
const byte M3IN1 = 6;
const byte M3IN2 = 7;
const byte M4IN3 = 8;
const byte M4IN4 = 9;
const byte botonAjuste = 12;
const byte botonReset = 13;
// Valores RAW (sin procesar) del acelerómetro en los ejes x, y, z
int ax, ay, az;
void setup() {
Serial.begin(57600); // Iniciando puerto serial
Wire.begin(); // Iniciando I2C
sensor.initialize(); // Iniciando el sensor
if (sensor.testConnection()) Serial.println("Sensor iniciado correctamente");
else Serial.println("Error al iniciar el sensor");
// Configuración de pines de salida
pinMode(M1IN1, OUTPUT);
pinMode(M1IN2, OUTPUT);
pinMode(M2IN3, OUTPUT);
pinMode(M2IN4, OUTPUT);
pinMode(M3IN1, OUTPUT);
pinMode(M3IN2, OUTPUT);
pinMode(M4IN3, OUTPUT);
pinMode(M4IN4, OUTPUT);
}
void loop() {
// Leer las aceleraciones
sensor.getAcceleration(&ax, &ay, &az);
// Calcular los ángulos de inclinación:
float angleX = atan(ax / sqrt(pow(ay, 2) + pow(az, 2))) * (180.0 / 3.14);
float angleY = atan(ay / sqrt(pow(ax, 2) + pow(az, 2))) * (180.0 / 3.14);
// Mostrar los ángulos separados por un [tab]
Serial.print("Inclinación en X: ");
Serial.print(angleX);
Serial.print("\tInclinación en Y: ");
Serial.println(angleY);
delay(10);
AjusteX(angleX);
AjusteY(angleY);
}
void AjusteX(float angleX) {
if (angleX > 0.5) {
extendPistonsX(M3IN1, M3IN2, M4IN3, M4IN4, angleX);
} else if (angleX < -0.5) {
extendPistonsX(M1IN1, M1IN2, M2IN3, M2IN4, angleX);
}
}
void AjusteY(float angleY) {
if (angleY > 0.5) {
extendPistonsY(M1IN1, M1IN2, M3IN1, M3IN2, angleY);
} else if (angleY < -0.5) {
extendPistonsY(M2IN3, M2IN4, M4IN3, M4IN4, angleY);
}
}
void extendPistonsX(byte IN1, byte IN2, byte IN3, byte IN4, float angle) {
do {
// Actualizar lecturas del sensor
sensor.getAcceleration(&ax, &ay, &az);
angle = atan(ax / sqrt(pow(ay, 2) + pow(az, 2))) * (180.0 / 3.14);
// Mover pistones
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(100); // Pequeño retraso para permitir el movimiento
} while (angle < -0.5 || angle > 0.5);
// Parar los pistones
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void extendPistonsY(byte IN1, byte IN2, byte IN3, byte IN4, float angle) {
do {
// Actualizar lecturas del sensor
sensor.getAcceleration(&ax, &ay, &az);
angle = atan(ay / sqrt(pow(ax, 2) + pow(az, 2))) * (180.0 / 3.14);
// Mover pistones
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(100); // Pequeño retraso para permitir el movimiento
} while (angle < -0.5 || angle > 0.5);
// Parar los pistones
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}