He estado probando de varias formas. La siguiente es la última versión que he obtenido y me he dado cuenta de lo siguiente: el comando 'moveTo()' es el que me hace perder los datos. Agrego el nuevo código:
#include <AccelStepper.h>
// Configuración de los pines para el CNC Shield
#define X_STEP_PIN 2
#define X_DIR_PIN 5
#define Y_STEP_PIN 3
#define Y_DIR_PIN 6
#define Z_STEP_PIN 4
#define Z_DIR_PIN 7
// Configuración de las dimensiones del sistema
const float stepsPerRevolution = 200; // Número de pasos por revolución del motor
const float microstepping = 8; // Factor de microstepping del controlador
// Crear objetos AccelStepper para los tres motores
AccelStepper motorX(AccelStepper::DRIVER, X_STEP_PIN, X_DIR_PIN);
AccelStepper motorY(AccelStepper::DRIVER, Y_STEP_PIN, Y_DIR_PIN);
AccelStepper motorZ(AccelStepper::DRIVER, Z_STEP_PIN, Z_DIR_PIN);
float Z=100.0;
int objetoContador = 1;
void setup() {
// Inicializar los motores, habilitar el driver
motorX.setEnablePin(8);
motorY.setEnablePin(8);
motorZ.setEnablePin(8);
// cambiar sentido de X
motorX.setPinsInverted(true, false, false); // Invertir los pines si es necesario
motorY.setPinsInverted(false, false, true);
motorZ.setPinsInverted(false, false, true);
// Establecer la configuración de aceleración y velocidad máxima de los motores
motorX.setMaxSpeed(1000.0);
motorX.setAcceleration(500.0);
motorY.setMaxSpeed(1000.0);
motorY.setAcceleration(500.0);
motorZ.setMaxSpeed(1000.0);
motorZ.setAcceleration(500.0);
// Habilitar los motores
motorX.enableOutputs();
motorY.enableOutputs();
motorZ.enableOutputs();
Serial.begin(9600);
}
void moverMotores(float X, float Y, float Z) {
float targetXSteps = 2 * X / (0.01 * microstepping);
float targetYSteps = 2 * Y / (0.01 * microstepping);
float targetZSteps = 2 * Z / (0.01 * microstepping);
// Configura las coordenadas objetivo para cada motor
// SI COMENTO ESTAS 3 LINEAS NO REALIZA TODOS LOS MOVIMIENTOS
motorX.moveTo(X);
motorY.moveTo(Y);
motorZ.moveTo(Z);
// Mientras algún motor no haya alcanzado su posición objetivo
while (motorX.distanceToGo() != 0 || motorY.distanceToGo() != 0 || motorZ.distanceToGo() != 0) {
// Realiza un paso en cada motor
motorX.run();
motorY.run();
motorZ.run();
}
// Detiene los motores y los libera
motorX.stop();
motorY.stop();
motorZ.stop();
motorX.disableOutputs();
motorY.disableOutputs();
motorZ.disableOutputs();
Serial.print("Movimiento acabado.");
}
void recibir(){
if (Serial.available() > 0) {
String data = Serial.readStringUntil('\n');
int commaIndex1 = data.indexOf(',');
int commaIndex2 = data.indexOf(',', commaIndex1 + 1);
int commaIndex3 = data.indexOf(',', commaIndex2 + 1);
String objectType = data.substring(0, commaIndex1);
int X = data.substring(commaIndex1 + 1, commaIndex2).toInt();
int Y = data.substring(commaIndex2 + 1, commaIndex3).toInt();
// Mostrar los datos por el monitor serial
Serial.print("Objeto ");
Serial.print(objetoContador);
Serial.print(": Tipo=");
Serial.print(objectType);
Serial.print(", Coordenadas=(");
Serial.print(X);
Serial.print(" mm, ");
Serial.print(Y);
Serial.println(" mm)");
// Incrementar el contador de objetos
objetoContador++;
moverMotores(X,Y,Z);
delay(1000);
}
}
void loop() {
recibir();
}
Comentando esas 3 líneas obtengo lo siguiente en la PI:
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (961) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
Objeto 1: Tipo=Tornillo, Coordenadas=(215 mm, 477 mm)
Objeto 2: Tipo=Tornillo, Coordenadas=(376 mm, 471 mm)
Objeto 3: Tipo=Tornillo, Coordenadas=(431 mm, 466 mm)
Objeto 4: Tipo=Tornillo, Coordenadas=(386 mm, 436 mm)
Objeto 5: Tipo=Tornillo, Coordenadas=(87 mm, 431 mm)
Objeto 6: Tipo=Tornillo, Coordenadas=(103 mm, 352 mm)
Objeto 7: Tipo=Tornillo, Coordenadas=(386 mm, 368 mm)
Objeto 8: Tipo=Arandela, Coordenadas=(380 mm, 327 mm)
Objeto 9: Tipo=Arandela, Coordenadas=(110 mm, 320 mm)
Objeto 10: Tipo=Arandela, Coordenadas=(113 mm, 308 mm)
Objeto 11: Tipo=Tornillo, Coordenadas=(394 mm, 316 mm)
Objeto 12: Tipo=Tornillo, Coordenadas=(495 mm, 230 mm)
Objeto 13: Tipo=Tornillo, Coordenadas=(512 mm, 248 mm)
Objeto 14: Tipo=Tornillo, Coordenadas=(494 mm, 148 mm)
Objeto 15: Tipo=Arandela, Coordenadas=(563 mm, 97 mm)
Objeto 16: Tipo=Tornillo, Coordenadas=(604 mm, 61 mm)
Objeto 17: Tipo=Tornillo, Coordenadas=(341 mm, 240 mm)
Objeto 18: Tipo=Tornillo, Coordenadas=(82 mm, 68 mm)
Y en la Arduino lo siguiente:
Objeto 1: Tipo=Tornillo, Coordenadas=(215 mm, 477 mm)
Movimiento acabado.Objeto 2: Tipo=Tornillo, Coordenadas=(376 mm, 471 mm)
Movimiento acabado.Objeto 3: Tipo=Tornillo, Coordenadas=(431 mm, 466 mm)
Movimiento acabado.Objeto 4: Tipo=Tornillo, Coordenadas=(386 mm, 436 mm)
Movimiento acabado.Objeto 5: Tipo=Tornillo, Coordenadas=(87 mm, 431 mm)
Movimiento acabado.Objeto 6: Tipo=Tornillo, Coordenadas=(103 mm, 352 mm)
Movimiento acabado.Objeto 7: Tipo=Tornillo, Coordenadas=(386 mm, 368 mm)
Movimiento acabado.Objeto 8: Tipo=Arandela, Coordenadas=(380 mm, 327 mm)
Movimiento acabado.Objeto 9: Tipo=Arandela, Coordenadas=(110 mm, 320 mm)
Movimiento acabado.Objeto 10: Tipo=Arandela, Coordenadas=(113 mm, 308 mm)
Movimiento acabado.Objeto 11: Tipo=Tornillo, Coordenadas=(394 mm, 316 mm)
Movimiento acabado.Objeto 12: Tipo=Tornillo, Coordenadas=(495 mm, 230 mm)
Movimiento acabado.Objeto 13: Tipo=Tornillo, Coordenadas=(512 mm, 248 mm)
Movimiento acabado.Objeto 14: Tipo=Tornillo, Coordenadas=(494 mm, 148 mm)
Movimiento acabado.Objeto 15: Tipo=Arandela, Coordenadas=(563 mm, 97 mm)
Movimiento acabado.Objeto 16: Tipo=Tornillo, Coordenadas=(604 mm, 61 mm)
Movimiento acabado.Objeto 17: Tipo=Tornillo, Coordenadas=(341 mm, 240 mm)
Movimiento acabado.Objeto 18: Tipo=Tornillo, Coordenadas=(82 mm, 68 mm)
Movimiento acabado.
En cambio si descomento esas lineas obtengo lo siguiente en la PI:
Objeto 1: Tipo=Tornillo, Coordenadas=(215 mm, 477 mm)
Movimiento acabado.Objeto 2: Tipo=Tornillo, Coordenadas=(376 mm, 471 mm)
Movimiento acabado.Objeto 3: Tipo=Tornillo, Coordenadas=(431 mm, 466 mm)
Movimiento acabado.Objeto 4: Tipo=Tornillo, Coordenadas=(386 mm, 436 mm)
Movimiento acabado.Objeto 5: Tipo=Tornillo, Coordenadas=(87 mm, 431 mm)
Movimiento acabado.Objeto 6: Tipo=Tornillo, Coordenadas=(103 mm, 352 mm)
Movimiento acabado.Objeto 7: Tipo=Tornillo, Coordenadas=(386 mm, 368 mm)
Movimiento acabado.Objeto 8: Tipo=Arandela, Coordenadas=(380 mm, 327 mm)
Movimiento acabado.Objeto 9: Tipo=Arandela, Coordenadas=(110 mm, 320 mm)
Movimiento acabado.Objeto 10: Tipo=Arandela, Coordenadas=(113 mm, 308 mm)
Movimiento acabado.Objeto 11: Tipo=Tornillo, Coordenadas=(394 mm, 316 mm)
Movimiento acabado.Objeto 12: Tipo=Tornillo, Coordenadas=(495 mm, 230 mm)
Movimiento acabado.Objeto 13: Tipo=Tornillo, Coordenadas=(512 mm, 248 mm)
Movimiento acabado.Objeto 14: Tipo=Tornillo, Coordenadas=(494 mm, 148 mm)
Movimiento acabado.Objeto 15: Tipo=Arandela, Coordenadas=(563 mm, 97 mm)
Movimiento acabado.Objeto 16: Tipo=Tornillo, Coordenadas=(604 mm, 61 mm)
Movimiento acabado.Objeto 17: Tipo=Tornillo, Coordenadas=(341 mm, 240 mm)
Movimiento acabado.Objeto 18: Tipo=Tornillo, Coordenadas=(82 mm, 68 mm)
Movimiento acabado.
ChatGPT
Basado en la salida que proporcionaste, parece que el programa está funcionando correctamente. Después de recibir los datos de objeto y coordenadas a través del puerto serial, el programa mueve los motores a las coordenadas especificadas y luego imprime "Movimiento acabado" en el monitor serial.
Cada objeto se mueve individualmente a sus coordenadas respectivas y, una vez que se alcanza la posición objetivo, se imprime "Movimiento acabado". Esto se repite para cada objeto que se recibe.
Si estás experimentando algún problema o tienes alguna pregunta adicional, por favor avísame y estaré encantado de ayudarte.
User
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (961) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
Objeto 1: Tipo=Arandela, Coordenadas=(3 mm, 475 mm)
Objeto 2: Tipo=Arandela, Coordenadas=(397 mm, 401 mm)
Objeto 3: Tipo=Tornillo, Coordenadas=(429 mm, 395 mm)
Objeto 4: Tipo=Tornillo, Coordenadas=(264 mm, 416 mm)
Objeto 5: Tipo=Tornillo, Coordenadas=(389 mm, 380 mm)
Objeto 6: Tipo=Tornillo, Coordenadas=(283 mm, 343 mm)
Objeto 7: Tipo=Arandela, Coordenadas=(108 mm, 271 mm)
Objeto 8: Tipo=Tornillo, Coordenadas=(389 mm, 294 mm)
Objeto 9: Tipo=Tornillo, Coordenadas=(398 mm, 242 mm)
Objeto 10: Tipo=Arandela, Coordenadas=(386 mm, 162 mm)
Objeto 11: Tipo=Arandela, Coordenadas=(502 mm, 151 mm)
Objeto 12: Tipo=Tornillo, Coordenadas=(482 mm, 125 mm)
Objeto 13: Tipo=Tornillo, Coordenadas=(564 mm, 55 mm)
Objeto 14: Tipo=Tornillo, Coordenadas=(495 mm, 66 mm)
Objeto 15: Tipo=Tornillo, Coordenadas=(518 mm, 148 mm)
Objeto 16: Tipo=Tornillo, Coordenadas=(495 mm, 14 mm)
Objeto 17: Tipo=Tornillo, Coordenadas=(401 mm, 74 mm)
Objeto 18: Tipo=Tornillo, Coordenadas=(355 mm, 9 mm)
Objeto 19: Tipo=Tornillo, Coordenadas=(149 mm, 240 mm)
Objeto 20: Tipo=Tornillo, Coordenadas=(74 mm, 69 mm)
Y en la Arduino lo siguiente:
Objeto 1: Tipo=Arandela, Coordenadas=(3 mm, 475 mm)
Movimiento acabado.Objeto 2: Tipo=Arandela, Coordenadas=(397 mm, 401 mm)
Movimiento acabado.Objeto 3: Tipo=Tornillo, Coordenadas=(429 mm, 395 mm)
Movimiento acabado.Objeto 4: Tipo=Tornillo, Coordenadas=(264 mm, 416 mm)
Movimiento acabado.Objeto 5: Tipo=Tornillo, Coordenadas=(389 mm, 380 mm)
Movimiento acabado.Objeto 6: Tipo=Tornillo, Coordenadas=(283 mm, 108 mm)
Movimiento acabado.Objeto 7: Tipo=Tornillo, Coordenadas=(389 mm, 294 mm)
Movimiento acabado.Objeto 8: Tipo=Arandela, Coordenadas=(386 mm, 162 mm)
Movimiento acabado.Objeto 9: Tipo=Tornillo, Coordenadas=(482 mm, 125 mm)
Movimiento acabado.Objeto 10: Tipo=Tornillo, Coordenadas=(564 mm, 518 mm)
Movimiento acabado.Objeto 11: Tipo=Tornillo, Coordenadas=(401 mm, 74 mm)
Movimiento acabado.Objeto 12: Tipo=Tornillo, Coordenadas=(149 mm, 240 mm)
Movimiento acabado.
En la Arduino tan solo llega hasta 12 en vez de hasta 20. Necesito saber si hay alguna otra forma de hacerlo.