Orientación Máquina Cortadora de Vidrio

Hola como estan?
Perdon por el titulo poco descriptivo, pero realmente no se por donde comenzar.

Voy a hacer el intento:
Estoy participando del desarrollo de una maquina para cortar vidrio, tenemos todo el "hardware" practicamente listo, lo que necesito es orientacion por donde encarar la programacion de lo que queremos que ese hardware haga, y si realmente se puede hacer (o no)
La procedimiento que debe seguir la maquina para lograr cortar el vidrio es simple, voy a tratar de escribirlo debajo para ver si me entienden

Antes que anda aclaro: el proceso consta de dos "partes", top y bottom ya que debe cortar vidrios laminados (si, esos que son como dos vidrios unidos por un "plastico")

Seria algo asi:
TOP
1- Accionar bomba top n1
2- mover stepper motor desde izquierda a derecha (izquiera 0, derecha detereminado por un microswich endstop)
3- soltar bomba top n1 y accionar bomba top n2
4- regresar motor desde el lado derecho hacia el izquierdo (tambien podria poner un endstop ahi)

BOTTOM
1- Accionar bomba n1
2- mover motor n2 a la derecha (igual que en TOP)
3- soltar bomba n1 y accionar laser (40w) y bomba n2
4- regresar motor a la izquierda (=top)

*Todas las bombas son de presion accionadas por aire, no necesito controlar por software dicha presion
*El laser funcionaria para "cortar" el laminado que esta entre los vidrios, por lo que no necesitaria "regular" su intencidad

Cuento con el siguiente hardware:
2 Andruino Mega
2 Nema 23 con sus respectivos drivers (stepperonline dm542t)
1 fuente 9v 1a
1 fuente 24v 10.4a
4 endstops opticos

Luego de leer mucho y realmente sentirme perdido con tanta informacion pense en su momento obviar todo lo relacionado a arduino e ir directamente a lo analogico conectando cada uno de los pasos a un tablero con swichs y listo.
Pero realmente quiero aprender como hacerlo con arduino, y a futuro (no se si se puede) conectar una pantalla tactil para poder ejecutar los pasos desde ahi de ser necesario

Desde ya muchas gracias a por tomarse el tiempo de leerme (se que no es facil) :o na

Claro que se puede hacer.
Dices tener el hardware pero no queda claro si dicho hardware incluye las interfaces para Arduino. Si las tiene yo y/o cualquiera haría lo siguiente:

Paso 1- Accionar bomba top n1

Supongo tiene un relé o un SSR para accionarlo. Recomiendo lo último.
Entonces es lo mismo que acciónar un LED. Si sabes accionar un LED no tendrás problema con una bomba.
El tema es que el accionamiento de una bomba siempre puede traer aparjeando problemas eléctricos pero ya nos dirás, para qué adelantarse.

Paso 2- mover stepper motor desde izquierda a derecha (izquiera 0, derecha detereminado por un microswich endstop)

Tienes una librería Stepper.h y cientos de tutoriales orientativos.
Pruebas tu stepper y te familiarias con el moviéndolo a la posición deseada y luego haciendo que recupere la original. Algo básico en cualquier máquina.

3- soltar bomba top n1 y accionar bomba top n2

Esa respondido en 1.

4- regresar motor desde el lado derecho hacia el izquierdo (tambien podria poner un endstop ahi)

Si se trata del stepper, esta respondido en 2.

Como verás todo pasa por sentirse cómodo conlo que se va a hacer y no ir a una tarea donde mezclas todo en el primer intento.

Luego te recomiendo que no uses delay() porque ya leí en el punto 4 que quieres esperar el accionamiento de un final de carrera y delay() y estado de pulsadores/sensores no van de la mano.

Ve a documentación => Indice de temas tutoriales => millis() y tmb lee máquina de estados.

Fundamentalmente la máquina de estados te permitirá tener un código fluído y los retardos los harás con millis().

Dices tener el hardware pero no queda claro si dicho hardware incluye las interfaces para Arduino. Si las tiene yo y/o cualquiera haría lo siguiente:

