Arduino - Usar control de tiempo distinto para cada salida en arduino

 
Vista:
sin imagen de perfil

Usar control de tiempo distinto para cada salida en arduino

Publicado por mario (5 intervenciones) el 01/01/2018 13:38:32
Hola muy buenas a todos!! :) espero que alguien me pueda echar una mano con un problemilla que no se solucionar.

Estoy haciendo un programa en arduino para un proyecto personal y consiste en el control de giro de 2 motores de continua mediante 2 interruptores y un pulsador:

- con el interruptor 1 controlo de forma manual el sentido de giro del motor 1.

- con el interruptor 2 controlo de forma manual el motor 2.

- y con el botón lo que pretendo es controlar los 2 motores haciendo que giren un tiempo determinado cada uno de ellos, es decir, imaginad que pulsando el botón los dos motores deben iniciar la marcha y uno de ellos pararse en 3 segundos y el otro se parará en 5 segundos.

Parece sencillo pero yo no he conseguido que me funcione este ultimo boton con control de tiempo, he descartado el uso de delay porque si lo uso tendria que esperar que terminara el delay del motor 1 para poder usar el del motor 2.

Os dejo aquí mi programa, lo he estructurado lo mejor que he podido:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// programa control motores por tiempo ** Mario Martinez **
 
int pin_pulsador1 = 2;
int pin_pulsador2 = 3;
int pin_pulsador3 = 4;
 
int motor1_derecha = 6;
int motor1_izquierda= 9;
int motor2_derecha = 10;
int motor2_izquierda= 11;
 
 
boolean estado_pulsador1;
boolean estado_pulsador2;
boolean estado_pulsador3;
 
 
 
void setup() {
 
 pinMode (pin_pulsador1,INPUT);
 pinMode (pin_pulsador2,INPUT);
 pinMode (pin_pulsador3,INPUT);
 
 
 pinMode (motor1_derecha, OUTPUT);
 pinMode (motor1_izquierda, OUTPUT);
 pinMode (motor2_derecha, OUTPUT);
 pinMode (motor2_izquierda, OUTPUT);
}
 
void loop() {
estado_pulsador1 = digitalRead(pin_pulsador1);
estado_pulsador2 = digitalRead(pin_pulsador2);
estado_pulsador3 = digitalRead(pin_pulsador3);
 
 
//**** control manual Motor 1****************
 
if(estado_pulsador1==1){    // el motor 1 gira a la derecha
  digitalWrite(motor1_derecha,HIGH);
  digitalWrite(motor1_izquierda,LOW);
}
 
if(estado_pulsador1==0){   // el motor 1 gira a la izquierda
  digitalWrite(motor1_derecha,LOW);
  digitalWrite(motor1_izquierda,HIGH);
}
 
 
 //**** control manual Motor 2***************
 
if(estado_pulsador2==1){   // el motor 2 gira a la derecha
  digitalWrite(motor2_derecha,HIGH);
  digitalWrite(motor2_izquierda,LOW);
}
 
if(estado_pulsador2==0){   // el motor 2 gira a la izquierda
  digitalWrite(motor2_derecha,LOW);
  digitalWrite(motor2_izquierda,HIGH);
}
 
 //**** control automatico Motores 1, 2 y 3 ****
 
 
 
if(estado_pulsador3==1){   // Los 3 motores giran a la izquierda un tiempo determinado por cada motor
 
}
 
 
if(estado_pulsador3==0){   // Los 3 motores giran a la derecha un tiempo determinado por cada motor
 
 }
}



Gracias y un saludo!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Usar control de tiempo distinto para cada salida en arduino

Publicado por Manuel L. (15 intervenciones) el 01/01/2018 23:31:04
No queda claro cómo quieres que funcionen los motores. Si están los motores en reposo y se da al pulsador3, arrancan (3s uno, 5s el otro). ¿Qué pasa si se vuelve a pulsar el pulsador3 una vez están en movimiento? ¿Se ignora, se extiende la acción de los motores 3s y 5s respectivamente...? En otras palabras: ¿es como el botón de marcha de la lavadora o el del microondas? Lo que sí, entiendo que una vez que algún motor está en marcha (hay órdenes pendientes de ejcución, por así decirse), se ignora lo que los pulsadores de petición de giro digan.

