Electronic – Arduino piezo vibration measurement circuit


I'm looking for a very simple measurement circuit to measure vibrations with a piezo elment and an arduino device. I want to read positive and negative values.

I have this sensor: http://www.seeedstudio.com/wiki/Grove_-_Piezo_Vibration_Sensor

I know that this sensor module only gives me digital output. But I want to measure the vibration amplitudes and the frequency. So I would use just the piezo element.

I found a lot examples, from very simple to high accurate. But most of them cutting of the negative values. E.G. http://www.learningaboutelectronics.com/Articles/Piezo-knock-sensor-circuit.php

And in the example above, there is no protection for the arduino. I also found statements, that the arduino needs no protection reading a piezo sensor at analog pin, because of the low current. And the analog pins are protected against higher voltages.

I want just a simple circuit to read negative and positive values from that piezo element. My arduino device use 3.3V input voltage. The piezo sensor can have in extrem up to 70-90V.

What is the minimum configuration to set up such a measurement circuit? I don't need highest accuracy. It should be as easy as possible. It is just for test purpuses. I think I have to use an voltage divider with two equal high resistences to set a DC offset for measuring the negativ values. But what else do I need for a minimal working example?

Best Answer

Using almost any article posted on the Internet, about sensing a piezo sensor digitally will provide the frequency of the vibration. This has the huge advantage that a digital pin can be sensed about 1000 times faster than the ADC.

A problem with using the ADC to sample the actual signal is the Arduino ADC is so slow that the the samples my suffer aliasing (the signal is sampled below the Nyquist-Shannon criteria), and give very unreliable information.

The signal voltage from the piezo sensor will oscillate about zero. That will be detected by a digital sample, recovering the frequency.

Protect the MCU's pins using a resistor and diode, connecting the signal to the pin via the resistor to the MCU pin, and to ground via the diode. I'd probably use a Schottky diode to stop the signal going much below ground.

Further, protect the input from the potentially very high voltages with a zener diode (3.3V for a 3.3V MCU, 5V/5.1V for a 5V MCU) also tied to ground, so that the signal can't rise above the Arduino pin's operating range.

While it might be okay to rely on the ESD protection diodes, relying on the ESD diode for protection is going beyond the spec of the device. Further, I know a guy who damaged several arduino pins, using a piezo sensor. It isn't worth saving a few pence.


simulate this circuit – Schematic created using CircuitLab

If you really want to sample the amplitude, then put a low-pass filter in too. I would probably stick with the digital input (in that circuit) for frequency, and use a second ADC pin to try to measure amplitude.

It isn't clear exactly what motors you wish to measure. For something like a washing machine, at say 1200rpm spin, that is 20 Hz. So a low pass filter at 100Hz+, and sampling at 1KHz+ should be good enough. That should be within the capabilities of the Arduino.