Paso 3: Añadir código y reproducir música vibracional!
Agradecimientos al club de robótica R-equipo para el registro de su código de arduino con las melodías programadas en!
http://www.phys-x.org/rbots/index.php?option=com_content&view=article&ID=66:Lesson-5-Play-Melody-with-piezo&catid=41:kits&Itemid=70
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ * Tocar melodía
* -----------
*
* Programa para tocar una melodía simple
*
* Tonos crean rápidamente pulsando un altavoz encendido y apagado
* uso de PWM, para crear frecuencias de firma.
*
* Cada nota tiene una frecuencia, creada mediante la variación del período de
* vibración, medida en microsegundos. Vamos a utilizar el ancho de pulso
* modulación (PWM) para crear esa vibración.
Calculamos el ancho de pulso para la mitad del período; nos del pulso
* el altavoz alta por microsegundos 'ancho de pulso' y luego baja
para el microsegundos de 'ancho de pulso'.
* Esta función crea una vibración de la frecuencia deseada.
*
* (hendidura) 2005 D. Cuartiella para K3
* Refactoring y comentarios clay.shirky 2006
* Ver notas en los comentarios al final para posibles mejoras
*/
// TONES ==========================================
Comenzar por definir la relación entre
Nota, período y frecuencia.
período está en microsegundos que P = 1/f * (1E6)
#define c3 7634
#define d3 6803
#define e3 6061
#define f3 5714
#define g3 5102
#define a3 4545
#define b3 4049
#define c4 3816 / / 261 Hz
#define d4 3401 / / 294 Hz
#define e4 3030 / / Hz 329
#define f4 2865 / / 349 Hz
#define g4 2551 / / 392 Hz
#define a4 2272 / / 440 Hz
#define a4s 2146
#define b4 2028 / / 493 Hz
#define c5 1912 / / 523 Hz
#define d5 1706
#define d5s 1608
#define e5 1517
#define f5 1433
#define g5 1276
#define a5 1136
#define a5s 1073
#define b5 1012
#define c6 955
Definir una nota especial, 'R', para representar a un descanso
#define R 0
// SETUP ============================================
Configurar el altavoz en un perno PWM (digital 9, 10 u 11)
int speakerOut = 9;
¿Queremos depuración en serie hacia fuera? 1 para sí, 0 no
int DEBUG = 1;
void setup() {}
pinMode (speakerOut, salida);
Si {} (DEBUG)
Serial.Begin(9600); Conjunto serie hacia fuera si queremos depurar
}
}
MELODÍA y el momento ===
[melodía] es un conjunto de notas, acompañada de golpes [],
que establece la longitud relativa de cada nota (# más, más Nota)
tema de Star wars
melodía de int [] = {f4, f4, f4, a4s, f5, d5s, d5, c5, a5s, f5, d5s, d5, c5, a5s, f5, d5s, d5, d5s, c5} ;//
beats de int [] = {21, 21, 21, 128, 128, 21, 21, 21, 128, 64, 21, 21, 21, 128, 64, 21, 21, 21, 128};
depuración de nota
melodía de int [] = {c4, d4, e4, f4, g4, a4, b4, c5};
beats de int [] = {63, 64, 64, 64, 64, 64, 64, 64};
Super tema de mario
melodía de int [] = {e5, e5, R, e5, R, c5, e5, R, g5, g4, R, R, R R, R, R, c5, R, R, g4, R, R, e4};
beats de int [] = {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 8, 16, 16};
int número = sizeof(melody) / 2; Longitud de la melodía, para bucle.
Set global tempo
largo tempo = 10000;
Duración de pausa entre las notas
int pausa = 1000;
Variable de bucle para aumentar la longitud del resto
int rest_count = 50; <-BLETCHEROUS HACK; Ver notas
Inicializar las variables de la base
int toneM = 0;
vencer a int = 0;
duración = 0;
// PLAY TONE ==============================================
El altavoz para reproducir un tono para una particular duración de pulso
{} void playTone()
largo elapsed_time = 0;
Si (toneM > 0) {/ / si esto no es un ritmo de descanso, mientras que el tono tiene
jugado menos tiempo de 'duración', altavoz de pulso alto y bajo
mientras que (elapsed_time < duración) {}
digitalWrite(speakerOut,HIGH);
delayMicroseconds(toneM / 2);
ABAJO
digitalWrite (speakerOut, bajo);
delayMicroseconds(toneM / 2);
Hacer un seguimiento de cuánto tiempo hemos pulsado
elapsed_time += (toneM);
}
}
Else {/ / resto vencer; tiempos de loop retrasan
para (int j = 0; j < rest_count; j ++) {/ / ver nota en rest_count
delayMicroseconds(duration);
}
}
}
DEJE QUE COMIENCE EL WILD RUMPUS ===
void loop() {}
Configurar un contador para tirar de [melodía] y [golpes]
para (int i = 0; i < número; i ++) {}
toneM = la melodía [i];
batir = beats [i];
duración = beat * tempo; Configurar la sincronización
playTone();
Una pausa entre las notas...
delayMicroseconds(pause);
Si (depurar) {/ / si depuración, Informe lazo, tono, ritmo y la duración
Serial.Print(i);
Serial.Print(":");
Serial.Print(Beat);
Serial.Print("");
Serial.Print(toneM);
Serial.Print("");
Serial.println(Duration);
}
}
}
/*
* NOTAS
* El programa pretende mantener un tono de microsegundos de 'duración'.
* Mentiras mentiras mentiras! Lleva a cabo para al menos microsegundos de 'duración', _plus_
* cualquier sobrecarga creado por elapsed_time incremeting (podría ser en exceso de
* 3 K microsegundos) _plus_ sobrecarga de bucle y dos digitalWrites() de
*
* Como resultado, mucho más lentamente que un resto se escuchará un tono de 'duración'
* de' duración' rest_count crea una variable de bucle para dar golpes de 'descanso'
* en línea con beats 'tono' de la misma longitud.
*
* rest_count se verán afectadas por la arquitectura de viruta y la velocidad, así como
* sobrecarga de cualquier mods del programa. Comportamiento pasado no es garantía de futuro
rendimiento. Su kilometraje puede variar. Fusible luz y escapar.
*
* Esto puede utilizar una serie de mejoras:
* AGREGAR código para dejar que el programador especifique cuantas veces la melodía debe
* lazo antes de parar
* AGREGAR otra octava
* HACIA tempo, pausa y rest_count declaraciones de #define
* Vuelva a escribir incluir volumen, usando analogWrite, como con el segundo programa en
* http://www.arduino.cc/en/Tutorial/PlayMelody
* Añadir código para que el tempo configurables por pot u otro dispositivo de entrada
* Agregue código para tomar ritmo o volumen configurable por comunicación serial
* (Requiere 0005 o superior.)
* Agregue código para crear un desplazamiento de tono (superior o inferior) a través de olla etc.
* REEMPLAZAR la melodía al azar con la apertura de bares a 'Humo sobre el agua'
* /