Wearable Orientational CV Controller
The scalar glove is good for what it does, but it has limited utility — only on or off, while a lot of CV control can use a gradient. So I wanted something that would output a gradient. I was poking around the internet and discovered this Adafruit chip: https://www.adafruit.com/product/2472f
This is a 9 degree of freedom absolute orientation sensor which detects its rotational x, y, and z position (among other things) and outputs the results as a vector that an Arduino can read and interpret. I’ve built it to output an individual CV signal for each of these axes (see the scalar glove post for a brief discussion of CV and why I’m using that). I’ve also mounted the chip on the back of my hand, which means that I can move my hand in particular ways and use that to control certain parameters of my modular synth.
It’s awesome and feels kind of like being a really lame superhero.
Basically all of the hardware involved for this is the BNO055 chip and a handful of the resistor/capacitor DACs — see the scalar glove hardware section for some discussion of those. I chose to use an Arduino Mega rather than an Uno for reasons I’ll get into in the software section.
Those DACs are needed because Arduino is incapable of outputting a purely analog signal. The closest it can come is by approximating one with PWM, pulse width modulation, pins. Here is Arduino’s explanation of PWM: https://www.arduino.cc/en/Tutorial/PWM
For my purposes, however, there’s an additional problem: the AnalogWrite method is very slow, too slow to be used for any kind of even halfway reliable CV controller. However, this isn’t necessary. There are ways to get around that — think of it as essentially overclocking your Arduino, forcing the duty cycle of the PWM pin to be faster than it was intended to be. Here are some resources that discuss how to accomplish that:
There are also various libraries that claim to do the same thing, but I haven’t had much luck with them.
Beyond that, the code is pretty simple; I’m using a library for the sensor to handle reading from it, normalizing the data to something that AnalogWrite can output (its range is 0-255), and writing it to the pins that I’ve set up fast PWM for.
The BNO055 sensor has a lot more capabilities than I’m using, and one of my next projects will be to extend it, at least to use one of the acceleration vectors. It’s just a matter of finding the time and motivation for that, which is easier said than done.
If you have any questions, feel free to contact me at firstname.lastname@example.org.
Thanks for reading,