¿qué es un microcontrolador? cap.8

43
Página 248 · ¿Qué es un Microcontrolador? Capítulo 8: Frecuencia y Sonido SU DÍA Y LOS BEEPS ELECTRÓNICOS Estos son algunos ejemplos de beeps que usted puede oir durante un día normal: El beep del horno de microondas cuando termina de cocinar su comida. El teléfono celular toca diferentes tonos de beeps de canciones para llamar su atención que está recibiendo una llamada. El cajero automático emite beeps para recordarle que no olvide su tarjeta. La caja registradora de la tienda emite beeps para decirle a la cajera que el código de barras de los abarrotes que pasó sobre el escaner ya lo registró. Algunas calculadoras emiten beeps cuando se presionan incorrectamente las teclas. Usted empezó su día con los beeps de un reloj despertador. MICROCONTROLADORES, BOCINAS Y SEÑALES APAGADO/ ENCENDIDO Todos los beeps que usted oye durante su rutina diaria los generan microcontroladores conectados a bocinas. El microcontrolador crea estos beeps mandando señales rápidas de apag/enc a varios tipos de bocinas. La velocidad de estas señales se llama frecuencia y determina el tono del beep. Cada vez que una señal apag/enc se repite a sí misma se llama ciclo. Usted verá frecuentemente que al número de ciclos por segundo se le llama hertz y se abrevia Hz. Por ejemplo, una de las frecuencias más comunes de los beeps que ayudan a las máquinas a llamar su atención es 2 kHz. Esto significa que las señales high/low se repiten 2000 veces por segundo. Presentando a las Bocinas Piezoeléctricas En esta actividad usted experimentará mandando una variedad de señales a una común, pequeña y barata bocina lllamada bocina piezoeléctrica. A una bocina piezoeléctrica comunmente se le llama bocina piezo o zumbador piezo. Su símbolo esquemático y su dibujo lo muestra la Figura 8-1. Figura 8-1 Bocina Piezoeléctrica. Dibujo y símbolo esquemático.

Upload: lorenzo-m-oliver-bustos

Post on 22-Feb-2016

309 views

Category:

Documents


0 download

DESCRIPTION

Capítulo 8: Frecuencia y Sonido

TRANSCRIPT

Page 1: ¿Qué es un Microcontrolador? Cap.8

Página 248 · ¿Qué es un Microcontrolador?

Capítulo 8: Frecuencia y Sonido

SU DÍA Y LOS BEEPS ELECTRÓNICOS Estos son algunos ejemplos de beeps que usted puede oir durante un día normal: El beep del horno de microondas cuando termina de cocinar su comida. El teléfono celular toca diferentes tonos de beeps de canciones para llamar su atención que está recibiendo una llamada. El cajero automático emite beeps para recordarle que no olvide su tarjeta. La caja registradora de la tienda emite beeps para decirle a la cajera que el código de barras de los abarrotes que pasó sobre el escaner ya lo registró. Algunas calculadoras emiten beeps cuando se presionan incorrectamente las teclas. Usted empezó su día con los beeps de un reloj despertador.

MICROCONTROLADORES, BOCINAS Y SEÑALES APAGADO/ ENCENDIDO Todos los beeps que usted oye durante su rutina diaria los generan microcontroladores conectados a bocinas. El microcontrolador crea estos beeps mandando señales rápidas de apag/enc a varios tipos de bocinas. La velocidad de estas señales se llama frecuencia y determina el tono del beep. Cada vez que una señal apag/enc se repite a sí misma se llama ciclo. Usted verá frecuentemente que al número de ciclos por segundo se le llama hertz y se abrevia Hz. Por ejemplo, una de las frecuencias más comunes de los beeps que ayudan a las máquinas a llamar su atención es 2 kHz. Esto significa que las señales high/low se repiten 2000 veces por segundo.

Presentando a las Bocinas Piezoeléctricas

En esta actividad usted experimentará mandando una variedad de señales a una común, pequeña y barata bocina lllamada bocina piezoeléctrica. A una bocina piezoeléctrica comunmente se le llama bocina piezo o zumbador piezo. Su símbolo esquemático y su dibujo lo muestra la Figura 8-1.

Figura 8-1 Bocina Piezoeléctrica. Dibujo y símbolo esquemático.

Page 2: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 249 ACTIVIDAD #1: CONSTRUYENDO Y VERIFICANDO LA BOCINA En esta actividad usted contruirá y verificará el circuito de la bocina piezoeléctrica.

Partes del Circuito de la Bocina

Una bocina piezoeléctrica Dos cables para puentes.

Construyendo el Circuito de la Bocina Piezoeléctrica.

La terminal negativa de la bocina piezoeléctrica deberá conectarse a Vss, y la terminal positiva deberá conectarse a un pin E/S. El BASIC Stamp deberá programarse para mandar señales high/low a la terminal positiva de la bocina piezoeléctrica.

Si su bocina tiene un aislante quíteselo (no necesita lavarlo) Construya el circuito que muestra la Figura 8-2

P15P14P13P12P11P10

P8P7P6P5P4P3P2P1P0

P9

X2

X3Vdd VssVin

Vss

P9 +

Figura 8-2 Circuito de la bocina piezoeléctrica, Diagrama esquemático y de alambrado.

Funcionamiento de la Bocina Piezoeléctrica

Cuando la cuerda de una guitarra vibra, causa cambios en la presión del aire. Estos cambios en la presión del aire nuestro oido los detecta como un tono. Con cambios rápidos en la presión del aire es mayor el tono, y para cambios lentos en la presión del aire, menor es el tono. El elemento dentro de la caja de plástico de la bocina piezoeléctrica se llama elemento piezoeléctrico. Cuando las señales high/low se aplican a la terminal positiva de la bocina, el elemento piezoeléctrico vibra, y genera cambios en la presión del aire como lo hace la cuerda de la bocina. Y como la cuerda de la bocina, su

Page 3: ¿Qué es un Microcontrolador? Cap.8

Página 250 · ¿Qué es un Microcontrolador? oido detecta los cambios en la presión del aire que genera la bocina piezoeléctrica, y suena típicamente como un beep o un tono.

Programando el Control de la Bocina

La instrucción FREQOUT es una forma conveniente de mandar señales high/low a la bocina para que haga un sonido. El Manual del BASIC Stamp muestra que la sintaxis de la instrucción es:

FREQOUT Pin, Duration, Freq1 {, Freq2} Y como la mayoría de las otras instrucciones usadas en este libro, “Pin” es un valor que usted puede usar para escoger que pin del BASIC Stamp usar. El argumento “Duration” es un valor que le dice a la instrucción FRECOUT que tan largo, en milisengundos, es el tono que deberá tocar. El argumento Freq1, se usa para fijar en hertz la frecuencia del tono, , en hertz . Hay un argumento opcional Freq2 que puede usarse para tocar dos tonos diferentes al mismo tiempo. Así se manda un tono al pin E/S P9 que dura 1.5 segundos y tiene una frecuencia de 2 kHz:

FREQOUT 9, 1500, 2000

Programa Ejemplo: TestPiezoWithFreqout.bs2

Este Programa Ejemplo manda un tono de 2 kHz a la bocina en el pin E/S P9 durante 1.5 segundos. Usted puede usar la Terminal Debug para ver cuando la bocina emite beeps y cuando se detiene.

Meta y corra el programa TestPiezoWithFreqout.bs2 Verifique que la bocina hacer un tono claramente audible durante el tiempo que

la Terminal Debug muestrael mensaje: “Tone sending” (Mandando Tono) ' ¿Que es un Microcontroladirr - TestPiezoWithFreqout.bs2 ' Manda un tono a la bocina piezo usando la instrucción FREQOUT. '{$STAMP BS2} '{$PBASIC 2.5} PAUSE 1000 DEBUG "Mandando Tono...", CR FREQOUT 9, 1500, 2000 DEBUG "Hecho el Tono ."

Page 4: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 251 Su Turno – Ajustando la Frecuencia y Duración

Guarde el programa TestPiezoWithFreqout.bs2 con un nombre diferente. Trate algunos valores diferentes para los argumentos de Duration y Freq1. Después de cada cambio, ejecute el programa y escriba el efecto. Conforme el argumento Freq1 se hace mayor ¿sube o baja el tono? Trate valores

de 1500, 2000, 2500 y 3000 para responder este pregunta.

ACTIVIDAD #2: SONIDOS EN ACCIÓN Algunos juguetes contienen microcontroladores que se usan para hacer “sonidos en acción”. Sonidos en acción involucra cambiar rápidamente la frecuencia de la bocina. Usted puede tambien obtener algunos efectos interesantes jugando juntos dos tonos diferentes usando el argumento opcional Freq2 de la instrucción FREQOUT. Esta actividad presenta ambas técnicas.

Programando Sonidos en Acción

La acción y aplicación de sonidos tiene tres componentes diferentes:

1. Pausa 2. Duración 3. Frecuencia

La pausa es el tiempo entre tonos, y usted puede usar la instrucción PAUSE para crearla. La duración es la cantidad de tiempo que dura un tono, usted puede fijarla usando el argumento Duration de la instrucción FREQOUT. La frecuencia determina la característica del tono. A mayor frecuencia, mayor es el tono, a menor frecuencia menor es el tono. Esto lo determina, naturalmente, el argumento Freq1 de la instrucción FREQOUT.

Programa Ejemplo: ActionTones.bs2

El programa ActionTones.bs2 demuestra unas pocas combinaciones de pausa, duración y frecuencia. Esta primer secuencia de tonos suena parecido a su reloj despertador electrónico. El segundo suena como hablaría un robot de película familiar de ciencia ficción. El tercero es un tipo de efecto de sonido que usted podría oir en un video juego antiguo.

Meta y ejecute el programa ActionTones.bs2

Page 5: ¿Qué es un Microcontrolador? Cap.8

