Introduction: Arduino Air Drums
This instructable will tell you how to make your own set of air drums using little more than an Arduino microcontroller and a few accelerometers.
Here's a video of the drums I based this design off of:
http://www.youtube.com/watch?v=jjvy_jzGlAQ
My drums feature a number of improvements over those shown in the video:
-Funtional Hi Hat Pedal: Looking at the original designer's code, I noticed he never got the photocell "hi-hat" to work. Instead, he programmed the cymbal drumstick to play a crash at high acceleration and a closed hi hat at lower accelerations.
-More responsive drumsticks and pedals
Here's a video of the drums I based this design off of:
http://www.youtube.com/watch?v=jjvy_jzGlAQ
My drums feature a number of improvements over those shown in the video:
-Funtional Hi Hat Pedal: Looking at the original designer's code, I noticed he never got the photocell "hi-hat" to work. Instead, he programmed the cymbal drumstick to play a crash at high acceleration and a closed hi hat at lower accelerations.
-More responsive drumsticks and pedals
Step 1: Get Your Materials
Items you will need (can be found on sparkfun.com unless otherwise noted):
4 - 6 foot usb a male - a male cords
8 - usb female type a smd connectors
3 - adxl 335 accelerometers
1 - Mini photocell
1- 10k resistor
1- 220 ohm resistor
1- MIDI Connector - Female Right Angle
1- MIDI USB converter (find it on Amazon.com for around $5)
Arduino Uno microcontroller
A Breadboard
Lots of Wire
Cheap flip flops you can cut up (got mine at target for $3)
Replacement strap for flip flops (I used some tennis wristbands for this)
Air drumsticks (I used some PVC pipe)
4 - 6 foot usb a male - a male cords
8 - usb female type a smd connectors
3 - adxl 335 accelerometers
1 - Mini photocell
1- 10k resistor
1- 220 ohm resistor
1- MIDI Connector - Female Right Angle
1- MIDI USB converter (find it on Amazon.com for around $5)
Arduino Uno microcontroller
A Breadboard
Lots of Wire
Cheap flip flops you can cut up (got mine at target for $3)
Replacement strap for flip flops (I used some tennis wristbands for this)
Air drumsticks (I used some PVC pipe)
Step 2: MIDI Connector
The first thing you'll want to do is wire up your Arduino to your MIDI female connector so you can play MIDI notes. This is an easy process - just follow the diagram! Note that the resistor is 220 ohm.
Step 3: Wiring Up the Accelerometers
Next, we want to hook up our accelerometers to the Arduino. Hook up the z terminals of the accelerometers to the analog inputs 0,1, and 4 of the arduino. Hook up the GND terminals to ground and the VCC terminals to the +3.3V of the Arduino. Also, hook up the Analog Reference pin to +3.3V. For reference, see the diagram below.
Also, to avoid long, tangled wires, use usb cables as connectors. Just solder the wires from the accelerometer onto the usb females and use usb males to connect them. The picture below shows a USB female with accelerometer cables soldered to it.
Also, to avoid long, tangled wires, use usb cables as connectors. Just solder the wires from the accelerometer onto the usb females and use usb males to connect them. The picture below shows a USB female with accelerometer cables soldered to it.
Step 4: Wire Up the Hi Hat Pedal
The hi-hat pedal works by utilizing a photocell as a voltage divider. The diagram below shows how to hook it (again, using a usb cable as a connector). Note that the resistor value is 10k, and that the middle of the voltage divider should be hooked up to Analog Pin 3, as shown.
Step 5: Putting It All Together
Upon completing the last step, you should have all of the necessary components wired up. First, put two of the accelerometers in some sort of "stick" (I used pvc pipe). the third accelerometer in some sort of "bass pedal" (I used the right foot of some cheap flip flops), and the photocell in a "hi hat pedal" (Left foot of cheap flip flops). Look at the pics below to see how I set things up.
Step 6: Code
Now it's time to upload the code to your Arduino. Here it is:
//snare
const int NumSnareReadings = 7;
int SnareReadings[NumSnareReadings];
int SnareIndex = 0;
int SnareTotal = 0;
int SnareAverage = 0;
int SnareMax = 700;
int SnarePin = A2;
//hi hat
const int NumHatReadings = 7;
int HatReadings[NumHatReadings];
int HatIndex = 0;
int HatTotal = 0;
int HatAverage = 0;
int HatMax = 700;
int HatPin = A0;
//bass pedal
const int NumBassReadings = 7;
int BassReadings[NumBassReadings];
int BassIndex = 0;
int BassTotal = 0;
int BassAverage = 0;
int BassMax = 700;
int BassPin = A4;
//crash (hi hat pedal up)
int PedalPin=A3;
int Light = analogRead(A3);
const int NumCrashReadings = 7;
int CrashReadings[NumCrashReadings];
int CrashIndex = 0;
int CrashTotal = 0;
int CrashAverage = 0;
int CrashMax = 700;
int CrashPin = A5;
int Threshold = 125;
//Millis function to give a delay between MIDI notes
long PreviousMillis1= 0;
long PreviousMillis2= 0;
long PreviousMillis3= 0;
long PreviousMillis4= 0;
long Interval1 = 100;
long Interval2 = 100;
long Interval3 = 100;
long Interval4 = 100;
void setup() {
Serial.begin(31250);
pinMode(SnarePin, INPUT);
pinMode(HatPin, INPUT);
pinMode(BassPin, INPUT);
pinMode(PedalPin, INPUT);
analogReference(EXTERNAL);
for( int ThisSnareReading = 0; ThisSnareReading < NumSnareReadings; ThisSnareReading++)
SnareReadings[ThisSnareReading] = 0;
for( int ThisHatReading = 0; ThisHatReading < NumHatReadings; ThisHatReading++)
HatReadings[ThisHatReading] = 0;
for( int ThisBassReading = 0; ThisBassReading < NumBassReadings; ThisBassReading++)
BassReadings[ThisBassReading] = 0;
}
void loop ()
{
unsigned long CurrentMillis = millis();
//snare
SnareTotal = SnareTotal - SnareReadings[SnareIndex];
SnareReadings[SnareIndex]=analogRead(SnarePin);
SnareTotal = SnareTotal + SnareReadings[SnareIndex];
SnareIndex=SnareIndex+1;
if(SnareIndex >= NumSnareReadings)
SnareIndex=0;
SnareAverage = SnareTotal / NumSnareReadings;
if(SnareAverage > SnareMax && (CurrentMillis-PreviousMillis1) > Interval1)
{
PreviousMillis1=CurrentMillis;
playMidiNote(1, 38, 127);
}
//hi hat
HatTotal = HatTotal - HatReadings[HatIndex];
HatReadings[HatIndex]=analogRead(HatPin);
HatTotal = HatTotal + HatReadings[HatIndex];
HatIndex=HatIndex+1;
if(HatIndex >= NumHatReadings)
{HatIndex=0;
HatAverage = HatTotal / NumHatReadings;
if(HatAverage > HatMax && (CurrentMillis-PreviousMillis2) > Interval2 && analogRead(A3) < Threshold)
{playMidiNote(1, 42, 127);}
}
//crash
CrashTotal = CrashTotal - CrashReadings[CrashIndex];
CrashReadings[CrashIndex]=analogRead(CrashPin);
CrashTotal = CrashTotal + CrashReadings[CrashIndex];
CrashIndex=CrashIndex+1;
if(CrashIndex >= NumCrashReadings)
{CrashIndex=0;
CrashAverage = CrashTotal / NumCrashReadings;
if(CrashAverage > CrashMax && (CurrentMillis-PreviousMillis4) > Interval4 && analogRead(A3) >= Threshold)
{playMidiNote(1, 46, 127);}
}
//bass pedal
BassTotal = BassTotal - BassReadings[BassIndex];
BassReadings[BassIndex]=analogRead(BassPin);
BassTotal = BassTotal + BassReadings[BassIndex];
BassIndex=BassIndex+1;
if(BassIndex >= NumBassReadings)
BassIndex=0;
BassAverage = BassTotal / NumBassReadings;
if(BassAverage > BassMax && (CurrentMillis-PreviousMillis3 > Interval3))
{
PreviousMillis3=CurrentMillis;
playMidiNote(1,36 , 127);
}
}
void playMidiNote(byte channel, byte note, byte velocity)
{
byte midiMessage= 0x90 + (channel - 1);
Serial.write(midiMessage);
Serial.write(note);
Serial.write(velocity);
}
//snare
const int NumSnareReadings = 7;
int SnareReadings[NumSnareReadings];
int SnareIndex = 0;
int SnareTotal = 0;
int SnareAverage = 0;
int SnareMax = 700;
int SnarePin = A2;
//hi hat
const int NumHatReadings = 7;
int HatReadings[NumHatReadings];
int HatIndex = 0;
int HatTotal = 0;
int HatAverage = 0;
int HatMax = 700;
int HatPin = A0;
//bass pedal
const int NumBassReadings = 7;
int BassReadings[NumBassReadings];
int BassIndex = 0;
int BassTotal = 0;
int BassAverage = 0;
int BassMax = 700;
int BassPin = A4;
//crash (hi hat pedal up)
int PedalPin=A3;
int Light = analogRead(A3);
const int NumCrashReadings = 7;
int CrashReadings[NumCrashReadings];
int CrashIndex = 0;
int CrashTotal = 0;
int CrashAverage = 0;
int CrashMax = 700;
int CrashPin = A5;
int Threshold = 125;
//Millis function to give a delay between MIDI notes
long PreviousMillis1= 0;
long PreviousMillis2= 0;
long PreviousMillis3= 0;
long PreviousMillis4= 0;
long Interval1 = 100;
long Interval2 = 100;
long Interval3 = 100;
long Interval4 = 100;
void setup() {
Serial.begin(31250);
pinMode(SnarePin, INPUT);
pinMode(HatPin, INPUT);
pinMode(BassPin, INPUT);
pinMode(PedalPin, INPUT);
analogReference(EXTERNAL);
for( int ThisSnareReading = 0; ThisSnareReading < NumSnareReadings; ThisSnareReading++)
SnareReadings[ThisSnareReading] = 0;
for( int ThisHatReading = 0; ThisHatReading < NumHatReadings; ThisHatReading++)
HatReadings[ThisHatReading] = 0;
for( int ThisBassReading = 0; ThisBassReading < NumBassReadings; ThisBassReading++)
BassReadings[ThisBassReading] = 0;
}
void loop ()
{
unsigned long CurrentMillis = millis();
//snare
SnareTotal = SnareTotal - SnareReadings[SnareIndex];
SnareReadings[SnareIndex]=analogRead(SnarePin);
SnareTotal = SnareTotal + SnareReadings[SnareIndex];
SnareIndex=SnareIndex+1;
if(SnareIndex >= NumSnareReadings)
SnareIndex=0;
SnareAverage = SnareTotal / NumSnareReadings;
if(SnareAverage > SnareMax && (CurrentMillis-PreviousMillis1) > Interval1)
{
PreviousMillis1=CurrentMillis;
playMidiNote(1, 38, 127);
}
//hi hat
HatTotal = HatTotal - HatReadings[HatIndex];
HatReadings[HatIndex]=analogRead(HatPin);
HatTotal = HatTotal + HatReadings[HatIndex];
HatIndex=HatIndex+1;
if(HatIndex >= NumHatReadings)
{HatIndex=0;
HatAverage = HatTotal / NumHatReadings;
if(HatAverage > HatMax && (CurrentMillis-PreviousMillis2) > Interval2 && analogRead(A3) < Threshold)
{playMidiNote(1, 42, 127);}
}
//crash
CrashTotal = CrashTotal - CrashReadings[CrashIndex];
CrashReadings[CrashIndex]=analogRead(CrashPin);
CrashTotal = CrashTotal + CrashReadings[CrashIndex];
CrashIndex=CrashIndex+1;
if(CrashIndex >= NumCrashReadings)
{CrashIndex=0;
CrashAverage = CrashTotal / NumCrashReadings;
if(CrashAverage > CrashMax && (CurrentMillis-PreviousMillis4) > Interval4 && analogRead(A3) >= Threshold)
{playMidiNote(1, 46, 127);}
}
//bass pedal
BassTotal = BassTotal - BassReadings[BassIndex];
BassReadings[BassIndex]=analogRead(BassPin);
BassTotal = BassTotal + BassReadings[BassIndex];
BassIndex=BassIndex+1;
if(BassIndex >= NumBassReadings)
BassIndex=0;
BassAverage = BassTotal / NumBassReadings;
if(BassAverage > BassMax && (CurrentMillis-PreviousMillis3 > Interval3))
{
PreviousMillis3=CurrentMillis;
playMidiNote(1,36 , 127);
}
}
void playMidiNote(byte channel, byte note, byte velocity)
{
byte midiMessage= 0x90 + (channel - 1);
Serial.write(midiMessage);
Serial.write(note);
Serial.write(velocity);
}
Step 7:
Here's a quick video of my drums in action: