2.- DIGITAL: PULSADORES


 LOS PULSADORES

 TEORÍA:
0.- TEORÍA: LOS MICROPULSADORES. PULL-UP Y PULL-DOWN.
1.- UN LED CONTROLADO POR UN PULSADOR
2.- PULLUP Y PULLDOWN
3.- CONTADOR DE PRESIONADOS.


http://elcajondeardu.blogspot.com.es/2013/11/pulsador-introduccion-y-ejemplos.html

0.- TEORÍA: LOS MICROPULSADORES


Los micropulsadores tienen cuatro patillas que podemos conectar de distintas maneras, horizontalmente o en diagonal, pero si lo hacemos en vertical el pulsador no estaría operativo.

No  podemos conectar directamente el pulsador a una entrada digital y a un pin, porque cuando el pulsador está abierto, el pin estaría en estado denominado de alta impedancia, es decir ni 0v ni 5v (estaría en estado de indeterminación).. Tampoco podemos conectar el pulsador a un pin por un lado, a GND por otro y a 5V por la tercera patilla, porque al cerrar el pulsador conectaríamos directamente GND y 5V, provocando un cortocircuito.

Debido a todo esto, la forma correcta de conectar un actuador (bien  sea un pulsador, o un sensor) a nuestra placa de arduino es usando una resistencia intermedia, normalmente de 10kOhmios, que podremos conectar de dos formas:

a) PULL-UP. La resistencia directamente  a  5v y el pulsador/sensor a GND, conectando el PinDigital de entrada en la zona intermedia entre ambos. De esta forma, con el  interruptor abierto tendriamos 5v (HIGH) en el PIN y LOW al  cerrarlo. En este montaje se trabaja con LOGICA INVVERSA, es decir, al pulsar el  pulsador el pin le entra 0voltios mientras que sin ser pulsado le está correspondiendo directamente +5v IG)
b) PULL-DOWN. La resistencia directamente  a  0v y el pulsador/sensor a 5v , conectando el PinDigital de entrada en la zona intermedia entre ambos. De esta forma, con el  interruptor abierto tendriamos LOW en el PIN y HIGH al  cerrarlo.







1.- UN  PULSADOR PARA CONTROLAR UN LED.
En esta ocasión el led se iluminará sólo en el caso de que se accione un pulsador.


Ésta es la forma más sencilla control de entrada con sólo dos posibles estados: encendido o apagado. En este ejemplo se lee un simple switch o pulsador conectado a PIN5. Cuando el interruptor está cerrado el pin de entrada se lee ALTO y encenderá un LED colocado en el PIN13.



Un pulsador electrónico es un pequeño botón de 2 o 4 patillas que consigue que un circuito se abra o cierre al pulsarlo. Los más comunes son aquellos que cierran el circuito al ser pulsados y se les llama NA, normalmente abiertos. En los pulsadores de 4 patillas, estas se encuentran unidas por pares, aunque no estén todas activadas. Cuandos se pulsan, quedan todas las patillas unidas.


El siguiente esquema muestra el pulsador conectado directamente a +5V y la resistencia a GND esto se conoce como montaje PULL-DOWN


CODIGO:
int pinPulsador=5 ;     //pulsador en el pin5 o cualquier otro
int pinLed=13;             //led en el pin13
int pulsador=0;            //declaramos la variable con valor inicial de 0 a la entrada del pulsador

void setup() {
pinMode (pinPulsador, INPUT);  //configuramos el PINPULSADOR como  entrada
pinMode (pinLed, OUTPUT);          //configuramos  el PINLED como salida
}
void loop() {
pulsador=digitalRead(pinPulsador);
if (pulsador== HIGH) {
   digitalWrite(pinLed,HIGH);
}
else {
   digitalWrite(pinLed, LOW);
}
}


Como vemos, en este sketch, no sucede nada, salvo que apretemos el botón y cambiemos el estado del botón, y a su vez, el de la variable VALORPULSADOR .



OTRA FORMA DE CÓGIDO:
int led = 13;         // asigna a LED el valor 13 
int boton = 5;       // asigna a botón el valor 5
int valor = 0;        // define el valor y le asigna el  valor 0
void setup() {
   pinMode(led, OUTPUT);          // configura el led (pin13) como salida
    pinMode(boton, INPUT);       // configura botón (pin5) como entrada
}
void loop() {
     valor = digitalRead(boton);          //lee el estado de la entrada botón

     digitalWrite(led, valor);                // envía a la salida ´led´el  valor leído
 }




ACTIVIDADES:

1.- Encendido del LED con una sola pulsación. EL PULSADOR DE ENCLAVAMIENTO EN PULL-DOWN.

En los ejemplos anteriores siempre teníamos que tener el pulsador pulsado para tener el led encendido o apagado, Como no queremos tener que estar pulsando constantemente el botón para hace que se encienda el led, podemos recordar el estado del cambio.

De esta forma, cuando el botón presionado o  abierto haga un cambio y no solo  cuando se le presione, se encienda el led. A esto se le llama el ESTADO del botón. Cuando el estado cambia la acción ocurre.


#define pinPulsador 5
#define pinLed 13
int  estadoAnterior=0;
int  estadoNuevo;
int  estadoLed=LOW;

void setup( ) {
Serial.begin(9600);
pinMode(pinPulsador, INPUT);       //definimos como entrada el pin5 de arduino  

pinMode(pinLed,OUTPUT);               //definiemos como salida  el pin13 de arduino
}