Página 252 · ¿Qué es un Microcontrolador? ' ¿Que es un Microcontrolador - ActionTones.bs2 ' Demuestra diferentes combinaciones de pausa, duracion, frecuencia ' pueden usarse para efectos de sonico. '{$STAMP BS2} '{$PBASIC 2.5} duration VAR Word frequency VAR Word PAUSE 1000 DEBUG "Alarm...", CR PAUSE 100 FREQOUT 9, 500, 1500 PAUSE 500 FREQOUT 9, 500, 1500 PAUSE 500 FREQOUT 9, 500, 1500 PAUSE 500 FREQOUT 9, 500, 1500 PAUSE 500 DEBUG "Robot reply...", CR PAUSE 100 FREQOUT 9, 100, 2800 FREQOUT 9, 200, 2400 FREQOUT 9, 140, 4200 FREQOUT 9, 30, 2000 PAUSE 500 DEBUG "Hyperspace...", CR PAUSE 100 FOR duration = 15 TO 1 STEP 1 FOR frequency = 2000 TO 2500 STEP 20 FREQOUT 9, duration, frequency NEXT NEXT DEBUG "Done", CR END

Funcionamiento de ActionTones.bs2

La rutina “Alarma” suena como un reloj despertador. Esta rutina toca un tono con una frecuencia fija de 1.5 kHz que dura 1.5 segundos con retardos fijos entre tonos de 0.5 segundos. La rutina “Robot reply” usa varias frecuencia de duración corta.

Page 6: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 253 La rutina “Hyperspace” no usa retardos, pero varia a la duración y la frecuencia. Usando bucles FOR...NEXT para cambiar rapidamente las variables frecuencia y duración, usted puede obtener algunos efectos interesantes de sonidos. Cuando uno de los bucles FOR...NEXT se ejecuta dentro de otro bucle, se le llama “bucles anidados”. Así trabaja el bucle anidado FOR...NEXT. La variable duración empieza en 15, entonces el bucle For frequency...lo toma y manda frecuencias a la bocina piezoeléctrica de 2000, luego 2020, luego 2040, etc, hasta llegar a 2500. Cuando termina el bucle FOR frequency, el bucle For duration...solo se ha repetido una de sus 15 ves. Entonces resta un 1 al valor de duración y repite el bucle For frequency una y otra vez.

FOR duration = 15 TO 1 FOR frequency = 2000 TO 2500 STEP 15 FREQOUT 9, duration, frequency NEXT NEXT

Programa Ejemplo: NestedLoops.bs2

Para comprender mejor como funciona el bucle anidado FOR...NEXT, el programa NestedLoops.bs2 usa la instrucción DEBUG para mostrar el valor de una versión menos complicada de bucles anidados que utizamos en el programa ActionTones.bs2.

Meta y ejecute el programa NestedLoops.bs2. Examine la salida de la Terminal Debug, y verifique que cambian las variables

duration y frequency cada vez que pasan por el bucle. ' ¿Que es un Microcontrolador? - NestedLoops.bs2 ' Demonstración del funcionamiento del bucle anidad del programa ActionTones.bs2. '{$STAMP BS2} '{$PBASIC 2.5} duration VAR Word frequency VAR Word PAUSE 1000 DEBUG "Duration Frequency", CR, "-------- ---------", CR

Page 7: ¿Qué es un Microcontrolador? Cap.8

Página 254 · ¿Qué es un Microcontrolador? FOR duration = 4000 TO 1000 STEP 1000 FOR frequency = 1000 TO 3000 STEP 500 DEBUG " " , DEC5 duration, " ", DEC5 frecuencia, CR FREQOUT 9, duration, frecuencia NEXT DEBUG CR NEXT END

Su Turno – Más Efectos de Sonido

Hay muchas formas bonitas e ilimitadas que al modificar ActionTones.bs2 genere diferentes combinaciones de sonido. Esta es una modificación a la rutine “Hyperspace”.

DEBUG "Hyperspace jump...", CR FOR duration = 15 TO 1 STEP 3 FOR frequency = 2000 TO 2500 STEP 15 FREQOUT 9, duration, frequency NEXT NEXT FOR duration = 1 TO 36 STEP 3 FOR frequency = 2500 TO 2000 STEP 15 FREQOUT 9, duration, frequency NEXT NEXT

Guarde su Programa Ejemplo con el nombre ActionTonesYourTurn.bs2. Alégrese con esta y otras modificaciones de su propia creación.

Dos Frecuencias al Mismo tiempo

Usted puede tocar dos frecuencias diferentes al mismo tiempo. Recuerde la sintaxis de la instrucción FREQOUT de la Actividad #1.

FREQOUT Pin, Duration, Freq1 {, Freq2}

Usted puede usar el argumento opcional Freq2 para tocar dos frecuencias con una sola instrucción FREQOUT. Por ejemplo, usted puede tocar 2 kHz y 3 kHz de la siguiente forma:

FREQOUT 9, 1000, 2000, 3000

Page 8: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 255

Cada tono de teclado es también un ejemplo de dos frecuencias juntas combinadas. En Telecomunicaciones a esto se le llama DTMF (Dual Tone Multi Frequency) Frecuencia Dual Muti Tono. En PBASIC también hay una instrucción llamada DTMFOUT que esta diseñada justamente para mandar tonos de teléfono. Para ejemplos vea esta instrucción en el Manual BASIC Stamp o en Ayuda.

Programa Ejemplo: PairsOfTones.bs2

Este Programa Ejemplo demuestra la diferencia en tono cuando tocó juntas 2 kHz y 3 kHz. También demuestra un fenomeno interesante que ocurre cuando usted suma dos ondas de sonida que están muy cerca en frecuencia. Cuando usted toca 2000 Hz y 2001 Hz al mismo tiempo el tono entra y sale una vez cada segundo (a un frecuencia de 1 Hz). Si usted toca 2000 Hz y 2002 Hz, el tono entra y sale dos veces por segundo (2Hz) y así sucesivamente.

Batido es cuando dos tonos muy cercanos en frecuencia se tocan juntan originando que el tono que usted oye entra y salga. La frecuencia de ese desvanecimiento es la diferencia entre las dos frecuencias. Si la diferencia es 1 Hz, el tono entra y sale a 1 Hz. Si la diferencia es 2 Hz, el tono entra y sale a 2 Hz.

Las variaciones en la presión del aire que hace la bocina piezoeléctrica se llaman “ondas de sonid” Cuando el tono es más grabe, las variaciones en la presión del aire causadas por las dos frecuencias se agregan una a otra (a esto se le llama superposición). Cuando el tono esta en lo más quieto , las variaciones en la presión del aire se cancelan unas a otras (a esto se se llama interferencia).

Meta y ejecute el programa PairsOfTones.bs2. De un vistaso a la Terminal Debug cuando están tocando los tonos, y observe los

efectos diferentes que se obtienen al mezclar los tonos diferentes. ' ¿Que es un Microcontrolador - PairsOfTones.bs2 ' Demostación de algunos de los efectos que ocurren cuando mezcla dos tonos. '{$STAMP BS2} '{$PBASIC 2.5} PAUSE 1000 DEBUG "Frequency = 2000", CR FREQOUT 9, 4000, 2000 DEBUG "Frequency = 3000", CR FREQOUT 9, 4000, 3000 DEBUG "Frequency = 2000 + 3000", CR FREQOUT 9, 4000, 2000, 3000

Page 9: ¿Qué es un Microcontrolador? Cap.8

Página 256 · ¿Qué es un Microcontrolador? DEBUG "Frequency = 2000 + 2001", CR FREQOUT 9, 4000, 2000, 2001 DEBUG "Frequency = 2000 + 2002", CR FREQOUT 9, 4000, 2000, 2002

DEBUG "Frequency = 2000 + 2003", CR FREQOUT 9, 4000, 2000, 2003 DEBUG "Frequency = 2000 + 2005", CR FREQOUT 9, 4000, 2000, 2005 DEBUG "Frequency = 2000 + 2010", CR FREQOUT 9, 4000, 2000, 2010 DEBUG "Hecho", CR END

Su Turno – Optimización del Código

El programa PairsOfTones.bs2 se escribió para demostrar fenómenos interesantes que suceden cuando usted toca al mismo tiempo dos frecuencias diferentes usando el argumento opcional Freq2 de la instrucción FREQOUT. Sin embargo, es muy ineficiente.

Modifique el programa PairsOfTones.bs2 para que recicle el argumento Freq2 en el rango de 2001 a 2005 usando una variable tamaño “word” y un bucle.

ACTIVIDAD #3: NOTAS MUSICALES Y CANCIONES SENCILLAS La Figura 8-3 muestra las 25 teclas más a la derecha del teclado de un piano. Tambien muestra las frecuencias a las cuales vibra cada alambre dentro del piano cuando usted la golpea.

Page 10: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 257

Figura 8-3 Teclas del Piano a la derecha y sus Frecuencias

Las teclas y sus notas correspondientes están marcadas C6 hasta C8. Estas teclas están separadas en dos grupos de 12, 7 son teclas blancas y 5 son teclas negras. La secuencia de notas se repite en si misma cada 12 teclas. Notas de la misma letra están relacionadas con la frecuencia que se dobla cada octava mayor. Por ejemplo, C7 es dos veces la frecuencia de C6, y C8 es el doble de C7. De igual forma, si va una octava hacia abajo, la frecuencia será la mitad del valor, por ejemplo, A6 es la mitad de frecuencia de A7. Si usted ha escucha a un cantante practicar sus notas cantando el Solfeo, “Do Re Mi Fa Sol La Si Do,” el cantante está intentando igualar la notas que usted obtiene de golpear las teclas blancas del teclado de un piado. Estas teclas blancas se llaman teclas naturales, y el nombre octava se relaciona al doblar la frecuencia con cada ocho teclas naturales. La tecla negra del piano se le llama Bemol o Sostenido. Por ejemplo la tecla negra entre C y D se llama C Bemol (C#)o D Sostenido El nombre x o y depende de la pieza particular que se está tocado, y las reglas de esto pertenecen a las lecciones de música.

Programando Notas Musicales

La instrucción FREQOUT también es útil para notas musicales. Programar el BASIC Stamp para tocar música usando un bocina piezo involucra seguir una variedad de reglas

Page 11: ¿Qué es un Microcontrolador? Cap.8

Página 258 · ¿Qué es un Microcontrolador? usadas al tocar música usando otro instrumento musical. Estas reglas se aplican a los mismos elementos que se usaron para hacer efectos de sonido: frecuencia, duración y pausa. El siguiente Programa Ejemplo toca algunas de las frecuencias de las notas musicales en la bocina piezo cada una con una duración de medio segundo.

Programa Ejemplo: DoReMiFaSolLaTiDo.bs2

Meta y ejecute el programa DoReMiFaSolLaTiDo.bs2 ' ¿Que es un Microcontrolador - DoReMiFaSolLaTiDo.bs2 ' Manda notas de una octava medio segundo usando una bocina piezo. '{$STAMP BS2} '{$PBASIC 2.5} PAUSE 1000 'Solfege Tone Note DEBUG "Do...", CR: FREQOUT 9,500,1047 ' C6 DEBUG "Re...", CR: FREQOUT 9,500,1175 ' D6 DEBUG "Mi...", CR: FREQOUT 9,500,1319 ' E6 DEBUG "Fa...", CR: FREQOUT 9,500,1396 ' F6

DEBUG "Sol..", CR: FREQOUT 9,500,1568 ' G6 DEBUG "La...", CR: FREQOUT 9,500,1760 ' A6 DEBUG "Ti...", CR: FREQOUT 9,500,1976 ' B6 DEBUG "Do...", CR: FREQOUT 9,500,2093 ' C7 END

Su Turno – Notas Bemol/Sostenido

Use las frecuencias mostradas en la Figura 8-3 para agregar las cinco notas bemol/sostenido al programa DoReMiFaSolLaTiDo.bs2. Modifique su programa para que toque la siguiente octava superior. Sugerencia: Haga sus operaciones y use la operación * 2 depués de cada argumento Freq1. Por ejemplo, FREQOUT 9, 500, 1175 * 2 esto multiplicara D6 por 2 y le dará a usted D7, que es la nota D en la séptima octava.

Page 12: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 259 Almacenando y Retirando Secuencias de Notas Musicales

Una forma de guardar notas musicales es almacenandola en el módulo EEPROM del BASIC Stamp. Aunque usted podría usar algunas instrucciones WRITE para hacer esto, una mejor forma es usar la directiva DATA. Esta es la sintaxis para la directiva DATA:

{Symbol} DATA {Word} DataItem {, {Word} DataItem, … } Este es un ejemplo para usar la directiva DATA para almacenar los caracteres que corresponden a las notas musicales.

Notes DATA "C","C","G","G","A","A","G" Usted puede usar la instrucción READ para accesar estos caracteres. La letra “C” se localiza en la dirección Notes + 0, la segunda letra “C” se localiza en Notes + 1. Entonces, hay una letra “G” en Notas + 2, y así sucesivamente. Por ejemplo si usted desea cargar la última letra “G” en una variable byte llamada noteLetter, use la instrucción: READ Notes + 6, noteLetter Usted también puede almacenar listas de números usando la directiva DATA. Los valores de Frecuencia y duración que usa el BASIC Stamp para las notas musicales necesitan estar almacenadas en variables tamaño “word” porque son generalmente mayores a 255. Así es como se hace con la directiva DATA.

Frequencies DATA Word 2093, Word 2093, Word 3136, Word 3136, Word 3520, Word 3520, Word 3136 Como cada uno de estos valores ocupa dos bytes, para accesarlos con la instrucción READ es diferente a accesar caracteres. El primer 2093 está en Frequencies + 0, pero el segundo 2093 se localiza en Frequencies + 2. El primer 3136 se localiza en Frecuencies +4, y el segundo 3136 se localiza en Frequencies + 6.

Los valores en la directiva DATA Frequencies corresponde con notas musicales in la directiva Notes DATA directive.

Este es un bucle FOR...NEXT que coloca Notes DATA en una variable llamada noteLetter, luego coloca Frequencies DATA en una variable llamada noteFreq.

FOR index = 0 to 6

Page 13: ¿Qué es un Microcontrolador? Cap.8

Página 260 · ¿Qué es un Microcontrolador?

READ Notes + index, noteLetter READ Frequencies + (index * 2), Word noteFreq DEBUG noteLetter, " ", DEC noteFreq, CR NEXT

¿Qué hace (index * 2)?

Cada valor almacenado en la directiva Frequencies DATA toma un “word” (dos bytes), mientras cada carácter en la directiva Notes DATA solamente toma un byte. El valor de index se incrementa por 1 cada vez en el bucle FOR...NEXT. Esto está bien al accesar los caracteres de las notas usando la instruccón READ Notes + index, noteLetter. El problema es que para cada uno de los bytes en Notes, la variable index necesita apuntar dos veces hacia debajo de la lista Frequencies. La instrucción READ Frequencies + (index * 2), Word noteFreq, se encarga de esto.

El siguiente Programa Ejemplo almacena notas y duraciones usando DATA, y usa la instrucción FREQOUT para tocar cada frecuencia de nota en una duración específica. El resultado es las primeras pocas notas de la canción de niños “Twinkle Twinkle Little Star.” {XW” Twinkle Twinkle Little Star ”}

La canción “El Alfabeto” la usan los niños para memorizar las letras “ABCDs”y usa las mismas notas de “Twinkle Twinkle Little Star.”

Programa Ejemplo: TwinkleTwinkle.bs2

Este programa ejemplo demuestra como usar la directiva DATA para almacenar listas y como usar la instrucción READ para accesar los valores de las listas.

Meta y ejecute el programa TwinkleTwinkle.bs2 Verifique que el sonido de las notas se parecea la canción “Twinkle Twinkle

Little Star.” Use la Terminal Debug para verificar que trabaja como se espera.

' ¿Que es un Microcontrolador? - TwinkleTwinkle.bs2 'Toca las primeras siete notas de la canción Twinkle Twinkle Little Star. '{$STAMP BS2} '{$PBASIC 2.5} Notes DATA "C","C","G","G","A","A","G" Frequencies DATA Word 2093, Word 2093, Word 3136, Word 3136, Word 3520, Word 3520, Word 3136

Page 14: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 261 Durations DATA Word 500, Word 500, Word 500, Word 500, Word 500, Word 500, Word 1000 index VAR Nib noteLetter VAR Byte noteFreq VAR Word noteDuration VAR Word PAUSE 1000 DEBUG "Note Duration Frequency", CR, "---- -------- ---------", CR FOR index = 0 TO 6 READ Notes + index, noteLetter DEBUG " ", noteLetter READ Durations + (index * 2), Word noteDuration DEBUG " ", DEC4 noteDuration READ Frequencies + (index * 2), Word noteFreq DEBUG " ", DEC4 noteFreq, CR FREQOUT 9, noteDuration, noteFreq NEXT END

Su Turno – Agregando y Tocando Más Notas

Este programa tocó las primeras siete notas de Twinkle Twinkle Little Star. Las sílabas son: “Twin-kle twin-kle lit-tle star” La siguiente frase de la canción dice “How I wond-er what yor are” y sus notas son F, F, E, E, D, D, C. E igual que la primera frase, se sostine dos veces que las otras notas. Para agregar esta frase a la canción del programa TwinkleTwinkle.bs2, usted necesita expander apropiadamente cada directiva DATA. No olvide cambiar el bucle FOR...NEXT para que vaya de 0 a 13 en lugar de 0 a 6.

Modifique el programa TwinkleTwinkle.bs2 para que toque las dos primeras frases de la canción en lugar de solamente la primera frase.

ACTIVIDAD #4: MÚSICA CON MICROCONTROLADOR Las duraciones de las notas en una hoja de música no se graba en terminos de milisegundos. En lugar de eso se decriben como notas: entero, mitad, cuarto, octavos, diecisesavos, y treinta y dosavos. Como su nombre lo sugiere, media nota dura la mitad de un entero, Un cuarto de nota dura la cuarta parte de tiempo de lo que dura una nota entera. ¿Cuánto dura una nota entera? Depende de la pieza de música que se está tocando.

Page 15: ¿Qué es un Microcontrolador? Cap.8

Página 262 · ¿Qué es un Microcontrolador? Una pieza se puede tocar en un tempo que hace que una nota entera dure cuatro segundo, en otra pieza la nota entera dura dos segundos y otras pueden tener otra duración. Descansos son los tiempos entre notas que no se tocan tonos. La duración de los descansos tambien se miden en entero, mitad, cuarto, octavo, dieciseisavo y treinta y doseavos.

Más de Musica con microcontrolador. Después de completar esta actividad, usted estará listo para aprender como escribir códigos musicales en PBASIC a partir de las hojas de música. Vea el tutorial Tocando música de partitura con la bocina piezo, y su primer video en www.parallax.com/go/WAM.

Un Sistema Mejorado para Almacenar y Retirar Música

Usted puede escribir programas que almacenen dos veces más música en su BASIC Stamp usando bytes en lugar de words en sus directivas DATA. Usted puede también modificar su programa para hacer fácil de leer las notas musicales usando una de las convenciones más comunes para las notas y su duración. Esta actuvidad empezará presentado como almacenar información musical en una forma que relacione los conceptos de notas, duración y descansos o silencios. Tambien se presentará el Tempo, y lo analizará en la siguiente actividad. Esta es una de las directivas DATA que almacena notas musicales y duraciones para el siguiente Programa Ejemplo. Cuando se toque se parecerá a la canción “Martinillo”. Solo se almacenarán los caracteres de las notas en la directiva Notes DATA porque las instrucciones LOOKUP y LOOKDOWN se usarán para acoplar letras con sus correspondientes frecuencias.

Notes DATA "C","D","E","C","C","D","E","C","E","F", "G","E","F","G","Q" Durations DATA 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 2 WholeNote CON 2000

El primer número en la directiva Durations DATA le indica al programa cuanto debe durar la primera nota de la directiva Notes Data. La segunda duración es para la segunda nota, y así sucesivamente. Las duraciones no están en terminos de milisegundos. En lugar de eso son números mucho más pequeños que pueden almacenarse en bytes, entonces no

Page 16: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 263 hay prefijo Word en la directiva DATA. Comparado con almacenar valores en terminos de milisegundos, estos números se relacionan más con la partitura. Esta es una lista de lo que significa cada duración. 1 nota entera 2 media nota 4 cuarto de nota 8 octavo de nota 16 dieciseisavo de nota 32 treintaydosavo de nota Después que se lee cada valor de la directiva Durations DATA, se divide entre el valor de WholeNote para obtener la Duration usada en la instrucción FREQOUT. La cantidad de tiempo que dura cada nota depende del tempo de la canción. Un tempo rápido significa que cada nota dura menos tiempo, mientras que un tempo lento significa que cada nota dura más tiempo. Como todas las duraciones de las notas son fracciones de una nota entera, usted puede usar la duración de la nota entera para fijar el tempo.

¿Qué significa “Q” en Notes DATA? “Q” se usa para “salir” y DO UNTIL...LOOP verifica “Q” cada vez en el bucle y lo repetirá hasta que lo encuentra.

¿Cómo toco un silencio? Usted puede insertar un silencio entre notas insertando una “p”. La sección “Su Turno” tiene las primeras pocas notas de la 5ª. Sinfonía de Beethoven que tiene un silencio.

¿Cómo toco notas bemol/sostenido? El programa NotesAndDurations.bs2 tiene valores en las tablas lookup para notas bemol/sostenido. Cuando usted usa con letra minúscula, usted toca la nota bemol. Por ejemplo, si usted desea tocar B-sostenido, use “b” en lugar de “B”. Recuerde que esta tiene la misma frecuencia que A-bemol.

Programa Ejemplo: NotesAndDurations.bs2

Meta y ejecute el programa NotesAndDurations.bs2 ¿Cómo se oye?

Page 17: ¿Qué es un Microcontrolador? Cap.8

Página 264 · ¿Qué es un Microcontrolador? ' ¿Que es un Microcontrolador - NotesAndDurations.bs2 ' Toca las primeras notas de Martinillo. '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Program Running!" Notes DATA "C","D","E","C","C","D","E","C","E","F", "G","E","F","G","Q" Durations DATA 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 2 WholeNote CON 2000 index VAR Byte offset VAR Nib noteLetter VAR Byte noteFreq VAR Word noteDuration VAR Word DO UNTIL noteLetter = "Q" READ Notes + index, noteLetter LOOKDOWN noteLetter, [ "A", "b", "B", "C", "d", "D", "e", "E", "F", "g", "G", "a", "P", "Q" ], offset LOOKUP offset, [ 1760, 1865, 1976, 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 0, 0 ], noteFreq READ Durations + index, noteDuration noteDuration = WholeNote / noteDuration FREQOUT 9, noteDuration, noteFreq index = index + 1 LOOP END

Funcionamiento de NotesAndDurations.bs2

Las directivas Notes y Durations DATA se analizaron antes del programa. Estas directivas combinadas con la constante WholeNote se usaron para almacenar todos los datos musicales usados por el programa.

Page 18: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 265 Abajo se muestran las declaraciones para las cinco variables usadas en el programa. Incluso aunque ya no usa el bucle FOR...NEXT para accesar los datos, ahí todavía tiene que estar una variable (index) que mantiene el ajuste por el cual entra DATA que está siendo leida por Notes y Durations. La variable offset se usa con las instrucciones LOOKUP y LOOKDOWN para seleccionar un valor particular. La variable noteLetter almacena un carácter que accesa la instrucción READ. Las instrucciones LOOKUP u LOOPDOWN se usan para convertir este carácter en un valor de frecuencia. Este valor se almacena en la variable noteFreq y se usa como argumento Freq1 de la instrucció FREQOUT. La variable noteDuration se usa en la instrucción READ para recibir un valor de Durations DATA. Y también se usa para calcular el argumento Duration para la instrucción FREQOUT.

index VAR Byte offset VAR Nib noteLetter VAR Byte noteFreq VAR Word noteDuration VAR Word

El bucle principal se mantiene en ejecución hasta que la letra “Q” se lee de NotesDATA.

DO UNTIL noteLetter = “Q” Una instrucción READ obtiene un caracter de NotesDATA, y lo almacena en la variable noteLetter. Entonces, la variable noteLetter se usa en la instrucción LOOKUP para fijar el valor de la variable offset. Recuerde que offset almacena un 2 si se detecta “b”, un 2 si se detecta “B”, un 3 si se detecta “C” y así sucesivamente. Entonces este valor de offset se usa en una instrucción LOOKUP to para calcular cual deberá ser el valor de la variable noteFreq. Si offset es 1, noteFreq será 1865, si offset es 2, noteFreq será 1876, si offset es 3, noteFreq es 2093 y así sucesivamente.

READ Notes + index, noteLetter LOOKDOWN noteLetter, [ "A", "b", "B", "C", "d", "D", "e", "E", "F", "g", "G", "a", "P", "Q" ], offset LOOKUP offset, [ 1760, 1865, 1976, 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 0, 0 ], noteFreq

Page 19: ¿Qué es un Microcontrolador? Cap.8

Página 266 · ¿Qué es un Microcontrolador? La frecuencia de la nota se ha determinado, pero todavía tiene que calcularse la duración. La instrucción READ usa el valor de “index” para colocar un valor de Duration DATA a NoteDuration.

READ Duration + index, noteDuration Entonces, noteDuration es iguala a la constante WholeNote dividida entre noteDuration. Si noteDuration empieza en 4 de la instrucción READ, se convierte en 2000/4 = 500. Si noteDuration es 8, se convierte en 2000/8 = 250.

noteDuration = WholeNote / noteDuration Ahora que ya se han determinado los valores de noteDuration y noteFrequ, la instrucción FREQOUT toca la nota.

FREQOUT 9, noteDuration, noteFreq Cada vez que pasa por el bucle principal, el valor de “index” se incrementa por uno. Cuando el bucle principal regresa al principio, la primer acción que el programa hace es leer la siguiente nota , usando la variable “index”.

index = index + 1 LOOP

Su Turno – Experimentando con Tempo y una Canción Diferente

La longitud de tiempo que cada nota pierde se relaciona con el tempo. Usted puede cambiar el tempo ajustando la constante WholeNote. Si usted la incrementa a 2250, el tempo decrecerá, y la canción se reproducirá más despacio. Si usted disminuye la constante a 1750, el tempo aumentará y la canción se reproducirá más rápido.

Guarde el programa NotesAndDurations.bs2 con el nombre NotesAndDurationsYourTurn.bs2

Modifique el tempo del programa NotesAndDurationsYourTurn.bs2 ajustando el valor de WholeNote. Pruebe valores de 1500, 1750, 2000 y 2250.

Ejecute el programa después de cada modificación, y elija cual se escucha mejor. Meter los datos musicales es mucho más fácil cuando todo lo que tiene que hacer es grabar notas y duraciones. Estas son las primeras ocho notas de la Quinta Sinfonía de Beethoven.

Notes DATA "G","G","G","e","P","F","F","F","D","Q"

Page 20: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 267

Durations DATA 8, 8, 8, 2, 8, 8, 8, 8, 2 WholeNote CON 2000

Guarde su programa modificado como Beethoven’s Fifth.bs2 Reemplace las directivas Notes y Durations DATA y la declaración de la

constante WholeNote con el código de arriba. Ejecuteel programa. ¿Le parece familiar?

Agregando Características Musicales

Al Programa Ejemplo le acaba de introducir notas, duraciones y silencios. También usa la duración de una nota entera para determinar el tiempo. Estas son tres características adicionales que podemos agregar a un programa que toca música;

• Tocar notas “punteadas” • Determinar la duración de la nota entero a partir del tempo • Tocar notas de más de una octava.

The termino “punteadas” se refiere a un punto usado en la partitura para indicar que una nota deberá tocarse 1 ½ veces más de su duración normal. Por ejemplo, una nota de un cuarto punteada deberá durar la duración de una nota de un cuarto más un octavo de nota. Una nota de un medio punteada dura una mitad mas un cuarto de duración. Usted puede agregar una tabla de datos que almacene notas punteadas s sin puntear. En este ejemplo, un cero significa una nota sin puntear, y un uno una nota punteada.

Dots DATA 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0

Los programas que reproducen música típicamente expresan el tempo de una canción en batidos por minuto. Esto es lo mismo que decir notas de un cuarto por minuto. BeatsPerMin CON 200 La Figura 8-4 es una repetición de la Figura 8-3. Esta muestra las 6ta. Y 7ta. Octavas del teclado de un piano. Estas son dos octavas que suenan con claridad cuando las toca la bocinapiezo. Este es un ejemplo de la directiva DATA que usted usará en la sección Su Turno para tocar más de una octava usando la directiva NotesDATA.

Octaves DATA 6, 7, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6

Page 21: ¿Qué es un Microcontrolador? Cap.8

Página 268 · ¿Qué es un Microcontrolador?

Figura 8-4 Teclas del Piano más a la derecha y Sus Frecuencias.

Programa Ejemplo: MusicWithMoreFeatures.bs2

Este Programa Ejemlo toca las primeras notas de “For He’s a Jolly Good Fellow.” Todas las notas pertenecen a la misma (7ª.) octava, pero algunas de las notas están punteadas. En la sección Su Turno, usted intentará un ejemplo que usa notas se usa notas de más de una octava y notas punteadas.

Meta y corra el programa MusicWithMoreFeatures.bs2 Cuente las notas y vea si usted puede oir las notas punteadas (con 1 ½ duración)- También escuche las notas de la 7ª. Octava. Trate de cambiar una de estas notas

a la 6ª. Octava. El cambio en el sonido de la música es hermosamente drástico. ' ¿Que es un Microcontrolador - MusicWithMoreFeatures.bs2 ' Toca el comienzo de He's a Jolly Good Fellow. '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Program Running!"

Page 22: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 269 Notes DATA "C","E","E","E","D","E","F","E","E","D","D", "D","C","D","E","C","Q" Octaves DATA 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 Durations DATA 4, 2, 4, 4, 4, 4, 2, 2, 4, 2, 4, 4, 4, 4, 2, 2 Dots DATA 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 BeatsPerMin CON 320 index VAR Byte offset VAR Nib noteLetter VAR Byte noteFreq VAR Word noteDuration VAR Word noteOctave VAR Nib noteDot VAR Bit wholeNote VAR Word wholeNote = 60000 / BeatsPerMin * 4 DO UNTIL noteLetter = "Q" READ Notes + index, noteLetter LOOKDOWN noteLetter, [ "C", "d", "D", "e", "E", "F", "g", "G", "a", "A", "b", "B", "P", "Q" ], offset LOOKUP offset, [ 4186, 4435, 4699, 4978, 5274, 5588, 5920, 6272, 6645, 7040, 7459, 7902, 0, 0 ], noteFreq READ Octaves + index, noteOctave noteOctave = 8 - noteOctave noteFreq = noteFreq / (DCD noteOctave) READ Durations + index, noteDuration noteDuration = WholeNote / noteDuration READ Dots + index, noteDot IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2 FREQOUT 9, noteDuration, noteFreq index = index + 1 LOOP END

Page 23: ¿Qué es un Microcontrolador? Cap.8

Página 270 · ¿Qué es un Microcontrolador? Funcionamiento de MusicWithMoreFeatures.bs2

Abajo están los datos musicales de la canción completa. Para cada nota en la directiva NotesData, le corresponde una entrada en Octaves, Durations, y la directiva Dost DATA. Por ejemplo, la primera nota es una nota C de la 7ª. Octava, es un cuarto de nota y no está punteada. Este es otro ejemplo, el segundo de la última nota (no incluye salida) es una nota E, de la 7ª. Octava. Es mitad de nota y no esta punteada. También hay una constante BeatPerMin que fija el tempo de la canción.

Notes DATA "C","E","E","E","D","E","F","E","E","D","D", "D","C","D","E","C","Q" Octaves DATA 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 Durations DATA 4, 2, 4, 4, 4, 4, 2, 2, 4, 2, 4, 4, 4, 4, 2, 2 Dots DATA 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 BeatsPerMin CON 320

En el Programa Ejemplo anterior, WholeNote era una constante. Este tiempo, es una variable que no retiene la duración de una nota completa en milisegundos. Después de calcular este valor, WholeNote se usará para determinar todas las duraciones de las otras notas, como se hizo en el programa anterior. Las variables index, offset, noteLetter, y noteDuration también se usaron en la misma manera como se usaron en el programa anterior. La variable noteFreq se maneja un poquito diferente ya que ahora tiene que ajustarse dependiendo de la octava en que se toca la nota. Se han agrefado las variables noteOctave y noteDot para manejar la octava y las características punteadas.

wholeNote VAR Word index VAR Byte offset VAR Nib noteLetter VAR Byte noteFreq VAR Word noteDuration VAR Word noteOctave VAR Nib noteDot VAR Bit

Page 24: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 271 La variable wholeNote se calcula usando BeatsPerMin. El tempo de la canción se define en batidos por minuto, y el programa tiene que dividir BeatsPerMin entre 60000 ms, y luego multiplicarse por 4. El resultado da el valor correcto de una nota completa. WholeNote = 60000/ BeatsPerMin * 4

Las Matemáticas se ejecutan de izquierda a derecha. En el cálculo de wholeNote = 60000/ beatsPerMin * 4, el BASIC Stamp primero calcula 60000/beatsPerMin. Luego el resultado lo multiplica por 4. Los parentesis se pueden usar para agrupar operaciones. Si usted desea dividir entre 4 beatsPerMin primero usted puede hacer esto: wholeNote = 60000/(beatsPerMin*4).

Todo esto es lo mismo como el programa anterior:

DO UNTIL noteLetter = "Q" READ Notes + index, noteLetter LOOKDOWN noteLetter, [ "C", "d", "D", "e", "E", "F", "g", "G", "a", "A", "b", "B", "P", "Q" ], offset

Ahora que las octavas están el el mix, ha cambiado la parte de el código que calculó la frecuencia de la nota. La Tabla de Valores de la instrucción LOOKUP contiene frecuencias de las notas desde la 8ª. Octava. Estos valores pueden dividirse entre 1 si usted desea tocar notas de la 8ª. Octava, Por 2 si usted desea tocar notas en la 7ª. Octava, por 4 si usted desea tocar notas en la 6ª. Octava, y por 8 si usted desea tocar notas en la 5ª. Octava. La divisió se efectua en seguida. Todo lo que hace la instrucción LOOKUP es colocar una nota de la 8ª. Octava en la variable noteFreq.

LOOKUP offset, [ 4186, 4435, 4699, 4978, 5274, 5588, 5920, 6272, 6645, 7040, 7459, 7902, 0, 0 ], noteFreq

Esta es la forma en que la variable noteFreq se ajusta para la octava correcta. Primero, la instrucción READ dimensiona el valor almacenado de la octava en Octaves DATA. Este pudiera ser un valor entre 5 y 8.

Page 25: ¿Qué es un Microcontrolador? Cap.8

Página 272 · ¿Qué es un Microcontrolador? READ Octaves + index, noteOctave Dependiendo de la octava, deseamos dividir noteFreq por 1, 2, 4, o 8. Esto significa que el objetivo es es realmente dividir por 20 = 1, 21 = 2, 22 = 4, or 23 = 8. La siguiente frase de abajo toma el valor de noteOctave, el cual puede ser un valor entre 5 y 8 y resta ese valor de 8. Si noteOctave fue 8, ahora es 0. Si noteOctave fue 7 ahora es 1. Si noteOctave fue 6, ahora es 2, y si noteOctave fue 5, ahora es 3. noteOctave = 8 – noteOctave Ahora, noteOctava es un valor que puede usarse como un exponente de 2, ¿pero como elevamos a la potencia 2 en PBASIC? Una solución es usando el operador DCD. DCD 0 es 1, DCD1 es 2, DCD 2 es 4 y DCD 3 es 8. Al dividir noteFreq por DCDnoteOctava significa que usted está dividiendo por 1, 2, 4, y 8, el cual divide noteFreq bajandolo al valor correcto. El resultado final es que noteFreq se fija en la octava correcta. Usted usará la Terminal Debug en la sección Su Turno para poner más atención en su funcionamiento.

NoteFreq = noteFreq / (DCD noteOctave)

¿Como puedo ser experto en usar el operador DCD? Manteniendose aprendiendo y practicando. Cada vez que usted vea una nueva: instrucción, operador, o palabra clave que se usa en un ejemplo consulte el Manual BASIC Stamp. Léalo y trate de usarlo en un programa de su propio diseño.

Adquiera el hábito de de leer periódicamente el Manual BASIC Stamp y trate de reducir los Programas Ejemplo. Esta es la mejor forma de familiarizarse con las diferentes instrucciones y operadores y su funcionamiento. Haciendo estas actividades, usted desarrollara el hábito de siempre agregarlos a la lista de herramientas de programación que usted puede usar para resolver problemas.

Las primeras dos líneas del código para determinar la duración de la nota son casi iguales a las del código del Programa Ejemplo anterior. Ahora, sin embargo, una nota pudiera estar punteada y esto significa que la duración tendría que multiplicarse por 1.5. Se usa un instrucción READ para accesar valores en la EEPROM con la directiv Dots DATE. La frase IF...THEN se usa para multiplicar por 3 y dividir por 2 siempre y cuando el valor de la variable noteDot es 1.

READ Durations + index, noteDuration noteDuration = WholeNote / noteDuration READ Dots + index, noteDot IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2

Page 26: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 273

Matemática de Numeros Enteros El BASIC Stamp no procesa automáticamente un número como 1.5. Cuando hace matemáticas solamente trabaja con números enteros..., -5, -4, -3, -2, -1, 0, 1, 2, 3,... La mejor solución para multiplicar por 1.5 es multiplicar por 3/2. Primero multiplica por 3 y luego divide por 2.

Hay algunas formas para programar el BASIC Stamp para que maneja valores fraccionales. Usted puede programar el BASIC Stamp que use enteros para calcular la parte fracciónal de un número. Esto se presenta en la Guia del Estudiante de Circuitos Básicos Analógicos y Digitales. Hay también dos operadores que hacen que los valores fraccionales sean faciles de trabajar, y estos son Multiplicación Alta y Multiplicación Middle. Estos se explican con detalla en la Guía del Estudiante de Sensores Aplicados y en el Manual de BASIC Stamp.

Lo restante de este programa ejemlo funciona de la misma forma que lo hizo en el Programa Ejemplo anterior:

FREQOUT 9, noteDuration, noteFreq index = index + 1 LOOP END

Su Turno – Tocando una Canción con Más de Una Octava

El programa MusicWithMoreFeatures.bs2 usó silencios, pero se mantuvo en una octava. La canción “Take Me Out of the Ball Game” abajo mostrada toca la mayoría de las notas en la 6ª. Octava. Hay dos notas en la 7ª. Octava y esto hace una gran diferencia en sus sonidos.

Guarde una copia del programa MusicWithMoreFeaturesYourTurn.bs2 Modifique el programa reemplazando las cuatro directivas data y una

declaración de constante con lo siguiente:

Notes DATA "C","C","A","G","E","G","D","P","C","C","A", "G","E","G","Q" Octaves DATA 6, 7, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6 Durations DATA 2, 4, 4, 4, 4, 2, 2, 4, 2, 4, 4, 4, 4, 2 Dots DATA 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 BeatsPerMin CON 240

Ejecute el programa y verifique que suene correctamente.

Page 27: ¿Qué es un Microcontrolador? Cap.8

Página 274 · ¿Qué es un Microcontrolador? Las dos notas de la 7ª. Octava son esenciales para hacer que la canción suene correctamente. Es interesante escuchar que sucede si estos 7 valores se cambian a 6.

Trate de cambiar los dos valores 7 en la directiva Octaves DATA, para que sean 6.

Recuerde que este cambio hará que “Take Me out to the Ball” suene feo. Ejecute el programa y escuche el efecto de las octavas incorrectas de la canción. Cambie la directiva Octaves DATA a su estado original. Ejecute el programa otra vez y escuche para ver si el sonido suena otra vez

correctamente.

ACTIVIDAD #5: TONOS TELEFÓNICOS CON RTTTL Los viejos teléfonos celulares usaban para tocar tonos telefonicos un bocina piezo. Los tonos se bajaban de la web a una computadora y se cargaban de la computadora al teléfono celular. En ese tiempo, en ese tiempo una de las formas más usadas de composición, grabación y traslado de tono eran cadenas de texto con caracteres que describen cada nota en la canción. Este es un ejemplo de cómo eran las primeras notas de la 5ª. Sinfonía de Beethoven.

Beethoven5:d=8,o=7,b=125:g,g,g,2d#,p,f,f,f,2d Este formato para almacnar datos nusicales se llama RTTTL {} que es Ringing Tone Text Transfer Language {} Lenguaje de Transferencia de Texto de Tonos Teléfonicos. La gran característica de los archivos RTTTL fue que eran ampliamente compartidos a traves de WWW. Alguno sitios tenían archivos RTTL disponibles para descargarlos libremente. Estos eran también programas de software libre que se podían usar para componer y emular archivos y después descargarlos en su teléfono celular. Las especificaciones de RTTTL todavía se publican en línea. El anexo C resume como se almacenan notas, duraciones, pausas, tempo y notas punteadas con archivos RTTTL. Esta actividad presenta algunas técnicas de programación con PBASIC que puede usar para reconocer diferentes elementos de texto. La habilidad para reconocer diferentes caracteres o grupos de caracteres tomar acciones basadas en lo que contienen esos caracteres es extraordinariamente útil. De hecho, es la clave para convertir formato RTTTL (como la Quinta de Beethoven arriba mostrada) en música. Al final de esta actividad, hay un Programa de Aplicación que usted puede usar para tocar tonos con formato RTTTL.

Page 28: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 275 Seleccionando que Bloque de Código Ejecutarse en Función de Caso por Caso

La frase SELECT...CASE es probablemente la mejor herramienta de programación para reconocer caracteres o valores. Recuerde que esta es una de las herramientas usadas para convertir tonos de teléfonos en notas musicales. En general, SELECT...CASE se usa para:

• Seleccionar una variable o expresión. • Evaluar la variable o expresión en función de caso por caso. • Ejecutar diferentes bloques de código dependiendo en que caso es adecuado el

valor de esa variable. Here is the syntax for SELECT...CASE: SELECT expression

CASE condition(s) statement(s) { CASE ELSE statement(s) } ENDSELECT

Usted puede intentar los dos siguiente Programas Ejemplo para ver como funciona SELECT...CASE. El pograma SelectCaseWithValues.bs2 toma valores numéricos que usted mete en la Terminal Debug y le indica el tamaño mínimo de la variable que usted necesitará para mantener ese valor. El programa SelectCaseWithCharacters.bs2 le dice a usted en la Terminal Debug si usted metió una letra mayúscula, minúscula, un dígito o un signo de puntuación. Recuerde usar la ventana de Transmisión en la Terminal Debug para mandar los caracteres que usted escribe en el BASIC Stamp. La Figura 8-5 muestra la ventanas de Transmisión y Recepción.

Windowpanes

Transmit →

Receive →

Figura 8-5 Mandando Mensajes al BASIC Stamp Haga click en la ventana Transmitir (arriba) para meter el valor o carácter que usted desea transmitir a el BASIC Stamp..

Page 29: ¿Qué es un Microcontrolador? Cap.8

Página 276 · ¿Qué es un Microcontrolador? Programa Ejemplo: SelectCaseWithValues.bs2

Meta y ejecute el programa SelectCaseWithValues.bs2. En la Terminal Debu, asegurese que en la ventanita no esta marcada Echo Off. Haga click en la ventana Transmitir de la Terminal. Meta un valor entre 0 y 65535, y presione la tecla Enter.

¿Qué sucede si usted mete un número mayor que 65535? Si usted mete el númere 65536, el BASIC Stamp almacenará el número 0. Si usted mete el número 65537, el BASIC Stamp almacenará el número 1, y así sucesivamente. Cuando un número es demasiado grande para la variable en la que cabe, hay un desbordamiento (overflow). Use la Tabla 8-1 para verificar que el Programa Ejemplo hace las decisiones correctas respecto al tamaño de los números que introdujo en la Terminal Debug.

Table 8-1: Variable Types and Values They Can Store

Tipo de Variables Rango de Valores Bit 0 a 1 Nib 0 a 15 Byte 0 a 255 Word 0 a 65535

' ¿Que es un Microcontrolador? - SelectCaseWithValues.bs2 ' Meta un valor y vea el tamaño mínimo requerido de la variable para retenerlo. '{$STAMP BS2} '{$PBASIC 2.5} value VAR Word PAUSE 1000 DEBUG "Enter a value from", CR, "0 to 65535: " DO DEBUGIN DEC value SELECT value CASE 0, 1 DEBUG "Bit", CR PAUSE 100

Page 30: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 277 CASE 2 TO 15 DEBUG "Nib (Nibble)", CR PAUSE 200 CASE 16 TO 255 DEBUG "Byte", CR PAUSE 300 CASE 256 TO 65535 DEBUG "Word", CR PAUSE 400 ENDSELECT DEBUG CR, "Meta otro valor: " LOOP

Funcionamiento del programa SelectCaseWithValues.bs2

Se declar una variable tamaño word para mantener los valores metidos en la Terminal Debug. value VAR Word La instrucción DEBUGIN toma el número que usted metión y lo coloca en la variable value. DEBUGIN DEC value La frase SELECT escoge la variable value como uno de los casos a evaluar. SELECT value El primer caso es si la variable es igual a 1 o a 0. Si el valor es igual a uno esos números, se ejecutan las instrucciones DEBUG y PAUSE que le siguen. CASE 0, 1 DEBUG “BIT”, CR PAUSE 100 El segundo caso es cuando su valor es igual a cualquier número que va de 2 a15. Si es igual a uno de esos números, se ejecutan las instrucciones DEBUG y PAUSE debajo de ellas. CASE 2 to 15 DEBUG “NIB (Nibble)”, CR PAUSE 200

Page 31: ¿Qué es un Microcontrolador? Cap.8

Página 278 · ¿Qué es un Microcontrolador? Cuando se han hecho todos los casos, la palabra clave ENDSELECT se usa para completar la instrucción SELECT...CASE. ENDSELECT

Programa Ejemplo: SelectCaseWithCharacters.bs2

Este Programa Ejemplo evalua cada caracterque usted mete en la ventana Transmisión de la Terminal Debug. El programa puede reconocer caracteres mayúsculas y minúsculas, digitos y algunos signos de puntuación. Si usted mete un carácter que el programa no reconoce, le dirá que lo intente otra ez (meta un carácter diferente).

Meta y ejecute el programa SelectCaseWithCharacters.bs2. Asegurese que no está marcada la ventanita Echo Off. Haga click en la ventana Transmit de la Terminal Degug para colocar ahí el

cursor. Meta los caracteres en la ventana Transmit y observe los resultados.

' ¿Que es un Microcontrolador? - SelectCaseWithCharacters.bs2 ' Programa que puede identificar algunos caracteres: mayusc/minusc, digito, puntuacion. '{$STAMP BS2} '{$PBASIC 2.5} character VAR Byte PAUSE 1000 DEBUG "Meta un caracter: ", CR DO DEBUGIN character SELECT character CASE "A" TO "Z" DEBUG CR, "Mayusculas", CR CASE "a" TO "z" DEBUG CR, "Minusculas", CR CASE "0" TO "9" DEBUG CR, "Digito", CR CASE "!", "?", ".", "," DEBUG CR, "Puntuacion", CR CASE ELSE

Page 32: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 279 DEBUG CR, "Caracter no conocido.", CR, "Pruebe otro diferente." ENDSELECT DEBUG CR, "Meta otro caracter", CR LOOP

Funcionamiento de SelectCaseWithCharacters.bs2.

Cuando lo comparamos con el programa SelectCaseWithValues.bs2, este Programa Ejemplo tiene unas pocas diferencias. Primero, el nombre de la variable value se cambió por character, y su tamaño cambió de word a byte. Esto se hace porque todos los caracteres en PBASIC son tamaño byte. La instrucción SELECT escoge la variabe character para la evaluación de caso por caso. SELECT character Las comillas se usan para decirle al Editor de BASIC Stamp que usted se está refiriendo a caracteres. Podemos tratar los siguientes grupos de caracteres y signos de puntuación de la misma forma como un rango de números, ya que el BASIC Stamp los reconoce por sus equivalentes numéricos en ASCII. {}. Vea la ayuda de BASIC Stamp Editor.

SELECT character CASE "A" TO "Z" DEBUG CR, "Upper case", CR CASE "a" TO "z" DEBUG CR, "Lower case", CR CASE "0" TO "9" DEBUG CR, "Digit", CR CASE "!", "?", ".", "," DEBUG CR, "Punctuation", CR

También hay una instrucción diferente “CASE” que no se usó en el ejemplo anterior:

CASE ELSE DEBUG CR, "Character not known.", CR, "Try a different one."

Esta instrucción CASE le indica al bloque de código SELECT que hacer si ninguno de los otros casos es verdadero. Usted puede usar este caso para trabajar metiendo un carácter por ejemplo % y $.

Page 33: ¿Qué es un Microcontrolador? Cap.8

Página 280 · ¿Qué es un Microcontrolador? Su Turno – Seleccionando Caracteres Especiales.

Modifique la frase SELECT...CASE en el programa SelectCaseWithCharacters.bs2 de tal forma que muestre “Carácter Especial” cuando usted meta uno de estos caracteres: @, #, %, %, &, (), _ , o +.

Programa de Aplicación para Tocar Tonos de Teléfono RTTTL

Abajo está un archivo que contiene la informació musical usada en el siguiente Programa Ejemplo. Hay cinco directivas adiconales RTTTL_File_DATA que usted puede probar en la sección Su Turno. Este programa toca una canción llamada “Reveille” {} que es el primer toque de trompeta de la mañana tocada en campos militares. Quizá usted la ha escuchado en películas y shows de tv. RTTTL_File DATA "Reveille:d=4,o=7,b=140:8g6,8c,16e,16c,8g6,8e,", "8c,16e,16c,8g6,8e,8c,16e,16c,8a6,8c,e,8c,8g6,", "8c,16e,16c,8g6,8e,8c,16e,16c,8g6,8e,8c,16e,", "16c,8g6,8e,c,p,8e,8e,8e,8e,g,8e,8c,8e,8c,8e,8c,", "e,8c,8e,8e,8e,8e,8e,g,8e,8c,8e,8c,8g6,8g6,c."

Programa Ejemplo: MicroMusicWithRtttl.bs2

Este Programa de Aplicación es muy largo, y es una buena idea descargar la última version de la página www.parallax.com/go/WAM. Al descargar el programa y abrirlo con el Editor BASIC Stamp usted ahorrará una cantidad significativa de tiempo. La alternativa, es naturalmente meterlo a mano y depurar cuatro página de código.

Con el Editor de BASIC Stamp abra el archivo del programa que descargó MicroMusicWithRtttl.bs2 o a mano meta cuidadosamente el ejemplo que está abajo.

Ejecute el programa, y verifique que reconoce la pieza Reveille bugle call. Vaya a la sección Su Turno e intente algunas piezas más (con directivas

RTTTL_File DATA) ' ¿Que es un Microcontrolador? - MicroMusicWithRtttl.bs2 ' Play Nokia RTTTL format ringtones using DATA. '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Programa ejecutandose!" ' -----[ Definiciones de E/S ]----------------------------------------------

Page 34: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 281 SpeakerPin PIN 9 ' Bocinapiezo conecteda a P9. ' -----[ Variables ]------------------------------------------------------- counter VAR Word ' Contador de Propósito General. char VAR Byte ' Variable almacena caracteres. index VAR Word ' Index para apuntar a los datos. noteLetter VAR Byte ' Amacena caracter de la note . noteFreq VAR Word ' Almacena frecuencia de la nota. noteOctave VAR Word ' Almacena octava de la nota. duration VAR Word ' Almacena duracion de la nota. tempo VAR Word ' Almacena tempo. default_d VAR Byte ' Almacena duración default . default_o VAR Byte ' Almacena octava default. default_b VAR Word ' Almacena batidos/min default. ' -----[ EEPROM Data ]----------------------------------------------------- RTTTL_File DATA "Reveille:d=4,o=7,b=140:8g6,8c,16e,16c,8g6,8e,", "8c,16e,16c,8g6,8e,8c,16e,16c,8a6,8c,e,8c,8g6,", "8c,16e,16c,8g6,8e,8c,16e,16c,8g6,8e,8c,16e,", "16c,8g6,8e,c,p,8e,8e,8e,8e,g,8e,8c,8e,8c,8e,8c,", "e,8c,8e,8e,8e,8e,8e,g,8e,8c,8e,8c,8g6,8g6,c." Done DATA ",q," Notes DATA "p", "a", "#", "b", "c", "#", "d", "#", "e", "f", "#", "g", "#" Octave8 DATA Word 0, Word 3520, Word 3729, Word 3951, Word 4186, Word 4435, Word 4699, Word 4978, Word 5274, Word 5588, Word 5920, Word 6272, Word 6645 ' -----[ Initialization ]-------------------------------------------------- counter = 0 ' Inicializa counter. GOSUB FindEquals ' Primero encuentra '=' en archivo. GOSUB ProcessDuration ' Obtiene duration default duration. GOSUB FindEquals ' Encuentra siguiente '='. GOSUB ProcessOctave 'Obtien Octava default. GOSUB FindEquals ' Encuentra el último '='. GOSUB GetTempo ' Obtiene tempo default. ' -----[ Código del Programa]------------------------------------------- DO UNTIL char = "q" 'Está en bucle en 'q' en DATA.

Page 35: ¿Qué es un Microcontrolador? Cap.8

Página 282 · ¿Qué es un Microcontrolador? GOSUB ProcessDuration ' Obtiene duración de la nota. GOSUB ProcessNote ' Obtiene el valor del índice de la nota. GOSUB CheckForDot ' Si es punteada, duracion es 3/2. GOSUB ProcessOctave ' Obtiene la octava. GOSUB PlayNote ' Obtiene la frecuencia de la siguiente nota,. LOOP ' Fin del bucle principal. END ' Fin del programa. ' -----[ Subroutina Encuentra Caracteres iguales ]----------------------- FindEquals: ' Va a caracteres en ' Busca Archivo RTTTL DO ' '='. Incremeta contador READ RTTTL_File + counter, char ' hasta que encuentra'=' , y luego counter = counter + 1 ' regresa. LOOP UNTIL char = "=" RETURN ' -----[ Subroutine - Read Tempo from RTTTL Header ]---------------------- ' Cada caracter del teclado tiene un sólo número llamado valor ASCII . ' Los caracteres 0, 1, 2,...9 tienen valores ASCII de 48, 49, 50,...57. ' Usted puede convertir los caracteres que representam un dígito a ' a si valr restamdpñes 48 a la variable que almacena el dígito. ' Puede examinar esto comparando DEBUG DEC 49 y DEBUG 49. GetTempo: ' Describe archivo RTTTL de Tempo. ' Convierte caracters a default_b = 0 ' digitos restandoles 48 DO ' de cada caracterASCII READ RTTTL_File + counter, char ' valor. Multiplica Iterativamente IF char = ":" THEN ' cada dígito por 10 y si hay default_b = default_b / 10 ' otro dígito, entonces lo suma counter = counter + 1 ' el dígito más reciente con EXIT ' uno de la columna. ENDIF ' Por ejemplo, la cadena default_b = default_b + char - 48 ' "120" es (1 X 10 X 10) counter = counter + 1 ' + (2 X 10) + 0. The '1' default_b = default_b * 10 ' primero se convierte, y luego LOOP UNTIL char = ":" ' se multiplica por 10. El '2' ' es convertido/agregado. RETURN ' 0 es convertido/agregado, hecho. ' -----[ Subroutine – Busca Octava ]------------------------------------ ProcessOctave: ' Puede o no puede haber Octava ' incluida en una nota dada READ RTTTL_File + counter, char ' porque cualquier nota SELECT char ' que se toca en la octava default CASE "5" TO "8" ' no se specifica noteOctave = char - "0" ' la octava. Si se usa un caracter

Page 36: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 283 counter = counter + 1 ' '5' '8' entonces se usa CASE ELSE ' ésta, usa default_o. noteOctave = default_o ' Los Characteres se convierten ENDSELECT ' a dígitos restando IF default_o = 0 THEN ' '0', que es lo mismo default_o = noteOctave ' que restar 48.La primera ENDIF ' vez se llama esta subrutina ' default_o e 0. RETURN ' Si 0, entonces fija default_o. ' -----[ Subroutina - Encuentra Index de Notea ]----------------------------- ProcessNote: ' Fija el valor de index value de lookup ' de la frecuencia de nota basada em READ RTTTL_File + counter, char ' el caracter de la nota. Si 'p', SELECT char ' el índice es 0. Si 'a' a 'g', CASE "p" ' lee los valores de los caracteres en index = 0 ' la Tabla DATA y su equivalente. counter = counter + 1 ' Graba el valor del índíce cuando CASE "a" TO "g" ' encuentra su equivalente. Si el siguiente FOR index = 1 TO 12 ' caracter es bemoñ (#), suma READ Notes + index, noteLetter ' 1 al valor del índice para IF noteLetter = char THEN EXIT ' incrementar el índice (y NEXT ' frecuencia) by 1 . counter = counter + 1 ' Igual que en otras subroutinas, READ RTTTL_File + counter, char ' incrementa el contador para SELECT char ' cada caracter que se procesa. CASE "#" index = index + 1 counter = counter + 1 ENDSELECT ENDSELECT RETURN ' -----[ Subroutina - Determina Duración de la Nota ]-------------------- ProcessDuration: ' Checa para ver si hay caracters de la ' forma 1, 2, 4, 8, 16 o 32. READ RTTTL_File + counter, char ' Si hay, entonce los convierte de ' Caracteres ASCII a un valor SELECT char ' restandoles 48. En el CASE "1", "2", "3", "4", "8" ' caso de 16 o 32, los multiplica duration = char - 48 ' por 10 y suma al siguiente counter = counter + 1 ' digito o a la columna de unos. READ RTTTL_File + counter, char SELECT char CASE "6", "2" duration = duration * 10 + char - 48 counter = counter + 1 ENDSELECT CASE ELSE ' Si no usa duración, duration = default_d ' use default.