A que te refieres con interfases?

Supongo tiene un relé o un SSR para accionarlo. Recomiendo lo último.
Entonces es lo mismo que acciónar un LED. Si sabes accionar un LED no tendrás problema con una bomba.
El tema es que el accionamiento de una bomba siempre puede traer aparjeando problemas eléctricos pero ya nos dirás, para qué adelantarse.

En realidad al ser una bomba de presion accionada por aire, el "gatillo" (como veras no tengo idea de los terminos, muy poco conocimiento de lo basico de programacion y lo basico de electronica) o lo que acciona la valvula para que el aire pase o no, es una coneccion de dos hilos 24vdc 3w...
No tengo rele o ssr, tengo que encargar y me preguntaba si algo como esto serviria

Mas alla de eso, estuve viendo este esquema/video y creo que seria mas o menos lo mismo que lo que yo necesito, no?

Tienes una librería Stepper.h y cientos de tutoriales orientativos.
Pruebas tu stepper y te familiarias con el moviéndolo a la posición deseada y luego haciendo que recupere la original. Algo básico en cualquier máquina.

Te refieres a los ejemplos dentro del ide?
Realmente me ayudarias si me das algun link de algun ejemplo de como mover un stepper por ejemplo digamos 30cm hacia la derecha

Luego te recomiendo que no uses delay() porque ya leí en el punto 4 que quieres esperar el accionamiento de un final de carrera y delay() y estado de pulsadores/sensores no van de la mano.

Ve a documentación => Indice de temas tutoriales => millis() y tmb lee máquina de estados.

Fundamentalmente la máquina de estados te permitirá tener un código fluído y los retardos los harás con millis()

Pensandolo bien no me voy a complicar poniendo endstops siempre y cuando pueda decirle al motor cuantos metros debe moverse, prefiero que valla hasta el final y haga un delay de algunos segundos y vuelva a tener que complicarme mas (al menos por ahora que estoy bastante perdido)

Desde ya te agradezo por tu tiempo y paciencia :slight_smile:
Perdon por la falta de puntuacion, mi teclado no esta en español :confused:

Luego de una mañana leyendo mas y estando un poco mas perdido que antes, decidi empezar a escribir el codigo como yo pienso que seria, viendo de algunos ejemplos y armando lo mio propio...

me quedo algo asi:

// defino los nombres de las constantes y sus respectivos pines
const int tpn1 = 2;  //asignar pin al pump (Top Pump N1)
const int tpn2 = 3;
const int bpn1 = 4;  //Bottom Pump N1
const int bpn2 = 5;
const int laser = 6;

#include <Stepper.h> //agrego la libreria stepper para controlar los nema23
#define STEPS 1600 //cantidad de pasos que necesita nema para dar una vuelta

//nombre de los motores nema
Stepper nematop(STEPS, 52, 53); //conectado en pin 52-53
Stepper nemabottom (STEPS, 50, 51); //conectado en pin 50-51

///////////////////////////////////////////////////////////////////////////////////
void setup()
{
  //inicio puerto serie
  Serial.begin(9600);   
   
  //defino pines como salida
  pinMode(tpn1, OUTPUT);  
  pinMode(tpn2, OUTPUT);
  pinMode(bpn1, OUTPUT);
  pinMode(bpn2, OUTPUT);
  pinMode(laser, OUTPUT);

  //velocidad del motor en rpm
  nematop.setSpeed(100);
  nemabottom.setSpeed(100);
}
//////////////////////////////////////////////////////////////////////////////////

