Go Down

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

Jorart05

Algo he leído sobre las peculiaridades de usar delay en según que situaciones, una de las pruebas fué poner un delay bastante alto para retrasar el apagado y me desvirtuaba todo el programa.
Una de las ventajas de esta plataforma es la cantidad de programas escritos a nuestra libre disposición, pero también es cierto que no nos adentramos en entender la programación si nos funciona, hasta que nos encontramos con problemas irresolubles.
Gracias por el apunte.

Alfaville

Hola surbyte.

Buena puntualizacion, aunque creo que en este caso como lo que se busca es completar los blink de los leds y la aplicacion no es critica... puede valer.

Estas llevando hilos a 4 manos jejeje,.. me meta donde me meta ahí te encuentro currando. ¿Como puedes simultanearlo todo?

Podria ser el titulo de un nuevo hilo, jajaja..

Jorart05

Pues funciona igual, he tenido que modificar la línea 34, estaba escrito al revés, readdigital en lugar de digitalread, mal menor, suelo dejarme el ; muchas veces.
También he cambiado los valores del servo, antes tenía esta línea:

(press1 == HIGH); //CAMBIA SENTIDO DE GIRO SERVO

que me permitía hacer el cambio de giro, simplemente ha sido invertir los valores, empezaba con las barreras bajadas, aunque tampoco importa mucho, con invertir el servo listo, pero así es más cómodo.

He subido el tiempo de espera, pero hace lo mismo, apagan antes de empezar a subir.

Dentro de un rato seguiré probando, ahora he de salir.


Alfaville

Cuando dejes el sketch funcionando bien, postealo aqui que pueda ver los fallos que he tenido.

Gracias

Alfaville

Lo siento...
Otro gazapo (corregido aqui).

Vamos a ver las prisas no son buenas, prueba directamenta con este:

Code: [Select]

// Sketch modelizacion de barrera paso a nivel
#include <VarSpeedServo.h>
#define ESPERA 2000   // milisegundos que tarda en completarse la maniobra de subida

const int servoPin1 = 9;
int button1 = 3;      // Interruptor (usar Pull Up)
int buttonState;      // Estado del interruptor
unsigned long duracion = 0;   // Variable para la toma inicial del tiempo
bool maniobra=false;  // Indica que hemos comenzado un ciclo de baja-sube

VarSpeedServo servo1;

void setup()
{
  servo1.attach(9);
  pinMode(button1, INPUT);
  pinMode(12, OUTPUT);    // LED intermitente
  pinMode(11, OUTPUT);    // LED intermitente
  pinMode(10, OUTPUT);    // LED de parpadeo fijo
  digitalWrite(3, HIGH);  // Activa pullup interno
}

void loop()
{
 buttonState = digitalRead(button1); // Leemos y guardamos el estado del interruptor

if (buttonState == LOW)
{
  digitalWrite(10,HIGH); // Led de parpadeo fijo a ON
  servo1.write(500,5);   // Bajamos la barrera
  maniobra = true;
  
  while((buttonState=digitalRead(button1))==LOW)
  {
    digitalWrite(12,HIGH);   // Led 12 ON
    delay(500);              // 0,5 seg de pausa
    digitalWrite(12,LOW);    // Led 12 OFF
    delay(100);              // 0,1 seg de pausa
    digitalWrite(11,HIGH);   // Led 11 ON
    delay(250);              // 0,25 seg de pausa
    digitalWrite(11,LOW);    // Led 11 OFF
    delay(100);              // 0,1 seg de pausa
  }
}
else
{
  digitalWrite (10,LOW);  // Apagamos led de intermitencia fija
  if(maniobra)            // Tenemos a medio una maniobra baja-sube ?
  {
    servo1.write(80,5);   // Subimos la barrera
 maniobra=false;       // Maniobra completada
 duracion=millis();    // Tomamos tiempo inicial
    while((duracion+ESPERA)>millis())
    {
      digitalWrite(12,HIGH);   // Led 12 ON
      delay(500);              // 0,5 seg de pausa
      digitalWrite(12,LOW);    // Led 12 OFF
      delay(100);              // 0,1 seg de pausa
      digitalWrite(11,HIGH);   // Led 11 ON
      delay(250);              // 0,25 seg de pausa
      digitalWrite(11,LOW);    // Led 11 OFF
      delay(100);              // 0,1 seg de pausa
    }
  }
}
}