Page 37: ¿Qué es un Microcontrolador? Cap.8

Página 284 · ¿Qué es un Microcontrolador? ENDSELECT IF default_d <> 0 THEN ' Si no define default_d duration = 60000/default_b/duration*3 ' (si default_d = 0), entonces ELSE ' fije default_d = a la duración default_d = duration 'con d=#. ENDIF RETURN ' -----[ Subroutine – Cheque Para '.' Indicando Duraci+on 1.5 ]----------- CheckForDot: ' Cheque para indicación punteada ' multiplique duración por 3/2. READ RTTTL_File + counter, char ' Si hay punteada, multiplique por SELECT char ' 3/2 e incremente contador, CASE "." ' sino, no haga nada y duration = duration * 3 / 2 ' regrese. counter = counter + 1 ENDSELECT RETURN ' -----[ Subrutina - Encuentra Comma and Play Note/Duration ]----------------- PlayNote: ' Encuentra la última comma en la ' note actual. Luego, READ RTTTL_File + counter, char ' manda la frecuencia de la nota SELECT char ' de los datos, y la toca, o CASE "," ' hay silencio si frecuencia = 0. counter = counter + 1 READ Octave8 + (index * 2), Word noteFreq noteOctave = 8 - noteOctave noteFreq = noteFreq / (DCD noteOctave) IF noteFreq = 0 THEN PAUSE duration ELSE FREQOUT SpeakerPin, duration, noteFreq ENDIF ENDSELECT RETURN