void loop()
{
//----------------------TOP-----------------------------
  digitalWrite(tpn1, HIGH);   // accionar top pump n1
  nematop.step(1600);         // accionar motor nema top (una vuela, luego calcular vueltas necesarias para recorrer distancia requerida)
  digitalWrite(tpn1, LOW);    // apago top pump n1
  delay(1000);                // espera de 1 segundo
  digitalWrite(tpn2, HIGH);   // acciona top pump n2
  nematop.step(-1600);        // gira el motor una vuelta en sentido contrario
  digitalWrite(tpn2, LOW);    // apago top pump n2
//------------------------------------------------------
  
  delay(5000);                // esperar 5 segundos

//----------------------BOTTOM--------------------------
  digitalWrite(bpn1, HIGH);   // accionar bottom pump n1
  nemabottom.step(1600);      // girar nema bottom una vuelta (cambiar luego)
  digitalWrite(bpn1, LOW);    // apago bpn1
  delay(1000);                // esperar 1 segundo
  digitalWrite(bpn2, HIGH);   // acciona bottom pum n2
  digitalWrite(laser, HIGH);  // acciona laser
  nemabottom.step(-1600);     // regresa el motor 1 vuelta
  digitalWrite(laser, LOW);   // apaga laser
  digitalWrite(bpn2, LOW);    // apaga bomba bpn2
//-----------------------------------------------------
}

Como conectar todo no lo puedo hacer aun (no tengo los ssr) y me va a llevar un buen tiempo (es una maquina grande, complicada y llena de mangueras :o) me gustaria que me digan si tiene algun sentido el codigo que escribi o si estoy totalmente confundido/equivocado :sob:

Una vez mas, gracias por la paciencia

Ok, probe los motores y funcionan 8) ;D

Alguien podria revisar si el resto tiene sentido?

Vamos paso a paso. Has probado los motores. Veamos que has hecho.
Bueno un programa básico con lo que pruebas que todo funciona, para mi esta muy bien!!

Ya sabes que eso funciona, ahora un comentario, olvida que luego puedas usar los delay() como ya te dije.

En realidad al ser una bomba de presion accionada por aire, el "gatillo" (como veras no tengo idea de los terminos, muy poco conocimiento de lo basico de programacion y lo basico de electronica) o lo que acciona la valvula para que el aire pase o no, es una coneccion de dos hilos 24vdc 3w...
No tengo rele o ssr, tengo que encargar y me preguntaba si algo como esto serviria

Respondo dos en 1. Has hablado de interfaces y esto es lo mismo.
Si tienes que disparar o gatillar una bomba de presión o lo que fuere, con una válvula de 24VDC 3W necesitas algo de esto:

  1. Lo mas simple un RELE sea electromecánico o de estado solido SSR. Los hay de ambos tipos. Yo prefiero el de estado sólido. En tu caso un transistor que comanda la válvula 24VDC 3W.

  2. Lo puedes manejar con un simple transitor MOSFET como un IRF520 o 510.

24VDC 3W implica una I = 3W / 24V = 125mA lo que es nada.

Puedes usar un MOSFET como te he dicho o un 2N2222 transitor.
Entre bornes de la válvula si o si debes usar un diodo 1N4002 como minimo.
Ese diodo estará conectado de tal manera que su cátodo ira a borne positivo (+24VDC) y su ánodo al transistor que cierra por GND (ground).

De esto mismo te hablo con un mosfet, que tamb por la corriente puede ser un 2n7000 o bien usa un NPN el que gustes con Rb como corresponda.

Te refieres a los ejemplos dentro del ide?

Los ejemplos del IDE son mas que suficientes. Se que ahora todo te parece demasiado pero si vas paso a paso y cuando tengas dudas pones en google: Arduino Stepper tutorial y ahi encuentras mas respuestas.

Sigues los ejemplos del IDE o del tutorial y avanzas.

Todo lo que resuelvas lo vas haciendo por separado.

Al final hay que unir las piezas y ahi se requiere de otra programación, similar a la que tienes pero con otro concepto de como debe fluir y responder a los eventos.

Seguramente compremos un SSR como el que puse en el link antes. Por lo que entiendo que no me necesitaria todo lo que dijiste de diodos y transistores, verdad? :o
Como dije, se poco de todo, pero de electronica es de lo que menos se ::slight_smile:

Ahora estoy teniendo algunos problemitas para que los motores den la suficiente cantidad de vueltas..
Cuando pongo numeros mayores de 10 vueltas me tira un error de overflow (warning: integer overflow in expression [-Woverflow])

