Go Down

Topic: Problema con secuencia (Read 503 times) previous topic - next topic

rmrmrm

Muy buenas tardes a todos, gracias de antemano, estoy haciendo un programa de una puerta automatica que sube y baja detetando la presencia con un reflecto de IR, fuera y otro dentro, un dual H L298N, dos finales de carrera y algunos botones y tal. Hice el programa completo de la puerta, y al principio funcionaba bien, luego aveces fallaba, y ahora falla siempre, explico en lo que falla: El fallo es que la puerta sube, toca el FC de arriba, espera su tiempo la manda bajar, toca el FC de abajo, y al tocarlo en vez de esperar a que algo se ponga en medio del refleco IR, la puerta sube de nuevo hasta arriba, y esta vez ignora por completo el FC de arriba. He decidido empezar de 0, simplificando por completo el programa a una subida y bajada sin IR reflectores ni nada, sino con un simple pulsado que al pulsarlo suba y cuando toque baje y luego tengas que darle de nuevo para poder hacerlo. Y haun haciendo esto sigo teniendo el mismo problema, la puerta empieza a subir, llega arriba, al toca en el FC de arriba la manda abajo, una vez abajo, en vez de pararse y quedarse, la manda otra vez para arriba y nunca para el motor. Copio el codigo a ver si alguien me puede ayudar, ya no se si es problema de algun componente, tambien decir que antes lo tenia todo puesto con un Arduino Nano, y pensando que se habia roto, lo cambie por un Arduino Uno.


Code: [Select]

void loop()
{
if ( digitalRead(FC_abajo)==HIGH )
{
  if ( digitalRead(pulsa_auto_man)==HIGH && digitalRead(motor_arriba)==LOW && digitalRead(motor_abajo)==LOW)
   {
    digitalWrite(motor_arriba, HIGH);
    delay(1000);
}

  if (digitalRead(motor_abajo)==HIGH)
  {
    digitalWrite(motor_abajo, LOW);
    digitalWrite(motor_arriba, LOW);
    delay(100);
  }
}
if ( digitalRead(FC_arriba)==HIGH )
{
  if( digitalRead(motor_arriba)==HIGH )
   {
    delay(50); //Pequeña pausa para que la puerta suba un poco mas del FC y no se descuelge y asi siempre este tocandolo.
    digitalWrite(motor_abajo, LOW);
    digitalWrite(motor_arriba, LOW);
    delay(5000);
    digitalWrite(motor_abajo, HIGH);
  }
}
}


Muchas gracias de nuevo

Jopapa

No se donde estará el problema, pero te daré un consejo que a mi me soluciona todos los problemas.
Guarda el resultado de todos los digitalWrite() en variables, activa el serial y vas viendo los valores de cada variable en cada parte del programa.
Te llevas sorpresas.

Jopapa
www.jopapa.me
Jopapa
www.jopapa.me

rmrmrm

A ver añado info, hice un pequeño debug, como dice el compañero, y cuando la puerta sube sola "a lo loco", tras estar leeyendo el estado del motor continuamente, me da un valor de 0 osea que deberia estar apagado pero esta arrancado el motor de subida. Y otra cosa, cambie el motor por dos leds, y parece que no hace lo mismo claro esta que lo estoy simulando, uno de los problemas que vi, que sin tener nada corriente si yo subo o bajo la puerta con la mano, el motor genera una corriente la cual pasa por el Dual-H y el arduino, ¿Puede estar esto ocasionando mis problemas? Un saludo y gracias de nuevo.

Marcial

Buenas, yo estoy intentando aprender a programar estos juguetes, y ... no te enfades pero te uso de practica, jejejeje.
te importaria probar este codigo a ver si te va bien:

boolean Subiendo=false;
boolean Bajando=false;
int pinFCsube=4;
int pinFCbaja=5;
int pinIR=6;
int pinPulsador=7;
int pinSubir=15;
int pinBajar=16;
int EsperaBajar= 10000;                      // T
void setup()
{
  pinMode(pinFCsube  ,INPUT);                // Establecer pin unidades como entrada
  pinMode(pinFCbaja  ,INPUT);                // Establecer pin unidades como entrada
  pinMode(pinIR      ,INPUT);                // Establecer pin unidades como entrada 
  pinMode(pinPulsador,INPUT);                // Establecer pin unidades como entrada
  pinMode(pinSubir  ,OUTPUT);                // Establecer pin unidades como salida   
  pinMode(pinBajar  ,OUTPUT);                // Establecer pin unidades como salida   
}

void loop()
{
  // Pulsamos boton, la puerta esta abajo y no estamos subiendo ni bajando
  if ( digitalRead(pinPulsador) && digitalRead(pinFCbaja) && !Subiendo && !Bajando)
  {
    Subiendo=true;
    digitalWrite(pinSubir, HIGH);            // Encender motor suibir
  }
  // Subiendo y llega al fc de subida
  if (Subiendo && digitalRead(pinFCsube))
  {
    digitalWrite(pinSubir, LOW);            // Apagar motor subir
    Subiendo=false;
    delay(EsperaBajar);
    Bajando=true;
    digitalWrite(pinBajar, HIGH);           // Encender motor bajar
  }
  // Bajando y llega al fc de bajada
  if (Bajando && digitalRead(pinFCsube))
  {
    digitalWrite(pinBajar, LOW);            // Apagar motor bajar
    Bajando=false;
  } 
  // Bajando y da señal el IR o esta bajando y pulsamos boton
  if (Bajando && digitalRead(pinIR) || Bajando && digitalRead(pinPulsador) )
  {
    digitalWrite(pinBajar, LOW);            // Apagar motor bajar
    Bajando=false;
    delay (1000);                           // Esperar 1 segundo para subir de nuevo la puerta
    Subiendo=true;
    digitalWrite(pinSubir, HIGH);            // Encender motor suibir (inicia maniobra de subida y espera)
  }   
}


Los números de los pines pon los que tengas conectados...

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy