Jump to content

Ayuda programación 3 válvulas (fotos colisión gotas)


fotoflipao
 Compartir

Publicaciones recomendadas

Hola a todos.

Pues me he propuesto ampliar el "colisionador" de gotas que me hice con Arduino, con 2 válvulas más.

A nivel electrónico no supone más problema que pinchar las dos válvulas adicionales a dos pines nuevos. 

Pero el problema se me plantea cómo abordar la secuencia de activación de las tres válvulas de forma solapada. Hasta ahora el disparo es muy sencillo, lo ejecuto con las siguientes instrucciones:

  digitalWrite(valv, HIGH);          //genera primera gota
  delay(GotA);                              //GotA es grosor de la gota A
  digitalWrite(valv, LOW);
  delay(Int);                                  //Int es la espera hasta la segunda gota
  digitalWrite(valv, HIGH);         //genera segunda gota
  delay(GotB);                             //GotB es grosor de la gota B
  digitalWrite(valv, LOW);
  delay(Ret);                               //Tiempo de espera hasta disparar la cámara (se ejecuta entonces la función disparo()

Uso delays porque los tiempos son muy rápidos y no interfieren en nada.

Al lío. Ahora la cosa se complica, más parámetros que configurar. Para fijarlos no hay problema, amplío el menú a más pantallas para cambiar las variables. Para simplificar vamos a suponer 2 válvulas solamente. Las variables serían las siguientes:

GotaA1 (grosor Gota A válvula 1)
Int1 (tiempo de espera entre gotas de la válvula 1)
GotaB1 (grosor Gota B válvula 1)
GotaA2 (grosor Gota A válvula 2)
Int2 (tiempo de espera entre gotas de la válvula 2)
GotaB2 (grosor Gota B válvula 2)
Sep1 (tiempo de espera entre la primera válvula y la segunda)
Ret (Retardo hasta disparar la cámara)

Si suponemos una tercera válvula, aparte de GotaA3, Int3 y GotaB3 habría un Sep2. Si no se entiende me decís.

Secuenciado en un cronograma tendríamos lo siguiente:

Cronograma-2-v-lvulas.jpg

Evidentemente ya no puedo usar delays, pero no se me ocurre cómo abordar el código, tengo poco nivel en programación, voy copiando de aquí y de allá, pero es que ni siquiera sé arrancar. ¿alguna idea?

Gracias por anticipado.

Editado por fotoflipao
Enlace al comentario
Compartir en otros sitios web

hace 2 horas, lorete dijo:

Te puedo enviar algunos codigos que he encontrado....tengo un rutina que la uso en el pc dese donde se pueden usar x cantidad de valvulas

Saludos

Pues me vendría fantástico a ver si me encauzan hacia donde quiero.

Mi email es fotoflipao (arroba) yahoo.es

Gracias mil!!

Enlace al comentario
Compartir en otros sitios web

Hola

 

Creo que esto podría ayudarte:


unsigned long inicio = 0;               //  tiempo de inicio de eventos

int inicio1 = 0;              //  tiempo de inicio de evento 1, desde inicio
int fin1 = 0;                 //  tiempo de fin evento 1, desde inicio

int inicio2 = 0;              //  tiempo de inicio de evento 2, desde inicio
int fin2 = 0;                 //  tiempo de fin evento 2, desde inicioint

int inicio3 = 0;              //  tiempo de inicio de evento 3, desde inicio
int fin3 = 0;                 //  tiempo de fin evento 3, desde inicio

int inicio4 = 0;              //  tiempo de inicio de evento 4, desde inicio
int fin4 = 0;                 //  tiempo de fin evento 4, desde inicio

int inicio5 = 0;              //  tiempo de inicio de evento 5, desde inicio
int fin5 = 0;                 //  tiempo de fin evento 5, desde inicio

// y así sucesivamente  pones los eventos que quieras con los respectivos tiempos


void setup() {


  inicio = millis();                        // inicializa el ‘reloj’ de calibración

}

