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
}
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
}
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:
- El conmutador es más caro que un simple pulsador.
- 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).
- 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).