Funcionamiento del programa de MusicWithRtttl.bs2

Este Programa Ejemplo es de uso divertido, y muestra la clase de código que usted será capáz de escribir con alguna práctica. Sin embargo, se incluyó en este texto más por diversión que por los conceptos de codificación que emplea. Si usted examina el código brevemente, usted podría observar que ya ha usado todas las instrucciones y operadores del programa ¡excepto uno!

Page 38: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 285 Esta es una lista de los elementos en este programa que por ahora le deberían ser conocidos:

• Comentarios que le ayudan en la explicación de su código • Declaraciones de Constantes y Variables. • Declaraciones DATA • Instrucciones READ • Bloques IF...ELSE...ENDIF • Bucles DO...LOOP con o sin WHILE y UNTIL • Subrutinas con GOSUB, etiquetas y RETURN • Bucles FOR...NEXT • Instrucciones LOOKUP y LOOKDOWN • Instrucciones FREQOUT y PAUSE • Instrucciones SELECT...CASE • EXIT es nuevo, pero este simplemente permite que el programa pueda “salir” de

un bucle antes que termine, y frecuentementese usa con las frases IF...THEN.

Su Turno – Canciones Diferentes

Trate de reemplazar la directiva RTTTL_File DATA en el programa MicroMusicWithRTTTL.bs2 con cada uno del los cinco archivos musicales de abajo.