void loop() {

  if (millis() > inicio + inicio1) {  // se se cumple el tiempo de retardo inicial

    // poner código para iniciar el evento 1 aquí

  }


  if (millis() > inicio + fin1) {   // verifica si el tiempo es mayor al del fin del evento. Si es así:

    // poner código para finalizar el evento 1 aquí

  }

  if (millis() > inicio + inicio2) {    // verifica si se ha cumplido el tiempo de espera para iniciar el evento 2. Si es así:

    // poner código de evento 2

  }

  if (millis() > inicio + fin2) {   // verifica si el tiempo es mayor al del fin del evento. Si es así:

    // poner código para finalizar el evento 2 aquí

  }

  if (millis() > inicio + inicio3) {    // verifica si se ha cumplido el tiempo de espera para iniciar el evento 2. Si es así:

    // poner código de evento 3

  }

  if (millis() > inicio + fin3) {   // verifica si el tiempo es mayor al del fin del evento. Si es así:

    // poner código para finalizar el evento 3 aquí

  }
  if (millis() > inicio + inicio4) {    // verifica si se ha cumplido el tiempo de espera para iniciar el evento 2. Si es así:

    // poner código de evento 4

  }

  if (millis() > inicio + fin4) {   // verifica si el tiempo es mayor al del fin del evento. Si es así:

    // poner código para finalizar el evento 4 aquí

  }
  if (millis() > inicio + inicio5) {    // verifica si se ha cumplido el tiempo de espera para iniciar el evento 2. Si es así:

    // poner código de evento 5

  }

  if (millis() > inicio + fin5) {   // verifica si el tiempo es mayor al del fin del evento. Si es así:

    inicio = millis();                        // re inicializa el ‘reloj’ de calibración, al final del último evento pero siempre dentro de los paréntesis del if
    
    // poner código para finalizar el evento 5 aquí

  }

 

// y así sucesivamente con los siguientes eventos...

 

}

 

aquí va en .ino:

 

secuencias_en_el_tiempo.ino

saludos

Editado por flamberge
Enlace al comentario
Compartir en otros sitios web

Hola buenas noches.

Mi  ayuda ha tardado, el código no es mío, lo ha elaborado otra persona en una par de ratitos libres, con el cronograma que proporcionas, y ya creo que te  han respondido con algo parecido, pero ya que se han tomado la molestia en hacerlo lo subo por si te sirve de algo (advierte que puede contener errores).

 

  /* Según cronograma supongamos que cada división corresponde a 50ms */
  
  unsigned long   TiempoAct;

  int             PasoEv1   =100;  // ciclo del cronograma Ev1
  unsigned long   T_PasoEv1 = 0;   // tiempo acumlado paso ciclo Ev1
  unsigned long   GotaA1    =150;  // grosor 1ª gota A1
  unsigned long   Int1      =400;  // espera a 2ª gota
  unsigned long   GotaB1    =150;  // grosor 2ª gota A1

  int             PasoEv2   =100;  // ciclo del cronograma Ev2
  unsigned long   T_PasoEv2 = 0;   // tiempo acumlado paso ciclo Ev2
  unsigned long   GotaA2    =150;  // grosor 1ª gota A2
  unsigned long   Int2      =400;  // espera a 2ª gota
  unsigned long   GotoB2    =150;  // grosor 2ª gota A2  

  unsigned long   Sep1      =100;  // Teimpo separación entre EVs
  unsigned long   Ret       =150;  // Tiempo de retardo disparo flash


void setup(){
  // Configuracion E/S
}

