domingo, 5 de octubre de 2014

Biestable con Arduino

Comenzar con cierta didáctica para ir haciéndonos con el Arduino Uno parece razonable. Antes de los grandes proyectos, conocer poco a poco de qué va esto puede contribuir a que nadie se aburra antes de empezar.
Habrá un millón de ejercicios como éste, pero cada uno la emprende como sabe, y yo quiero aportar mi granito de arena para que nadie pueda quedar en la estacada. Así, este biestable es un sencillo ejercicio que nos va a permitir conocer el operador de comparación ==, e operador de asignación =, el operador booleano && (Y), el condicional IF ELSE, el manejo de variables enteras int, la estructura de un programa con Arduino y la creación de un subprograma. Todo muy sencillo, ya lo verán.
Con este biestable vamos a poder apagar y encender un LED con un sólo pulsador, lo mismo que hace el biestable tipo T que dejé en otra entrada.
El programa está lo suficiente comentado como para percatarnos fácilmente de cómo va. Asi, lo único importante es que maneja una variable para conmutar de encendido y apagado, y está condiconado el encendido y apagado del LED al cambio de valor que en cada momento establecemos en la variable "biestable" y el hecho de pulsar el pulsador.
El programa es como sigue:

En el siguiente vídeo observamos como trabaja:

Os dejo el programa en formato texto por si queréis estudiarlo o moficarlo a vuestro antojo.
Os recuerdo que no viene mal en este espíritu colaborativo mencionar este blog para que muchos más puedan beneficiarse de lo que puedan aprender en él. Gracias.

// Biestable por Nacho
// Cotidiana Place
//********************

// Declarar variables

int pulsador=2; // Pulsador, pin 2
int led=10;     // LED, pin 10
int biestable=0;// Variable para conmutar

// Configurar

void setup()
{
  pinMode(pulsador, INPUT); // Pulsador como entrada
  pinMode(led, OUTPUT);     // LED como salida
}

// Programa

void loop()
{
// Encender LED si pulsamos el pulsador y la variable biestable es igal a cero 
  if (digitalRead(pulsador)==LOW && biestable==0)
  {
  biestable=1; // Cambiamos valor de biestable a 1
  digitalWrite(led, HIGH);
  tempo();
}
// Apagar LED si pulsamos el pulsador y la variable biestable es igal a uno 
  else if (digitalRead(pulsador)==LOW && biestable==1)
{
  biestable=0; // Cambiamos valor de variable a 0
  digitalWrite(led, LOW);
  tempo();
}

} // Fin de programa

// Subprograma de retardo
void tempo()
{
delay(600);
 
 
Os dejo aquí el enlace con la simulación con Tinkercad:
 

 


6 comentarios:

  1. Hay un error en el código

    Encender LED si pulsamos el pulsador y la variable biestable es igal a cero
    if (digitalRead(pulsador)==LOW && biestable==0)

    ese LOW debe ser HIHG

    ResponderEliminar
    Respuestas
    1. Gracias José Carlos por interesarte por este blog. No sé si realmente tuviste algún problema con la ejecución de este código, yo realmente no. Es posible que pienses que el código trabaja cambiando el estado del biestable al ejecutar cada uno de los IF, pero no. Debes fijarte que la variable de conmutación es "biestable", y esa sí cambia de valor entre LOW y HIGH para conmutar el estado representado por el LED, apagado o encendido. Lo único que hacen los IF es detectar el flanco de bajada al pulsar el pulsador y permitir así el cambio de valor de la variable "biestable", entre el valor 1 y 0. En el vídeo puedes apreciar que funciona el código perfectamente. Fíjate que los IF cumplen una condición asociada al valor de la variable biestable mediante un operador AND, es decir, hay que pulsar el pulsador, y dependiendo del estado de la variable "biestable", ejecutará uno de los IF para cambiar de nuevo el valor de la misma. Yo siempre agradezco cualquier detalle sobre gazapos o cualquier otra sugerencia constructiva que la gente estime oportuna. Si pudieras ser más explícito detallando el problema siempre te lo agradeceré. Este código es una sugerencia más que cada uno puede modificar o mejorar si lo ve oportuno. Sin problemas. Saludos.

      Eliminar
  2. Buen día amigo, disculpe, ¿para que utiliza la función tempo?
    Gracias.

    ResponderEliminar
    Respuestas
    1. Hola Damián. Gracias por tu comentario. Si eliminas la función tempo, al pulsar el pulsador se produciría lo que se conoce como rebote, es decir, el tiempo invertido en pulsar la tecla sería demasiado largo como para producir múltiples cambios en el estado del biestable, y así sería ingobernable. Puedes probar sin la función, y verás como una cosa tan sencilla desbarataría este ejercicio. Muchas gracias. Un saludo

      Eliminar
  3. Muchas gracias por enseñarme ha hacer un biestable, aunque en mi caso e reemplazado la estructura else if por if per también funciona.

    ResponderEliminar
    Respuestas
    1. Gracias a ti por interesarte por este blog y añadir el comentario. Saludos

      Eliminar