I had some minor success this evening preparing for a new project to build a MIDI controller utilizing raveloxmidi.
I wanted to use a Raspberry Pi Zero W as the main CPU and I set up a breadboarded version of how it’s going to work along with some Python code to poll the hardware and integrate with raveloxmidi.
It actually works but the latency is too great so I’m going to switch the Pi Zero out with a Pi 2 or 3 if I can find one in my pile.
I’m pretty excited because I’ve gone from concept to working prototype in a couple of hours and I already know what the final product is going to look like.
I realized that I didn’t need another ADC to clear down the capacitor. The circuit I’m basing this on uses 2 multiplexers: 1 for the input select to send on to an ADC and one to clear the capacitor for the selected drum input. The design makes sense because you’re selecting the input and those same input selections will also be used to select the clear down.
However, given that the MCP3008 (ADC) has 8 inputs, the first multiplexer is redundant.
So, I now have the ADC and one multiplexer.
I put together a test circuit to make sure that I understood how to talk to the multiplexer and that seems to be working fine.
After giving up for a couple of days because it wasn’t doing what I wanted, I took everything apart and rewired it. This time, it functioned as I wanted it to!
There are more things that I need to do:
- Get another MCP3008 ADC so that it can be used to clear an input once it’s been read.
- Wire up more than 1 drum input using more LM324 op-amps.
- Rewrite the python code in C so that latency can be as low as it can be. I may attach the Raspberry Pi to a network hub/switch so that WiFi isn’t part of the equation.
As I’ve been preparing to build a test circuit using the CD4051 multiplexer, I’ve realized that a multiplexer isn’t an ADC. The CD4051 is an 8:1 multiplexer meaning that the Raspberry Pi will select which of the 8 inputs to select to read from the 1 output. That’s fine and dandy if all I want to do is to check whether a drum pad has been hit. It’s a 1 or a 0 for on off.
However, if I want to determine velocity ( how hard the pad has been hit ), I need to be able to measure voltage too. This is why I need the ADC.
I still have the MCP3008 ADC chip from my previous circuitry. So, what I’m planning to do is to connect the output from the CD4051 to one of the inputs on the MCP3008, select the CD4051 input using 3 GPIO pins and then permanently select the single input on the MCP3008 and measure the voltage.
At least, that’s the theory. First step is to get the Raspberry Pi talking to the CD4051 in the first place. I’ve laid the groundwork down by making sure I understand exactly which GPIO pins to assign to be the A/B/ C input select on the CD4051. Next, I’ll build up the circuit for the drum input using the LM324 op-amp.
I actually got the circuit wired up again and, somehow, it seemed to work this time. I saw a voltage change with small taps and large hits so the next step was to connect the ADC (MCP3008) and the Pi Cobbler (GPIO cable connector).
So, I consulted the project at http://learn.adafruit.com/reading-a-analog-in-and-controlling-audio-volume-with-the-raspberry-pi/overview and wired up the GPIO pins to the ADC per their instructions.
I also took the python script from the same project and hacked it to remove the audio volume stuff.
It was during my initial test that I found I had connected the GPIO cable the wrong way round on the Pi which meant that nothing worked. My first thought was that I’d broken something but I pulled everything out and did a quick LED test ( see https://projects.drogon.net/raspberry-pi/gpio-examples/tux-crossing/gpio-examples-1-a-single-led/ ) which proved that none of the GPIO pins were responding as they should have done. So, I took the case apart, turned the cable around and reassembled everything. This time, the LED test worked as I expected (cue a quick Gangnam across the living room to celebrate ).
After wiring the ADC up again, it was a success as this video shows:
Next to do is to remove the capcitor to see if I can get the slope to decay much quicker.