void loop(){

  TiempoAct = millis();                   // Tiempo actual al inicio del scan, no se contempla tiempo de ciclo

  /*** Inicio del ciclo EV1 y EV2 ***/
  If (( ""lectura de una accion de inicio"" )&&(PasoEv1==100)&&(PasoEv2==100)){
    PasoEv1=0;
    PasoEv2=0;
  }

  /*** Ciclo EV1 con switch ***/
  switch (PasoEv1){
    case 0:                               // Inicio gota A1
      //Activar Ev1;
      PasoEV1 = 1;
      T_PasoEv1 = TiempoAct + GotaA1;
       break;
    case 1:                               // Fin gota A1, grosor
      if (TiempoAct >= T_PasoEv1){
        //Desactivar Ev1;
        PasoEV1 = 2;
        T_PasoEv1 = TiempoAct + Int1;
          }   
       break;
    case 2:                               // Inicio gota B1, con intervalo
      if (TiempoAct >= T_PasoEv1){
        //Activar Ev1;
        PasoEV1 = 3;
        T_PasoEv1 = TiempoAct + GotaB1;
      }
       break;
    case 3:                               // Fin gota B1, grosor
      if (TiempoAct >= T_PasoEv1){
        //Desactivar Ev1;
        PasoEV1 = 100;
      }
       break;
    default:
       break;
  }


  /*** Ciclo EV2 con if ***/
  if (PasoEv2 == 0){                                  // Inicio tiempo de espera para gota A2
    PasoEV2 = 1;
    T_PasoEv2 = TiempoAct + Sep1;
  }
  if ((PasoEv2 == 1)&&(TiempoAct >= T_PasoEv2)){      // Inicio gota A2 + espera
    //Activar Ev2;
    PasoEV2 = 2;
    T_PasoEv2 = TiempoAct + GotaA2;
  }
  if ((PasoEv2 == 2)&&(TiempoAct >= T_PasoEv2)){      // Fin gota A2, grosor  
    //Desactivar Ev2;
    PasoEV2 = 3;
    T_PasoEv2 = TiempoAct + Int2;
  }
  if ((PasoEv2 == 3)&&(TiempoAct  >= T_PasoEv2)){     // Inicio gota B2, con intervalo
    //Activar EV2;
    PasoEV2 = 4;
    T_PasoEv2 = TiempoAct + GotaB2;
  } 
  if ((PasoEv2 == 4)&&(TiempoAct >= T_PasoEv2)){      // Fin gota B2, grosor
    //Desactivar EV2;
    PasoEV2 = 5;
    T_PasoEv2 = TiempoAct + Ret;
  }
  if ((PasoEv2 == 5)&&(TiempoAct >= T_PasoEv2)){      // Inicio disparo flash, con espera
    //Activar disparo flash;
    PasoEV2 = 6;
    T_PasoEv2 = TiempoAct + 100;
  }
  if ((PasoEv2 == 6)&&(TiempoAct >= T_PasoEv2)){      // Fin disparo flash, tiempo fijo
    //Desactivar disparo flash;
    PasoEV2 = 100;
  }
}

Enlace al comentario
Compartir en otros sitios web

Hola

 

Cambié un poco el sketch que puse.

Este ahora funciona ajustando dos variables: la duración de cada "evento", y el intervalo entre cada evento y el siguiente.

Pensé que es mas fácil seleccionar el tiempo entre eventos que cada uno a partir de un tiempo inicial.

Lo probé conectando cinco LEDs al Arduino, y los puedo encender por el tiempo que yo quiera, y la secuencia entre un encendido y el otro también lo puedo ajustar a voluntad.

Tienes 5 eventos con pines asignados en este sketch. Es decir, puedes controlar cuatro válvulas con tiempo de encendido y duración respectivos, además de la cámara.

Creo que por lo menos te va a ayudar en el concepto.

Te envié un video con el .ino a tu correo, pero lo agrego aquí por si acaso. Con el video el mensaje quedó bastante pesado y a veces los servidores los rechazan.

 

aquí va también el sketch, este esta mejor corregido en los comentarios con respecto al que te envié por correo:

secuencias_en_el_tiempo.ino

 

saludos

Editado por flamberge
Enlace al comentario
Compartir en otros sitios web

hace 14 horas, Skyper dijo:

Hola buenas noches.

Mi  ayuda ha tardado, el código no es mío, lo ha elaborado otra persona en una par de ratitos libres, con el cronograma que proporcionas, y ya creo que te  han respondido con algo parecido, pero ya que se han tomado la molestia en hacerlo lo subo por si te sirve de algo (advierte que puede contener errores).

 

Muchísimas gracias, Skyper, y también gracias a la persona que te ayudó.

Lo probaré.

Un saludo!

Enlace al comentario
Compartir en otros sitios web

hace 10 horas, flamberge dijo:

Hola

 

Cambié un poco el sketch que puse.

Este ahora funciona ajustando dos variables: la duración de cada "evento", y el intervalo entre cada evento y el siguiente.

Pensé que es mas fácil seleccionar el tiempo entre eventos que cada uno a partir de un tiempo inicial.

Lo probé conectando cinco LEDs al Arduino, y los puedo encender por el tiempo que yo quiera, y la secuencia entre un encendido y el otro también lo puedo ajustar a voluntad.

