Final Arduino Audio

 

By: Dia Thao

 

Itrems used were a piezo speaker, photocell, 10k ohm resisitor and Arduino for my final.

 

Here are pictures of my setup.

 

This is the code that I used to turn on the audio final.

// 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 photoPin = 5;
int speakerOut = 9;
int photoVal = 0;
int photoValByte = 0;
int speakRate = 0;
// Do we want debugging on serial out? 1 for yes, 0 for no
int DEBUG = 1;

// 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, R, C, c, g, a, C };
int beats[] = { 16, 16, 16, 8, 8, 16, 32, 16, 16, 16, 8, 8 };
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;

void setup() {
pinMode(speakerOut, OUTPUT);
if (DEBUG) {
Serial.begin(9600); // Set serial out if we want debugging
}
}

void loop() {
takePhoto();
givePhotoSerial();
giveSpeak();
}

void takePhoto() {
/////////////////////
// photocell input //
/////////////////////
photoVal = analogRead(photoPin);
}

void givePhotoSerial() {
///////////////////////////////
// photocell value to serial //
///////////////////////////////
photoValByte = abs( photoVal - 1024 ) / 4;
printInteger(photoValByte);
Serial.print(10, BYTE);
}

void giveSpeak() {
////////////////////
// speaker output //
////////////////////
speakRate = abs( photoVal - 1024 ) / 4;
digitalWrite(speakerOut, HIGH);
delay(speakRate/2);
digitalWrite(speakerOut, LOW);
delay(speakRate/2);
}

// 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) {

digitalWrite(speakerOut,HIGH);
delayMicroseconds(tone / 2);

// 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);
}
}
}

// LET THE WILD RUMPUS BEGIN =============================

void setTempo() {
//Set up a counter to pull from melody[] and beats[]
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);

if (DEBUG) { // If debugging, report loop, tone, beat, and duration
Serial.print(i);
Serial.print(":");
Serial.print(beat);
Serial.print(" ");
Serial.print(tone);
Serial.print(" ");
Serial.println(duration);
}
}
}

//////////////////////// This is what I used to test out if the photocell and the piezo speaker///////////////////////////

 

 

// 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 photoPin = 5;
int speakerOut = 9;
int photoVal = 0;
int photoValByte = 0;
int speakRate = 0;
// Do we want debugging on serial out? 1 for yes, 0 for no
int DEBUG = 1;

 

void setup() {
pinMode(speakerOut, OUTPUT);
if (DEBUG) {
Serial.begin(9600); // Set serial out if we want debugging
}
}

void loop() {
takePhoto();
givePhotoSerial();
giveSpeak();
}

void takePhoto() {
/////////////////////
// photocell input //
/////////////////////
photoVal = analogRead(photoPin);
}

void givePhotoSerial() {
///////////////////////////////
// photocell value to serial //
///////////////////////////////
photoValByte = abs( photoVal - 1024 ) / 4;
printInteger(photoValByte);
Serial.print(10, BYTE);
}

void giveSpeak() {
////////////////////
// speaker output //
////////////////////
speakRate = abs( photoVal - 1024 ) / 4;
digitalWrite(speakerOut, HIGH);
delay(speakRate/2);
digitalWrite(speakerOut, LOW);
delay(speakRate/2);
}