Go Down

Topic: Problema con secuencia (Read 491 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

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