Sie sind auf Seite 1von 10

Leccin 3: Entradas digitales, variables,

una instruccin de control y generacin


de
sonidos
Dado el xito cosechado con nuestro trabajo de las dos primeras lecciones, en esta
tercera nos hemos crecido y vamos a introducir cuatro nuevos conceptos. Vamos a ver
cmo podemos tener una entrada digital, a conocer la utilizacin de las variables, a utilizar
una primera instruccin de control (el bloque if..else) y a generar notas musicales con
nuestro Arduino.
En lecciones anteriores hemos visto cmo podamos actuar sobre otros dispositivos
utilizando las salidas digitales. Activando una salida podamos encender un led y
desactivndola podamos apagarlo. Aunque sea de forma muy rudimentaria todava, lo
cierto es que ya sabemos cmo nuestro equipo Arduino puede utilizarse para gobernar
dispositivos.
El siguiente paso importante consiste en lograr que nuestro Arduino sepa cmo es el
mundo de su alrededor. Para ello uno de los caminos disponibles es la utilizacin de las
entradas digitales. Con una entrada digital somos capaces de saber si un determinado
dispositivo est activado o desactivado. Es muy importante que nos fijemos en el matiz.
Con una entrada digital slo podemos saber si un dispositivo est en uno de los dos
estados posibles: activado o desactivado. No hay trmino medio. El caso ms simple es la
utilizacin de un interruptor. Un interruptor puede estar abierto o cerrado. Con una entrada
digital nuestro Arduino es capaz de saber si el interruptor est abierto o cerrado.
Proteus nos posibilita simular un interuptor utilizando el dispositivo "SWITCH".

Como podemos observar, junto al interruptor hay dos pequeos botones con una flecha
apuntando para arriba y otra para abajo. Si pulsamos sobre la primera simulamos el cierre
del interruptor y si pulsamos sobre la segunda simulamos su apertura.

El estado inicial del interruptor (abierto o cerrado) se puede establecer editando sus
propiedades utilizando en el men contextual la opcin "Editar las propiedades". Para
abrir el men contextual en Proteus debemos pulsar con el botn derecho del ratn sobre
el dispositivo en cuestin. En la ventana de dilogo que se abre, debemos seleccionar la
casilla "Editar todas las propiedades como texto" y entonces podremos ver la variable
STATE. Si le asignamos el valor 1 el dispositivo se inicia cerrado y si le asignamos el
valor 0 lo har abierto.

Para conocer el estado de nuestro interruptor con una de las entradas digitales de nuestro
Arduino tenemos que dar los siguientes pasos. Primero definir que vamos a utilizar ese
pin como una entrada. Segundo conectarlo elctricamente a nuestro pin. Y, tercero y
ltimo, leer el estado del pin desde nuestro programa. Vamos a dar los tres pasos.
Ya vimos que para definir si un pin va a funcionar como entrada o salida, utilizbamos la
instruccin pinMode() dentro de la funcin setup(). En nuestro caso deseamos conectar
nuestro interruptor al pin 5, as que nuestro cdigo deber ser:

Para conectar elctricamente nuestro interruptor con el pin 5 de nuestro Arduino


podramos tener la tentacin de utilizar un esquema como el siguiente.

Sin embargo esta forma de conectar una entrada es una mala prctica que debemos
erradicar desde el principio de nuestros diseos. Aunque a primera vista puede parecer
que todo es correcto, existe un problema serio en utilizar las entradas de esta forma.
Cuando el interruptor est cerrado el pin 5 est en un estado conocido, +5V, y la entrada
estar activa. Pero, qu pasa cuando el interruptor est abierto? La respuesta rpida
podra ser que la entrada est a 0V y, por lo tanto, desactivada. Pero esta respuesta no es
correcta. En realidad cuando el interruptor est abierto la entrada se encuentra en un
estado indeterminado puesto que no est conectada a ningn potencial conocido. Para
entendernos, que un cable no est conectado al positivo de la fuente no significa que est
conectado al negativo. Los denominados "ruidos" o interferencias en el circuito pueden
generar potenciales indeterminados en nuestro pin de entrada. Para evitar esta
indefinicin el circuito que debemos utilizar es el siguiente que fija claramente el estado
del pin a +5V o a 0V.

