El pulsador

Veremos la forma de montar un circuito en el que al pulsar un pulsador encenderemos un led.

Objetivos

  • Conocer las entradas digitales.
  • Leer el primer pulsador.
  • Presentar los valores booleanos.
  • El operador: Negación.

Material requerido

cropped-arduino-1.jpg
  • Arduino Uno o similar.
  • Un PC con el entorno de Arduino correctamente instalado y configurado.
Img_3_4
  •  Una Protoboard.
RedLed_
  • Un diodo LED.
pulsador
  • Un pulsador
Img_3_5
  • Una resistencia de 330 Ohmios.
resistencia10K
  • Una resistencia de 10K.
Img_3_6-300x185
  • Algunos cables de Protoboard.
 El montaje del pulsador, resistencias de Pull-Down o Pull-Up.
Necesitaremos de las resistencias de Pull Down y Pull Up. Estas dos resistencias son un mecanismo básico, muy habitual dentro del mundo de la electrónica y automatización.
Las resistencias de Pull-Down y Pull-Up se conectan entre el PIN digital y una de las tensiones de referencia (0V o 5V) y «fuerzan» (de ahí su nombre) el valor de la tensión a LOW o HIGH, respectivamente.
  • La resistencia de Pull-Up fuerza HIGH cuando el pulsador está abierto. Cuando está cerrado el PIN se pone a LOW, la intensidad que circula se ve limitada por esta resistencia.
  • La resistencia de Pull-Down fuerza LOW cuando el pulsador está abierto. Cuando está cerrado el PIN se pone a HIGH, y la intensidad que circula se ve limitada por esta resistencia

Así es como quedaría el montaje final en vista esquemática (la conexión de puede realizar en empleando cualquiera de los PIN digital).

02_basica_pulsador

¿Qué valor de resistencia elegir?

Para el caso de Arduino y valores de tensión entre 0 a 5V, valores típicos de resistencias de Pull Down y Pull Up son 4k7, y 10k, que suponen un consumo de 1mA y 0,5mA respectivamente cuando el pulsador está accionado.

El circuito

Montaremos un circuito con un diodo LED y resistencia conectado al pin digital 13 de Arduino,  y ademas un segundo circuuito con un pulsador conectado al pin 2 con una resitencia como se muestra en el esquema siguiente:

03_Button_enciende_led

Observar que mientras no pulsemos el pulsador el pin 2 de Arduino está conectado a 0V a través de la resistencia (4k7) forzando una lectura de tensión baja (LOW). En cambio cuando pulsemos el pulsador cerraremos el circuito del pin 2 a 5V con lo que leerá tensión alta, HIGT. En ambos casos tenemos un valor de tensión definido.

Si no pusiéramos la resistencia del pulsador, al pulsar sobre el pulsador leeríamos correctamente HIGH en el pin 2. Pero al dejar de pulsarlo el pin 2 estaría en un estado flotante, que es ni HIGH ni es LOW sino indeterminado. Esto es inaceptable en circuitos digitales.

A esta resistencia que fuerza el valor alto en vacio se le conoce como pullup Si la conectáramos a masa para forzar una lectura a Ground se le llamaría pulldown resistor.

  • Esta resistencia es clave para que las lecturas del pulsador sean consistentes. El circuito, simplemente, no funcionará bien si se omite.

El programa

Empecemos haciendo un programa que haga que el LED se encienda cuando pulsamos el botón y se apague cuando lo soltamos. Para ello pediremos a Arduino que configure el pin digital 13 como salida para manejar el LED, y el pin digital 2 como entrada para leer el botón.

Normalmente en programas sencillos basta con poner el número de pin en las instrucciones. Pero a medida que el programa se complica esto tiende a provocar errores difíciles de detectar.

Por eso es costumbre definir variables con los números de pin que usamos, de forma que podamos modificarlos tocando en un solo lugar (y no teniendo que buscar a lo largo del programa). Vamos a escribir esto un poco más elegantemente:

int led = 13 ;
int boton = 2;

void setup()
{

pinMode( led, OUTPUT) ; // LED como salida
pinMode( boton , INPUT) ; //botón como entrada

}

Atención: C++ diferencia entre mayúsculas y minúsculas y por tanto LED, Led y led no son lo mismo en absoluto. Del mismo modo, pinMode es correcto y en cambio pinmode generará un error de compilador fulminante.

He usado la variable boton sin acento porque no es recomendable usarlos ni la ñ en los nombres de variables, porque pueden pasar cosas extrañas.

Vimos que para encender el LED bastaba usar digitalWrite( led, HIGH). Para leer un botón se puede hacer algo similar: digitalRead( boton). Veamos cómo podría ser nuestro loop:

void loop()
{

// leemos el valor de boton en valor

int valor = digitalRead(boton) ; 
digitalWrite( LED, valor) ;

}

  • int digitalRead(): Lee o captura el valor de entrada del pin especificado, dará valores HIGH o LOW. Devuelve un valor de tipo entero HIGH(1) o LOW (0).

¿Cómo podríamos hacer lo contrario, que el LED este encendido y al pulsar se apague ? Bastaría con escribir en led lo contrario de lo que leamos en el botón.

Existe un operador que hace eso exactamente el operador negación » ! « . Si una valor dado x es HIGH, entonces !x es LOW y viceversa.

Un operador es un símbolo que relaciona varios valores entre sí, o que modifica el valor de una variable de un modo previsible.

Ejemplos de operadores en C++ son los matemáticos como:

  • + para la suma.
  • – para la resta
  • * multiplicación
  •  / división
  • y hay otros como la negación ! o el cambio de signo de una variable : – x.

De hecho este tipo de operaciones son tan frecuentes que C++ incorpora un tipo llamado bool o booleano que solo acepta dos valores TRUE (cierto) y FALSE y son completamente equivalentes al 1 / 0, y al HIGH / LOW.

Este nuevo programa sería algo así:

void loop()
{

int valor = digitalRead(boton) ; // leemos el valor de botón
digitalWrite( LED, !valor) ; //Escribimos valor en LED

}

 

De hecho podríamos escribir una variante curiosa del blinking LED usando el operador negación:

void loop()
{

bool valor = digitalRead (led) ;
digitalWrite( led, !valor) ;
delay ( 1000) ;

}

Podemos leer la situación actual de un pin (nos devuelve su estado actual), aún cuando lo hayamos definido como salida, En cambio no podemos escribir en un pin definido como entrada.

La primera linea lee la situación del led y la invierte en la segunda línea, después escribe esto en led. Podemos escribir el blinking led en solo dos líneas:

void loop()
{

digitalWrite( LED , ! digitalRead( LED)) ;
delay ( 1000) ;

}

Las instrucciones dentro de los paréntesis se ejecutan antes que las que están fuera de ellos. Por eso el digitalRead se ejecuta antes que el digitaWrite().