Me estoy volviendo loco tratando de buscar una forma de que el motor mueva lo suficiente :frowning:

Basado en el código del post#3?
Veo que esto da una vuelta

 nematop.step(1600);

entonces 10 vueltas sería algo como esto dentro del loop

vueltasMotor(10); // por supuesto si fueran vueltas enteras.

y esto a continuación del loop()

void vueltasMotor(

    for (int i=0; i<vueltas; i++) { 
          nematop.step(1600);  
    }
}

Si no, en lugar de usar algo como entero usa una variable long que es un entero largo.
Por eso recibes ese error que has indicado.

Gracais por la pronta respuesta, pero si te soy sincero no entendi como agregarlo al codigo que ya hice...

Y si, nematop.step(1600) es 1 vuelta.

Estuve leyendo el porque del error, entiendo perfectamente pero cuando lo quiero guardar como long a los valores no logro hacerlo, tengo errores por todos lados.

Podrias ayudarme siendo mas claro en que parte del codigo tengo que poner las vueltas? (supongo que debo guardarlo como int antes?

Gracias de nuevo, eres un genio.

Ya te lo respondí.
Cuando quieras vueltas usas esto

vueltasMotor(10); // ejemplo para 10 vuetas

en lugar de lo que estas usando

Pero para que esto funcione debes agregar... bueno te lo doy el código por si no lo captas.

// defino los nombres de las constantes y sus respectivos pines
const int tpn1 = 2;  //asignar pin al pump (Top Pump N1)
const int tpn2 = 3;
const int bpn1 = 4;  //Bottom Pump N1
const int bpn2 = 5;
const int laser = 6;

#include <Stepper.h> //agrego la libreria stepper para controlar los nema23
#define STEPS 1600 //cantidad de pasos que necesita nema para dar una vuelta

//nombre de los motores nema
Stepper nematop(STEPS, 52, 53); //conectado en pin 52-53
Stepper nemabottom (STEPS, 50, 51); //conectado en pin 50-51

///////////////////////////////////////////////////////////////////////////////////
void setup()
{
  //inicio puerto serie
  Serial.begin(9600);   
   
  //defino pines como salida
  pinMode(tpn1, OUTPUT); 
  pinMode(tpn2, OUTPUT);
  pinMode(bpn1, OUTPUT);
  pinMode(bpn2, OUTPUT);
  pinMode(laser, OUTPUT);

  //velocidad del motor en rpm
  nematop.setSpeed(100);
  nemabottom.setSpeed(100);
}
//////////////////////////////////////////////////////////////////////////////////

void loop()
{
//----------------------TOP-----------------------------
  digitalWrite(tpn1, HIGH);   // accionar top pump n1
  vueltasMotor(10);              //  10 vueltas
  digitalWrite(tpn1, LOW);    // apago top pump n1
  delay(1000);                // espera de 1 segundo
  digitalWrite(tpn2, HIGH);   // acciona top pump n2
    vueltasMotor(-10);              //  10 vueltas
  digitalWrite(tpn2, LOW);    // apago top pump n2
//------------------------------------------------------
 
  delay(5000);                // esperar 5 segundos

//----------------------BOTTOM--------------------------
  digitalWrite(bpn1, HIGH);   // accionar bottom pump n1
  vueltasMotor(10);              //  10 vueltas
  digitalWrite(bpn1, LOW);    // apago bpn1
  delay(1000);                // esperar 1 segundo
  digitalWrite(bpn2, HIGH);   // acciona bottom pum n2
  digitalWrite(laser, HIGH);  // acciona laser
  vueltasMotor(-10);              //  10 vueltas
  digitalWrite(laser, LOW);   // apaga laser
  digitalWrite(bpn2, LOW);    // apaga bomba bpn2
//-----------------------------------------------------

}

void vueltasMotor(int vueltas) {
   int i;
   int step = 1600;

   if (vueltas < 0) {
       step = -1600;
       vueltas *= -1;
   }
   for (i=0; i<vueltas; i++) {
             nematop.step(step); 
   }
}

Prueba a ver.