Si desea detectar cuándo algo se mueve, inclina o sacude sin entrar en las complejidades de un acelerómetro , el sensor de inclinación de bola podría ser la opción más económica.

Descripción general

Un sensor de inclinación de bola es un interruptor que puede detectar movimiento básico, orientación o inclinación. Estos interruptores están diseñados de tal manera que un nivel inclinación predeterminado interrumpa la conexión eléctrica. Dicha señal se puede usar como indicador o se puede usar para encender o apagar algo.

Son pequeños, baratos, fáciles de usar y nunca se desgastan. Su simplicidad los hace populares para su uso en juguetes, aparatos, robots y otros dispositivos cuyo funcionamiento depende de la inclinación. Por eso a veces se les llama el “acelerómetro del pobre”.

Aunque todos los sensores de inclinación funcionan prácticamente igual, sus tamaños y especificaciones pueden diferir ligeramente.

Dimensiones5,5 mm (0,22″) de diámetro y 13,5 mm (0,53″) de largo
Tensión máxima de funcionamiento (VCC)Hasta 20V
Corriente máxima de funcionamiento (Imax)30mA
Rango de sensibilidadMovimientos de alrededor de 5 a 10 grados
Duración50,000+ ciclos (interruciones)

Sensor de inclinación frente a un acelerómetro

Si bien no es tan preciso ni flexible como un acelerómetro, el sensor de inclinación puede detectar bastante bien el movimiento o la orientación. Otra ventaja de usar un sensor de inclinación es que se puede usar como un sensor independiente. El acelerómetro, por otro lado, emite un voltaje digital o analógico que debe analizarse con circuitos adicionales.

¿Cómo funcionan los sensores de inclinación?

Un sensor de inclinación de bola generalmente se compone de un tubo de metal con una pequeña bola de metal que rueda en su interior. Un extremo de la cavidad tiene dos elementos conductores (polos). El sensor está diseñado de tal manera que un nivel de inclinación permite que la pelota ruede, permitiendo o interrumpiendo una conexión eléctrica.

Cuando el sensor está en posición vertical, la pelota toca los postes y hace una conexión eléctrica. Y cuando se inclina el sensor, la bola rueda fuera de los postes y la conexión se abre.

Prueba de un sensor de inclinación

Probar un sensor de inclinación de bola es muy simple. Utiliza tu multímetro en modo de “prueba de continuidad” y toca las sondas en los dos cables. Luego inclínalo para determinar el ángulo en el que el interruptor se abre y se cierra. Cuando apunta hacia arriba, el interruptor está cerrado (continuidad total).

Cuando apunta hacia abajo, el interruptor está abierto (sin continuidad).

Conexión de un sensor de inclinación a un Arduino

Conectar el sensor de inclinación a tu Arduino es bastante sencillo. Todo lo que necesita hacer es conectar un pin a cualquier pin digital del Arduino y el otro a GND.

Si conecta el sensor de esta manera, deberá activar la resistencia pull-up ‘incorporada’ de arduino para el pin de entrada. De lo contrario, debe usar una resistencia pull-up externa de 10K en tu circuito.

La siguiente ilustración muestra el cableado.

Código Arduino: lectura de un sensor de inclinación

A continuación, se muestra un sketch muy básico de Arduino que encenderá el LED incorporado (pin 13) cuando el sensor de inclinación se incline hacia un lado y se apagará cuando se incline hacia el otro lado.

const int tiltPin = 2;		// un pin del sensor de inclinación se conecta al pin 2 
const int ledPin = 13;		// built-in LED es conectado al pin 13

void setup() {
 pinMode(tiltPin, INPUT);      // configura el sensor pin como un pin de entrada 
 digitalWrite(tiltPin, HIGH);	// Enciende la resistencia pull-up incorporada
 pinMode(ledPin, OUTPUT);      // ajusta el pin led como un pin de salida
}

void loop() {
 if (digitalRead(tiltPin)) { // revisa si el pin del sensor esta en estado alto
     digitalWrite(ledPin, HIGH);	// Enciende el led
 }
 else { 
 		digitalWrite(ledPin, LOW);	// revisa si el pin del sensor está en estado bajo
 }
}

El código es bastante autoexplicativo. Inicialmente, se definen dos constantes que declaran los pines de Arduino a los que se conectan el sensor de inclinación y el LED incorporado. En la configuración, el pin del sensor se configura como una entrada mientras que el pin del LED se configura como una salida. También se habilita el pull-up interno para el pin del sensor. En el bucle, el LED incorporado se enciende si el pin del sensor está en ALTO, de lo contrario se apaga.

Es un boceto bastante corto, funciona muy bien, pero hay un problema. Si miró el LED mientras inclinaba el sensor, es posible que haya notado que parpadea. Eso es porque algo llamado ‘ cambio de rebote ‘.

¿Qué es el rebote del interruptor y cómo lidiar con él?

Cuando el sensor está apuntando hacia arriba, la bola rueda hacia los postes y los corta. En un mundo ideal, si conectamos esto a un analizador de señales, deberíamos obtener una señal que se vería así:

Esa es la forma en que debería funcionar un sensor de inclinación de la bola y eso es lo que piensa la mayoría de la gente. Sin embargo, en realidad se parece más a esto:

Lo ideal es que el contacto sea instantáneo. En cambio, la pelota rebota un poco, haciendo que el contacto se abra, se cierre, se abra, se cierre, etc. Es un fenómeno puramente mecánico conocido como ‘Switch Bounce ‘ o rebote, como dejar caer una pelota, esta rebota antes de aterrizar finalmente en el suelo.

Entonces, la señal sube y baja varias veces antes de estabilizarse. Lo hace durante un período de tiempo (t). Si bien este período de tiempo es muy rápido y nos parece casi instantáneo, para un Arduino es un período de tiempo enorme ya que el Arduino puede ejecutar múltiples instrucciones en ese período de tiempo.

El proceso de eliminar los rebotes del interruptor se llama ‘Antirrebote ‘ y se puede lograr mediante programación. Por lo general, el rebote del interruptor ocurre dentro de una ventana de 50 ms. Por lo tanto, un retraso de 50 ms después de que se detecte un cambio de interruptor es suficiente para eliminarlo.

Código Arduino: lectura de un sensor de inclinación (más confiable)

Aquí hay un nuevo sketch reescrito para demostrar cómo eliminar el rebote de una entrada. En este sketch, leemos el sensor de inclinación dos veces en un período corto de tiempo para asegurarnos de que esté definitivamente inclinado.

Adelante, cargalo a tu Arduino. Ahora puedes ver que el LED ya no parpadea cuando inclina el sensor (si el problema persiste, intente aumentar el tiempo de rebote).

const int tiltPin = 2;		// tilt sensor pin is connected to pin 2
const int ledPin = 13;		// built-in LED is connected to pin 13

int ledState = HIGH;		// the current state of the LED
int tiltState;				// the current reading from the sensor
int lastTiltState = LOW;	// the previous reading from the sensor

unsigned long time = 0;		// the last time the output pin was toggled
unsigned long debounceDelay = 50;	// the debounce time, increase if the output flickers

void setup() {
	pinMode(tiltPin, INPUT);		// Set sensor pin as an INPUT pin
	digitalWrite(tiltPin, HIGH);	// turn on the built in pull-up resistor
	pinMode(ledPin, OUTPUT);		// Set LED pin as an OUTPUT pin
}

void loop() {
	// read the state of the tilt sensor
	tiltState = digitalRead(tiltPin);

	// If the sensor really tilted?
	if (tiltState != lastTiltState) {
		// reset the debouncing timer
		time = millis();
	}

	if ((millis() - time) > debounceDelay) {
		// whatever the switch is at, its been there for a long time
		// so lets settle on it!
		ledState = tiltState;
	}
	digitalWrite(ledPin, ledState);

	// Save the last tiltState so we keep a running tally
	lastTiltState = tiltState;
}

Explicación del código:

El sketch comienza declarando los pines de Arduino a los que están conectados el sensor de inclinación y el LED incorporado.

const int tiltPin = 2;
const int ledPin = 13;

Tres números enteros ledStatetiltStatey lastTiltStatese se definen para almacenar el estado actual del LED, la lectura actual del sensor y la lectura anterior del sensor resp.

int ledState = HIGH;
int tiltState;
int lastTiltState = LOW;

En esa misma área global, se definen dos variables para almacenar el último evento de inclinación y el tiempo de rebote. Ten en cuenta que estas variables son del tipo long sin signo porque el tiempo (medido en milisegundos) se convierte rápidamente en un número muy grande y más de lo que se puede almacenar en un número entero.

unsigned long time = 0;
unsigned long debounceDelay = 50;

La sección setup() es la misma que antes, donde configuramos el pin del sensor como entrada y el pin del LED como salida; y se habilita el pull-up interno para el pin del sensor.

void setup() {
	pinMode(tiltPin, INPUT);
	digitalWrite(tiltPin, HIGH);
	pinMode(ledPin, OUTPUT);
}

En la función loop(), primero leemos el estado del sensor de inclinación y verificamos si este estado es diferente del último estado de inclinación (ya sea debido a la inclinación o al ruido). Si es diferente, registramos este evento de cambio de estado almacenando el tiempo actual. Para este propósito, usamos la función millis() que realiza un seguimiento del tiempo transcurrido desde que la placa Arduino comenzó a ejecutar el programa actual.

tiltState = digitalRead(tiltPin);

if (tiltState != lastTiltState) {
	time = millis();
}

A continuación, vemos si el sensor cambia su estado dentro de una ventana de 50 ms (debounceDelay), si no lo hace, significa que el sensor está realmente inclinado (y no debido al rebote del interruptor). Luego cambiamos el LED y guardamos el último estado de inclinación para que podamos mantener un conteo continuo.

if ((millis() - time) > debounceDelay) {
	ledState = tiltState;
}
digitalWrite(ledPin, ledState);

lastTiltState = tiltState;

traducido desde: In-Depth: Interfacing Ball Tilt Switch Sensor with Arduino (lastminuteengineers.com)