Killtrojan te invita a participar como usuario en nuestra comunidad. Registrate y podrás participar en todos nuestros subforos y ayudarás a crecer nuestra comunidad.

Si te gusta la informática,la seguridad, el análisis de malware o tienes problemas con virus o troyanos,no te lo pienses.


Registrarte en el foro no te llevará mas de un minuto.

Diseño de un piano electrónico con PIC18F y libreria tones.c

Ver el tema anterior Ver el tema siguiente Ir abajo

Diseño de un piano electrónico con PIC18F y libreria tones.c

Mensaje  Skapunky el Lun Feb 04, 2013 9:16 pm

Si eres electrónico o tienes conocimientos de electrónica ahora podrás diseñarte un piano electrónico sencillo o un sencillo dispositivo que emita melodías parecidas a los primeros teléfonos móviles con el siguiente circuito, fácil de montar, donde podrás distraerte potenciando tu faceta como músico.

El diseño propuesto, es el de un piano electrónico con las notas musicales base DO-RE-MI-FA-Sol-LA-SI que puede servir para interpretar sencillas canciones con un pequeño altavoz y unos pulsadores emulando las teclas de un piano. Además se ha añadido un 8º botón que al pulsarlo emite la melodía de una canción conocida a modo de ejemplo por si alguien quiere montarse una especie de reproductor midi ya que se pueden emular todas las notas que existen.


Cuando inicié el diseño, intenté recrear cada nota con su frecuencia simulando pulsos cuadrados variando el dutty cycle aunque no acababan de sonar correctamente desde mi punto de vista. Buscando una solución encontré una librería que justamente sirve para eso y permite simular gran cantidad de notas, diferenciando incluso sus tiempos según sean negras o blancas, semifusas…

Primero quiero dar unos detalles del esquema creado y simulado con proteus. Por una parte las teclas del piano, van conectada al puerto D declarado como entrada con unas resistencias de pull-up de 1 kohm para generar el estado alto en los bits del puerto.


Para generar el sonido de las notas, se ha utilizado un altavoz pequeño que en la realidad se puede usar uno a gusto del consumidor, en lo personal recomiendo uno pequeño de 8ohm-1W. Se ha utilizado el primer bit del puerto B como salida para generar la frecuencia de las notas ya que en la librería que se explicará a continuación, así viene por defecto.

Para activar el altavoz, en vez de conectar ésta salida directamente, se utiliza un transistor a modo de “interruptor”. Sobre diseño electrónico poco más hay para comentar, la electrónica es sencilla y es más interesante ver el funcionamiento de la librería para generar los sonidos.

Libreria Tones.c

La librería para generar los sonidos es tones.c, para usarla simplemente haremos un include al archivo. En mi caso con el compilador CCS no me dio ningún tipo de error ya que estaba integrada, en caso de que no la encuentre, se puede buscar por internet y descargar sin ningún problema.

La librería está compuesta por la función “generate_tone()” donde se le entrarán dos variables como parámetro, por una parte la nota y por otra el tipo de nota si es blanca o negra. Al entrar la nota, en realidad entramos una variable con un índice de array ya que hará referencia a una tabla ya que la librería distingue 4 tipos de octavas según la frecuencia. En realidad la librería tiene construida la siguiente tabla:

// NOTE FREQUENCY
// Octave0 Octave1 Octave2 Octave3
const long C_NOTE[4] ={ 262, 523, 1047, 2093};
const long Db_NOTE[4] ={ 277, 554, 1109, 2217};
const long D_NOTE[4] ={ 294, 587, 1175, 2349};
const long Eb_NOTE[4] ={ 311, 622, 1245, 2489};
const long E_NOTE[4] ={ 330, 659, 1329, 2637};
const long F_NOTE[4] ={ 349, 698, 1397, 2794};
const long Gb_NOTE[4] ={ 370, 740, 1480, 2960};
const long G_NOTE[4] ={ 392, 784, 1568, 3136};
const long Ab_NOTE[4] ={ 415, 831, 1661, 3322};
const long A_NOTE[4] ={ 440, 880, 1760, 3520};
const long Bb_NOTE[4] ={ 466, 923, 1865, 3729};
const long B_NOTE[4] ={ 494, 988, 1976, 3951};

Hay un detalle importante y aviso por si alguien no tiene conocimientos básicos de música, la notación utilizada es la que generalmente se usa en tablaturas donde:

C = DO , D = RE, E = MI, F= FA, G= Sol, A= LA, B= SI

Para utilizar la función correctamente tendremos:

Código:
generate_tone( nota, tipo);


Por ejemplo si querémos generar un DO de una partitura cuya duración es de negra, llamarémos a la siguiente función:

Código:
generate_tone(C_NOTE[1], negra);

Según la tabla de valores, sería equivalente a:

Código:
generate_tone(262, negra);


La parte mas importante, en cuanto al piano, es la detección de la tecla pulsada, donde según la que sea utilizando la función input_state se generará la nota que toque.

A continuación dejo el proyecto, por una parte la simulación en proteus y por otra el código fuente:

- Descarga el proyecto dado electrónico ()Simulación + Codigo fuente
avatar
Skapunky
Admin
Admin

Posts : 493
KCoins : 822
Reputación : 21
Fecha de inscripción : 16/06/2008

Premios :
Staff


Ver perfil de usuario http://www.killtrojan.net

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 
Permisos de este foro:
No puedes responder a temas en este foro.