¡Solamente una directiva RTTTL_File DATA a la vez! Asegurese de reemplazar, no añada, su nueva directiva RTTTL_File DATA.

Ejecute el programa MicroMusicWithRTTTL.bs2 para verificar cada archivo

RTTTL. RTTTL_File DATA "TwinkleTwinkle:d=4,o=7,b=120:c,c,g,g,a,a,2g,f,", "f,e,e,d,d,2c,g,g,f,f,e,e,2d,g,g,f,f,e,e,2d,c,c,", "g,g,a,a,2g,f,f,e,e,d,d,1c" RTTTL_File DATA "FrereJacques:d=4,o=7,b=125:c,d,e,c,c,d,e,c,e,f", ",2g,e,f,2g,8g,8a,8g,8f,e,c,8g,8a,8g,8f,e,c,c,g6", ",2c,c,g6,2c" RTTTL_File DATA "Beethoven5:d=8,o=7,b=125:g,g,g,2d#,p,f,f,f,2d" RTTTL_File DATA "ForHe'sAJollyGoodFellow:d=4,o=7,b=320:c,2e,e,e,", "d,e,2f.,2e,e,2d,d,d,c,d,2e.,2c,d,2e,e,e,d,e,2f,", "g,2a,a,g,g,g,2f,d,2c"

