Paso 12: sonidos
Todos los sonidos fueron generados de un ATtiny84. No había ningún espacio para otra junta. Y el ATtiny estaba allí de todos modos, el gatillo y selector de dial de lectura y envío de PWM a los conductores del LED.
De hecho, aprovechó un Consejo que he estado trabajando en esto; tiene un ATtiny84, un jefe de programación ICSP y cuatro drivers de corriente constante de LC135. Estos últimos son un chip poco cool suministrará un regulado 350 miliamperios a un LED de alta potencia, tendrá PWM y apilado (o, más bien, ejecutar en paralelo).
La Junta tuvo que ser modificado pesadamente para este apoyo, por supuesto.
Es relativamente sencillo hacer tonos en un ATtiny. Funcionará (con algunas salvedades importantes) la biblioteca tone() para Arduino. También es capaz de síntesis wavetable. La teoría es bastante simple. Uno de los cronómetros de a bordo del hardware está configurado para la salida de voltaje analógico; fijar la frecuencia de corte variable, (PWM, básicamente). Un segundo contador de tiempo se utiliza para generar una interrupción de hardware. Cuando se llama a la rutina de servicio de interrupción, se recoge el siguiente valor de una tabla de ondas y ajusta la salida de tensión Ajuste del temporizador primera.
Este truco requiere un par de cosas. Requiere el segundo temporizador operando en la frecuencia deseada X la longitud de las ondas. Requiere el primer temporizador ejecutar varias órdenes más rápidas (de lo contrario habrá aliasing divertido sucediendo). Y requiere que el programa no gastar un montón de ciclos haciendo otra cosa que estar listo para la siguiente interrupción ser procesados.
Que este último resultó difícil. Yo corría software PWM para LED (no había más temporizadores de hardware disponible en ese chip), tuve que tomar lecturas de gatillo y lecturas analógicas de la esfera, y las clases de sonidos quería necesitan evolucionar con el tiempo. Entonces dio para arriba en la tabla de la onda completa y genera ondas diente de sierra o cuadradas simple. Y eso significaba que podía repuesto de los ciclos de programa para sumar o restar números a la frecuencia (es decir, la tasa base que los cambios se hacen a la salida analógica solicitada de timer1.)
Todavía significaba que los sonidos cambiaron radicalmente cada vez que pongo en un nuevo "Si" Declaración y también fueron fuertemente dependiente en la frecuencia de base para el PWM. Pero con una gran cantidad de ensayo y error pude obtener algunos clics, chirridos y gorjeos para las diferentes tomas y sonidos de función (encender, selector dial movimiento, etc..)
De hecho, el aliasing y general "grano" es un beneficio. Usando técnicas similares a la síntesis de wavetable por encima de uno puede hacer ruido blanco o rosado de varios sabores, pero que resultó innecesario. Si estaba usando un chip más rápido y más potente, tal como se encuentra en un Arduino Nano, yo probablemente ser digital combinando diferentes ondas y procesamiento antes de enviar a la salida analógica final.
Toda la programación se hizo nominalmente en el IDE de Arduino. Aprovechar los temporizadores de hardware de la manera que tenía que estaba abordarlos directamente sin la ayuda de las bibliotecas de Arduino. Pero el beneficio de la programación de un apoyo como este es usted puede pensar en "bosquejo," tirar juntos cualquier obras de código desordenado y llamarlo bueno.