Tienes 5 eventos con pines asignados en este sketch. Es decir, puedes controlar cuatro válvulas con tiempo de encendido y duración respectivos, además de la cámara.

Creo que por lo menos te va a ayudar en el concepto.

Te envié un video con el .ino a tu correo, pero lo agrego aquí por si acaso. Con el video el mensaje quedó bastante pesado y a veces los servidores los rechazan.

 

aquí va también el sketch, este esta mejor corregido en los comentarios con respecto al que te envié por correo:

secuencias_en_el_tiempo.ino

 

saludos

Muchas gracias de nuevo, ahora echo un vistazo al vídeo.

Un saludo!!

Enlace al comentario
Compartir en otros sitios web

Hola

 

Se podría hacer algo así con el sketch que te envié, y el diseño sería este, si a tí o a alguien le interesa:

 

secuenciador2.thumb.jpg.6a55712501d1470eb4eccfad436e64b1.jpg

 

 

Es un diseño bastante simple, sólo son un botón y cinco relays que se pueden conectar a cualquier cosa, tanto en la variante de contacto normalmente abierto como contacto normalmente cerrado. El cambio de los intervalos de tiempo y duración de los eventos hay que hacerlos con el arduino conectado a un ordenador por USB y modificando esos parámetros directamente en el sketch.

Consideré diseñar una caja con controles, displays y todo, pero creo que no se justifica. Como esto se va a usar en un lugar fijo, manejando todo desde un notebook es mucho mas fácil y simple de construir.

Un cosa importante es el conector para una fuente externa de 5v. Los Relays del tipo Keyes SR1 que puse consumen creo que algo de 90mA cada uno. Con los cinco  se llega peligrosamente cerca del máximo de 500mA que el bus USB es capaz de suministrar. Por eso si alguien quiere hacer algo así, sugiero aportar corriente desde una fuente externa confiable de 5 volts y no depender del aporte del bus USB del ordenador.

 

El sketch lo corregí con respecto al anterior respecto de los valores de inicio que hacía que no funcionara bien con determinadas secuencias de tiempos. Este funciona perfecto.

Lo cambié también comentando la ultima instrucción para adecuarlo a su uso con un botón de inicio:

de esto:
    inicio = millis();

 

cambié a :
    // inicio = millis();
 

De esta forma una vez que al arrancar el Arduino ha hecho la primera secuencia, sólo se puede reiniciar la secuencia con el botón, ( que no hace nada mas que resetear el arduino ) y sólo se ejecutará una vez. Quien quiera que se ejecute indefinidamente la secuencia, sólo tiene que descomentar esa última instrucción. El botón permanece completamente funcional, reiniciando la secuencia a voluntad.

 

secuencias_en_el_tiempo.ino

 

saludos

Editado por flamberge
Enlace al comentario
Compartir en otros sitios web

En 3/10/2020 a las 20:51, flamberge dijo:

Hola

 

Se podría hacer algo así con el sketch que te envié, y el diseño sería este, si a tí o a alguien le interesa:

 

secuenciador2.thumb.jpg.6a55712501d1470eb4eccfad436e64b1.jpg

 

 

Es un diseño bastante simple, sólo son un botón y cinco relays que se pueden conectar a cualquier cosa, tanto en la variante de contacto normalmente abierto como contacto normalmente cerrado. El cambio de los intervalos de tiempo y duración de los eventos hay que hacerlos con el arduino conectado a un ordenador por USB y modificando esos parámetros directamente en el sketch.

Consideré diseñar una caja con controles, displays y todo, pero creo que no se justifica. Como esto se va a usar en un lugar fijo, manejando todo desde un notebook es mucho mas fácil y simple de construir.

Un cosa importante es el conector para una fuente externa de 5v. Los Relays del tipo Keyes SR1 que puse consumen creo que algo de 90mA cada uno. Con los cinco  se llega peligrosamente cerca del máximo de 500mA que el bus USB es capaz de suministrar. Por eso si alguien quiere hacer algo así, sugiero aportar corriente desde una fuente externa confiable de 5 volts y no depender del aporte del bus USB del ordenador.

 

El sketch lo corregí con respecto al anterior respecto de los valores de inicio que hacía que no funcionara bien con determinadas secuencias de tiempos. Este funciona perfecto.

