Arduino: Sensor de inclinación (Ejercicio 04)

Los sensores de inclinación permiten detectar orientación o inclinación. Son pequeños, económicos, de bajo consumo y fáciles de usar.

Su simplicidad los hace populares para juguetes, artilugios y electrodomésticos. A veces se los conoce como "interruptores de mercurio", "interruptores de inclinación" o "sensores de bola rodante" por razones obvias. Están formados por una cavidad cilíndrica en general y una masa libre conductora en su interior, que puede ser una gota de mercurio o una bola rodante. Un extremo de la cavidad tiene dos elementos conductores (polos). Cuando el sensor está orientado de modo que ese extremo esté hacia abajo, la masa rueda sobre los polos y los conecta, actuando como un cambio de interruptor.

Este tipo de sensores solían fabricarse de mercurio, pero son ya escasos, ya que el mercurio extremadamente tóxicos. Lo ventajoso del mercurio es que es lo suficientemente denso como para que la bolita no rebote haciendo al interruptor insensible a las vibraciones.

Por otro lado, los sensores tipo bola son fáciles de fabricar, no se rompen y no presentan ningún riesgo de contaminación.

Aunque no son tan precisos ni flexibles como un acelerómetro completo, los interruptores de inclinación pueden detectar movimiento y orientación. Los acelerómetros, por otro lado, dan como salida un voltaje digital o analógico que luego debe procesarse en un circuito específico.

 

Lectura del estado del interruptor con un microcontrolador Arduino UNO

Montamos el sensor como se muestra en el esquema, con una resistencia de pull-up de 10kOhm. Alternativamente puede configurarse el pin de lectura digital como INPUT con el comando digitalWrite(inPin, HIGH); y de esta forma no hace falta la resistencia externa.

Y a continuación se muestra el código C++:

URL en el repositorio IoT-Arduino

/* Better Debouncer
 *
 * This debouncing circuit is more rugged, and will work with tilt switches!
 *
 *
 */

 
int inPin = 2;         // the number of the input pin
int outPin = 11;       // the number of the output pin
 
int LEDstate = HIGH;      // the current state of the output pin
int reading;           // the current reading from the input pin
int previous = LOW;    // the previous reading from the input pin
 
// the following variables are long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0;         // the last time the output pin was toggled
long debounce = 50;   // the debounce time (milliseconds), increase if the output flickers
 
void setup()
{
  pinMode(inPin, INPUT);
  /* Only if you miss the external pull-up resistor
  digitalWrite(inPin, HIGH);   // turn on the built in pull-up resistor
  */

  pinMode(outPin, OUTPUT);

  /* Debug
   *  */

   Serial.begin(9600);
}
 
void loop()
{
  int switchstate;
 
  reading = digitalRead(inPin);
 
  // If the switch changed, due to bounce or pressing...
  if (reading != previous) {
    // reset the debouncing timer
    time = millis();
  }
 
  if ((millis() - time) > debounce) {
     // whatever the switch is at, its been there for a long time
     // so lets settle on it!
     switchstate = reading;
 
     // Now invert the output on the pin13 LED
    if (switchstate == HIGH)
      LEDstate = LOW;
    else
      LEDstate = HIGH;
  }
  digitalWrite(outPin, LEDstate);
 
  // Save the last reading so we keep a running tally
  previous = reading;

  /* Debug
   */

  Serial.print("Previous reading= ");
  Serial.print(previous);
  Serial.print("\tPresent reading= ");
  Serial.print(reading);
  Serial.print("\tLED state= ");
  Serial.println(LEDstate);
  delay(200);
}