medir-vibracion-con-arduino-y-sensor-sw-18020p

Medir vibración con Arduino y sensor SW-18020P

¿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.

arduino-vibracion-sw18020p-funcionamiento

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.

sw18020p

Esquema eléctrico

El esquema eléctrico que necesitamos es el siguiente.

arduino-vibracion-sw18020p-esquema

Esquema montaje

Mientras que el montaje en una protoboard sería el siguiente.

arduino-vibracion-sw18020p-montaje

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. github-full