Lo cambié también comentando la ultima instrucción para adecuarlo a su uso con un botón de inicio:

de esto:
    inicio = millis();

 

cambié a :
    // inicio = millis();
 

De esta forma una vez que al arrancar el Arduino ha hecho la primera secuencia, sólo se puede reiniciar la secuencia con el botón, ( que no hace nada mas que resetear el arduino ) y sólo se ejecutará una vez. Quien quiera que se ejecute indefinidamente la secuencia, sólo tiene que descomentar esa última instrucción. El botón permanece completamente funcional, reiniciando la secuencia a voluntad.

 

secuencias_en_el_tiempo.ino

 

saludos

Pues se trata de un diseño muy simple y compacto. En mi caso uso transistores TIP120, perfectamente adaptables a este diseño, y aprovechando la alimentación de 12V que requieren las válvulas para alimentar el arduino.

Gracias por la información.

Enlace al comentario
Compartir en otros sitios web

  • 4 semanas más tarde...

Como por estos lugares ya se esta poniendo un poco Frio, tratare de hechas a andar los trastes que hay guardados, quiero empezar muy pronto con gotas de Líquidos... 

Quiero cerrar la caja de plástico (Controlador) pero hasta ahora no le he puesto un led para que yo pueda ver que esta funcionando, me refiero cuando la orden sale del arduino y esta se realiza, El Arduino uno tiene un led pequeño instalado y me bastaría con una señal como esa... Alguien me podría Iluminar con una idea de como funcionaria:=):=):=)

mis saludos

Edit: Creo que ya he encontrado la solución, para cada salida voy a instalar un Led, así poder visualizar todo el proceso.....

 

 

Editado por lorete
Enlace al comentario
Compartir en otros sitios web

  • 3 semanas más tarde...

 No quiero Abrir otro tema, pues es la razón que expongo mi problema aquí:

Ayer estuve probando mi aparato para las gotas de agua, al parecer casi todo esta correcto hasta que aparece un error, he disparado el flash controlado desde el dispositivo, y este se dispara correctamente, el problema es el siguiente o la foto esta totalmente o muy borrosa. he probado con los disparadores yongnuo y todo funciona totalmente correcto.

el porque he decidido disparar el flash a travez del dispositivo es que hasta hasta ahora no logro que la sincronización entre Camara y  flash sean constantes una vez el retraso esmas lenta y a veces es mas corto.

cuelgo 2 fotos para que se vea detallar el problema 

Nr° 1con yongnuo 

50634560011_5aed1e1969_c.jpg20201122_202246 by Photo Martinez, auf Flickr

Nr° 2 con el dispositivo

50634643087_cdfe5ef7a2_c.jpg20201122_202225 by Photo Martinez, auf Flickr

saludos

 

Enlace al comentario
Compartir en otros sitios web

Hola

 

Da la impresión que el enfoque no es correcto. Dependiendo de como tienes programado este, es posible que la cámara dispare antes que alcance a enfocar bien. Y si pusiste ambos contactos juntos en ese control de disparo, ni siquiera va a intentar enfocar.

Si es así, sugiero que desactives el enfoque automático y las fotos las hagas con enfoque manual previamente fijado. Total, la distancia es siempre la misma.

 

saludos

Enlace al comentario
Compartir en otros sitios web

Hola..olvide escribir lo del enfoque.

Esta esta desactivado, las Fotos son solamente como ilustracion. Y como dices los 2 contactos estan juntos, asi que no trata de enfocar...muy interesante es que o me da una foto negra o a toda potencia :(1/1) como la puesta en aqui en el Post.

Saludos

Enlace al comentario
Compartir en otros sitios web

Pues da la impresión de que es un problema de sincronización entre flash y cámara.

Hay un factor que influye en el tiempo total del disparo. Se trata de que la cámara esté activa o en reposo. Me explico. Una vez disparas, la cámara se queda activa: la foto aparece en pantalla y después de desaparecer el exposímetro se queda activo unos segundos. Después de ese tiempo la cámara se queda en reposo. Dependiendo del momento en el que se active el disparo (hay 3 momentos: 1. foto en pantalla, 2. exposímetro activo, 3. cámara en reposo) el tiempo de reacción es distinto. Son ms de diferencia, pero eso te influirá en el tiempo de reacción, y más cuando los ms cuentan en el resultado. O al menos en las pruebas que yo he estado haciendo con mi aparato. Haz pruebas en los 3 estados porque yo creo que puede ser la razón del fallo que sufres.

