Learning   Examples | Foundations | Hacking | Links

Lee dos interruptores con un solo pin de E/S

El chip ATmega, en el cual esta basado el Arduino, posee resistencias internas de 20k que pueden ser muy útiles(resistencias conectadas internamente entre las E/S de Arduino y VCC - +5 voltios). Estas resistencias son accesibles a través del software usando la función digitalWrite(), cuando se configura el pin como una entrada.

Este programa aprovecha las resistencias de pullup utilizando el software. La idea es que conectando una resistencia de 200K entre el pin de entrada y masa hará que cuando la resistencia interna (20K) este desactivada, la entrada detecte nivel bajo en la entrada. Sin embargo cuando se active la resistencia interna de pullup (20k) esta, governara sobre la de 200k y por tanto se leerá en la entrada un nivel alto.

Lo único malo del esquema (¿Siempre tiene que haber algo malo no?) es que no podemos saber si se ambos botones se pulsan a al vez. En este caso solo se detecta que el interruptor dos ha sido pulsado. La función de la resistencia de 10K que se pone en serie es evitar cortocircuitos si un usuario pulsa ambos botones a la vez. Puede ser omitida si usamos un interruptor de palanca en el cual tiene un punto central de apagado y que excluye de forma manual que ambos estén conectados a la vez.


/*
 * Lee_Dos_Interruptores_En_Un_Pin
 * Lee dos pulsadores o un interruptor de palanca usando un solo pin de Arduino.

 * Paul Badger 2008 
 * A partir de una idea en EDN (Electronic Design News)
 *
 * Aprovecha la resistencias de pullup que poseen cada una de las E/S y los pines analógicos.
 * La idea es que la resistencia de 200k que se conecta a masa hará que si la resistencia de pullup
 * (20K) está apagada, se detectará nivel bajo en la entrada (0V) pero cuando la resistencia de pullup esté, 
 * activada la resistencia de 20K prevaleserá sobre la de 200K y el pin detectará un nivel alto.
 *
 * Esquemático    ( No puedo creer que haya dibujado este esqumático funky en ASCII )     
 *
 *
 *                             +5 V
 *                                |
 *                                \
 *                                /   
 *                                \    10K
 *                                /
 *                                \
 *                                |
 *                               /    interruptor 1  o 1/2 del interruptor de palanca
 *                              /       
 *                                |
 *            pin digital ________+_____________/\/\/\____________   masa              
 *                                |               
 *                                |               200K a 1M  (no es crítica)
 *                               /   
 *                              /        interruptor 2  o 1/2 del interruptor de palanca
 *                                |
 *                                |
 *                              _____   
 *                               ___     masa
 *                                _
 *
 */


#define swPin 2                 // pin de entrad, sin punto y coma después del #define
int stateA, stateB;             // variable para almacenar el valor de los pines
int sw1, sw2;                   // variables para representar el estado de los pinse

void setup()                   
{
   Serial.begin(9600);
}

void loop()            
{
   digitalWrite(swPin, LOW);                   // asegurate de que las resistencias de pullup están desactivadas
   stateA = digitalRead(swPin);
   digitalWrite(swPin, HIGH);                  // activa las resistencias de pullup
   stateB = digitalRead(swPin);

   if ( stateA == 1 && stateB == 1 ){          // ambos estados a nivel alto,el interruptor 1 se ha pulsado
      sw1 = 1;
      sw2 = 0;
   }
   else if ( stateA == 0 && stateB == 0 ){     // ambos estados a nivel bajo,el interruptor 2 se ha pulsado
      sw1 = 0;
      sw2 = 1;
   }
   else{                                       // stateA a nivel bajo y stateB a nivel bajo 
      sw1 = 0;                                 // no se han pulsado interruptores o el de palanca está en el centro

      sw2 = 0;
   }  

   Serial.print(sw1);
   Serial.print("    ");     // Algunos espacios para darle formato al texto en pantalla
   Serial.println(sw2);

   delay(100);  
}


Share