En cualquier caso, el programa no interpreta siempre las entradas de la misma manera, así que necesitas diferenciar ambas situaciones: con o sin órdenes pendientes (un booleano). También necesitas llevar control del tiempo restante para cada motor, para saber cuándo pararlos. Me imagino algo así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void setup() {
   // Código de inicialización de los pines
   // ...
   // Recuerdo de la situación de la instalación el bucle anterior
   boolean enMarcha = false;
   int msRestantesM1 = 0, msRestantesM2 = 0;
}
 
void loop() {
   if(enMarcha) {
      comprobarExtensionTiempo(); // Únicamente si debe extenderse en el tiempo la actuación de los motores.
      actualizarTiemposRestantes(); // Control de cuándo parar
   } else {
      if(estado_pulsador3==1) {
         enMarcha = true;
         msRestantesM1 = 3000; msRestantesM2 = 5000;
         if(estadoPulsador1 == 1) motor1ALaDcha();
         else motor1ALaIzqda();
         if(estadoPulsador2 == 1) motor2ALaDcha();
         else motor2ALaIzqda();
      }
   }
}
 
void comprobarExtensionTiempo() {
   if(estado_pulsador3 = 1) {
      msRestantesM1 = msRestantesM1 + 3000;
      msRestantesM2 = msRestantesM2 + 5000;
   }
}
 
void actualizarTiemposRestantes() {
   // Descontar el tiempo transcurrido desde el último ciclo
   int msTranscurridos = msDesdeUltimaVez();
   msRestantesM1 = msRestantesM1 - msTranscurridos;
   msRestantesM2 = msRestantesM2 - msTranscurridos;
   if(msRestantesM1 <= 0) motor1Paro();
   if(msRestantesM2 <= 0) motor2Paro();
 
   // Comprobar si se ha terminado con la tarea o no
   enMarcha = !(msRestantesM1 <= 0 && msRestantesM2 <= 0);
   }
}
Obviamente el código no funciona, pero quizás te ayude. Si no me sigues, coméntame qué pasa cuando le das al pulsador de marcha (el pulsador3) y te preparo un programa de verdad. No obstante, sería más interesante que lo programases tú.

Un par de consejos respecto a tu código: usa nombres ilustrativos. Por ahora es fácil tener todos los detalles en la cabeza, pero cuando hagas programaciones más elaboradas no vas a saber si pulsador3 es marcha, paro, inversión de giro... fíjate que me ha dolido en mi código que la función «loop» tuviese asignaciones a variables y no únicamente llamadas a funciones...

P.D.: en la vista previa ya he localizado un fallito en el código bastante latoso en comprobarExtensionTiempo, pero no importa. Con que veas por dónde quiero ir, luego ya programarás y comprobarás tu propio código.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Usar control de tiempo distinto para cada salida en arduino

Publicado por mario (5 intervenciones) el 03/01/2018 15:17:37
Hola Manuel, muchas gracias por tu ayuda, después de darle vueltas a lo que quiero hacer, me he dado cuenta que el control de tiempo no me sirve. El control de tiempo yo lo uso para que los motores se paren a la vez siempre en un mismo punto, el problema es que si muevo previamente los motores de forma manual pues ya el control por tiempo no me serviria pues los motores al no partir del punto de inicio pues se pararan en otro punto.

Al final voy a optar por el uso de sensores y final de carrera para que los motores se paren siempre en el mismo punto al pulsar el boton automático.

En cuanto a las dudas que tenias sobre las condiciones de mi programa, si pulso el interruptor 1 o 2 controlo de forma manual el motor 1 y motor 2 respectivamente, los interruptores tendrian 3 posiciones (en la posicion central estaria parado, en la posicion 1 daria un HIGH y en la posicion 3 un LOW)