void loop() {
   estadoNuevo=  digitalRead(pinPulsador);   // leemos el estado del pulsador
        if ((estadoAnterior==0) && (estadoNuevo==1)) {
        cambiarEstado();
        }
 estadoAnterior=estadoNuevo;  //actualizamos el estado del pulsador
 delay(10);                                                //una pequeña pausa  para dar  algo de tiempo
}

void cambiarEstado() {                 //función para cambiar el estado del led
    if (estadoLed==LOW) {       //si el led está  apagado lo encendemos
        digitalWrite(pinLed,HIGH);
        estadoLed=HIGH;           //ahora el estado del  led es de encendido
        Serial.println ("El Pulsador ha sido  presionado");
    }
   else {                                 //si el led está encendidolo apagamos
        digitalWrite(pinLed, LOW);
        estadoLed=LOW;         //ahora el estado del led es de apagado
   }
}





PULL-UP   vs PULL-DOWN.
Para comprender mejor el por que de utilizar un montaje pull-up o pull-down a la hora de conectar un pulsador o sensor  como entrada en digital o analógica en nuestra placa de arduino. amos a hacer un montaje donde pondríamos por ejemplo el PIN2 concectado a una R=100 ohmios y después con el común de un "interruptor conmunador" donde un conmutación NormalmenteAbierta conecte con los +5V de arduino y la otra conmutacion con 0V de arduino. Y visualizaremos el resultado en el monitor serie de arduino.

int swPin=2;
void setup()
{
Serial.begin(9600);
pinMode(swPin, INPUT);    //definimos como entrada el pin2 de arduino 
}
void loop()
{
Serial.println("lectura SW entrada");
Serial.println(digitalRead(swPin));          //lee y representa el varlor de swPin como 0 o 1.
delay(500);
}


También podíamos haber escrito el siguiente código donde hacemos uso de una variable donde vamos guardando el valor de la señal digital del pin2.

int swPin=2;
void setup()
{
serial.begin(9600);
pinMode(swPin, INPUT);       //definimos como entrada el pin2 de arduino 
}
void loop()
{
serial.Println("lectura SW entrada");
var=digitalRead(swPin);
serital.Println(var);              //lee y representa el varlor de swPin como 0 o 1.
delay
}




Inconvenientes de este tipo de montajes:

  1. El conmutador es más caro que un simple pulsador.
  2. Que le entre al pin directamente 5v. Podemos equivocarnos y hacer un cortocircuito si metemos +5V en un pin que le hemos asignado como INPUT.  Si hicieramos esto, romperíamos el microcontrolador. Por eso hay que poner siempre resistencias de protección  que actue como un Buffer (tope).
  3. FLOATING INPUT. Cuando hacemos uso  de un  conmutador, puede ocurrir en la entrada del pin2 tres posibles casos (5voltios, 0v. o FLOATING INPUT).

Que en la conmutación entre uno y el otro se quede enmedio y no le entre nada. Este se conoce como voltaje de entrada flotante o en estado de alta impedancia. Es un estado lógico indeterminado (ni ON, ni OFF) y ocasiona errores e la lectua del código por ser una entrada no válida puesto que en ordenador  se memorizará el último valor registrado pero no  representará el cambio.

Si  queremos usar un simple  barato pulsador tendremos que hacer el siguiente tipo de montaje que evite el  FLOATING INPUT con dos tipos de montajes:

a) PULL-DOWN. (es como decir que tira a tierra el pin2)





b) PULL-UP. (es como decir que sube a +5v el pin6)








ACTIVIDADES:
1.- Realiza un montaje pull-down donde un led parpadee 5 veces cuando se pulse un  pulsador. 

2.- Realiza un montaje con un LED y un PULSADOR que haga que encienda el led al pulsar y se apague transcurridos 5 segundos, parpadeando antes en dos ocasiones.





3.- CONTADOR DE PRESIONADOS.

Ahora vamos a contar las veces que se presiona un pulsador con siguiente código:


int swPin=2;
int val;
int botonEstado;
int botonPresiones;

void setup()
{
Serial.begin(9600);
pinMode(swPin, INPUT);       //definimos como entrada el pin2 de arduino  
botonEstado=digitalRead(swPin);     //lee el valor inicial
}

void loop()

      val=digitalRead(swPin);
      if (val !=botonEstado)  //si cambia de estado
      {
              if (val==LOW)
             {
             botonPresiones++;
             Serial.println("El botón ha sido presionado");
             Serial.println(botonPresiones);
            Serial.println("veces");
            }
      }
     botonEstado=val; //conserva como nuevo el estado
}




ACTIVIDADES:

1.- Prueba ahora tú con las siguientes modificaciones:

a) Con el botón no presionado.
b) Que cuente hacia atras desde 10 y acabe con poner "explosión".
c) Varios ledes que se enciendan cada uno a cada pulsación.

 Y por último este otro código más completo para detectar el cambio de estado:

int swPin=2;
int estadoActual;
int estadoAnterior;
int contador;

void setup()
{
serial.begin(9600);
pinMode(swPin, INPUT);       //definimos como entrada el pin2 de arduino  

}

void loop()

      estadoActual=digitalRead(swPin);
      if (estadoAnterior !=estadoActual)  //si cambia de estado
      {
             contador++; //cuenta los cambios pares
             int validarPar=contador%2; //solo  cambios pares
             if (validarPar !=1)  //solo para cuanod haya cambios pares
              {
             serial.Println("El botón ha sido presionado");
             serial.Println(contador);
            serial.Println("veces");
            }
      }
}


... si queremos que se ejecute sólo cuando se pulse (por primera vez, es decir, en valores impares) entonces cambiariamos el if(validarPar==1).