miércoles, 4 de septiembre de 2013

El pulsador (2)



Ahora que ya sabemos qué es un pulsador y cómo se usa, vamos a buscarle utilidad para nuestro Arduino.

Vamos a enseñar a nuestro Arduino a hacer una acción cuando se presiona un botón. Sería el ejemplo más simple de lo que nuevo será la operativa para que nuestro futuro robot actúe de forma autónoma. Cuando reciba una señal (en nuestro ejemplo la presión del botón, pero podría ser una vibración, un ruido, ...) nuestro robot ejecutará una acción (en nuestro caso el encendido de un LED, pero puede ser la activación de un sistema de vigilancia, el envío de un mensaje, la emisión de una alarma acuística, etc.).

Para esta práctica necesitaremos

Qué
Imagen
Coste estimado


Placa Arduino
 


24 €


  
Placa de prototipado


5-6€



Adaptador de red
  

6€


LED naranja
  

0,1€
  

Resistencias 


0,1€


Pulsador 


0,2€
  
Cablecitos
  
2€


Ahora, ayudándonos de Fritzing para nuestro prototipo, vamos a desarrollar nuestro proyecto


cuyo esquema sería



donde para calcular la resistencia de protección de nuestro LED hemos usado lo que aprendimos en Cálculo de la resistencia para un led, y hemos propuesto una de 220 ohms.

y le cargamos este pequeño Sketch que hemos preparado

/*
 Práctica con el pulsador_1
 Basado en un sketch de DojoDave y Tom Igoe
 
 Enciende y apaga un LED conectado al pin digital 13,
 cuando se presiona el pulsador unido al pin 2
 
 El circuito se coompone de:
 * un LED  unido desde el pin 13 a tierra 
 * un pulsador unido a pin con +5 voltios
 
 adaptado en 2013
 M. Domínguez
 
 Basado en el ejemplo de dominio público
 
 http://www.arduino.cc/en/Tutorial/Button
 */

// Bloque de definición de constantes que usaremos en nuestro sketch
// Define la asignación de los pines a usar
const int pulsadorPin = 2;    // El número del pin asociado al pulsador
const int ledPin =  13;      // El número del pin asociado al LED

// Bloque de declaración de las variables que usaremos
int pulsadorEstado= 0;   // Es la variable que registrará el estado del pulsador

// Bloque de configuración 
// Definimos qué pines vamos a usar
// y si lo usaremos como entradas o como salida de datos

void setup() {
  // Inicializamos el pin del LED y lo definimos del tipo Salida:
  pinMode(ledPin, OUTPUT);      
  // Inicializamos el pin del pulsador y lo definimos del tipo Entrada:
  pinMode(pulsadorPin, INPUT);     
}

// Bloque de definición del programa a ejecutarse 

void loop(){
  // lee el valor del estado del pulsador:
  pulsadorEstado = digitalRead(pulsadorPin);

  // verifica si el pulsador está presionado
  // si es así, el estado del pulsador es Alto:
  // y enciende el LED

  if (pulsadorEstado == HIGH) {     
    // enciende el LED   
    digitalWrite(ledPin, HIGH);  
  } 
  // si no lo es, el estado del pulsador es Bajo:
  // y apaga el LED
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW); 
  }
}


Con lo que obtenemos un resultado como éste



Si nos fijamos parece que funciona, pero si nos fijamos con más detenimiento, vemos no va demasiado fino.
Cuando pulsamos el botón (o pulsador), el LED se enciende, pero cuando dejamos de pulsarlo, se mantiene encendido durante un instante, y éste no es el comportamiento que queríamos reproducir. Nuestro robot ejcutará una acción (por ejemplo activar un sistema anti-incendios) mientras se de una condición concreta (en nuestro caso, alguien presionando una botón), pero una vez que esa situación se finaliza, queremos que desactive el sistema que haya activado (en nuestro caso nuestro LED). ¿Por qué sucede ésto?

Si recordamos lo que vimos en la entrada Resistencias Pull-Up - Pull-Down, la tensión que ejercemos sobre el pin 2 de nuestro Arduino, es como el empujón que damos para abrir una puerta, si no implementamos en la puerta un mecanismos de autocierre, puede que se quede abierta durante un tiempo e incluso que se cierre y se abra debido a pequeñas perturbaciones (lo que en electrónica se llama ruido). Para ello si queremos que nuestro pin note que hemos dejado de presionar el botón tenemos que implementar nuestro pequeño resorte para cerrar "nuestra puerta". Y esto lo hacíamos conectandole una resistencia de 10K a tierra. De este modo, una vez que el pulsador deja de actuar, y los 5 voltios no llegan al pin 2, la carga que quede en ese pin, fluirá hacia la tierra a través de la resistencia de pull-down.



Para ello tendremos que modificar nuestro prototipo como sigue:


cuyo esquema sería


Y ahora sí funcionaría como queremos.

Pero ¿cómo lo hacemos si lo que queremos es justo el comportamiento contrario? Queremos que nuestro Arduino mantenga activado el sistema de iluminación de nuestro edificio (en nuestro caso, representado por el LED) a menos que se dispare una señal de emergencia, como puede ser un detector de terremotos (en nuestro caso representado por el pulsador)?.

Pues en ese caso, si pensamos de nuevo en la analogía de la puerta, lo que queremos es siempre que la puerta esté abierta, osea que querríamos que siempre hubiera 5 voltios en la entrada del pin 2 a menos que algo mande una señal contraria. Es lo que viene ser una resistencia de Pull-up


siendo su prototipo como sigue




y su comportamiento lo podemos ver más claramente en este vídeo



En resumen:
Este ejemplo enciende el LED asociado al pin 13 cuando pulsas el botón asociado al pin 2.

Con resistencia Pull-down:
Cuando el pulsador está abierto (sin pulsar) no hay conexión entre las dos patas del pulsador, de forma que el pin está conectado a tierra (a través de la resistencia pull-down) y leemos un LOW (bajo ó 0). Cuando el botón se cierra (pulsado), se establece la unión entre sus dos extremos, conectando el pin a 5 voltios, por lo que leemos un HIGH (alto ó 1).


Con resistencia Pull-up:
Cuando cableamos el circuito en sentido contrario, con una resistencia "pull-up" que mantiene la entrada del pin 2 en HIGH, ésta pasa  LOW cuando se pulsa el botón. Así, el comportamiento del programa (sketch) se invertie, con el LED normalmente encendido y apagado cuando se pulsa el botón.

Si resistencias pull-down o pull-up:

Si se desconectas el pin digital de E/S del todo, el LED puede llegar a parpadear de forma errática. Esto se debe a la entrada es "flotante", es decir, al azar se tornará en HIGH o LOW. Y este efecto se puede ver si esperas un poco o usas un LED de tensión baja y que lo haga muy sensible a las señales generadas por el ruido. Por eso se necesita la resistencia pull-up o pull-down estos tipos de circuitos. De otro modo nuestro futuro robot, podría malinterpretar el ruido como señales de disparo, y actuar cuando debería no hacerlo.




es → en
pulsadorPin
es → en
in
preposición: in, on, at, into, to, for, by, about

No hay comentarios:

Publicar un comentario