Go Down

Topic: Modificar encendido leds (Read 3095 times) previous topic - next topic

Jorart05

Nov 29, 2016, 12:35 pm Last Edit: Nov 29, 2016, 07:34 pm by Jorart05
Hola a todos, tengo un problema con un proyecto de unas barreras con leds para una maqueta de tren, después de recopilar varios programas por la red y adaptarlos a mi proyecto, soy incapaz de hacer funcionar correctamente los leds, en cuanto alimento el nano, funcionan los leds siempre, independientemente del servo.
Mi idea es que empiecen a funcionar en cuanto se active el pulsador y dejen de funcionar cuando el servo haya vuelto a su posición inicial, que hago mal?

Gracias

Code: [Select]


// LEDS PARPADEAN SIEMPRE REVISAR
#include <VarSpeedServo.h>

int button1 = 3; //button pin, connect to ground to move servo
int press1 = 0;

VarSpeedServo servo1;

const int servoPin1 = 9;



void setup()
{
  servo1.attach(9);
  pinMode(button1, INPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  digitalWrite(3, HIGH); //enable pullups to make pin high
 
}

void loop()

{
    press1 = digitalRead(button1);
    
  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(250);              // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  delay(100);              // wait for a second
  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(250);              // wait for a second
  digitalWrite(11, LOW);    // turn the LED off by making the voltage LOW
  delay(100);              // wait for a second

  servo1.write(500,5);  // GRADOS GIRO, VELOCIDAD
  

 if
 (press1 == LOW); //CAMBIA SENTIDO DE GIRO SERVO
 
 else
 {
  servo1.write(80,5);

}
}
  
  




Mikelazp

Hola!! En void setup asigna al pin de cada led el valor LOW. Así deberían empezar apagados.

cas6678

Segun tu codigo los led no se encienden en funcion de nada. Estan dentro del loop y se activan asi: El lel del pin 12 se enciende y se apaga a las 250 milisegundos, luego a los 100 milisegundos el led del pin 11 se enciende y se apaga a los 250 milisegundos, luego a los 100 milisegundos se repite el ciclo.

Los led no estan conectados a nada. Ponlos dentro del if (debajo del else) y veras como actuan cuando hay señal en el button1

Sadvance

Para lo que tu quieres esto te puede servir:

Code: [Select]
// LEDS PARPADEAN SIEMPRE REVISAR
#include <VarSpeedServo.h>

int button1 = 3; //button pin, connect to ground to move servo
int press1 = 0;

VarSpeedServo servo1;

const int servoPin1 = 9;


void setup()
{
  servo1.attach(9);
  pinMode(button1, INPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  digitalWrite(3, HIGH); //enable pullups to make pin high
 
}

void loop()

{
    press1 = digitalRead(button1);

    if (press1 == HIGH){// si presionas  el boton

  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(250);              // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  delay(100);              // wait for a second
  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(250);              // wait for a second
  digitalWrite(11, LOW);    // turn the LED off by making the voltage LOW
  delay(100);              // wait for a second

  servo1.write(500,5);  // GRADOS GIRO, VELOCIDAD
  }
else // si no lo presionas todo off
{
digitalWrite(12, LOW); 
digitalWrite(11, LOW);
}     

 if
 (press1 == LOW){}; //CAMBIA SENTIDO DE GIRO SERVO
 
 else
 {
  servo1.write(80,5);

}
}
 




Si te soy sincero esta parte no se lo que quieres hacer ni para que sirve, porque solo dices: si press1 no esta conectado......

Code: [Select]


if
 (press1 == LOW); //CAMBIA SENTIDO DE GIRO SERVO
 
 else
 {
  servo1.write(80,5);

}

cas6678

Hace lo mismo que tu. Tu preguntas si press1 es igual a High para hacer algo y el se pregunta si es igual a low para hacer algo en caso contrario, por eso lo pone en el else  ;)

surbyte

Lee las normas del foro.
Edita título y postea usando tags (</>) tu código. 
Ese código debe verse en el hilo y no adjuntarlo. Hazlo en el primer post no en uno nuevo.

Jorart05

Ya está modificado el post, disculpad por el error.

En cuanto a las respuestas gracias por vuestro interés, pero ninguna funciona.

La primera no sirve o soy incapaz de implementarla correctamente.

En la segunda respuesta lo mismo, pero deduzco que en cuanto suelte el button1 se apagarían y no es esta la opción que necesito.

La tercera respuesta el código tiene error, hay algún token de más, después de eliminarlos lo he probado y no funciona el servo, pero si apagan los leds, aunque inmediatamente.
En la parte del código que no entiendes tampoco yo, soy muy novato y mi experiencia se limita a otro proyecto realizado con éxito de una placa giratoria con stepper y aperturas de puertas mediante servos, con Arduino Nano y códigos de la red, modificando valores para mis necesidades.
Como comento en la línea del código, si cambio a HIGH invierte el sentido del servo.

Quizá no me he explicado bien en el primer post.

Se trata de unas barreras en un paso a nivel de una maqueta ferroviaria, en principio el funcionamiento es manual mediante interruptor.
Al cerrar el circuito mueve un servo y debe encender los leds para los semáforos, dos de forma alternativa, al abrir el circuito el servo vuelve a su posición inicial debiendo mantener los leds encendidos hasta el final del movimiento.
El servo está conseguido, velocidad y recorrido, pero los leds encienden siempre nada más conectgar alimentación.

Gracias por vuestro tiempo.

Jorart05

No hay nadie que pueda aportar una solución a mi problema?, soy neófito y no consigo solucionarlo, gracias.

cas6678

A ver, yo no trabaje con servos pero si tu ya lo tienes conseguido ni hace falta.

No entiendo bien que significa encender los led de forma alternativa. Que son dos luces amarillas que parpadean una si y una no?

Aun sin saber como funcionan los servos se me ocurre que tus led pueden empezar a funcionar cuando el circuito se cierre y hacerlo hasta X tiempo despues de que abra, para que esten activos mientras el servo termina de hacer su trabajo.

Dices que los led te quedan encendidos desde el principio. No se si estas trabajando con el codigo que tienes en el primer post pero si es asi ya te lo conteste. Tus led se activan con independencia de que la señal que tu activas este ON/OFF.

En tu codigo dentro de void loop cargas en press1 la señal que lees del button1. Pero inmediatamente a continuacion juegas con los led con independencia de lo que has leido.

Mas abajo tienes un IF en donde te preguntas si press1 es LOW para en ese caso (mejor dicho en el contrario porque lo ponese en el ELSE) haga determiandas cosas.

Esa es la unica parte de tu codigo en las que algo se hace en funcion del estado button1, lo demas, los led estan SIEMPRE ACTIVADOS. Ya te comente que probaras en poner la secuencia de led DENTRO DEL IF, ya sea en la zona IF si quieres que se active cuando button1 sea LOW o en la zona ELSE si quieres que se active cuando button1 sea HIGH.

Otra cosa que te puede afectar es el rebote, el paso de LOW a HIGH o el contrario, en un interruptor no es UNICO. En la zona de transcion se producen muchos cambios (*) lo llamamos rebote y puede afectar a tu proyecto.

(*) Por ejemplo si tu activas tu quieres que pase de LOW a HIGH, pero al mover el interruptor tienes que tener en cuenta que quizas el cambio real sea: (LOW, HIGH, LOW, HIGH, LOW, HIGH, LOW, HIGH) Cosas de la velocidad de la luz...!!!



surbyte

Hola. Algo confusa tu explicación, pero repasemos algunos comentarios tuyos.
Quote
El servo está conseguido, velocidad y recorrido, pero los leds encienden siempre nada más conectgar alimentación.
Si los leds encienden al conectar la alimentación y no has presionado el pulsador entonces lo tienes mal conectado o el estado que debes esperar al presionarlo debe ser LOW y no HIGH.
Primero identifiquemos como lo has conectado. Es pull down o pull up. Para mi es pull-up porque tienes HIGH siempre y eso haría que los leds parpadeen al energizar el arduino aún sin presionarlo.

Caso pull-up. Tu energizas y siempre ve un HIGH. Si presionas leeras un LOW
Caso pull-down. Tu energizas y siempre leeras un LOW. Al presionar lees un HIGH.
Asi que en función de esto, corrige tu hardware.

Luego seguimos con el semáforo.

cas6678

Quote
Si los leds encienden al conectar la alimentación y no has presionado el pulsador entonces lo tienes mal conectado o el estado que debes esperar al presionarlo debe ser LOW y no HIGH.
No, mira el codigo.

Los led se encienden (se encienden y se apagan en forma alternativa) porque estan fuera de ninguna condicion. Da igual si presiona o no presiona, no es un problema de que este bien o mal conectado. El programa funciona como el lo ha escrito, bien. Cuando arranca los led se empiezan a mover.


surbyte

Vaya que me pareció haber visto un if algo.. ok, tienes razon cas6678.
Encontes? Que es lo que pide?
Si tienes en el loop los leds para que se enciendan y no quiere que lo hagan, es una conversación de locos.
Me había parecido que estaba leyendo un pulsador y lo hacía mal y por eso se veían.
A ver si clarificas por favor jorart05.

Que quieres que hagan los leds? Deja el servo tranquilo. Enfócate en los leds y como quieres que funcionen. 
Tal como has hecho siempre parpadearán al correr el loop sin control alguno. Asi que establece la condicion que los pone en marcha o no.

Alfaville

Hola Jorart05

Si no estas cansado de pruebas haz esta:

Code: [Select]

// codigo anterior...
  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1500);              // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1500);              // wait for a second
  digitalWrite(11, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
// codigo posterior ...

Y luego nos lo cuentas.

Verás el problema puede deberse a que estas jugando con milisegundos y como el programa va muy rapido el parpadeo no se distingue de un nivel medio de luz.

Lo he modificado a 1,5 segs ON - 1 seg OFF

Jorart05

Ya he conseguido, después de infinidad de pruebas y leyendo multitud de programas, encender los leds al activar el interruptor, como bien comentáis, no estaban asociados a ningún pin, ahora ya funciona correctamente, pero sigo con el problema del apagado, en cuanto abro el circuito se apagan antes de que el servo levante las barreras.

Para aclarar, al cerrar el circuito empiezan a parpadear los leds y acto seguido bajan las barreras, hasta aquí correcto.
Al abrir el circuito dejan de parpadear los leds y después suben las barreras, necesito que primero suban las barreras y después apaguen los leds, es decir, un retraso de apagado.
Muchas gracias por vuestra ayuda.

surbyte

Cuando presentes un problema recuerda que no estamos en tu cabeza.
Primero dinos como hiciste de que se trata, un tren de modelismo.
Luego nos dices.. quiero hacer tal o cual cosa. Pero explicas el objetivo, no tu programa y lo que hace mal.
Entonces si pones el programa y dices que no hace.

De ese modo es mas fácil entender lo que persigues.
Mira desde tu post inicial hasta mi comentario como no dijiste nada sobre un interruptor que accione las luces lo que era lógico para mi porque el semáforo debe accionarse con la presencia o proximidad del tren para simular situaciones.
Así que tenlo presente, para la próxima consulta.
 

Go Up