Los leds se apagaban porque me habia equivocado al teclear (como en digitalRead()) y habia puesto <millis(), cuando debe ser mayor que.
Cosas de la multitarea.

Prueba que debe ir OK.

Alfaville

Me he comido boolean por las prisas.
Ponlo.

Code: [Select]


// Sketch modelizacion de barrera paso a nivel
#include <VarSpeedServo.h>
#define ESPERA 2000   // milisegundos que tarda en completarse la maniobra de subida

const int servoPin1 = 9;
int button1 = 3;      // Interruptor (usar Pull Up)
int buttonState;      // Estado del interruptor
unsigned long duracion = 0;   // Variable para la toma inicial del tiempo
boolean maniobra=false;  // Indica que hemos comenzado un ciclo de baja-sube

VarSpeedServo servo1;

void setup()
{
  servo1.attach(9);
  pinMode(button1, INPUT);
  pinMode(12, OUTPUT);    // LED intermitente
  pinMode(11, OUTPUT);    // LED intermitente
  pinMode(10, OUTPUT);    // LED de parpadeo fijo
  digitalWrite(3, HIGH);  // Activa pullup interno
}

void loop()
{
 buttonState = digitalRead(button1); // Leemos y guardamos el estado del interruptor

if (buttonState == LOW)
{
  digitalWrite(10,HIGH); // Led de parpadeo fijo a ON
  servo1.write(500,5);   // Bajamos la barrera
  maniobra = true;
  
  while((buttonState=digitalRead(button1))==LOW)
  {
    digitalWrite(12,HIGH);   // Led 12 ON
    delay(500);              // 0,5 seg de pausa
    digitalWrite(12,LOW);    // Led 12 OFF
    delay(100);              // 0,1 seg de pausa
    digitalWrite(11,HIGH);   // Led 11 ON
    delay(250);              // 0,25 seg de pausa
    digitalWrite(11,LOW);    // Led 11 OFF
    delay(100);              // 0,1 seg de pausa
  }
}
else
{
  digitalWrite (10,LOW);  // Apagamos led de intermitencia fija
  if(maniobra)            // Tenemos a medio una maniobra baja-sube ?
  {
    servo1.write(80,5);   // Subimos la barrera
 maniobra=false;       // Maniobra completada
 duracion=millis();    // Tomamos tiempo inicial
    while((duracion+ESPERA)>millis())
    {
      digitalWrite(12,HIGH);   // Led 12 ON
      delay(500);              // 0,5 seg de pausa
      digitalWrite(12,LOW);    // Led 12 OFF
      delay(100);              // 0,1 seg de pausa
      digitalWrite(11,HIGH);   // Led 11 ON
      delay(250);              // 0,25 seg de pausa
      digitalWrite(11,LOW);    // Led 11 OFF
      delay(100);              // 0,1 seg de pausa
    }
  }
}
}

Jorart05

Funcionamiento perfecto, he modificado algunas cosas, el led fijo se apagaba al desconectar, los intermitentes solo ajustar el tiempo, cambiado sentido de giro del servo.
En mayúsculas describo las modificaciones:
La linea de apagado del led fijo pasa al final del código, precedido de un delay para ajustar el tiempo de apagado, el else también está anulado, creo que no tenía ningún sentido después de la modificación.

Ahora unas preguntas, debo poner un pull-up teniendo activado el de la placa?
Este automatismo va en un módulo, seguramente en la maqueta fija pondré otro, pero activado por infrarrojos, supongo que servirá el código, excepto modificar los apartados referentes al interruptor, correcto?
Existe algún pdf con nociones sobre la manera de implementar las líneas de código?, algo que describa las funciones de manera sencilla, porque ahora mismo la mayoría de lo que hay en el código no tengo ni idea de lo que hace.
Como comenté en otro post, he empezado hace unos meses con Arduino, he construido un módulo con placa giratoria y puertas de cocherón con servos, pero todo con código recopilado de la red y modificado a mis necesidades, me costó lo mío poner los dos programas en uno.



Code: [Select]


// OK, SERVO, INTERMITENCIAS Y FIJO 9/12/16 FORO ARDUINO Y MODIFICACIONES
// Sketch modelizacion de barrera paso a nivel
#include <VarSpeedServo.h>
#define ESPERA 8000   // milisegundos que tarda en completarse la maniobra de subida, MODIFICADO TIEMPO

