I'm trying to build an electric xylophone. I want it to be pressure/velocity sensitive so I decided to use piezo-elements to pick up 'hits'. Below is a close-up picture of my setup. Close up of piezo-setup So every bar you see (4 total) has a piezo-element taped onto the bottom. The bars are attached to the foam with CA glue/superglue and the foam is in turn glued with CA glue to the wooden piece beneath it.

When I hit a bar (hard enough to exceed a certain threshold), the piezo is read on an arduino which finds the peak in the signal and converts it to MIDI, that is in turn send to a Raspberry Pi which produces a tone. The idea of the blue foam, is that when I hit one bar, other bars (piezos) will not vibrate enough to produce a tone.

However, the problem I'm facing is that the blue foam is currently not dampening the vibrations enough. When I hit a bar not even all that hard, it will already trigger other bars as well. A side-problem is that I don't need to hit very hard to make the piezo send out its max value (5V). That relation could perhaps be solved if I would have less sensitive piezo-elements. Do those exist? The first (main) problem is more urgent to me though. So do you have any ideas on how to dampen the vibrations better to prevent other bars from vibrating as well?

Below is a broad-view picture of my setup, in case that clears up anything. Broad overview of setup

Here is a picture of my electronics to some extent. Close up of wiring The piezos are to the right of the picture, they are inserted in the blue breadboard, each with a 1 Mohm resistor. The inputs are then wired to the transparent breadboard where they are connected to a mux (CD4051BE). The mux is connected to an arduino analog input (most left yellow wire). This setup is because I eventually want to connect 16 piezos to 1 arduino.

  • \$\begingroup\$ You ask questions about how to handle your piezo elements and even if there are less sensitive ones but give ABSOLUTELY NO information about what type of piezo elements you are using (datasheet) or how are they interfaced (circuit diagram) or what the signal looks like (signal graph)! Don't you think there is missing something? \$\endgroup\$ – Curd Jan 11 '18 at 14:15


This is usually solved by putting a resistor across the piezo element. You could start at (say) 1 Mohm and reduce the resistor value in steps until you get the desired sensitivity.

You might also find that if the piezo is hit too hard you could damage the arduino inputs so "dampening" is recommended plus adding a series resistor between arduino input and piezo element (maybe 10 kohm). If you could describe the interface better more help could be given.

  • \$\begingroup\$ I already have a 1 Mohm resister in place for each arduino, so I should increase that then? And do you mean that if I hit the piezo too hard it will send out more than 5V? I'll edit my original post with another picture showing my electronics to some extent. \$\endgroup\$ – Rien Heuver Jan 11 '18 at 13:46
  • \$\begingroup\$ Decrease the resistor not increase. \$\endgroup\$ – Andy aka Jan 11 '18 at 13:57
  • \$\begingroup\$ Right, my bad. That totally makes sense if I only think about it. Thanks, I'll try that right away. \$\endgroup\$ – Rien Heuver Jan 11 '18 at 14:01

This problem is called cross-talk, where what should be sensed by one sensor is also picked up by the others.

I would recommend that you set up a way to measure the cross-talk. Measure the signal level between one element being hit and its neighbour. The difference between these is the cross-talk ratio (typically expressed in dB). This can be done using the ADC on the Arduino and/or an oscilloscope. That way you can see what effect potential improvements has (or not), instead of going blindly.

The cross-talk can likely be decreased mechanically. One idea is to let each bar hang freely (still horizontally), with elastic strings/bands suspending them within a frame.

Another idea is to compensate for the common-mode signal by having one or two piezo elements on the base. Then subtract or divide each sensor reading by this base value before doing the hit detect logic.


Your Answer

