Sketchy Arduino dual frequency counter
After much fiddling around trying to build a Roland System 100 VCO – over a period of actual months – I thought it would be handy to have a frequency counter to tune the thing in. And then I thought I could make it a dual one so I could tune my Model 101 keyboard exactly as well, being as it doesn’t have an octave selector, just a coarse frequency knob that sweeps from less than 10Hz to over 10KHz.
And then, I thought I could add some sort of indication of the pulse width of the signal, because I like tuning the oscillators as close to pure squares as possible to get that Roland-y low square sound.
Here’s a mercifully short video, with the prototype DIY System 100 VCO providing the constant drone against a real wiggling Roland VCO.
The System 100 outputs a 0-10v (ish) square wave, so we go in through a voltage divider, then to one side of an LM358 set up as a unity gain buffer, and then on to a LM319 dual comparator, configured with a bit of hysteresis as described at ermicroblog.
From here the signals go to pin 2 or 3 on the Arduino, and every time the pins change state an interrupt happens, and the time is noted. The LM319 is probably total overkill, but I wanted to make sure I was getting clean square waves and it was all I had in my bits box.
This is the sketchy bit – because you can’t interrupt an interrupt (at least on the Arduino), there’s potential for interrupts to get missed, so the code chucks out any readings that look ridiculously long or short. The result displayed is a median of a number of readings.
I did think about using external counters so as to avoid missing any ticks, possibly using a pair of Attiny MCUs talking to the Atmega328, but I found that just chucking out any rubbish results was good enough.
I’m only really interested in the audio range, so below about 8Hz it gets a bit sketchy with the display falsely wrapping around to >15KHz, but goes up to about 40KHz. In the video you can see the update rate really slow down as the pitch gets lower, because it takes longer to gather the samples to take an average.
I’m chuffed that my first attempt at transplanting the Atmega328 chip from an Arduino board onto a stripboard has worked out. I borrowed Nathan Chantrell’s Veroduino layout, and moved the electrolytic capacitor out the way so there was space for the regulator to lie flat. The regulator really needs a heat sink, it’s too hot to touch with the Samsung VFD running from the same supply.
It’s probably overkill to use the 328 given the unused I/O, but it would’ve been more of a faff to try and find something smaller just to save a bit of board space.
Here’s a Gist with the code, and this is the jumper-happy layout.
Idiot things I did wrong included using a shit switching power supply that caused the frequency readout to jump around; a heavyweight linear supply sorted that out. Also with the thought of matching the frequency to a musical note, I created an array full of strings and filled the RAM, which caused the Arduino to crash randomly.
Next is the bit I always struggle with, putting it in some sort of box – thinking of a Ponoko/Razorlab acrylic case.