I am working on having processing read and act on data from the ardunino, this is a simple test and code should be up soon, i am working on a code repo for Morgellon and I to share projects.
So here’ s my little version of the drum kit. I’ve just used sample code from arduino.cc, but it’s more than enough to get the project up and running. Expect to see it evolve over time, and if you plan on being at Phreaknic you can play with it there!
Here’s the sample code I used, with a few tweaks added:
int ledPin = 13; // led connected to control pin 13
int knockSensor = 0; // the knock sensor will be plugged at analog pin 0
byte val = 0; // variable to store the value read from the sensor pin
int statePin = LOW; // variable used to store the last LED status, to toggle the light
int THRESHOLD = 100; // threshold value to decide when the detected sound is a knock or not
// TONES ==========================================
// Start by defining the relationship between
// note, period, & frequency.
#define c 3830 // 261 Hz
#define d 3400 // 294 Hz
#define e 3038 // 329 Hz
#define f 2864 // 349 Hz
#define g 2550 // 392 Hz
#define a 2272 // 440 Hz
#define b 2028 // 493 Hz
#define C 1912 // 523 Hz
// Define a special note, ‘R’, to represent a rest
#define R 0
// SETUP ============================================
// Set up speaker on a PWM pin (digital 9, 10 or 11)
int speakerOut = 9;
// Do we want debugging on serial out? 1 for yes, 0 for no
int DEBUG = 1;
void setup() {
pinMode(ledPin, OUTPUT); // declare the ledPin as as OUTPUT
pinMode(speakerOut, OUTPUT);
Serial.begin(9600); // use the serial port
}
// MELODY and TIMING =======================================
// melody[] is an array of notes, accompanied by beats[],
// which sets each note’s relative length (higher #, longer note)
int melody[] = { C, b, g, C, b, e, C, c };
int beats[] = { 16, 16, 16, 8, 8, 16, 16, 16 };
int MAX_COUNT = sizeof(melody) / 2; // Melody length, for looping.
// Set overall tempo
long tempo = 10000;
// Set length of pause between notes
int pause = 1000;
// Loop variable to increase Rest length
int rest_count = 100; //<-BLETCHEROUS HACK; See NOTES
// Initialize core variables
int tone = 0;
int beat = 0;
long duration = 0;
// PLAY TONE ==============================================
// Pulse the speaker to play a tone for a particular duration
void playTone() {
long elapsed_time = 0;
if (tone > 0) { // if this isn’t a Rest beat, while the tone has
// played less long than ‘duration’, pulse speaker HIGH and LOW
while (elapsed_time < duration) {
// DOWN
digitalWrite(speakerOut, LOW);
delayMicroseconds(tone / 2);
// Keep track of how long we pulsed
elapsed_time += (tone);
}
}
else { // Rest beat; loop times delay
for (int j = 0; j < rest_count; j++) { // See NOTE on rest_count
delayMicroseconds(duration);
}
}
}
void loop() {
val = analogRead(knockSensor); // read the sensor and store it in the variable “val”
if (val >= THRESHOLD) {
// statePin = !statePin; // toggle the status of the ledPin (this trick doesn’t use time cycles)
digitalWrite(ledPin, HIGH); // turn the led on or off
Serial.println(”Knock!”); // send the string “Knock!” back to the computer, followed by newline
for (int i=0; i<MAX_COUNT; i++) {
tone = melody[i];
beat = beats[i];
duration = beat * tempo; // Set up timing
playTone();
// A pause between notes…
delayMicroseconds(pause);
}
delay(10); // short delay to avoid overloading the serial port
}
digitalWrite(ledPin, LOW);
}
I totally ripped this off from Morgellon, but it sounded fun and I wanted to try it. He is going to build his own version of this that I am sure is going to be cooler. I had to call him and ask some questions as he is most definitely the hardware end of our crazy love triangle. I want to dump the data into processing and have it animate the drums being hit, but that is for another day.
When a drum is struck, a knock sensor (backwards peizo) talks to the arduino and activates an led ot change the color of the drum (blue), after a delay the blue led goes out and the drum becomes orange again. I used a pullup resistor between the pins of the knock sensor, but i didnt get any different results with different values, so its probably dependent on the peizo that you use.
/*
droop's drum kit
dailyduino.com
droops - gmail
thanks for the idea josh!!
*/
int knockPin = 3; //pin for incoming knock sensor
int knockVal; //value from knock sensor
int knockLedPin = 10; //bue led
int normalLedPin = 4; //orange led
int lightBlue = 2000; //counter for keeping blue light on
int limit = 1000; //how sensitive the knock sensor is, lower = higher sensitivity based on piezo and pull down resistor
int blueTime = 2000; //how long the blue led stays on
void setup(){
pinMode(knockLedPin, OUTPUT);
pinMode(normalLedPin, OUTPUT);
pinMode(knockPin, INPUT);
Serial.begin(9600);
digitalWrite(knockLedPin, LOW);
digitalWrite(normalLedPin, HIGH);
}
void loop(){
knockVal = analogRead(knockPin); //read the knock sensor
if (knockVal < limit){
lightBlue = 0; //drop the value to activate the led
Serial.println(knockVal); //dump to serial for debugging
}
//this keeps the blue light on after a knock is registered
if(lightBlue < blueTime){
digitalWrite(normalLedPin, LOW);
digitalWrite(knockLedPin, HIGH);
lightBlue++;
} else {
digitalWrite(knockLedPin, LOW);
digitalWrite(normalLedPin, HIGH);
}
}
Several of my favorite Arduino/Freeduino stores have sent us in some giveaways for the con. We are not sure how we are going to be giving things out, as most are kits, I think we will be giving them out during our talk and during the tutorials going on during the day. Maybe get a few teams together during the talk and give them each a board to put together and do a project off of. Then give more coolness away for the team that makes the coolest stuff, I guess I need to bring a big box of parts.
Paul from Modern Device sent in 3 rBBB’s, 2 P4 RS232 to TTL Serial Adapter Kits, 2 LCD117 Serial LCD Boards, 2 16×2 blue LCD’s and a Serial Cable.
Morgellon and I will be talking about “The Extraordinary Journey from Fundamental Electronics to Fabulous Enchanted Systems with Arduino’s and Magical Potions” at PN 12 http://phreaknic.info/pn12/
droops and Morgellon will take you from basic electronics to building embedded systems. Learn how to build a standalone RFID tag reader with a fancy LCD display or your own oscilloscope or childrens
toys that speak to you or how to solar power a geothermal heat pump. There may even be some giveaways and contests. Magical Potions will be consumed but not provided.
Code will be posted on the blog as we get it availible, hopefully all will be done before the con.