This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
CONSULTA Switch final de carrera no controla parada
#1
Hola a todos, estoy haciendo un proyecto para mi casa. Quiero hacer un sistema que cierre y abra automaticamente la ventana de mi casa que da para la calle. El cierre y apertura lo pienso manejar con los siguientes componentes:

- 1 arduino uno (controlador principal)
- 1 sensor PIR (para sensar el paso de las personas frente a la ventana)
- 1 motor paso a paso (para mover la ventana)
- 1 shield de motores (para controlar el motor paso a paso)
- 1 microswitch de final de carrera (de esos que se usan en las impresoras 3d como final de carrera)

Mi idea es de mantener la ventana abierta mientras no pase nadie frente a la ventana, y cuando el sensor detecte el paso de una persona, mueva la ventana hasta que choque con el sensor de final de carrera indicandole que la ventana este cerrada, espere alli unos 5 minutos y de no detectar a nadie al frente de la ventana, abra la ventana y que asi comience el ciclo otra vez.

Para esto he hecho el codigo que les adjunto comprimido (esta en .ino para que se pueda abrir desde Arduino.cc o desde cualquier otro programador.


Ya que la shield del controlador de motores tapa todo el arduino Uno, buscando en internet vi que tiene unos pines que no usa que son el PIN 2, y los los pines analogicos A0 al A5, ademas de que tiene salidas de 5Vdc.

He conectado los componentes de la siguiente manera:

- el motor paso a paso a la shield a los bornes M3 y M4,
- el sensor PIR al PIN 2 (con alimentacion 5V sacada de los bornes de salida 5V de la shield, ya testee con un multimetro y si salen 5.05V)
- el microswitch al pin A4 (el comun a 5V de la shield, y el NO a GND con una resistencia de 1K y tambien al pin A4)

Cuando subo el codigo al arduino y comienza a funcionar, se supone que si paso la mano por el PIR deberia detectarme (cosa que si hace) y comenzar a girar el motor en modo CERRADO y continuar moviendose hasta que el microswitch se pulse (que por el momento soy yo el que lo pulsa para simular esa accion) pero alli es donde ocurre el problema, NO PARA EL MOTOR! gira y gira y gira y gira y no para por mas que lo presione, pero cuando reseteo el arduino, y mantengo presionado el microswitch simulando que la ventana esta cerrada y paso la mano por delante del PIR alli si no avanza y me sale en la consola VENTANA CERRADA, osea demostrando que el microswitch si funciona bien. Por si hay alguien que piense que los componentes estan fallando, ya los probe y tambien cambie varios nuevos que tengo y todos me dan el mismo resultado.

Alguien que me pueda dar una mano por favor, desearia que me explique mas que todo cual es mi error, ya que quiero aprender y estoy fascinado por este mundo del arduino.

Les mando una foto del circuito adjunto.


Espero sus respuestas


Saludos a todos y FELIZ DIA DE LA AMISTAD!!!!!


Archivos adjuntos Miniatura(s)
   

.rar   cierra_ventana.rar (Tamaño: 649 bytes / Descargas: 55)
  Responder
#2
No estoy muy puesto en arduino, así que puedo equivocarme.

Creo tienes que leer el estado del final de carrera dentro del while:
Código:
void close_win (){
 estado_final_carrera = digitalRead(final_carrera);
 Serial.println("El final de carrera esta :" + String(estado_final_carrera));
 while (estado_final_carrera==0) {
   /* code */
   Serial.println("Cerrando Ventana");
   motor.step(10, BACKWARD, DOUBLE);
   estado_final_carrera = digitalRead(final_carrera);
   Serial.println("El final de carrera esta :" + String(estado_final_carrera));
  }

  if (estado_final_carrera==1) {
    motor.release();
     Serial.println("Ventana cerrada");
  }
}

dentro del bucle que manda girar el motor, el estado_final_carrera siempre será cero, porque no se actualiza el valor dentro del bucle, hay que gacer un digitalRead (creo yo).

También te aconsejo sangrar (indentar) el código, la lectura se  hace más fácil.
Ulticampy V2: fundiendo plástico sin descanso...
  Responder
#3
(14-02-2020, 07:46 PM)Lepes escribió: No estoy muy puesto en arduino, así que puedo equivocarme.

Creo tienes que leer el estado del final de carrera dentro del while:
Código:
void close_win (){
 estado_final_carrera = digitalRead(final_carrera);
 Serial.println("El final de carrera esta :" + String(estado_final_carrera));
 while (estado_final_carrera==0) {
   /* code */
   Serial.println("Cerrando Ventana");
   motor.step(10, BACKWARD, DOUBLE);
   estado_final_carrera = digitalRead(final_carrera);
   Serial.println("El final de carrera esta :" + String(estado_final_carrera));
  }

  if (estado_final_carrera==1) {
    motor.release();
     Serial.println("Ventana cerrada");
  }
}

dentro del bucle que manda girar el motor, el estado_final_carrera siempre será cero, porque no se actualiza el valor dentro del bucle, hay que gacer un digitalRead (creo yo).

También te aconsejo sangrar (indentar) el código, la lectura se  hace más fácil.

Gracias por tu aporte Lepes, hice lo que me sugeriste de ingresar la lectura del estado del final de carrera dentro del WHILE, pero igual, no para de girar el motor. Ya no se que pudiera estar mal en el codigo, y ya he cambiado 3 Arduinos UNO, 2 shields de motores y mas de 5 switchs de final de carrera y nada, no se soluciona el problema..  Nusenuse

Acabo de cambiar el final de carrera por un pulsador y nada... creo que en cuanto a parte mecánica no es el problema, sino netamente de programación.[Imagen: b79220fe9cc6ff714b8b3610804b3264.jpg]

Enviado desde mi SM-A750G mediante Tapatalk
  Responder
#4
Vengo a decirte que puede haber un problema en ese código que te sugerí.

No sé como funciona la orden de giro del motor:
- Si es asíncrona, es decir, procesa la orden y el programa sigue corriendo, haría falta un delay(500) después de la orden de giro.
- Si es síncrona, es decir, arduino procesa la orden de giro del motor, pero el programa se queda parado en ese punto, y no continúa hasta que el motor haya terminado el giro (me extrañaría mucho que funcionara así) entonces no haría falta el delay(500)

El 500 es por decir algo, debería ser algo menos que lo que tarda el motor en hacer el giro completo que se le manda. Si pones 3000, el motor giraría poco a poco, haciendo paradas, supongo.

Lamento no poderte ayudar más.
Ulticampy V2: fundiendo plástico sin descanso...
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  CONSULTA Controlar bucle con un final de carrera polu2 10 2,720 15-03-2019, 10:16 PM
Último mensaje: Triangulo
  DUDA Finales de carrera Vicente48 1 1,188 17-09-2018, 06:44 PM
Último mensaje: Nullz
  Control Livolo touch switch (o intento) jukillo 19 10,481 01-01-2015, 08:01 PM
Último mensaje: driverss
  [PROYECTO FINAL MODULO] Rover bluetooth con LCD cansi22 22 7,315 06-07-2014, 04:56 PM
Último mensaje: cansi22