¿Que es un sensor de vibración?
Un sensor de vibración es un dispositivo que reacciona ante movimientos bruscos, golpes, o vibraciones, pero no a movimientos constantes o progresivos. En el caso de detectar una vibración genera una señal digital, que cesa al finalizar la vibración.
El principio de funcionamiento es muy sencillo. El dispositivo dispone de un cilindro, con dos contactos. Uno de los contactos está unido a una varilla metálica ubicada en el centro del cilindro. A su alrededor, el otro contacto se arrolla a su alrededor en forma de muelle.
En caso de una vibración, el muelle se deforma por efecto de la inercia, estableciendo contacto en varios puntos con el contacto fijo. De esta forma, se establece una conexión eléctrica entra ambos contactos, que puede ser leída con un microprocesador, como si fuera un pulsador, como vimos en entradas digitales en Arduino.
Precio
Los sensores de vibración SW-18020P son dispositivos baratos. Podemos encontrar 10 sensores de vibración por 1€ en vendedores internacionales en Ebay o AliExpress.
Esquema eléctrico
El esquema eléctrico que necesitamos es el siguiente.
Esquema montaje
Mientras que el montaje en una protoboard sería el siguiente.
Ejemplo de código
A continuación tenemos un ejemplo de código para realizar la lectura del sensor. Leemos el estado del sensor mediante la entrada digital, usando la resistencia internar de Pull Up. Por otro lado, empleamos el valor shakeTime y la variable estado previo para controlar el cambio de estado, y así detectar la vibración.
const int sensorPin = 2;
const int ledPin = 13;
int tiltSensorPreviousValue = 0;
int tiltSensorCurrentValue = 0;
long lastTimeMoved = 0;
int shakeTime = 50;
void setup() {
pinMode(sensorPin, INPUT);
digitalWrite(sensorPin, HIGH); //activamos la resistencia interna PULL UP
pinMode(ledPin, OUTPUT);
}
void loop() {
tiltSensorCurrentValue = digitalRead(sensorPin);
if (tiltSensorPreviousValue != tiltSensorCurrentValue) {
lastTimeMoved = millis();
tiltSensorPreviousValue = tiltSensorCurrentValue;
}
if (millis() - lastTimeMoved < shakeTime) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
}
Descarga el código
Todo el código de esta entrada está disponible para su descarga en Github.