Page 39: ¿Qué es un Microcontrolador? Cap.8

Página 286 · ¿Qué es un Microcontrolador? RTTTL_File DATA "TakeMeOutToTheBallgame:d=4,o=7,b=225:2c6,c,a6,", "g6,e6,2g.6,2d6,p,2c6,c,a6,g6,e6,2g.6,g6,p,p,a6", ",g#6,a6,e6,f6,g6,a6,p,f6,2d6,p,2a6,a6,a6,b6,c,", "d,b6,a6,g6"

Descargando Archivos RTTTL. Hay archivos disponibles RTTTL para bajarse de varios sitios de WWW. Estos archivos son contribuciones de entusiastas de ring tones, muchos de ellos no son expertos musicales. Algunos tonos de teléfono son muy buenos, otros no se pueden reconocer. Si usted desea descargar y tocar algunos archivos RTTTL, asegurese de quitar los espacios entre caracteres, luego inserte el archivo de texto entre las comillas.

RESUMEN Este capítulo introdujo técnicas para hacer sonidos y tonos musicales con el BASIC Stamp y una bocina piezo eléctrica. La instrucción FREQOUT se puede usar para mandar a una bocina piezo eléctrica señales high/low para que hagan efectos de sonido y/o notas musicales. La instrucción FREQOUT tiene argumentos que controlan los pines de E/S a donde se manda la señal, la Duration del Tono y la Frecuencia del Tono (Freq1). Hay un argumento opcional Freq2 que puede utilizarse para tocar dos tonos al mismo tiempo. Los efectos de sonido pueden hacerse ajustando la frecuencia y duración de los tonos y las pausas entre ellos. El valor de la frecuencia también puede barrerse en un rango de valores para crear una variedad de efectos. Hacer notas musicales también depende de la frecuencia, duración y pausas. El valor del argumento “Duration” de la instrucción FREQOUT lo determina “tempo” de la canción y la duración de la nota (nota entera, media nota, un cuarto de nota, etc). El valor Freq1 de la nota lo determina la letra de la nota y la octava. Los descansos o silencios entre notas se usan para fijar la duración de la instrucción PAUSE. Tocar canciones simples usando el BASIC Stamp puede hacerse con una secuencia de instrucciones FREQOUT, pero hay formas mejores para almacenar y retirar los datos musicales. Las directivas “DATA” con su etiquetas opcionales “SYMBOL” se usaron para almacenar valores de bytes sin usar prefijos, y valores tamaño “word” usando prefijos “Word”. La instruccón READ se usó para retirar valores almacenados por las directivas DATA. En los ejemplos de este capítulo, el argumento “Location” de la instrucción DATA siempre usó la etiqueta de la directiva opcional “Symbol” para diferenciar los diferentes tipos de datos. Algunas de las etiquetas “Symbol” que se usaron fueron Notes, Durations, Dots, y Octaves (notas, duraciones, puntos y octavas).