Si pulso el boton automático los 2 motores giran a la vez y se paran sólo cuando se detecta el sensor de parada o final de carrera, si mientras esta el modo automático activo vuelvo a pulsar el modo automático pues no ocurriria nada ya que esta activo este modo.

Y ya por ultimo colocaria un segundo botón que pare todos los motores.

De todas formas mi código esta muy verde y no he implementado bien los bucles de control (if, else) Es lo que mas me cuesta dominar por eso al principio obvie el uso de sensores para evitar bucles complejos.
Intentare con las pautas que me has dado y el código que me has mandado intentar adaptarlo y añadirle sensores y haber si veo la luz...
Mil gracias por la ayuda!! da gusto encontrar a gente que este dispuesta a echar una mano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Usar control de tiempo distinto para cada salida en arduino

Publicado por Manuel L. (15 intervenciones) el 03/01/2018 18:51:45
De nada, Mario. No obstante, ahora que entiendo los mandos del sistema no me encaja el uso de los interruptores de tres posiciones. En modo manual, y para un motor dado, el programa necesita saber en cuál de las tres posiciones está, pero en el código usas un único pin digital de Arduino, que tiene dos «posiciones»: «HIGH» y «LOW». Porque si «HIGH» significa izquierda y «LOW» derecha, ¿cómo sabe el programa cuándo deben estar quietos (en modo manual)? ¿Cómo harías un programa que encendiese una luz de tres, según la posición del interruptor?

Respecto a detener los motores en un punto previsto, ¿necesitas mucha precisión en ese punto o no? Si te vale poca precisión, como cuando un coche se detiene ante un semáforo en rojo, un sensor te vale. Puede que el coche se detenga un centímetro más adelante o atrás dependiendo de lo cargado que vaya el vehículo o de si ha llovido; en cualquier caso se detendrá antes la raya. Si quieres que la detención sea exacta, necesitarás un final de carrera (el coche «aparca por contacto»). Hay un tercer caso, y es que quisieras controlar el ángulo del eje del motor, como en el segundero de un reloj. En esa situación necesitarías un servomotor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Usar control de tiempo distinto para cada salida en arduino

Publicado por mario (5 intervenciones) el 03/01/2018 20:36:41
Voy a explicarte cual es mi proyecto de manera que puedas entender por qué necesito esos movimientos tan raros con los motores.

Me estoy construyendo un simulador de movimiento con estructura de aluminio, tengo experiencia en el mundillo del simracing y en temas de telemetría para sacar movimiento de los juegos de carreras y aplicarlo a diferentes actuadores, bien, se me ocurrió un dia realizar una estructura modular de aluminio que fuese capaz de modificar la posición de todos sus elementos, por ejemplo elevar el volante, poner el asiento a tu gusto o bajar los pedales. Esto que quiero hacer la verdad que nunca he visto que a alguien que se le haya ocurrido, casi todos los simuladores de este tipo son fijos y si se pueden mover hay que hacerlo a mano soltando tornillos.

Para mover estos elementos usare motores lineales tipo Warner como estos:

s-l1600


Irían en parejas de 2 para poder mover cada una de las partes de la estructura de aluminio, por lo tanto los interruptores manuales los usaría para modificar la posición de las diferentes partes de la estructura, por ejemplo elevar o adelantar el volante hacia mi posición.

Pero además la estructura podrá adoptar forma de un formula, eso explicaría para que necesito botones de marcha manual .
Al pulsar el botón manual se moverían todos los motores a una posición exacta hasta conseguir que la estructura pase de esta forma:

a

a esta:

b


Y mediante otro botón manual que regresen los motores a su posición inicial, este método seria como una especie de “perfiles de conducción” en la que pulsado un boton se queda todo mas o menos en su sitio y si luego quieres ajustarlo mejor pues ya modificas de forma manual los motores que quieras. Los bloques azules que ves en la imagen serian la ubicación de estos motores.