Para conocer desde nuestro programa si el pin est activo o desactivado, utilizamos la
funcin digitalRead(). La sintaxis de esta funcin es la siguiente:
digitalRead( <nmero de pin> )
La funcin devolver un valor 1 cuando el pin est activo y un valor 0 cuando el pin est
desactivado.
Ahora ya estamos en condiciones de utilizar en el cdigo del programa nuestra primera
entrada digital para conocer el estado del interruptor y decidir si debemos encender el led
o apagarlo. Aunque sera ms preciso decir casi estamos en condiciones. Porque la frase
incluye la palabra "decidir" que hasta ahora no habamos utilizado. Tomar decisiones es
una de las tareas ms importantes de los ordenadores y precisamente su potencia viene
de esta capacidad de decisin. Para tomar decisiones, utilizamos las instrucciones de
control.
La instruccin de control ms bsica son los bloques de cdigo if...else. El objeto de un
bloque de cdigo if...else es evaluar una determinada condicin y en funcin de que sea
verdadera o falsa ejecutar sentencias diferentes. La sintaxis de un bloque if...else es la
siguiente.
if( <condicin> )

{
instrucciones que se ejecutan si la condicin se cumple (vale 1)
}
else
{
instrucciones que se ejecutan si la condicin no se cumple (vale 0)
}
Un ejemplo nos ayudar a entenderlo mejor. Nuestro objetivo es encender el led situado
en el pin 0 cuando el interruptor situado en el pin 5 est activo y apagarlo cuando est
desactivado. El cdigo de nuestro programa sera el siguiente.

Y el funcionamiento lo podemos probar con el siguiente circuito. Con el pulsador S1


gobernamos el estado del led D2.

Hasta ahora nos hemos limitado a que nuestro Arduino sea capaz de encender o apagar
leds. Es decir que somos capaces de hacer seales luminosas con nuestro Arduino. Pero
tambin podemos generar seales acsticas si en lugar de conectar un led a un pin de
nuestro Arduino, le conectamos un altavoz piezolctrico. El altavoz piezoelctrico es un
tipo de altavoz basado en la propiedades de los cristales piezoelctricos (polister o
cermica), que se deforman cuando se les aplica una tensin entre sus caras y que
actuando como transductor electroacstico es utilizado para la reproduccin de sonido.
Tambin se le suele conocer con el nombre de "chicharra".

En Proteus podemos simular un altavoz piezoelctrico con el dispositivo SPEAKER.

Por defecto, el dispositivo SPEAKER viene configurado para funcionar a 1V. Para
adaptarlo a nuestra tensin de 5V debemos editar sus propiedades y cambiar este valor
en la variable "Nominal Input".

El esquema que utilizaremos en nuestro diseo es el siguiente:

Y el cdigo de nuestro programa:

Podemos realizar la simulaicn. Si actuamos sobre el interruptor S1 se encender el led


