Arduino no respeta los delays

Prueba esto y dinos como trabaja en las siguientes condiciones

  1. hace lo mismo que con delay(10000), yo estimo que si
  2. que pasa si en in o out, el sensor vuelve a detectar <40, deberia abrir a 270 de nuevo

chequea

#include <Ultrasonic.h>
#include <Servo.h>
Servo Servo_Puerta;

Ultrasonic ultrain(6, 7);   //pin trig, pin echo
Ultrasonic ultraout(8, 9);  //pin trig, pin echo
int led = 2;                //pin del arduino que se conecta al led
int distanciain;            // variable de distancia del ultrasonico interior
int distanciaout;           // variable de distancia del ultrasonico exterior
unsigned long startin, startout;
byte modoin = 0; 
byte modoout = 0;

void setup() {
  pinMode(led, OUTPUT);
  Servo_Puerta.attach(5);
  Serial.begin(9600);
}

void loop() {
  distanciain = ultrain.read(CM);
  distanciaout = ultraout.read(CM);

  if (distanciain < 40) {     //distancia deteccion
    switch(modoin) {
      case 0: digitalWrite(2, HIGH);    //enciende led
              Servo_Puerta.write(270);  //abre puerta
              modoin = 1;
              startin = millis();
              break;
      case 1: if (millis()- startin > 10000UL) {
                  digitalWrite(2, LOW);     //apaga led
                  modoin = 0;
              }
              break;
    }
  else {
    Servo_Puerta.write(0);  //cierra la puerta
  }    

  if (distanciaout < 40) {     //distancia deteccion
    switch(modoout) {
      case 0: digitalWrite(2, HIGH);    //enciende led
              Servo_Puerta.write(270);  //abre puerta
              modoout = 1;
              startout = millis();
              break;
      case 1: if (millis()- startout > 10000UL) {
                  digitalWrite(2, LOW);     //apaga led
                  modoout = 0;
              }
              break;
    }
  else {
    Servo_Puerta.write(0);  //cierra la puerta
  }
}

Gracias Surbyte!
Lamentablemente no me funciono este codigo solo enciende el led y lo deja encendido indefinidamente con un pequeño blink cada 10seg.

SIN EMBARGO, descubri algo nuevo:

  • Cuando la placa esta conectada al PC via USB, entonces SI respeta los 10 segundos del delay
  • Cuando la placa la dejo conectada mediante el JACK DC12V entonces solo abre la puerta por 3 segundos (cronometrado), y sin encender el led.

Sinceramente no entiendo que es lo que hace la diferencia si en ambos casos la placa recibe 5V.. no se como influye esto en la duracion del delay ????

Eso es muy extraño.
Si tenés un tester (multímetro) tendrías que comprobar si hay 5V entre el pin 5V y GND del arduino cuando está alimentado por el jack.

Es un quebradero de cabeza..
Para mas contexto este es el cableado electrico desde la pared:

  • Transformador 220V --> 12V ~2A (tipico Jack DC12V)
  • DC Splitter (me divide 1 macho en dos machos)
  • Un macho DC12V va para alimentar la placa
  • El otro macho DC12V va a un step down que baja a 5V para alimentar el servo

Tengo un tester y hasta ahora he medido lo siguiente:

  • En la placa 5V a GND --> 5V
  • En la placa VIN a GND --> 12V
  • El step down mide 12V entrada y 5V salida
  • Comprobe la mini protoboard y tambien da 5V entre +5V y GND

Como ves todas mediciones esperables..
Pense que podria ser alguna tierra mal conectada pero he revisado 10 veces todo :confused:

Qué servo usas?

Este...
Marca: DSSERVO
Modelo: DS3218
Torque máximo: 21.5 KG*cm con 6.8V
Giro: 270°
Voltaje de funcionamiento: 4.8 ~ 6.8 voltios CC
Frecuencia de funcionamiento: 50-333Hz

El codigo funciona perfecto conectado por USB al PC incluso sin tener el programa de arduino abierto, asi que mas que codigo creo que es un tema electrico..

Me parece que el problema es el consumo del servo que puede llegar a 1.8A a 5V.

Mirá la hoja de datos

DS3218 (Servo).pdf (447,4 KB)

Mira hice una prueba mas..

  • Deje conectado el servo al step down tal como lo tenia, es decir 12V --> 5V --> Servo
  • Ahora conecte la placa por USB a un PowerBank en vez del PC

Y FUNCIONA PERFECTO!!!!

El problema esta en la alimentacion de la placa via USB vs vía Jack12V..
Algo pasa dentro de la placa cuando se alimenta por el Jack..

  • Sera que 12V es demasiado?
  • Sera que el regulador interno de la placa no funciona bien?

Para mí el problema es que la fuente de 12V está en el límite de corriente y cuando se mueve el servo cae la tensión.
Medí los 12V y fíjate si se mantienen todo el tiempo.

Si cuando se mueve el servo cae a 3.2V pero en reposo siempre esta en 5V y 12V depende del pin (5V o VIN)..

En fin mi solucion fue enchufar el servo y la placa de forma independiente.
El servo a traves del regulador step down y la placa a traves de un transformador tipico de celular que da 5V.. No es lo mas elegante pero por ahora anda perfecto.

Luego probaré con un step down de 12V a 5V con salida USB para alimentar desde ahi la placa.. este es el modelo: Regulador de Voltaje Step Down USB MP1584EN – Afel

Si esta prueba es exitosa, entonces la electronica interna dela placa desde el Jack12V es la problematica..

¿No te das cuenta que ése es el problema?

No tiene sentido porque el problema es la fuente de 12V. Necesitas una fuente de mayor amperaje.

No, la problemática es la fuente de 12V.

Pero la fuente da 2amp segun tiene escrito.. me figure que seria suficiente con eso..
Sino probare con otro transformador que de unos 3amp minimo

Te creo pero yo tengo 2 cargadores para conectar al encendedor del auto con 2 tomas cada uno que dicen que entregan 1A y 2.1A respectivamente. O sea que teóricamente entragan hasta 3.1A
A uno se le quemó el fusible, el otro quemó el fusible de 15A del encendedor.
Resulta que son un engaño, solo entregan 700 mA pero los fabricantes no conectan un pin del USB para "engañar" al aparato que conectas (móvil, tablet, gps, etc.), pero los engañados somos nosotros que confiamos en lo que dice la etiqueta.

Por otro lado, si al moverse el servo cae tanto la tensión es porque la corriente no alcanza.
Sea porque la fuente no entrega los 2A que dice o porque el servo consume más de 2A, lo cierto es que la fuente se queda "corta".
Además al consumo del servo hay que sumar el del UNO así que 2A quedan muy justos de todos modos.

La fuente esa no esta funcionando bien o su regulador esta dañado y por eso cae.
Es muy común que pase.
EL trafo puede decir 2A pero la electrónica puede estar dañada o su regulador.
Vaya a saber qué tiene.

Bueno estuve dos días haciendo pruebas varias..

  1. Medí amperaje de la fuente que tenia y efectivamente aunque nominalmente decia 2A, lo que entrega realmente es 1.6A
  2. Me consegui otra fuente, esta vez de 9V y 3A confirmados, pero el problema persistió
  3. Intenté con una fuente de 6V y 5A y esta vez pasó lo contrario.. el delay que se supone era de 10 segundos esta vez dejaba la puerta abierta 22 seg y cuando bajaba volvia a subir de inmediato

Conclusiones:

  • Servo y placa necesitan al menos 3A.. si se le da menos, cuando el servo esta en su mayor esfuerzo se come todos los amperios y crashea la placa
  • No hay forma de hacer que funcione correctamente el circuito manteniendo 1 fuente para ambas lineas (servo / placa) lo que me lleva a pensar que los tipicos DC splitter (este) no son buena idea.
  • Hasta ahora la unica solucion ha sido mantener placa y servo alimentados independientemente desde la toma de corriente de casa, cada uno con su transformador independiente.

El porque de esto se me escapa, por lo que veo no es SOLO tema de amperaje..
Al menos la solucion es sencilla y es tener un cable para cada cosa..

Hi,
Una sugerencia porque no pones una puerta que se deslize horizontal en una canal cuando abre y cierra.la puerta. Estas usan una cadena con un motorpara abrir los portones de las entradas de las casas. creo que son facil de construir una paara tu aplicacion.

Saca el servo de la alimentación del Arduino. Arduino con una fuente, y servo con otra. Algo le pasa a ese servo pero haz tu analisis de esta manera, no arrastrando a ambos y generando mas dudas que respuestas.
Siempre descarta culpables.

Es justamente lo que debes hacer. No hay forma porque el Servo estará muy al limite cuando intenta cambiar del estado de parado a movimiento.

Hola Tauro! Si esa hubiese sido la prioridad pero el espacio no me permite deslizamientos horizontales.. solo vertical =/
Por eso tuve que diseñar en base a poleas en vez de cremalleras..

Si finalmente asi tendra que ser.. mi idea era mantener 1 cable de alimentación en lugar de dos, pero ni modo. Abajo el enlace a un video de la puerta funcionando correctamente =)

https://youtu.be/ZWYe6SsPhW8

Hi,
Yo veo un problema en los sensores ultrasonicos y es que pasa si los perros estan moviendose. Ya que tienes un delay que es constate y una vez que los perros esten moviendose alrededor puedes tener un delay timeout y los perros esta moviendose dentro de la distancia para mi el sensor ultrasonico no es el ideal. Yo usaria un sensor PIR ya que estos esta mirando el calor del cuerpo del perro y no la distancia. Yo uso estos en una trampa de ratones tan pronto detecto el calor generado por el cuerpo ,del raton, cierro la puerta y aplico un voltaje de 50kvoltio y el raton queda electrocutado. El alto voltaje es optional. El sensoe que yo uso es el HC-SR501 PIR. Esto es una sugerencia para tu consideracion.

No veo ningun problema en la puerta subir y bajar ya que lo esta hacindo bastante rapido. El systema esta bien disenado. Felicitaciones por el buen trabajo de diseno.