Lab 5
Description
The purpose of this lab was to explore input/output coincidence. Using a speaker and a light sensor, I created a music box that only plays music when the user spins the handle. The light sensor detects the internal rotation and begins playing the music. In particular, I had a Nyan Cat papercraft that I augmented with these electronics. The music sequence was developed by others (mentioned in the code comments below).
Components
- Arduino Uno
- Light Sensor
- Speaker
- Nyan Cat Papercraft
Code
/*Lab4This lab uses light sensors and a speakerNyan Cat music boxOriginal Arduino music code byBruce Helsen (geobruce)Stan Draulans (purewantfun)update (Jrigvd (Jordy v. D.))Zach Wasson*/#include "pitches.h"#define THRESHOLD 10int light_sensor = A0;int old_val, new_val;int intro[] = {//introNOTE_DS5,NOTE_E5,NOTE_FS5,NOTE_B5,NOTE_DS5,NOTE_E5,NOTE_FS5,NOTE_B5,NOTE_CS6,NOTE_DS6,NOTE_CS6,NOTE_AS5,NOTE_B5,NOTE_FS5,NOTE_DS5,NOTE_E5,NOTE_FS5,NOTE_B5,NOTE_CS6,NOTE_AS5,NOTE_B5,NOTE_CS6,NOTE_E6,NOTE_DS6,NOTE_E6,NOTE_B5};// note durations: 4 = quarter note, 8 = eighth note, etc.:int noteDurations[] = {16,16,8,8,16,16,16,16,16,16,16,16,8,8,16,16,8,8,16,16,16,16,16,16,16,16};void setup() {new_val = analogRead(light_sensor);delay(100);for (int thisNote = 0; thisNote < 25; thisNote++) {// only play if user is spinning deviceold_val = new_val;new_val = analogRead(light_sensor);int difference = abs(new_val - old_val);while(difference < THRESHOLD) {old_val = new_val;new_val = analogRead(light_sensor);difference = abs(new_val - old_val);delay(100);}// to calculate the note duration, take one second// divided by the note type.//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.int noteDuration = 1500/noteDurations[thisNote];tone(8, intro[thisNote],noteDuration);// to distinguish the notes, set a minimum time between them.// the note's duration + 30% seems to work well:int pauseBetweenNotes = noteDuration * 1.30;delay(pauseBetweenNotes);// stop the tone playing:noTone(8);}}int melody[] = {//ANOTE_FS5,NOTE_GS5,NOTE_DS5,NOTE_DS5,REST,NOTE_B4,NOTE_D5,NOTE_CS5,NOTE_B4,REST,NOTE_B4,NOTE_CS5,NOTE_D5,NOTE_D5,NOTE_CS5,NOTE_B4,NOTE_CS5,NOTE_DS5,NOTE_FS5,NOTE_GS5,NOTE_DS5,NOTE_FS5,NOTE_CS5,NOTE_DS5,NOTE_B4,NOTE_CS5,NOTE_B4,NOTE_DS5,NOTE_FS5,NOTE_GS5,NOTE_DS5,NOTE_FS5,NOTE_CS5,NOTE_DS5,NOTE_B4,NOTE_D5,NOTE_DS5,NOTE_D5,NOTE_CS5,NOTE_B4,NOTE_CS5,NOTE_D5,NOTE_B4,NOTE_CS5,NOTE_DS5,NOTE_FS5,NOTE_CS5,NOTE_DS5,NOTE_CS5,NOTE_B4,NOTE_CS5,NOTE_B4,NOTE_CS5,NOTE_FS5,NOTE_GS5,NOTE_DS5,NOTE_DS5,REST,NOTE_B4,NOTE_D5,NOTE_CS5,NOTE_B4,REST,NOTE_B4,NOTE_CS5,NOTE_D5,NOTE_D5,NOTE_CS5,NOTE_B4,NOTE_CS5,NOTE_DS5,NOTE_FS5,NOTE_GS5,NOTE_DS5,NOTE_FS5,NOTE_CS5,NOTE_DS5,NOTE_B4,NOTE_CS5,NOTE_B4,NOTE_DS5,NOTE_FS5,NOTE_GS5,NOTE_DS5,NOTE_FS5,NOTE_CS5,NOTE_DS5,NOTE_B4,NOTE_D5,NOTE_DS5,NOTE_D5,NOTE_CS5,NOTE_B4,NOTE_CS5,NOTE_D5,NOTE_B4,NOTE_CS5,NOTE_DS5,NOTE_FS5,NOTE_CS5,NOTE_DS5,NOTE_CS5,NOTE_B4,NOTE_CS5,NOTE_B4,NOTE_CS5,//end of loopNOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_B4,NOTE_CS5,NOTE_DS5,NOTE_B4,NOTE_E5,NOTE_DS5,NOTE_E5,NOTE_FS5,NOTE_B4,NOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_B4,NOTE_FS4,NOTE_E5,NOTE_DS5,NOTE_CS5,NOTE_B4,NOTE_FS4,NOTE_DS4,NOTE_E4,NOTE_FS4,NOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_B4,NOTE_B4,NOTE_CS5,NOTE_DS5,NOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_FS4,//NOTE_B4,NOTE_B4,NOTE_AS4,NOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_E4,NOTE_E5,NOTE_DS5,NOTE_E5,NOTE_FS5,NOTE_B4,NOTE_AS4,//NOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_B4,NOTE_CS5,NOTE_DS5,NOTE_B4,NOTE_E5,NOTE_DS5,NOTE_E5,NOTE_FS5,NOTE_B4,NOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_B4,NOTE_FS4,NOTE_E5,NOTE_DS5,NOTE_CS5,NOTE_B4,NOTE_FS4,NOTE_DS4,NOTE_E4,NOTE_FS4,NOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_B4,NOTE_B4,NOTE_CS5,NOTE_DS5,NOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_FS4,NOTE_B4,NOTE_B4,NOTE_AS4,NOTE_B4,NOTE_FS4,NOTE_GS4,NOTE_B4,NOTE_E5,NOTE_DS5,NOTE_E5,NOTE_FS5,NOTE_B4,NOTE_CS5};int melodyNoteDurations[] = {//a8,8,16,16,16,16,16,16,16,16,8,8,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8,8,16,16,16,16,16,16,16,16,16,16,16,16, 8,16,16,16,16,16,16,16,16,8,8,8,8,8,16,16,16,16,16,16,16,16,8,8,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8,8,16,16,16,16,16,16,16,16,16,16,16,16, 8,16,16,16,16,16,16,16,16,8,8,8,//8,16,16,8,16,16,16,16,16,16,16,16,16,16,8,8,16,16,16,16,16,16,16,16,16,16,16,16,8,16,16,8,16,16,16,16,16,16,16,16,16,16,//8,16,16,16,16,16,16,16,16,16,16,8,8,//8,16,16,8,16,16,16,16,16,16,16,16,16,16,8,8,16,16,16,16,16,16,16,16,16,16,16,16,8,16,16,8,16,16,16,16,16,16,16,16,16,16,//8,16,16,16,16,16,16,16,16,16,16,8,8};void loop() {// iterate over the notes of the melody:for (int thisNote = 0; thisNote < 216; thisNote++) {// only play if user is spinning deviceold_val = new_val;new_val = analogRead(light_sensor);int difference = abs(new_val - old_val);while(difference < THRESHOLD) {old_val = new_val;new_val = analogRead(light_sensor);difference = abs(new_val - old_val);Serial.println(old_val);Serial.println(new_val);Serial.println(difference);Serial.println();delay(100);}// to calculate the note duration, take one second// divided by the note type.//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.int noteDuration = 1400/melodyNoteDurations[thisNote];tone(8, melody[thisNote],noteDuration);// to distinguish the notes, set a minimum time between them.// the note's duration + 30% seems to work well:int pauseBetweenNotes = noteDuration * 1.30;delay(pauseBetweenNotes);// stop the tone playing:noTone(8);}}
/************************************************** Public Constants*************************************************/#define REST 0#define NOTE_B0 31#define NOTE_C1 33#define NOTE_CS1 35#define NOTE_D1 37#define NOTE_DS1 39#define NOTE_E1 41#define NOTE_F1 44#define NOTE_FS1 46#define NOTE_G1 49#define NOTE_GS1 52#define NOTE_A1 55#define NOTE_AS1 58#define NOTE_B1 62#define NOTE_C2 65#define NOTE_CS2 69#define NOTE_D2 73#define NOTE_DS2 78#define NOTE_E2 82#define NOTE_F2 87#define NOTE_FS2 93#define NOTE_G2 98#define NOTE_GS2 104#define NOTE_A2 110#define NOTE_AS2 117#define NOTE_B2 123#define NOTE_C3 131#define NOTE_CS3 139#define NOTE_D3 147#define NOTE_DS3 156#define NOTE_E3 165#define NOTE_F3 175#define NOTE_FS3 185#define NOTE_G3 196#define NOTE_GS3 208#define NOTE_A3 220#define NOTE_AS3 233#define NOTE_B3 247#define NOTE_C4 262#define NOTE_CS4 277#define NOTE_D4 294#define NOTE_DS4 311#define NOTE_E4 330#define NOTE_F4 349#define NOTE_FS4 370#define NOTE_G4 392#define NOTE_GS4 415#define NOTE_A4 440#define NOTE_AS4 466#define NOTE_B4 494#define NOTE_C5 523#define NOTE_CS5 554#define NOTE_D5 587#define NOTE_DS5 622#define NOTE_E5 659#define NOTE_F5 698#define NOTE_FS5 740#define NOTE_G5 784#define NOTE_GS5 831#define NOTE_A5 880#define NOTE_AS5 932#define NOTE_B5 988#define NOTE_C6 1047#define NOTE_CS6 1109#define NOTE_D6 1175#define NOTE_DS6 1245#define NOTE_E6 1319#define NOTE_F6 1397#define NOTE_FS6 1480#define NOTE_G6 1568#define NOTE_GS6 1661#define NOTE_A6 1760#define NOTE_AS6 1865#define NOTE_B6 1976#define NOTE_C7 2093#define NOTE_CS7 2217#define NOTE_D7 2349#define NOTE_DS7 2489#define NOTE_E7 2637#define NOTE_F7 2794#define NOTE_FS7 2960#define NOTE_G7 3136#define NOTE_GS7 3322#define NOTE_A7 3520#define NOTE_AS7 3729#define NOTE_B7 3951#define NOTE_C8 4186#define NOTE_CS8 4435#define NOTE_D8 4699#define NOTE_DS8 4978
- Login to post comments
Drupal theme by Kiwi Themes.