Por ello vi más factible el uso de sensores, porque siempre que pulse los botones manuales y además el motor pase por esa posición se detendrá.
El control por tiempo no me serviría pues si modifico previamente de forma manual la posición de los pedales por ejemplo, al pulsar el modo manual contara un tiempo erróneo para esos motores al partir de diferente posición.

Todo el tema de la estructura,partes móviles para el desplazamiento de las partes, diseño y demás lo tengo ya controlado, lo he construido en 3d y lo he simulado para sacar todas las medidas, solo me falta solucionar el tema del Arduino que controlara estos motores, llevo casi un mes aprendiendo sobre Arduino a tope, el problema que he llegado a un punto que no avanzo en mi programación, me cuesta hacer bien el tema de los bucles de control, es decir se perfectamente lo que quiero hacer pero no soy capaz de plasmarlo en el programa, dicen que no se puede ser bueno en todo, y cierto es, soy muy manitas para diseñar la estructura que me proponga y para temas de hardware, pero para el tema de programar son un cafre.

En cuanto a lo que comentas de los interruptores de 3 posiciones son estos los que pretendía usar:

rr

Y tienes razón en lo que comentas de los estados, pero yo lo razoné de la siguiente manera:

Cuando el pulsador está en LOW (0V) el motor gira derecha y cuando el pulsador está en HIGH(5V) gira izquierda, estos serían los 2 estados digitales de una configuración “PULL UP” pero si el interruptor se encuentra en la posición intermedia no debería dar ni 0V ni 5V ya que es un estado indeterminado, y no tenia yo claro si esta “indeterminación” se podría usar de alguna manera para que se parase el motor,
seria algo así como:

Si hay 0V gira a la derecha
Si hay 5V gira a la izquierda
Si no nay ni 5V ni 0V permanece parado

Quizás esto que pensé fuera una locura y nunca funcionaria, de ser así entonces supongo que tendré que usar un pulsador de 3 posiciones del tipo (ON, OFF, ON) de manera que en la posición intermedia daría 0V y estaría el motor parado y los 2 ON asociado cada uno a una entrada distinta.


En cuanto a lo de la precisión que necesito, creo que con lo que te he comentado de mi proyecto estaría más o menos clara esa pregunta, necesitaría la precisión suficiente para que la estructura se colocase “mas o menos” en la misma posición, no tiene que ser tampoco algo milimétrico. Yo he pensado en usar sensores porque tengo algo de experiencia con la sensorica en general y su uso en Arduino es fácil, por ejemplo un sensor inductivo que detecta metal, lo colocaría de manera que al pasar la estructura por ese punto se detecte la entrada de un pin de Arduino.

Perdona por esta entrada tan larga, pero quería dejar claro lo que pretendía hacer para que los demás puedan también seguir este hilo.
Gracias de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Usar control de tiempo distinto para cada salida en arduino

Publicado por Manuel L. (15 intervenciones) el 05/01/2018 23:58:28
Respecto a los interruptores, los estados intermedios, al tratarse de una entrada digital, el Arduino los va a asimilar a HIGH (> 3V) o a LOW (<3V). Escogerá lo que más se le parezca, así que efectivamente necesitas interruptores ON-OFF-ON y llevar cada salida a un pin.

Los sensores sí te servirán. En este caso es habitual usar finales de carrera, que son básicamente pulsadores colocados sobre el tope mecánico que tenga la estructura. No obstante, si prefieres los sensores, y ya no digamos si tienes algún sensor a mano, desde luego te van a servir perfectamente.

Y ahora, desearte ánimo con esa programación y ya sabes que aquí estamos si necesitas una manita. Ya casi tienes tu prototipo funcionando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Usar control de tiempo distinto para cada salida en arduino

Publicado por mario (5 intervenciones) el 06/01/2018 16:10:27
Creo que usare sensores ya que me ofrecen mas flexibilidad por si quiero que los motores tengan algo más de movimiento sin que tengan un "tope".
Muchas gracias por los consejos y si tengo alguna duda ya la iré comentando.
Saludos!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar