Paso 3: Hacer el Arduino comprender nuestra genialidad musical
Cómo almacenar los datos de ejemplo en el microcontrolador
Sin duda recordará usted del paso anterior que tomamos nuestra información disminuirá y había embalado en un paquete pequeño del tamaño de 1 byte u 8 bits.
Esto ahorra espacio en el microcontrolador como sabe usted, pero usted se estará preguntando cómo almacenarlo y acceder a esta información para su reproducción en el arduino.
Entrar en avr/pgmspace.h:
#include <avr/pgmspace.h>
Este archivo de encabezado nos permite programar nuestros datos de muestra directamente en la memoria flash en el Arduino, yay!
Es muy fácil de usar solo con un poquito de consideración sobre cómo leemos la información nuevamente.
prog_uchar onebitraw[] PROGMEM = { 0XFF, 0XFF, 0XEF, 0XFF,..... };
Supongo que los 2 puntos claves para hacer sobre ese fragmento de código anterior que utilizar prog_uchar como el tipo de datos que estamos almacenando, esto es importante para nosotros para poder leer los datos de la memoria cuando jugamos la muestra. Lo notable es que utilizamos la palabra clave PROGMEM, esto se basa en el archivo de encabezado que mencioné avr/pgmspace.h y esto indica al compilador donde almacenar esta matriz de datos.
prog_uchar indica al compilador que estamos almacenando los datos del tipo unsigned char.
Un char es simplemente 1 byte, por lo que puede almacenar un valor de 0 a 255, 8 bits.
Que especificar unsigned porque estamos almacenando sólo números positivos desde 0 y arriba. Esto es fundamental porque nosotros no estamos realmente almacenar números como recordarán realmente estamos almacenando 8 muestras de sonido dentro de este valor, esto termina siendo convertido a un valor numérico y podemos moverlo como si es un numero pero la realidad es que no es bastante lo que parece pero el compilador no sabe ni se preocupan por esta configuración. Si estábamos usando un método de almacenamiento de información firmada estaríamos en un caos de derecha.
Si te apetece saber más sobre firmadas, sin firmar y dos entonces complementan este artículo de la wiki debe una interesante leer para usted. http://en.wikipedia.org/wiki/Two's_complement
Aritmética de puntero es wayyy más fácil de lo que suena
Para que la Arduino a leer nuevamente nuestra información en la sección PROGMEM de memoria nos se que necesitan utilizar la función pgm_read_byte_near(); Es muy fácil de usar y lo único que lo complica es que requiere utilizar aritmética de puntero para especificar qué byte de memoria... Como tal:
pgm_read_byte_near(onebitraw + which_one);
En el ejemplo se que extienda por encima ves 'onebitraw' que voy a usar para expresar el almacenamiento de nuestras muestras de audio. Ahora usted puede estar familiarizado con el uso de índices de array como variable [índice] y esto no es diferente salvo que sustituirla [índice] + índice en su lugar... ¿Tiene sentido? La razón es que almacenan nuestros datos de audio como un bloque de bytes, uno tras otro, así que sabemos que cada uno es simplemente uno más a lo largo de una anterior a ella.
¿Ver? ¡ Muy simple!