Por tanto, trata de disparar siempre en la misma situación. En mi caso opté por disparar siempre cuando la cámara está en el estado 3. A partir de ahí es ajustar todos los delays para conseguir sincronizar todo.

Teniendo cuidado de esto, la sincronización con los disparadores de flash también puede solucionarse, yo también me peleé con ellos y al final conseguí sincronizar bien.

No sé si he conseguido explicarme.

Editado por fotoflipao
Enlace al comentario
Compartir en otros sitios web

Yo tambien tengo esa opcion en la mira...entre Camara y el Flash algo no funciona como deberia. Bueno podria ser tambien que en el Droplet no le doy los parametros correctos..pero no lo creo he trabajado con el droplet otras veces y no me dio problemas.

 

Editado por lorete
Enlace al comentario
Compartir en otros sitios web

hace 2 horas, lorete dijo:

Yo tambien tengo esa opcion en la mira...entre Camara y el Flash algo no funciona como deberia. Bueno podria ser tambien que en el Droplet no le doy los parametros correctos..pero no lo creo he trabajado con el droplet otras veces y no me dio problemas.

 

 

¿Has probado eliminar retardos y latencias poniendo todos los parámetros en manual: enfoque, exposición, modo e intensidad de flash, de tal forma que la cámara no tenga que medir ni ajustar nada antes del disparo?

Como estas básicamente repitiendo una y otra vez la misma escena, estos no tendrían por que cambiar ante cada foto.

Lo que si yo trataría de eliminar cuanto pueda de la iluminación general de tal forma que fuese sólo la luz del flash la que actúe. Se puede hacer mucho para minimizar la iluminación ambiente bajando el ISO y aumentando proporcionalmente la potencia del flash. Es un truco muy socorrido en macro para resaltar primeros planos sobre todo cuando fotografías al aire libre.

 

saludos

Editado por flamberge
Enlace al comentario
Compartir en otros sitios web

Efectivamente, yo también tenía problemas con los modos de flash. Uso los YN-622 y si los uso de forma automática los tiempos eran volubles. Opté por poner todo en manual (también los flashes encima de los disparadores, que lo habitual es ponerlos en modo ttl aunque los manejes desde la cámara en manual) y a partir de ahí se estabilizaron los tiempos de retardo. Si usas cables, menos posibilidad de error, todo en manual.

Para estabilizar esos tiempos se me ocurre utilizar 2 optoacopladores (creo recordar que tú solo usas uno), haciendo lo siguiente:

A.- activar enfoque (pinwrite enfoque). De esta manera la cámara activa el fotómetro (sobre lo que decía ayer, dejar la cámara en estado 2).

B.- sueltas las gotas, con correspondientes delays entre gotas etc.

C.- activar enfoque + disparo

Tengo que hacer la prueba, yo siempre he usado solo B.- y luego C.-, teniendo que esperar a que la cámara se quede en espera (esperar 4-5 segundos entre disparo y disparo, estado 3). Introduciendo A.- los tiempos de reacción serán levemente menores, solo debería requerir algún ajuste en los parámetros de lanzado de gotas.

Enlace al comentario
Compartir en otros sitios web

He encontrado un video muy interesante...Lamentableme en la Lengua Alemana de un hombre que hace muy buenas tomas de este tipo...en dicho video aclara como correguir el retardo de disparo...y confirma lo que por ahi lei..que nikon no tiene un retardo constante..de todas maneras cuelgo el link quizas Famberge tiene interes....

Saludos

Enlace al comentario
Compartir en otros sitios web

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invitado
Responder a este tema...

×   Pegar como texto enriquecido.   Pegar como texto sin formato

  Only 75 emoji are allowed.

×   Tu enlace se ha incrustado automáticamente..   Mostrar como un enlace en su lugar

×   Se ha restaurado el contenido anterior.   Limpiar editor

×   No se pueden pegar imágenes directamente. Carga o inserta imágenes desde la URL.

 Compartir

  • Explorando recientemente

    • No hay usuarios registrados viendo esta página.
×
×
  • Crear nuevo...