jueves, 30 de abril de 2020

Controlando un led con un boton

Visión general

En esta lección, aprenderemos cómo detectar el estado de un botón y luego alternar el estado de un LED basado en el del botón.

Vamos a requerir:
  •  1 x ESP8266 NodeMCU LoLin
  •  1 x Protoboard
  •  1 x Led 3mm
  •  1 x botón pulsador 
  •  1 x resistencias de 220Ω.
  •  1 x resistencias de 10KΩ.
  •  Cables para conectar todo.

Conceptos básicos

1. Botón

Los botones son un componente común utilizado para controlar dispositivos electrónicos. Generalmente se usan como interruptores para conectar o desconectar circuitos. 
Aunque los botones vienen en una variedad de tamaños y formas, la utilizada en este experimento será un botón de 12 mm como se muestra en las siguientes imágenes. Pines señalados por el las flechas del mismo color están destinadas a estar conectadas.
 


El botón que usamos es un botón de tipo normalmente abierto. Los contactos del botón están apagado en las condiciones normales, solo cuando el botón está presionados están cerrados.

El diagrama esquemático que utilizamos es el siguiente:


El jitter (o fluctuación) del botón debe ocurrir en el proceso de uso. La forma de onda de este es como la imagen siguiente:


Cada vez que presione el botón, la placa pensará que ha presionado el botón botón muchas veces debido al jitter del botón. Debemos tratar con el
de botones antes de usar el botón. Podemos eliminar la fluctuación a través de la programación de los botones, o por medio de un capacitor para hacerlo de forma fisica. Para hacerlo por software rimero, detectamos si el nivel de la interfaz del botón es bajo o alto. Cuando el nivel que detectamos es bajo, se necesita un retraso de 5 ~ 10 MS, y luego detecte si el nivel de la interfaz del botón es bajo o alto. Si la señal es bajo, podemos confirmar que el botón se presiona una vez. También puede usar un capacitor de 0.1 uF para limpiar el jitter de botones. 

Diagrama esquematico

2. Interrupción

Se introdujeron interrupciones de hardware como una forma de reducir el desperdicio de valioso tiempo del procesador en bucles de sondeo, esperando eventos externos. Ellos puede implementarse en hardware como un sistema distinto con líneas de control, o pueden integrarse en el subsistema de memoria.

3. Funciones clave

attachInterrupt (interrupción, ISR, modo)
Especifica una rutina de servicio de interrupción (ISR) para llamar cuando se produce una interrupción. Reemplaza cualquier función anterior que se adjuntó a la interrupción.
La mayoría de las placas tienen dos interrupciones externas: números 0 (en el pin digital 2) y 1 (en el pin digital 3).
En general, un ISR debe ser lo más corto y rápido posible. Si tu boceto usa ISR múltiples, solo uno puede ejecutarse a la vez, otras interrupciones serán ignoradas (apagado) hasta que finalice el actual. como delay () y millis () ambos confían en interrupciones, no funcionarán mientras se ejecuta un ISR. delayMicroseconds (), que no depende de interrupciones, funcionará como se espera.

Sintaxis
attachInterrupt (pin, ISR, modo)
Parámetros
pin: el número de pin
ISR: se llamará al ISR cuando ocurra la interrupción; esta función debe tomar sin parámetros y no devuelve nada. Esta a veces se denomina: rutina de servicio de interrupción.
modo: define cuándo se debe activar la interrupción. Cuatro constantes son predefinidos como valores válidos:
  • LOW para activar la interrupción siempre que el pin esté bajo,
  • CHANGE para activar la interrupción cada vez que el pin cambia de valor
  • RISING para disparar cuando el pin va de bajo a alto,
  • FALLING para cuando el pin va de mayor a menor.
 
digitalRead ()
Lee el valor de un pin digital especificado, ya sea ALTO o BAJO.
Sintaxis
digitalRead (pin)
Parámetros
pin: el número del pin digital que desea leer (int)
Devoluciones
Alto o bajo

delayMicroseconds (us)
Pausa el programa por la cantidad de tiempo (en microsegundos) especificado como parámetro. Hay mil microsegundos en un milisegundo y un millón microsegundos en un segundo.
Actualmente, el valor más grande que producirá un retraso preciso es 16383. Esto podría cambiar en futuros lanzamientos de Arduino. Para retrasos de más de unos pocos miles microsegundos, debería usar delay () en su lugar.
Sintaxis
delayMicroseconds (us)
Parámetros
nosotros: el número de microsegundos para pausar (unsigned int)
Devoluciones
Ninguna


Procedimientos

1. Construcción del circuito

Vamos a utilizar los pines digitales  D2 - GPIO 4 ara conectar el LED y D1 - GPIO 5 para el pulsador. Al negativo del diodo conectaremos una resistencia de 220Ω que ira al neutro. La pata del pulsador que hace contacto con el pin D1 se conecta ademas al vivo (3V) por medio de una resistencia de 10KΩ, la otra pata se conecta al neutro.


2. Programa

/***********************************************************
  Descripcion: Cuando precione el boton, podra verse como cambia el estado del LED. (ON->OFF,OFF->ON).
***********************************************************/

int led_pin = 4;          // definimos el pin digital 2 (GPIO 4) como el controlador del LED
int btn_pin = 5;          // definimos el pin digital 1 (GPIO 5) para la interface del boton