Page 40: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 287 Los datos musicales pueden almacenarse en formatos que tienden en si mismos para convertirse en una partitura. El estilo de los datos de la partitura puede convertirse en frecuencias usando las instrucciones LOOKUP y LOOKDOWN. También pueden realizarse las operaciones matemáticas en valores de variables para cambiar la octava de una nota dividiendo su frecuencia por una potencia de dos. Las operaciones matemáticas también son útiles para la duración de las notas conociendo el tempo o la duración de la nota entera. Se introdujo SELECT...CASE como una forma de evaluar una variable en función de caso por caso. SELECT...CASE es particularmente útil para examinar caracteres o números cuando hay diferentes elecciones lo que podría ser la variable y diferentes elecciones para fijar las acciones que necesitan tomarse en función del valor de la variable. Un programa que convierte cadenas de caracteres que describen los tonos musicales de los teléfonos celulares viejos (se llama RTTTL) se usó para introducir programas grandes que hacen uso de todas las técnicas de programación presentadas en este texto. SELECT...CASE juega un papel importante en este programa porque se usa para examinar caracteres seleccionados en un archivo RTTTL en función de caso-por-caso.

Preguntas

1. ¿Que origina que un sonido suene con un timbre alto? 2. ¿Qué hace FREQOUT 15, 1000, 3000? ¿Qué provoca que un tono suene con un

timbre bajo? 3. ¿Cómo puede usted modificar la instrucción FREQOUT de la pregunta 2 para

que mande dos frecuencias al mismo tiempo? 4. Si usted golpea la tecla B6 de un piano, ¿Qué frecuencia emite? 5. ¿Cómo modifica usted una directiva DATA o una instrucción READ si desea

almacenar y retirar valores “word”? 6. ¿Puede usted tener más de una directiva DATA? Si si puede, como puede usted

indicarle a una instrucción READ que obtenga los datos de una o mas directiva DATA?

7. Si usted conoce la frecuencia de una nota en una octava, que tiene usted que hacer para que esa frecuencia toco en la octava mayor siguiente?

8. ¿Qué hace SELECT...CASE?

Ejercicios

1. Modifique el tono “Alarm...” del programa ActionTones.bs2 para que la frecuencia del tono que toca aumente en 500 cada vez que el tono se repite.

Page 41: ¿Qué es un Microcontrolador? Cap.8

Página 288 · ¿Qué es un Microcontrolador?

2. Explique como modifica el programa MusicWithMoreFeatures.bs2 para que muestre un mensaje de alerta en la Terminal Debug cada vez que se toca una nota punteada.

Proyectos

1. Construya un Generador de Tonos controlado con botones push. Si se presiona un botón push, la bocina debe emitir un beep de 2 kHz durante un 1/5 de segundo. Si se presiona el segundo botón push la bocina debe emitir una beep de 3 kHz durante un 1/10 de segundo.

Soluciones

Q1. Nuestro oido detecta cambios en la presión del aire como tonos. Un tono con timbre alto genera cambios más rápidos en la presión del aire, un tono con timbre bajo genera cambios lentos en la presión del aire.

Q2. FRECOUT 15, 1000, 3000 manda una señal de 3000 Hz que sale del pin P15 durante un segundo (1000 ms). El efecto de cada númro es: 15 es el pin E/S 15; 1000 es la duración del tono en milisegundos, o un segundo; 3000 es la frecuencia del tono, en hertz, entonces manda un tono de 3000 Hz.

Q3. Use el argumento opcional Freq2. Para tocar 3000 Hz y digamos 2000 Hz,

simplemente agregamos la segunda frecuencia a la instrucción después de una coma:

FREQOUT 15, 1000, 3000, 2000

Q4. 1975-5 Hz, vea la Figura 8-3. Q5. Use el modificador opcional Word antes de cada dato. Q6. Si. Cada directiva DATA puede tener un diferente parámetro opciona Symbol.

Para especificar de que directiva DATA se obtienen los datos, incluya el parámetro Symbol despues de cada palabra clave READ. Por ejemplo: READ Notes, noteLetter. En este ejemplo, Notes es el parámetro Symbol.

Q7. Para obtener una nota en la siguiente octava mayor, multiplique la frecuencia por dos.

Q8. SELECT...CASE selecciona una variable o expresión la evaluación en función de caso por caso, y ejecuta diferentes bloques de código dependiendo en cual caso se adecúa el valor de la variable.

Page 42: ¿Qué es un Microcontrolador? Cap.8

Frequencia y Sonido · Página 289

E1. Este problema puede resolverse ya sea manualmente incrementando el valor de cada tono por 500 o utilizando el bucle FOR...NEXT con un valor “STEP” (paso) de 500.

Utilizing FOR...NEXT loop: Manually increasing tone: DEBUG "Increasing alarm...", CR PAUSE 100 FOR frequency = 1500 TO 3000 STEP 500 FREQOUT 9, 500, frequency PAUSE 500 NEXT

DEBUG "Increasing Alarm...",CR PAUSE 100 FREQOUT 9, 500, 1500 PAUSE 500 FREQOUT 9, 500, 2000 PAUSE 500 FREQOUT 9, 500, 2500 PAUSE 500 FREQOUT 9, 500, 3000 PAUSE 500

E2. Modifique las líneas que identifican la nota punteada.

READ Dots + index, noteDot IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2

Agregue una instrucción DEBUG al bucle IF...THEN. No olvide ENDIF. Add a DEBUG command to the IF...THEN. Don't forget the ENDIF. READ Dots + index, noteDot IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2 DEBUG "Nota Punteada!", CR ENDIF

P1. Use el circuito de bocina piezoeléctrica de la Figrua 8-2; y los circuitos del botón

push de la Figura 4-26.

' ¿Que es unMicrocontrolador? - Ch8Prj01_PushButtonToneGenerator.bs2 ' P4 Presionado: 2 kHz beep for 1/5 second. 2 kHz = 2000 Hz. ' 1/5 s = 1000 / 5 ms = 200 ms ' P3 Presionado: 3 kHz beep for 1/10 second. 3 kHz = 3000 Hz. ' 1/10 s = 1000 / 10 ms = 100 ms '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Programa Ejecutandose!" DO IF (IN4 = 1) THEN FREQOUT 9, 200, 2000 ' 2000 Hz para 200 ms ELSEIF (IN3 = 1) THEN

Page 43: ¿Qué es un Microcontrolador? Cap.8

Página 290 · ¿Qué es un Microcontrolador?

FREQOUT 9, 100, 3000 ' 3000 Hz para 100 ms ENDIF LOOP