D2 y se escuchar un sonido en el altavoz. Si actuamos sobre el interrumptor S2 cuando
el S1 est activado, provocaremos que la nota que se escucha en el altavos sea una
octava diferente. Si desactivamos el interruptor S1 el led se apaga y el altavoz deja de
sonar.
Una vez que hemos entendido el funcionamiento de nuestro programa, podemos
analizarlo en detalle. La primera parte la dedicamos a declarar variables. Una
variable est formada por un espacio en el sistema de almacenaje (memoria principal de
un ordenador) y un nombre simblico (un identificador) que est asociado a dicho
espacio. Ese espacio contiene una cantidad o informacin conocida o desconocida, es
decir un valor. El nombre de la variable es la forma usual de referirse al valor almacenado:
esta separacin entre nombre y contenido permite que el nombre sea usado
independientemente de la informacin exacta que representa. En nuestro caso, hemos
definido ocho variables que las usamos para identificar los pines 0 a 7 de nuestro Arduino.
Las variables las hemos utilizado para inicializar los pines indicando si los utilizaremos
como entrada o salida, y dentro de las funciones de escritura y lectura de su estado.
Como las variables contienen valores numricos al definirlas hemos puesto delante la
palabra clave INT. Con ello indicamos que esa variable almacenar un valor numrico de
tipo entero.
En este ejemplo todava no hemos sacado mucho partido a la utilizacin de las variables,
porque en realidad las estamos utilizando como si fueran constantes (les asignamos un
valor al principio que no cambia a lo largo de toda la vida del programa). Pero en
lecciones posteriores iremos utilizando y aprovechando muchos ms el uso de las
variables.
El ncleo del programa se basa en el uso de un primer bloque if...else. Con l evaluamos
el estado del pin5 y ejecutamos un cdigo u otro en funcin del resultado. En caso de que
el pin5 est activo, encendemos el led conectado al pin0 y volvemos a evaluar un
segundo bloque if...else. De esta manera acabamos de descubrir una importante
caractersticas de los bloques de control: que pueden anidarse. Anidar varios bloques de
control significa que podemos utilizar unos dentro de otros que se irn ejecutando o no en
funcin de las condiciones.
Para generar las dos notas diferentes que suenan en el altavoz hemos hecho lo siguiente.
Cuando el interruptor conectado al pin6 est activo, activamos y desactivamos el altavoz
con un espacio de 2272 microsegundos entre cada operacin. La funcin
delayMicrosegundos() tiene una sintaxis muy similar a la funcin delay() ya estudiada en
lecciones anteriores, slo que, en este caso, el intervalo de tiempo que mantenemos
dormido al procesador viene expresado en microsegundos en lugar de segundos.
Para generar la nota una octava ms alta cuando el interruptor S2 no est pulsado, lo que
hacemos es activar y desactivar el altavoz con un espacio de separacin de 1136
microsegundos.Por qu se produce este cambio con estos valores? Vamos a estudiarlo
con detalle para entenderlo.
Un sonido tiene un determinado tono que depende de la frecuencia a la cual vibra el aire.
Las notas musicales son vibraciones de frecuencias determinadas. Una vibracin a una
frecuencia concreta, produce un sonido puro que nosotros percibimos como un pitido de
un determinado tono. En el sistema musical occidental, se ha acordado utilizar slo unas
frecuencias concretas, a las cuales llamamos notas.Dividimos las posibles frecuencias en
porciones que llamamos "octavas", y cada octava en 12 porciones que llamamos notas.
Cada nota de una octava tiene exactamente la mitad de frecuencia que la misma nota en

la octava superior. El oido humano capta slamente frecuencias que estn por encima de
los 20Hz y por debajo de los 20.000 (muy aproximadamente). As pues, y con mucha
suerte, slo podemos oir unas 10 octavas como mucho, con doce notas cada una. La nota
"La" sirve como referencia para todas las dems. A menudo se denomina "nota de afinar".
Se produce un "La" de afinar cuando el aire vibra 440 veces por segundo, es decir a 440
hertzios. Por convencin, a la octava que contiene esta nota "La" se le suele considerar la
cuarta.Hay otra nota "La", de una "octava" superior (la quinta octava) cuando el aire vibra
a 880 hertzios. Del mismo modo, hay un "La" que se produce cuando el aire vibra a
220Hz (tercera octava).
Por lo tanto, para conseguir una determinada nota, slo tenermos que hacer vibrar
nuestro altavoz a una determinada frecuencia. La tabla que identifica cada nota con su
frecuencia y toda la teora relativa a este tema la podemos encontrar muy bien explicada
en
el
siguiente
enlace: http://latecladeescape.com/t/Frecuencia+de+las+notas+musicales.
Una vez que sabemos que queremos emitir un La4 y un La5 tenemos que hacer vibrar
nuestro altavoz a unas frecuencia de 440Hz y 220Hz respectivamente, ya podemos hacer
los clculos necesarios para escribir nuestro cdigo. Para obtener una frecuencia de
440Hz necesitamos activar y desactivar nuestro altavoz con una separacin de tiempo
entre ambas rdenes (es decir, con un periodo) de 2.272 segundos:
frecuencia = 1 / periodo.
440 = 1 / x ---> x = 1 /440 = 0,002272 segundos = 2.272segundos.
Como la mitad de ese tiempo tiene que estar el altavoz encendido y la otra mitad
apagado, la separacin entre ambas rdenes debe ser:
2.272 / 2 = 1.136
Ese es el valor que hemos escrito cuando nuestro pulsador est desactivado. Para
obtener un La5 (una octava superior) utilizamos el valor 2.272 porque:
220 = 1 / x ---> x = 1 / 220 = 0,004545segundos. La mitad de ese valor 4.545 / 2 =
2.272.
Acabamos de ensearle los rudimentos de la msica a nuestro Arduino, pero todava nos
queda un largo trecho hasta que consigamos que Arduino funcione como un instrumento
musical y podamos interpretar una meloda con l. Pero es que hay que dejar algo para
las prximas lecciones.

Das könnte Ihnen auch gefallen