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

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:

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:
generate_tone(C_NOTE[1], negra);
Según la tabla de valores, sería equivalente a:

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)

- Ver el codigo fuente completo (pastebin)

9 comentarios:

red.triger@gmail.com dijo...

Gracias es el primero que encuentro completo, estoy empezando en esto, necesitaba hacer un proyecto, todo me funciona bien, solo q la canción se escucha muy lenta, y la bocina bajito, puedes recomendarme algo para mejorar estos aspectos? el cristal solo encontre de 40000 mhz, tendra q ver? de nuevo gracias por tu tiempo y tu trabajo

Albert López dijo...

Hola red.triger, es muy probable que el problema sea el cristal de cuarzo ya que dependen de él los ciclos del microcontrolador. Yo de tí intentaría aumentar la velocidad.

Otro problema que se me ocurre es que hayas utilizado dos condensadores de valor equivocado, no se que microcontrolador utilizas pero te recomiendo que mires su datasheet ya que muchas veces dan valores estándares del cristal de cuarzo y los condensadores adecuados a utilizar.

red.triger@gmail.com dijo...

muchas gracias por tu respuesta, uso el mismo pic que tienes en el diagrama, creo q pondre uno de 1mhz creo q es el mismo que usas vrd? otra duda mas espero mepuedas ayudar, intento poner un led al lado de cada boton de activacion de cada sonido, pero al intentarlo activar se escucha mal, y hasta mas bajo, puedo bajarlos ohms de las resistencias o q puedo hacer para q funcione bien, sobre aumentar el amplificador de sonido, hay algun transistor q me recomiendes? o q tenga la posiblidad de regular el volumen?

Unknown dijo...

me marca un error al querer compilarlo y tengo mucho tiempo trtando de solucionarlo **Error 128 line23(1,2)a #device required before this line, sabes porque lo marca? como lo puedo solucionar?

Unknown dijo...

puedo modificar la librería quiero utilizar un piano de 5 octavas

Enrique dijo...

muy buena informacion amigo.. disculpa lo puedo programar en un pic16f877A?¿?¿?¿

Unknown dijo...

oigan en que programa lo grabas, o bueno en k software meto el codigo no entiendo esa parte

Unknown dijo...

hola amigo.. es posible reproducir notas midi con esta programacion? .. de antemano le agradezco

wiwisticos dijo...

me gustaria que me enviaras el link de la libreria para descargarla

Publicar un comentario

Copyright © Microtronic