huborarduino.com

La web de Hubor para la simulación de Arduino con Proteus

Banner Guia Programacion Arduino Con Proteus

[Proteus versión 8.1]

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 cómo podemos tener una entrada digital, a conocer la utilización de las variables, a utilizar una primera instrucción de control (el bloque if..else) y a generar notas musicales con nuestro Arduino.

En lecciones anteriores hemos visto cómo podíamos actuar sobre otros dispositivos utilizando las salidas digitales. Activando una salida podíamos encender un led y desactivándola podíamos apagarlo. Aunque sea de forma muy rudimentaria todavía, lo cierto es que ya sabemos cómo nuestro equipo Arduino puede utilizarse para gobernar dispositivos.

El siguiente paso importante consiste en lograr que nuestro Arduino sepa cómo es el mundo de su alrededor. Para ello uno de los caminos disponibles es la utilización 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 sólo podemos saber si un dispositivo está en uno de los dos estados posibles: activado o desactivado. No hay término medio. El caso más simple es la utilización 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". 

Lec03 001

Como podemos observar, junto al interruptor hay dos pequeños 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.

Lec03 002

El estado inicial del interruptor (abierto o cerrado) se puede establecer editando sus propiedades utilizando en el menú contextual la opción "Editar las propiedades". Para abrir el menú contextual en Proteus debemos pulsar con el botón derecho del ratón sobre el dispositivo en cuestión. En la ventana de diálogo 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.

Lec03 003

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 eléctricamente 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, utilizábamos la instrucción pinMode() dentro de la función setup(). En nuestro caso deseamos conectar nuestro interruptor al pin 5, así que nuestro código deberá ser:

Lec03 004

Para conectar eléctricamente nuestro interruptor con el pin 5 de nuestro Arduino podríamos tener la tentación de utilizar un esquema como el siguiente.

Lec03 005

Sin embargo esta forma de conectar una entrada es una mala práctica que debemos erradicar desde el principio de nuestros diseños. 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 rápida podría 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 ningún 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 indefinición el circuito que debemos utilizar es el siguiente que fija claramente el estado del pin a +5V o a 0V.

Lec03 006

Para conocer desde nuestro programa si el pin está activo o desactivado, utilizamos la función digitalRead(). La sintaxis de esta función es la siguiente:

digitalRead( <número de pin> )

La función 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 código del programa nuestra primera entrada digital para conocer el estado del interruptor y decidir si debemos encender el led o apagarlo. Aunque sería más preciso decir casi estamos en condiciones. Porque la frase incluye la palabra "decidir" que hasta ahora no habíamos utilizado. Tomar decisiones es una de las tareas más importantes de los ordenadores y precisamente su potencia viene de esta capacidad de decisión. Para tomar decisiones, utilizamos las instrucciones de control.

La instrucción de control más básica son los bloques de código if...else. El objeto de un bloque de código if...else es evaluar una determinada condición y en función de que sea verdadera o falsa ejecutar sentencias diferentes. La sintaxis de un bloque if...else es la siguiente.

if( <condición> )

{

   instrucciones que se ejecutan si la condición se cumple (vale 1)

}

else

{

   instrucciones que se ejecutan si la condición 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 código de nuestro programa sería el siguiente.

Lec03 007

Y el funcionamiento lo podemos probar con el siguiente circuito. Con el pulsador S1 gobernamos el estado del led D2.

Lec03 008

Hasta ahora nos hemos limitado a que nuestro Arduino sea capaz de encender o apagar leds. Es decir que somos capaces de hacer señales luminosas con nuestro Arduino. Pero también podemos generar señales acústicas si en lugar de conectar un led a un pin de nuestro Arduino, le conectamos un altavoz piezoléctrico. El altavoz piezoeléctrico es un tipo de altavoz basado en la propiedades de los cristales piezoeléctricos (poliéster o cerámica), que se deforman cuando se les aplica una tensión entre sus caras y que actuando como transductor electroacústico es utilizado para la reproducción de sonido. También se le suele conocer con el nombre de "chicharra".

Lec03 009

En Proteus podemos simular un altavoz piezoeléctrico con el dispositivo SPEAKER.

Lec03 010

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

Lec03 011

El esquema que utilizaremos en nuestro diseño es el siguiente:

Lec03 012

Y el código de nuestro programa:

Lec03 013

Podemos realizar la simulaicón. 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 simbólico (un identificador) que está asociado a dicho espacio. Ese espacio contiene una cantidad o información conocida o desconocida, es decir un valor. El nombre de la variable es la forma usual de referirse al valor almacenado: esta separación entre nombre y contenido permite que el nombre sea usado independientemente de la información 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 numéricos al definirlas hemos puesto delante la palabra clave INT. Con ello indicamos que esa variable almacenará un valor numérico de tipo entero.

En este ejemplo todavía no hemos sacado mucho partido a la utilización 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 más el uso de las variables.

El núcleo del programa se basa en el uso de un primer bloque if...else. Con él evaluamos el estado del pin5 y ejecutamos un código u otro en función 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 características de los bloques de control: que pueden anidarse. Anidar varios bloques de control significa que podemos utilizar unos dentro de otros que se irán ejecutando o no en función 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 operación. La función delayMicrosegundos() tiene una sintaxis muy similar a la función delay() ya estudiada en lecciones anteriores, sólo 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 más alta cuando el interruptor S2 no está pulsado, lo que hacemos es activar y desactivar el altavoz con un espacio de separación 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 vibración 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 sólo 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 sólamente frecuencias que estén por encima de los 20Hz y por debajo de los 20.000 (muy aproximadamente). Así pues, y con mucha suerte, sólo podemos oir unas 10 octavas como mucho, con doce notas cada una. La nota "La" sirve como referencia para todas las demás. 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 convención, 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, sólo tenermos que hacer vibrar nuestro altavoz a una determinada frecuencia. La tabla que identifica cada nota con su frecuencia y toda la teoría 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 cálculos necesarios para escribir nuestro código. Para obtener una frecuencia de 440Hz necesitamos activar y desactivar nuestro altavoz con una separación 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.272µsegundos.

Como la mitad de ese tiempo tiene que estar el altavoz encendido y la otra mitad apagado, la separación 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,004545µsegundos. La mitad de ese valor 4.545 / 2 = 2.272.

Acabamos de enseñarle los rudimentos de la música a nuestro Arduino, pero todavía nos queda un largo trecho hasta que consigamos que Arduino funcione como un instrumento musical y podamos interpretar una melodía con él. Pero es que hay que dejar algo para las próximas lecciones.

 

Comparte este artículo en redes sociales

Submit to FacebookSubmit to Google PlusSubmit to TwitterSubmit to LinkedIn


Esta página es propiedad de Hubor.

2014.

Guardar
Preferencias de usuario para las Cookies
Estamos utilizando las cookies para asegurarnos de que le podemos ofrecer el mejor servicio posible en este sitio web. Si rechaza el uso de las cookes, es posible que esta web no funcione como estaba previsto por el equipo de programadores.
Aceptar todo
Rechazar todo
Leer más
Estadísticas
Las cookies de preferencias permiten a la página web recordar información que cambia la forma en que la página se comporta o el aspecto que tiene, como su idioma preferido o la región en la que usted se encuentra.
Google Analytics
Aceptar
Rechazar