const int servoPin1 = 9;
int button1 = 3;      // Interruptor (usar Pull Up)
int buttonState;      // Estado del interruptor
unsigned long duracion = 0;   // Variable para la toma inicial del tiempo
boolean maniobra=false;  // Indica que hemos comenzado un ciclo de baja-sube

VarSpeedServo servo1;

void setup()
{
  servo1.attach(9);
  pinMode(button1, INPUT);
  pinMode(12, OUTPUT);    // LED intermitente
  pinMode(11, OUTPUT);    // LED intermitente
  pinMode(10, OUTPUT);    // LED de parpadeo fijo
  digitalWrite(3, HIGH);  // Activa pullup interno
}

void loop()
{
 buttonState = digitalRead(button1); // Leemos y guardamos el estado del interruptor

if (buttonState == LOW)
{
  digitalWrite(10,HIGH); // Led de parpadeo fijo a ON
  servo1.write(80,5);   // Bajamos la barrera
  maniobra = true;
 
  while((buttonState=digitalRead(button1))==LOW)
  {
    digitalWrite(12,HIGH);   // Led 12 ON
    delay(250);              // 0,25 seg de pausa
    digitalWrite(12,LOW);    // Led 12 OFF
    delay(100);              // 0,1 seg de pausa
    digitalWrite(11,HIGH);   // Led 11 ON
    delay(250);              // 0,25 seg de pausa
    digitalWrite(11,LOW);    // Led 11 OFF
    delay(100);              // 0,1 seg de pausa
  }
//}
//else DESHABILITADO
//{
   
  if(maniobra)            // Tenemos a medio una maniobra baja-sube ?
  {
 servo1.write(500,5);   // Subimos la barrera
 maniobra=false;       // Maniobra completada
 duracion=millis();    // Tomamos tiempo inicial
    while((duracion+ESPERA)>millis())
    {
      digitalWrite(12,HIGH);   // Led 12 ON
      delay(250);              // 0,25 seg de pausa
      digitalWrite(12,LOW);    // Led 12 OFF
      delay(100);              // 0,1 seg de pausa
      digitalWrite(11,HIGH);   // Led 11 ON
      delay(250);              // 0,25 seg de pausa
      digitalWrite(11,LOW);    // Led 11 OFF
      delay(100);              // 0,1 seg de pausa
    }
   
   delay(500);                // AÑADIDO
   digitalWrite (10,LOW);  // Apagamos led de intermitencia fija, CAMBIADO DE LÍNEA 49
   
  }
}
}


Muchísimas gracias por vuestra colaboración.
Saludos.

Alfaville

Me alegro de que te funcione.

Los detallitos se cambian y punto.

Vayamos a tus preguntas:



Ahora unas preguntas, debo poner un pull-up teniendo activado el de la placa?


Normalmente con el interno que activas va bien, pero en ambientes con alto ruido o inestabilidades puede ser insuficiente porque tiene una impedancia alta, en esos caso yo coloco una resistencia de un valor entre 10k y 4k7 con un extremo al +5v y el otro al pin (pullup).




Este automatismo va en un módulo, seguramente en la maqueta fija pondré otro, pero activado por infrarrojos, supongo que servirá el código, excepto modificar los apartados referentes al interruptor, correcto?


Es correcto si cumple con las especificaciones del actual: contacto mecanico y el mismo sentido de ON-OFF, naturalmente se pueden usar salidas electronicas (transistores y otros) pero eso nos llevaria a hacer un pequeño interfaz en la interconexion.



Existe algún pdf con nociones sobre la manera de implementar las líneas de código?, algo que describa las funciones de manera sencilla, porque ahora mismo la mayoría de lo que hay en el código no tengo ni idea de lo que hace.


Como haber hay mogollon, pero aqui mismo en la web tienes tutriales y demas. Quizas ya lo hayas hecho pero puedes comenzar por aqui:  lenguaje Arduino y asi vas aprendiendo sintaxis y uso de las distintas sentencias.
Este es un tema abierto si quieres concretar mas mansame un MP.

Lo mas importante es no desanimarse y si la prueba sale mal, se repasa el código y la prueba se repite.
Ojo no siempre el código es el culpable de los fallos, tambien esta el hardware.


Jorart05

Gracias por tus respuestas, en cuanto al pull-up, pues sí, lo pondré ya que los trenes miniatura suelen tener fallos de alimentación y creará inestabilidad.
Daré un vistazo al enlace que me facilitas, seguro que me facilitará la labor.
Gracias otra vez.

Saludos.

Go Up