volatile int state = LOW; // Definimes el estado inicial del LED

void setup()
{
  pinMode(led_pin, OUTPUT); // Seteamos el pin del LED, lo dejamos en modo de salida OUTPUT
  pinMode(btn_pin, INPUT);  // Seteamos el pin del BOTON, lo ponemos en modo entrada INPUT
}

void loop()
{
  if (digitalRead(btn_pin) == LOW)        // Detectamos la bajada del boton
  {
    delay(10);                            // Esperamos 10ms para eliminar el jitter del pulsador
    if (digitalRead(btn_pin) == LOW)      // Confirmamos que el boton este precionado
    {
      while (digitalRead(btn_pin) == LOW);
      delay(10);
      while (digitalRead(btn_pin) == LOW);
      state = !state;                     // Invertimos el valor de state.
      digitalWrite(led_pin, state);       // Asignamos el valor de state a LED
    }
  }
}

3. Compile el programa y cárguelo 

Cuando presiona el botón, puede ver que el estado del LED se activará.


Resumen

A través de esta lección, debería haber aprendido a detectar el estado de un botón externo y luego alternar el estado de un LED.

miércoles, 29 de abril de 2020

Semáforo

Como primer proyecto, realizaremos un semáforo con unos Leds. 
Es ideal para iniciarnos en la programación y el montaje de circuitos porque, como se vera, es muy fácil.
Los elementos que vamos a necesitar son
  •  1 x ESP8266 NodeMCU LoLin (La cual usaremos para todos nuestros experimentos)
  •  1 x Protoboard
  •  1 x Led rojo 3mm
  •  1 x Led amarillo 3mm
  •  1 x Led verde 3mm
  •  3 x resistencias de 220Ω.
  •  Cables para conectar todo.
Una vez que tenemos todo, hacemos nuestro montaje siguiendo el siguiente esquema.

Esquema de montaje del semáforo

Utilizaremos los pines digitales D3 - GPIO 0 (rojo), D2 - GPIO 4 (amarillo) y D1 - GPIO 5 (verde). Al conectar los Leds debéis tener en cuenta que tienen polaridad, por lo que tenéis que colocarlos bien para que funcionen. En los Leds la patilla corta, o el lado que está achatado, es el negativo e irá conectado a tierra (GND en la placa) a través de una resistencia. La patilla larga, o lado redondeado, es el positivo y se conectará al pin de la placa correspondiente.


Una vez montado, abriremos nuestro IDE Arduino y escribiremos el programa (sketch).
/*************/
/*  SEMAFORO */
/*************/
//** Definiciones **//
int rojo = 0;    //definimos el valor del pin para el led rojo
int amarillo = 4; //definimos el valor del pin para el led amarillo
int verde = 5;   //definimos el valor del pin para el led verde
//** Programa **//
void setup() {
 pinMode(verde, OUTPUT);  //declaramos el pin verde como salida
 pinMode(amarillo, OUTPUT); //declaramos el pin amarillo como salida
 pinMode(rojo, OUTPUT);   //declaramos el pin rojo como salida
}
void loop() {
 digitalWrite(verde, HIGH); //encendemos el led rojo
 delay(2000);             //esperamos 2 segundos
 digitalWrite(verde, LOW); //apagamos el led rojo
 delay(500);              //esperamos medio segundo
 digitalWrite(amarillo, HIGH); //encendemos el led amarillo
 delay(2000);                 //esperamos 2 segundos
 digitalWrite(amarillo, LOW); //apagamos el led amarillo
 delay(500);                  //esperamos medio segundo
 digitalWrite(rojo, HIGH); //encendemos el led verde
 delay(2000);              //esperamos 2 segundos
 digitalWrite(rojo, LOW); //apagamos el led verde
 delay(500);               //esperamos medio segundo
}

Con la sentencia int estamos declarando una variable numérica entera, para poderla usar después en nuestro código.

El comando delay hace que el programa pare un tiempo determinado. Éste lo definiremos, en milisegundos, dentro de los paréntesis.




ln - crear un enlace simbólico

Con ln -s creamos enlaces simbólicos a ficheros o directorios. Un enlace simbólico es un acceso a un fichero o directorio que se encuentra en otro sitio del disco sin copiar el fichero o directorio.

Para crear un enlace simbólico lo haremos de la siguiente forma:

ln -s ORIGEN DESTINO

Si por ejemplo tenemos el fichero /var/www/index.html y queremos crear un enlace simbólico en /home/web haremos lo siguiente

ln -s /var/www/index.html /home/web/index.html

Y con los directorios pasa lo mismo

ln -s /var/www/ /home/web/www

Se crearía un enlace simbólico al directorio /var/www en el directorio /home/web/

En la siguiente imagen se muestra un ls -l con dos directorios que son enlaces simbolicos:




Como vemos lock y run son enlaces simbólicos, lock apunta al directorio run/lock /, y para saber donde esta el directorio lock  realmente entramos dentro del directorio y ejecutamos el comando pwd veremos la ruta del enlace simbólico y si ejecutamos el comando pwd -P vemos la ruta real del directorio.

Se puede ver la ayuda del comando que tiene mas opciones

ln --help