Manual de Usuario Modulo 8

April 3, 2017 | Author: Jose Luis | Category: N/A
Share Embed Donate


Short Description

fdafad alrduidaf dsa oe kczvmcxv,oadfa kdafdas fadsfe arduino es guay del parauay y me gusta un monton...

Description

Módulo 8 ARDUINO: La tecnología al alcance de todos

open source

Con más de 80 ejemplos !!

INGENIERIA DE MICROSISTEMAS PROGRAMADOS S.L. C/ Alda. Mazarredo Nº 47 - 1º Dpto. 2 48009 BILBAO - BIZKAIA Tel/Fax: 94 4230651 email: [email protected] www.microcontroladores.com

ARDUINO: La tecnología al alcance de todos INDICE GENERAL www.microcontroladores.com

INDICE GENERAL TEMA1: El Universo ARDUINO 1.- INTRODUCCIÓN 2.- HERRAMIENTAS HARDWARE PARA ARDUINO 2-1 Tarjetas de control ARDUINO 2-2 Los Shields o tarjetas de aplicación 3.- HERRAMIENTAS SOFTWARE PARA ARDUINO 4.- EL EQUIPO DE PRÁCTICAS 4-1 El controlador Arduino NANO 4-2 El Laboratorio Universal Trainer 4-3 Instalación / Configuración del software

TEMA 2: Las entradas y salidas Digitales 1.- INTRODUCCIÓN 2.- ENTRADAS DIGITALES 3.- SALIDAS DIGITALES 4.- INSTRUCCIONES PARA EL CONTROL DE LAS E/S DIGITALES 4-1 Función: pinMode() 4-2 Función: digitalRead() 4-3 Función: digitalWrite() 5.- EL PRIMER EJEMPLO: “FUNCIÓN SI” 5-1 Montaje práctico 5-2 El programa “Función SI” 5-3 Grabación del programa 5-4 Comprobación 5-5 Trabajo personal 6.- PRINCIPALES FUNCIONES LÓGICAS 6-1 Función lógica NO 6-2 Función lógica Y 6-3 Función lógica O 7.- FUNCIONES LÓGICAS DERIVADAS 7-1 Función NO-Y 7-2 Función NO-O 7-3 Función Exclusiva-O 7-4 Función NO-Exclusiva-O 8.- LOS PUERTOS 8-1 Ejemplo: Leer_Puerto 8-2 Ejemplo: Calculadora_Binaria

TEMA 3: Temporizaciones, expresiones y sonido 1.- INTRODUCCIÓN

i-1

ARDUINO: La tecnología al alcance de todos INDICE GENERAL www.microcontroladores.com

2.- FUNCIONES DE TEMPORIZACIÓN 2-1 Función: delayMicroseconds() 2-2 Función: delay() 3.-EJEMPLO: INTERMITENCIA 3-1 Trabajo personal 4.- MAS EJEMPLOS 4-1 Ejemplo: Faro 4-1-1 Trabajo personal 4-2 Ejemplo: Juego_de_luces 4-2-1 Trabajo personal 4-3 Ejemplo: Semáforo_V1 5.- EXPRESIONES 5-1 Constantes 5-2 Variables 5-2-1 Tipos de variables 5-3 Operaciones 6.- SONIDO; Ejemplo: Tonos V1 6-1 Funciones de sonido 6-1-1 Función: tone() 6-1-2 Función noTone() 6-2 Ejemplo: Tonos_V2 6-3 Ejemplo: Tonos_V3 6-4 Ejemplo: Tonos_V4 6-5 Ejemplo: Melodias 6-6 Ejemplo: Semáforo_V2

TEMA 4: Toma de decisiones y sentencias de control 1.- INTRODUCCIÓN 1-1 Operadores de comparación 1-2 Operadores booleanos 2.- FUNCIÓN: IF(….) 2-1 Ejemplo: Timbre 3.- FUNCIÓN: IF(….) ELSE 3-1 Ejemplo: Juego_de_luces_V2 3-2 Ejemplo: Semáforo_V3 4.- FUNCIÓN: FOR(….) 4-1 Operadores compuestos 4-2 Ejemplo: Faro_V2 4-3 Ejemplo: Semáforo_V4 4-4 Ejemplo: Ráfagas 5.- FUNCIÓN: WHILE() 5-1 Ejemplo: Timbre_V2 5-2 Ejemplo: Contador 5-3 Ejemplo: Contador_V2 6.- FUNCIÓN: SWITCH() / CASE 6-1 Ejemplo: Decodificador

i-2

ARDUINO: La tecnología al alcance de todos INDICE GENERAL www.microcontroladores.com

6-1-1 Trabajo personal 6-2 Ejemplo: Juego_de_luces_V3 6-3 Ejemplo: Decodificado_ BCD_7_segmentos 6-3-1 Trabajo personal 6-4 Ejemplo: Década 6-4-1 Trabajo personal 6-5 Ejemplo: Dado_Electrónico 7.- OTRAS FUNCIONES DE CONTROL 7-1 Función: do…while() 7-2 Función: break 7-3 Función: return() 7-4 Función: goto

TEMA 5: Las señales PWM y el control de servos 1.- INTRODUCCIÓN 1-1 ¿Para qué sirven las señales PWM? 1-2 Función: analogWrite() 2.- USANDO LAS SEÑALES PWM 2-1 Ejemplo: PWM 2-2 Ejemplo: Efectos 2-3 Ejemplo: Luces_Aleatorias 2-4 Ejemplo: Regulación 3.- SERVOMOTORES 3-1 Conexión de servos 3-2 La librería servo.h 3-2-1 Función: #include 3-2-2 Función: attach() 3-2-3 Función: writeMicroseconds() 3-2-4 Función: write() 3-2-5 Función: read() 3-2-6 Función: attached() 3-2-7 Función: detach() 4.- USANDO LOS SERVOS 4-1 Ejemplo: Servo 4-2 Ejemplo: Servo_V2 4-3 Ejemplo: Servo_V3 4-4 Ejemplo: Servo_Control

TEMA 6: Las comunicaciones 1.- NTRODUCCIÓN 2.- LA COMUNICACIÓN SERIE 2-1 Tipos de comunicación serie 2-2 La comunicación serie tipo UART 3.- ESTABLECIENDO LA COMUNICACIÓN 3-1 Función: Serial.begin() 3-2 Función: Serial.end() 4.- TRANSMISIÓN DE DATOS 4-1 Función: Serial.print()

i-3

ARDUINO: La tecnología al alcance de todos INDICE GENERAL www.microcontroladores.com

4-2 Función: Serial.println() 4-3 Ejemplos de transmisión 4-3-1 Ejemplo: Saludos 4-3-2 Ejemplo: Números 4-3-3 Ejemplo: Monitor_Remoto 5.- RECEPCIÓN DE DATOS 5-1 Función: Sertal.available() 5-2 Función: Serial.read() 5-3 Función: Serial.parseint() 5-4 Función: Seral.parsefloat() 5-5 Ejemplos de recepción 5-5-1 Ejemplo: Control_Remoto 5-5-2 Ejemplo: Calculadora 5-5-3 Ejemplo: Potencia_PWM 5-5-4 Ejemplo: Servo_Control_Remoto 6.- MÁS EJEMPLOS 6-1 Funciones matemáticas 6-1-1 Ejemplo: Min_Max 6-1-2 Ejemplo: Absoluto 6-1-3 Ejemplo: Potencia 6-1-4 Ejemplo: Raíz 6-1-5 Ejemplo: Trigonometría 6-2 Funciones avanzadas 6-2-1 Ejemplo: Tiempo_On 6-2-2 Ejemplo: Eiempo_On_V2 6-2-3 Ejemplo: Medir_Pulso 6-2-4 Ejemplo: Frecuencímetro 6-2-5 Ejemplop: Tiempo_:de_Activación 7.- MÁS FUNCIONES PARA LAS COMUNICACIONES 7-1 Función: Serial.find() 7-2 Función: Serial.findUntil() 7-3 Función: Serial.peek() 7-4 Función: Serial.readBytes() 7-5 Función: Serial.readBytesUntil() 7-6 Función: Serial.setTimeout() 7-7 Función: Serial.write() 7-8 Función: serialEvent()

TEMA 7: Las señales analógicas 1.- INTRODUCCIÓN 2.- CONVERSIÓN DIGITAL 3.- FUNCIONES DEL LENGUAJE ARDUINO 3-1 Función: analogReference() 3-2 Función: analogRead() 3-2 Función: map() 4.- PERIFÉRICOS ANALOGICOS 4-1 El potenciómetro 4-1-1 Ejemplo: Conversión_AD 4-1-2 Ejemplo: Umbrales 4-1-3 Ejemplo: Comparador_Analógico

i-4

ARDUINO: La tecnología al alcance de todos INDICE GENERAL www.microcontroladores.com

4-1-4 Ejemplo: Control_de_Brillo 4-1-5 Ejemplo: Generador_BF 4-2 El sensor de luz 4-2-1 Ejemplo: Fotómetro 4-2-2 Ejemplo: Control_de_Alumbrado 4-2-3 Ejemplo: Regulación_de_Luz 4-3 El sensor de temperatura 4-3-1 Ejemplo: Temperatura 4-3-2 Ejemplo: Climatizador

TEMA 8: La pantalla LCD 1.- INTRODUCCIÓN 2.- LA PANTALLA LCD 3.- FUNCIONES PARA EL CONTROL DE UNA LCD 3-1 Función: LiquidCrystal() 3-2 Función: begin() 3-3 Función: setCursor() 3-4 Función: home() 3-5 Función: clear() 3-6 Función: write() 3-7 Función: print() 3-8 Función: cursor() 3-9 Función: noCursor() 3-10 Función: blink() 3-11 Función: noBlink() 3-12 Función: noDisplay() 3-13 Función: display() 3-14 Función: scrollDisplayLeft() 3-15 Función: scrollDisplayRight() 3-16 Función: leftToRight() 3-17 Función: rightToLeft() 3-18 Función: autoscroll() 3-19 Función: noAutoscroll() 3-20 Función: createChar() 4.- EJEMPLOS DE CONTROL DE UNA PANTALLA LCD 4-1 Ejemplo: HolaMundo 4-2 Ejemplo: Display 4-3 Ejemplo: Cursor 4-4 Ejemplo: Blink 4-5 Ejemplo: DirecciónTexto 4-6 Ejemplo: Scroll 4-7 Ejemplo: Autoscroll 4-8 Ejemplo: CaracteresPersonalizados 4-9 Ejemplo: SerialDisplay 5.- TRABAJO PERSONAL

i-5

ARDUINO: La tecnología al alcance de todos INDICE GENERAL www.microcontroladores.com

RELACION DE MATERIALES La siguiente relación se corresponde con los materiales y accesorios necesarios para realizar todos los ejercicios y experimentos propuestos en el presente módulo 8. Se supone al lector en posesión del entrenador “UNIVERSAL TRAINER” en cualquiera de sus versiones V1, V2 o V3.              

Entrenador “UNIVERSAL TRAINER” (no incluído) Controlador Arduino NANO Cable USB tipo A a mini B Cable rígido de conexión de 0 Altavoz de 8Ω y 0.5 W Servo estándar Futaba FP-S3003 Pantalla LCD 16 x 2 Foto transistor BPW40 Sensor de temperatura LM35DZ Tira de pines macho / macho paso 2.54 Resistencia de carbón de 4K7, ¼ W Resistencia de carbón de 10K, ¼ W Resistencia de carbón de 100K, ¼ W CD-ROM con manual de usuario, documentación técnica, ejemplos y herramientas de programación

i-6

ARDUINO: La tecnología al alcance de todos INDICE GENERAL www.microcontroladores.com

BIBLIOGRAFIA Y DIRECCIONES DE INTERÉS 

“ARDUINO:la tecnología al alcance de todos”. Editorial: Creaciones Copyright. Autor: Mikel Etxebarria Isuskiza. La obra se puede considerar como un complemento al contenido del presente módulo de prácticas. Propone una importante colección de ejemplos que se resuelven con materiales y componentes muy económicos.



www.microcontroladores.com Es la dirección de la página web de Ingeniería de Microsistemas Programados S.L. En ella puedes encontrar gran cantidad de productos relacionados con la electrónica y los micro controladores, así como abundante información técnica.



www.arduino.cc Es la página oficial de la organización de Arduino. En ella encontrarás todos los productos originales de Arduino, información técnica, descargas de las herramientas y manual de referencia del lenguaje de programación de Arduino.



www.arduino.cc/es Es la versión en caastellano de la página anterior. Es probable que no esté totalmente actualizada.

i-7

ARDUINO: La tecnología al alcance de todos INDICE GENERAL www.microcontroladores.com

i-8

ARDUINO: La tecnología al alcance de todos TEMA 1: El Universo ARDUINO www.microcontroladores.com

TEMA 1: El Universo ARDUINO 1.- INTRODUCCIÓN Hasta no hace demasiado tiempo, el diseño y desarrollo de aplicaciones y proyectos basados en microcontroladores, estaba reservado a personal cualificado y con unos determinados conocimientos técnicos tanto en electrónica como en programación. Las herramientas necesarias para acometer esos proyectos se dividen en dos grandes grupos: 



Herramientas hardware. Consisten en diferentes tipos de tarjetas sobre las cuales se desarrolla y montan los circuitos electrónicos necesarios. Aquí también se incluyen los equipos e instrumentos que ayudan a poner a punto nuestros programas: emuladores, depuradores, grabadores, instrumentos de medida, etc… Herramientas software. Es un conjunto de aplicaciones que facilitan el desarrollo de nuestros programas. Es decir, se tratan de programas que nos ayudan a programar. Podemos citar a los editores de texto que emplearemos para escribir un programa, los simuladores, los intérpretes y los compiladores del lenguaje de programación que estemos empleando.

Todas ellas tienen un coste bastante elevado que no está al alcance de todos. Únicamente las Escuelas de formación profesional, Ingenierías, Universidades, así como empresas de diseño, montaje, investigación y desarrollo (I+D) o similares, se lo pueden permitir. Afortunadamente a día de hoy esto ya no tiene porqué ser así necesariamente. Gracias a plataformas como ARDUINO es posible acercar el mundo de la tecnología a todas las personas, empezando por estudiantes de Enseñanza Secundaria Obligatoria (ESO), bachiller, y módulos profesionales, como a todo tipo de aficionados a la misma. ARDUINO es una palabra de origen Germánico que se podría traducir como “El que ayuda a los amigos”. Allá por el año 2005, en el instituto Italiano de Diseño Interactivo (IVRA), se reúne un equipo de profesores y alumnos, procedentes de diferentes disciplinas, y liderados por Massimo Banzi, David Cuartielles, Tom Igoe, Gianluca Martino, David Mellis y Nicholas Zambetti. Apuestan por desarrollar una tarjeta electrónica sencilla y de muy bajo precio, que pueda ser utilizada en cualquier tipo de proyecto y en cualquiera de las diferentes disciplinas y áreas del conocimiento. Que tenga un lenguaje de programación sencillo y fácil de aprender y, sobre todo, ¡accesible y abierta a todo el mundo!. Esto es ARDUINO. Este módulo que tienes entre manos pretende acercarte a la tecnología. Para ello, en Ingeniería de Microsistemas Programados (MSE), hemos diseñado un buen número de ejemplos de programación que trataremos de presentar de forma ordenada y progresiva. Se trata de que tú, querido lector, puedas aprender a utilizar la plataforma ARDUINO y su programación de una forma amena y eminentemente práctica. Lo hemos dividido en una serie de temas que te van a permitir estudiar, analizar y utilizar los múltiples recursos internos de que consta un controlador como ARDUINO. Al mismo tiempo, vas aprendiendo las sentencias y funciones más importantes de que consta su lenguaje de programación. Ten en cuenta que todo lo que aprendas sobre los recursos internos y el lenguaje de programación (muy similar al lenguaje C), lo podrás utilizar en un futuro no muy lejano sobre controladores más potentes como los utilizados en aplicaciones comerciales e industriales. 2.- HERRAMIENTAS HARDWARE PARA ARDUINO ARDUINO es básicamente una tarjeta electrónica. Con el paso del tiempo se han desarrollado diferentes modelos que se diferencian en su aspecto y prestaciones. Aunque el lenguaje de programación es similar para todas ellas, cada uno elige la que mejor se adapte a sus necesidades. En cualquier caso recordemos que todas ellas son abiertas, por lo que se pueden obtener sus esquemas y toda la información

1-1

ARDUINO: La tecnología al alcance de todos TEMA 1: El Universo ARDUINO www.microcontroladores.com

técnica disponible sobre las mismas. Vamos a echar un vistazo a las más representativas y a sus características más relevantes.

2.1 Tarjetas de control ARDUINO La figura 1-1 muestra la tarjeta ARDUINO UNO. Probablemente es la más utilizada y desciende directamente de la mítica ARDUINO DIECIMILA, que apareció allá por el año 2005. Es una tarjeta muy sencilla, económica y fácil de conseguir. A través de un puerto USB se conecta con el PC, desde donde se realiza la grabación de los programas de aplicación. Mediante unos sencillos conectores se accede a las diferentes líneas de E/S del controlador. Con unos cables podemos conectar con los periféricos que deseemos gobernar: sensores, interruptores, leds, displays y un largo etcétera. Figura 1-1. La tarjeta ARDUINO UNO

Por otra parte, en la fotografía de la figura 1-2, tenemos la tarjeta de control ARDUINO MEGA2560. Se puede considerar como la hermana mayor. Salta a la vista su mayor tamaño ya que dispone de un elevado número de líneas de E/S, lo que permite controlar un gran número de periféricos. De la mitad a la derecha aproximadamente se puede apreciar la extensión de los conectores de E/S, respecto a los de la tarjeta ARDUINO UNO. Figura 1-2. La tarjeta ARDUINO MEGA 2560 En la figura 1-3 tenemos otro modelo de tarjeta de control, la ARDUINO NANO. Se trata de una versión miniaturizada y mejorada de la tarjeta ARDUINO UNO. Viene encapsulada en un formato DIL de 0.6” con 30 pines distribuidos en dos filas de 15 pines, y unas dimensiones de tan solo 0.73” x 1.70” (18.5 mm x 43.1). Este modelo se puede insertar directamente sobre un zócalo, una tarjeta impresa o un módulo board para el montaje sin soldadura, y conectar con los periféricos que vamos a gobernar en la aplicación. ¡¡ ES LA QUE VAMOS A EMPLEAR EN EL PRESENTE MÓDULO DE PRÁCTICAS !! Figura 1-3. La tarjeta de control ARDUINO NANO Aunque hemos mostrado las tres tarjetas de control más utilizadas, al menos hoy en día, basta con que visites la página oficial de ARDUINO (www.arduino.cc), para que veas la variedad de tarjetas ARDUINO existentes. Además de por su aspecto, las tarjetas se diferencian en sus prestaciones y características. En la siguiente tabla se hace una breve comparación de las características más relevantes de los tres modelos de tarjetas de control de ARDUINO que acabamos de presentar.

1-2

ARDUINO: La tecnología al alcance de todos TEMA 1: El Universo ARDUINO www.microcontroladores.com

CONCEPTO Tipo de Controlador Tensión de alimentación Alimentación interna de trabajo Velocidad Patillas de E/S digital Entradas analógicas Corriente en cada patilla de E/S Salidas PWM Memoria FLASH de programa Ocupado por el bootloader Memoria RAM de datos Memoria EEPROM de datos

UNO ATmega328 7-12V 5V 16MHz 14 6 40mA 6 32KB 0.5KB 2KB 1KB

MEGA 2560 ATmega2560 7-12VC 5V 16MHz 54 16 40mA 15 256KB 8KB 8KB 4KB

NANO ATmega328 7-12V 5V 16MHz 14 8 40mA 6 32KB 2KB 2K 1KB

2-2 Los Shields o tarjetas de aplicación Como ocurre con cualquier otro sistema, las diferentes tarjetas de control de ARDUINO no sirven de gran cosa si no les conectamos los periféricos que vamos a gobernar: sensores, interruptores, indicadores, altavoces, motores, displays, pantallas, relés, válvulas y un sinfín de dispositivos diferentes. Algunos periféricos son de uso tan común y tan extendido, que muchas empresas fabrican las tarjetas que los contienen. Reciben el nombre de “Shields”, y se pueden conectar o “pinchar” directamente sobre las tarjetas de control ARDUINO UNO, MEGA 2560, o cualquiera que sea compatible. En la figura 1-4 se muestra el shield ARDUINO BASIC I/O. Está desarrollado, fabricado y comercializado por Ingeniería de Microsistemas Programados. Se trata de un circuito puramente didáctico. Contiene unos periféricos muy básicos y sencillos: leds, pulsadores, altavoz, potenciómetros, y sensores de luz, de infra rojos y de temperatura. La idea es que se puedan conectar directamente con las líneas de E/S de las tarjetas de control ARDUINO UNO o MEGA 2560. Basta con insertar esta tarjeta sobre la de control. El alumno se centra en la programación y se olvida de realizar conexiones eléctricas. Los periféricos ya están conectados. Figura 1-4. El Shield ARDUINO BASIC I/O La fotografía de la figura 1-5 muestra un ejemplo de aplicación. El Shield BASIC I/O está insertado sobre la tarjeta de control ARDUINO UNO. Esta contiene un programa que controla el encendido de un led a partir de un pulsador. Debemos saber que, si mediante un programa somos capaces de leer el estado de una entrada (p.e. un pulsador), también seremos capaces de lee un sensor, un final de carrera, un detector, etc.. Igualmente, si somos capaces de controlar el encendido de un led, también podremos actuar sobre un motor, un relé, una válvula, una señal acústica de alarma, etc… En resumidas cuentas, mediante el Shield BASIC I/O tenemos una forma muy económica y sencilla de probar nuestros programas y simular situaciones reales. Figura 1-5. Ejemplo de aplicación

1-3

ARDUINO: La tecnología al alcance de todos TEMA 1: El Universo ARDUINO www.microcontroladores.com

Aunque no se trata de un Shield propiamente dicho, otra forma de conectar periféricos a nuestra tarjeta de control ARDUINO para probar los programas, es mediante el uso de entrenadores de electrónica de propósito general, como puede ser el de la figura 1-6. Se trata de nuestro Universal Trainer V3. Contiene una serie de valiosos periféricos tales como leds, interruptores, displays, etc… y, lo que es más importante, una amplia zona para el montaje sin soldadura de cualquier circuito electrónico. También dispone de tensiones de alimentación, generador de funciones y mucho más. ¡¡ Es el equipo que vamos a usar en los ejemplos que proponemos en el presente módulo de prácticas !!

NOTA: Los ejemplos propuestos también se pueden realizar por todos aquellos usuarios que dispongan de las versiones anteriores, la V1 y la V2, del entrenador Universal Trainer.

Figura 1-6. El entrenador Universal Trainer V3 Como ya se ha comentado anteriormente, dada su popularidad y su uso extendido, podemos encontrar numerosos shields de propósito específico como los mostrados en la figura 1-7. De entre los muchos disponibles en el mercado, cabe destacar los shields para el control de relés y de motores, shields con interfaces a Ethernet, WiFi, y Bluetooth, shileds para el control de pantallas gráficas y de texto, robots y muchos más. Incluso podemos encontrar shields universales para la construcción de prototipos. Consisten en unas tarjetas impresas que se insertan sobre las tarjetas ARDUINO de control y donde cada cual puede cablear la electrónica que necesite en un momento dado. Figura 1-7. Shields de propósito general

3- HERRAMIENTAS SOFTWARE PARA ARDUINO ARDUINO es un controlador al que debemos programar para que realice una determinada tarea. Para ello necesitamos una serie de herramientas software que nos permitan y faciliten la programación. Una de esas herramientas es el propio lenguaje que vamos a emplear en el diseño de nuestros programas. Recibe el nombre de “Lenguaje ARDUINO” y se trata de un lenguaje expresamente diseñado para poder ser usado por personas que no tengan grandes conocimientos de programación. Recordemos que ARDUINO pretende ser una plataforma que acerque la tecnología a todos los niveles y que nos aliente y nos siembre el “gusanillo” de la programación. Es un lenguaje de alto nivel similar en funciones y estructuras al lenguaje C, muy utilizado en el ámbito profesional. ¡¡ Todo lo que aquí aprendas, lo podrás usar en un futuro !! El lenguaje ARDUINO, como todos los lenguajes (incluidos los humanos), está en constante evolución. Con el tiempo van apareciendo nuevas expresiones, reglas y sentencias. En este módulo de prácticas vamos a construir nuestros programas y ejemplos usando las funciones principales. Ya tendrás tiempo de ir profundizando conforme vayas adquiriendo más conocimientos. No olvides que el lenguaje de programación ARDUINO ¡¡ es libre !!.

1-4

ARDUINO: La tecnología al alcance de todos TEMA 1: El Universo ARDUINO www.microcontroladores.com

Otra herramienta software que necesitamos es la conocida como “Entorno de trabajo de ARDUINO” también conocido como “IDE”. Es una aplicación que se ejecuta en nuestro PC y la podemos conseguir, de forma gratuita, para los sistemas operativos Windows, Mac OS X y Linux. Con ella podemos escribir nuestros programas, verificarlos, guardarlos en un archivo, recuperarlos y grabarlos físicamente sobre la memoria FLASH de programa del controlador ARDUINO. La figura 1-8 muestra el aspecto del IDE de ARDUINO.

Figura 1-8. El entorno de trabajo IDE de ARDUINO Vemos una ventana sobre la cual escribiremos nuestro programa empleando el lenguaje ARDUINO. En el argot de ARDUINO los programas reciben el nombre de “Sketch”. Mediante una serie de opciones y botones podremos:    

Escribir y editar nuestro programa. Guardar en un archivo nuestro programa. Recuperar nuestro programa o Sketch desde un archivo. Verificar que nuestro programa esté escrito correctamente según las reglas del lenguaje ARDUINO. Esto implica que el IDE de ARDUINO … ¡¡ Incluye al propio lenguaje ARDUINO !!

1-5

ARDUINO: La tecnología al alcance de todos TEMA 1: El Universo ARDUINO www.microcontroladores.com

    

Grabar el programa o Sketch en la memoria de programa tipo FLASH del controlador. Establecer preferencias de trabajo. Seleccionar el tipo de tarjeta con la que estamos trabajando: ARDUINO UNO, MEGA 2560, NANO, etc. Seleccionar el canal de comunicaciones entre el ordenador y la tarjeta ARDUINO. Y mucho más….

Una vez más tenemos que repetir que el entorno IDE de trabajo de ARDUINO, y el lenguaje de programación que incluye, son totalmente gratuitos y están disponibles en la página web oficial: www.arduino.cc. Te lo puedes descargar libremente para los sistemas operativos Windows, Mac OS X y Linux. Es más, recomendamos que periódicamente visites el sitio con objeto de descargar la última versión disponible. 4.- EL EQUIPO DE PRÁCTICAS Vamos a ir describiendo el equipo que necesitamos para poder realizar los múltiples ejemplos de programación que vamos a proponer en el presente módulo de prácticas. 4.1 El controlador ARDUINO NANO Es el que vamos a utilizar en todos los ejemplos. En la figura 1-9 tenemos la distribución de las patillas de la tarjeta de control ARDUINO NANO. Te recomendamos que la tengas siempre a mano. Observa que todas ellas tienen una, dos e incluso tres funciones diferentes que se pueden configurar por programa. Por ejemplo, la patilla 9 se puede emplear como línea digital de entrada o salida (E/S) o bien como salida de señal PWM. Tal y como se aprecia en la imagen, la patilla 1 es la primera del ángulo superior izquierdo. Se van contando de forma correlativa en sentido contrario a las agujas del reloj.

Figura 1-9. Patillaje del ARDUINO NANO En la tabla siguiente se detalla la función de cada una de ellas.

1-6

ARDUINO: La tecnología al alcance de todos TEMA 1: El Universo ARDUINO www.microcontroladores.com

FUNCION D0 – D13

DESCRIPCIÓN Entradas o salidas digitales. Permiten leer o sacar niveles lógicos: “1” = tensión (5V); “0” = No tensión (0V)l La línea 13 está conectada a un led situado en la propia tarjeta. TX/RX Señales de transmisión (TX) y recepción (RX) en las comunicaciones serie tipo USART. RESET Entradas para reiniciar el sistema. Es activa por nivel “0” y están también conectadas con el pulsador que hay en la propia tarjeta. GND Entradas de tierra de alimentación INT0 / INT1 Entradas de interrupción externa. Se pueden configurar por programa para que sean activas por nivel “0”, o por flanco ascendente o descendente o por cambio de estado lógico. PWM Salidas de señal modulada en anchura (PWM) SDA / SCL Señales para la comunicación serie tipo I2C. Esta comunicación se gestiona mediante las funciones incluidas en la librería “Wire” SS / MOSI Señales para la comunicación serie tipo SPI. Esta comunicación se gestiona MISO / SCK mediante las funciones incluidas en la librería “SPI” AREF Entrada de tensión de referencia para los convertidores analógico / digital A0 – A7 Entradas analógicas al convertidor. Este tiene una resolución de 10 bits por lo que proporciona una escala de 1024 valores diferentes. 3V3 Salida de 3.3V. +5V Entrada / Salida de la tensión interna de trabajo, estabilizada a 5V VIN Entrada de tensión de alimentación. Puede estar comprendida entre 6 y 20V como máximo. U1

Simplemente representamos el número de cada una de las patillas y la función principal de las mismas: D0 - D13 (E/S digitales), A0 – A7 (entradas analógicas), RESET, GND, 3V3, AREF, +5V y VIN. Hay que remitirse a la figura 1-9 anterior para conocer el resto de funciones que pueden estar asociadas a alguna de esas patillas.

D1 D0 RESET GND D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12

VIN GND RESET +5V A7 A6 A5 A4 A3 A2 A1 A0 AREF 3V3 D13

ARDUINO NANO

En lo sucesivo, con el fin de simplificar los esquemas eléctricos de los ejemplos propuestos, el símbolo de la tarjeta ARDUINO NANO lo vamos a representar como se muestra en la figura 1-10.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

Figura 1-10. Símbolo eléctrico de ARDUINO NANO

4.2 El Laboratorio Universal Trainer V3 Lo presentamos en la figura 1-6 anterior. Se trata de un laboratorio de propósito general para trabajar el aspecto práctico de la electrónica en sus diferentes especialidades: semiconductores, digital, analógica, micro programable, etc… Nos aprovecharemos de los recursos que dispone para trabajar con nuestro ARDUINO NANO:      

Entradas y salidas digitales mediante interruptores y leds. Displays de 7 segmentos. Entradas analógicas. Zumbador Fuentes de alimentación con diferentes tensiones de salida. Generador lógico con señales de onda cuadrada de diferentes frecuencias.

1-7

ARDUINO: La tecnología al alcance de todos TEMA 1: El Universo ARDUINO www.microcontroladores.com

Además, dispone de una amplia zona para el montaje sin soldadura. Esto nos permite insertar la tarjeta de control ARDUINO NANO, así como montar todos los circuitos eléctricos que necesitemos para llevar a cabo todo tipo de pruebas y experimentos.

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

+5Vcc

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

ARDUINO NANO

En primer lugar vamos a montar el circuito del esquema de la figura 1-11. Simplemente consiste en insertar ARDUINO NANO sobre el módulo board del entrenador, y alimentarlo con la tensión de +5V que éste nos proporciona. El montaje es común a todos los que iremos haciendo en las sucesivas prácticas. Aunque tenemos dos patillas, la 4 y la 29, por las que podemos aplicar la señal GND de alimentación, basta con que usemos una de ellas. En este caso empleamos la patilla 4. La patilla 27 la conectamos con la tensión de alimentación +5Vcc. Tanto GND como +5Vcc nos la suministra el entrenador Universal Trainer V3 Figura 1-11. Alimentando a ARDUINO NANO

En la fotografía de la figura 1-12 podemos apreciar el montaje práctico sobre el entrenador.

Figura 1-12. Montaje de ARDUINO NANO sobre el Universal Trainer V3 La tarjeta de control ARDUINO NANO se inserta a la derecha del módulo board del entrenador. De esta forma se hace más fácil su conexión con el PC, a través del conector mini USB. También disponemos de una amplia zona para el montaje de los circuitos y accesorios que precisemos en las diferentes prácticas. Como se muestra en la figura, empleamos tres cables para la alimentación de +5Vcc (rojos), y otros tres para la alimentación GND (negros). Ambas alimentaciones las suministra el entrenador Universat Trainer V3. Al conectar el entrenador se ilumina un led azul que indica la correcta alimentación de la NANO. También es posible que el led rojo, conectado con D13, parpadee. Esto es porque la NANO suele venir con un programa de test. IMPORTANTE: Aunque en este documento, todos los ejemplos se desarrollan sobre el entrenador Universal Trainer V3, también es posible hacerlo sobre las versiones anteriores, la V1 y la V2, de dicho entrenador.

1-8

ARDUINO: La tecnología al alcance de todos TEMA 1: El Universo ARDUINO www.microcontroladores.com

4.3 Instalación / Configuración del software En el momento de escribir este documento, la última versión disponible de las herramientas software de Arduino, el entorno IDE de trabajo y el lenguaje de programación, es la 1.0.5. Se puede descargar de forma gratuita desde:

www.arduino.cc/en/Main/Software Recomendamos visitar este sitio con cierta frecuencia para obtener la última versión más actualizada. Al seleccionar la versión Arduino 1.0.5 (o la que sea), tenemos la opción de elegir para qué sistema operativo la deseamos: Windows, Mac OS X y Linux. En nuestro caso vamos a trabajar con Windows. Aunque todos los ejemplos los hemos realizado bajo W XP, también los hemos probado bajo W 7 y W8 de 64 bits. Funciona todo correctamente. En la versión 1.0.5 se puede descargar un único archivo ejecutable de instalación llamado “arduino1.0.5-windows.exe” y que también lo adjuntamos en el CDROM que acompaña a este módulo de prácticas. Al ejecutarlo, automáticamente se instala el entorno de trabajo (IDE), el lenguaje, los archivos auxiliares y los drivers. Basta con ir aceptando las diferentes preguntas que se realizan durante el proceso de instalación. En el escritorio aparecerá un icono de acceso directo. Al hacer doble click sobre él, se abre la ventana de trabajo de Arduino, como la mostrada en la figura 1-13.

Figura 1-13. El entorno IDE de trabajo de Arduino

1-9

ARDUINO: La tecnología al alcance de todos TEMA 1: El Universo ARDUINO www.microcontroladores.com

Se trata de un entorno muy sencillo. La mayor parte de tareas las podemos realizar mediante los botones: verificar, grabar, nuevo, cargar y salvar Sketchs. El área destinada a la escritura de los programas o sketchs se comporta como un editor de textos convencional. Las opciones del menú principal permiten realizar las típicas operaciones de Windows relacionadas con los Archivos (“Archivo”), Edición de textos (“Editar”), Programas (“Sketch”), Selección de herramientas y configuración (“Herramientas”) y opciones de ayuda (“Ayuda”). Una de las primeras tareas a realizar es seleccionar con qué tipo de tarjeta de control vamos a trabajar. En nuestra caso, como se muestra en la figura 1-14, seleccionamos: Herramientas  Tarjeta  Arduino Nano w/ Atmega328

Figura 1-14. Selección de la tarjeta de control Arduino NANO Ahora podemos conectar la tarjeta Arduino NANO en uno de los puertos USB de nuestro PC. En pantalla nos aparece un “globo” indicando que se ha detectado un nuevo dispositivo USB, concretamente el ARDUINO NANO. Transcurrido un cierto tiempo el sistema nos informa de que el dispositivo está instalado y listo para usarse.

1 - 10

ARDUINO: La tecnología al alcance de todos TEMA 1: El Universo ARDUINO www.microcontroladores.com

Cuando se conecta la tarjeta NANO y se instala sobre un puerto USB, se crea un canal serie virtual COMx. El siguiente paso es establecer la comunicación entre el entorno de trabajo IDE y dicho canal serie COMx. Para ello seleccionamos: Herramientas  Puerto Serial  COMx, como se muestra en la figura 1-15.

Figura 1-15. Selección del canal serie COMx de comunicaciones Es posible que en nuestro PC tengamos más de un canal serie COM. Si deseamos conocer en cuál de ellos quedó instalado nuestra tarjeta controladora Arduina NANO cuando la conectamos al puerto USB, podemos recurrir al administrador de dispositivos de Windows: InicioPanel de controlSistemaHardwareAdministrador de dispositivosPuertos (COM & LPT) Como se muestra en la figura 1-16, el puerto serie virtual se asignó, en nuestro caso, al COM23.

Figura 1-16. Asignación del puerto COM

1 - 11

ARDUINO: La tecnología al alcance de todos TEMA 1: El Universo ARDUINO www.microcontroladores.com

¡Por fin! ya tenemos todo lo necesario para empezar a trabajar. Podemos hacer un pequeño programa, a modo de test, para comprobar el correcto funcionamiento de todo el sistema. Puede servir como ejemplo el que se muestra en la figura 1-17 que, como todos los demás ejemplos, se incluye en el CDROM que acompaña al módulo de prácticas.

Figura 1-17. Programa de test Aunque el programa del ejemplo es muy sencillo, no te preocupes si no consigues entenderlo en su totalidad. Simplemente lo transfieres, mediante el botón “Cargar”, a la tarjeta de control Arduino NANO. Observa que el led rojo se enciende y apaga a intervalos de un segundo. Puedes hacer también la siguiente comprobación. Desconecta el cable USB de la tarjeta Arduino NANO. Desconecta la alimentación del entrenador y la vuelves a conectar. El led sigue realizando la secuencia de intermitencia. Esto demuestra que, una vez has transferido un programa a la tarjeta, este permanece en ella indefinidamente, Arduino NANO es independiente del PC. Ya estás listo para empezar a realizar los múltiples ejemplos que vamos a ir proponiendo. En Ingeniería de Microsistemas creemos que te vas a divertir, al mismo tiempo que te vas introduciendo en la tecnología y la programación. Esperamos que te “enganches”.

1 - 12

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

TEMA 2: Las entradas y salidas Digitales 1.- INTRODUCCIÓN En el mundo digital todas las cosas u objetos se contemplan como si únicamente pudieran tener dos estados diferentes y opuestos. A esto se le conoce como estados “binarios”. Por ejemplo, una bombilla puede estar encendida o apagada, pero nunca se pueden dar ambas situaciones al mismo tiempo. Ejemplos como este podemos poner muchos:       

Un interruptor o un pulsador puede estar accionado o no, pero no ambas cosas al mismo tiempo El motor está girando (no importa a qué velocidad) o puede estar parado. La sirena de una alarma está activada o no lo está. Un relé puede estar activado o no, lo mismo que por ejemplo, una electro válvula. Podemos tener pulsada una tecla del teclado de nuestro ordenador, o no tenerla. Un sensor detecta la presencia de un objeto o su ausencia. Tu mismo, puedes reír o llorar, vivir o morir, pero nunca ambas cosas al mismo tiempo.

El concepto de “todo” o “nada”, “activado” o “desactivado”, “cerrado” o “abierto”, “pulsado” o “no pulsado”, tiene una relación directa con la electricidad. Efectivamente, la bombilla está “activada” cuando se le aplica tensión (+V), y “desactivada” cuando no se le aplica tensión (0V). Cuando un interruptor está “abierto” decimos que corta la tensión (0V), sin embargo cuando está “cerrado”, deja pasar la tensión (+V). Al objeto de abreviar se definen dos estados o niveles lógicos diferentes:  

“nivel 1” cuando hay tensión (+V). También se le denomina “nivel alto”, “high”, “ON” o, simplemente, “1” “nivel “0” cuando no hay tensión (0V). También se le denomina “nivel bajo”, “low”, “OFF” o, simplemente, “0”

Quizá a partir de este momento entiendas un poquito más el funcionamiento del programa de Test que viste en el tema anterior. Al led conectado en la patilla D13 de E/S se le aplicaba un nivel alto (HIGH) y se iluminaba. Luego se le aplicaba nivel bajo (LOW) y se apagaba. El proceso se repetía de forma indefinida con un intervalo de tiempo de 1 segundo para cada caso. En la figura 2-1 tenemos una representación gráfica de una señal digital o binaria. El eje vertical representa la tensión (+V). No importa su valor, aunque en los equipos digitales actuales es frecuente que sea de 5V o de 3.3V. Un “0” equivale a 0V y un nivel “1” equivale a tensión y se representa mediante una línea horizontal por encima de la línea que representa el nivel “0”. A esta gráfica se le llama “Diagrama de tiempos” Figura 2-1. Representación de una señal digital El eje horizontal representa el tiempo T. Muestra el intervalo de tiempo en que la señal digital permanece a “0”, luego a “1” y vuelta a valer “0”. Ahora fíjate en el diagrama de tiempos de la figura 2-2. Representa a tres señales digitales de otros tantos dispositivos: un interruptor, un motor y una bombilla. Observándolo con atención podemos decir que:   

El interruptor está abierto (sin accionar) durante un segundo. Luego se cierra (acciona) durante otro segundo. Se abre durante tres segundos y, finalmente, se cierra durante dos. El motor está parado durante dos segundos, en movimiento durante cuatro y parado durante uno. La bombilla se apaga y enciende a intervalos de un segundo. ¿Te suena?

2-1

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

Figura 1-2. Análisis de tres señales digitales

2.- ENTRADAS DIGITALES Son señales binarias que se introducen al controlador (p.e. a la tarjeta Arduino NANO) a través de determinadas patillas, y procedentes de determinados periféricos de entrada como pueden ser interruptores, pulsadores, sensores, detectores, teclados, etc…Sea cual sea el periférico empleado, solo puede introducir señales con niveles lógicos binarios: “0” (no tensión) o “1” (tensión). Los pulsadores y/o interruptores son los periféricos de entrada más utilizados y sencillos que existen. En la figura 2-3 se muestra un posible esquema eléctrico de conexión entre un pulsador y una línea de entrada del controlador. Cuando el pulsador está sin accionar, la señal S suministra un nivel lógico “0” (0V) a la entrada del controlador. Cuando se pulsa introduce un nivel lógico “1” (+5V). Se dice de este circuito que trabaja con “lógica positiva”. Si NO se acciona se introduce un nivel “0”, y si se acciona se introduce un nivel “1” al controlador.

Figura 2-3. Pulsador de entrada con lógica positiva

Otra forma de circuito es la mostrada en la figura 2-4. Cuando el pulsador está sin accionar, la señal S suministra un nivel lógico “1” de +5V a la entrada del controlador. Cuando se pulsa introduce un nivel lógico “0”.Se dice que este nuevo circuito trabaja con “lógica negativa” o “invertida”. Si NO se acciona introduce un nivel “1”, si se acciona introduce un nivel “0” al controlador. Funciona justamente al revés que el anterior.

Figura 2-4. Pulsador de entrada con lógica negativa

2-2

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

No importa cuál de los dos circuitos empleemos. Lo realmente importante es saber cómo leer la entrada del controlador a la que está conectado ese pulsador, e interpretar correctamente el valor binario leído. 3.- SALIDAS DIGITALES Son señales binarias de nivel “0” (no tensión) o de nivel “1” (tensión) que, es esta ocasión, proporciona el controlador por algunas de sus patillas. En esas patillas conectamos los periféricos de salida que vamos a gobernar tales como: bombillas, relés, motores, válvulas, alarmas, etc.. El controlador puede por tanto activarlos o desactivarlos. Uno de los periféricos de salida más sencillos y económicos son los llamados diodos “Led”. Son pequeños dispositivos que cuando se activan emiten luz. El led tiene dos patillas: ánodo (A) y cátodo (K). Para que se ilumine es necesario aplicarles una tensión de “polarización directa”. Se consigue cuando el ánodo (A) es positivo respecto al cátodo (K). Los hay de diferentes formas, tamaños y colores y se emplean mucho como pilotos de señalización o indicadores. En la figura 2-5 se muestra el esquema eléctrico necesario para conectar una patilla de salida del controlador, a uno de estos leds. Cuando la señal S de salida está a nivel “0” (0V), el diodo led se apaga. Su ánodo queda con 0V, al igual que el cátodo. Cuando la señal de S salida está a nivel “1” (+5V), el led se ilumina. Su ánodo ahora es positivo respecto al cátodo. Se dice de este circuito que trabaja con “lógica positiva”. Si el controlador saca un “0” el led se apaga, si saca un “1” el led se enciende. Figura 2-5. Control de un led de salida con lógica positiva

Otra forma de controlar a un led es mediante el circuito de la figura 2-6. Cuando la señal S que saca el controlador por una de sus patillas de salida es de nivel “1” (+5V), el led se apaga ya que tanto el ánodo como el cátodo tienen la misma tensión (+5V). Cuando la señal S de salida está a nivel “0” (0V), el led se ilumina. En esta ocasión el ánodo es positivo (+5V) respecto al cátodo. Este circuito trabaja con “lógica negativa” o “invertida”. Si el controlador saca un “0” el led se enciende, si saca un “1” el led se apaga. Funciona justo al contrario que el circuito anterior.

Figura 2-6. Control de un led de salida con lógica negativa

Nuevamente no es importante cuál de los dos circuitos empleemos. Lo que realmente importa es saber qué hay que hacer para que el controlador saque por sus patillas de salida, cualquiera de los dos niveles lógicos. RECORDAR: Lo mismo que leemos el estado de un pulsador, podemos leer el estado de una tecla, un interruptor, un sensor, un final de carrera, etc… Igualmente, si que somos capaces de activar o desactivar un led, podremos activar o desactivar un relé, un motor, una válvula, etc.. IMPORTANTE. La corriente que es capaz de entregar un controlador por cualquiera de sus patillas de salida, es limitada. En el caso de Arduino NANO es una corriente de 40mA, suficiente para activar directamente leds o cargas de consumo similar. Si se quiere controlar dispositivos con un mayor consumo, las líneas de salida deben conectarse a circuitos que amplifiquen en corriente y/o en tensión la señal. De no hacerlo es muy posible que estropeemos el controlador.

2-3

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

4.- INSTRUCCIONES PARA EL CONTROL DE LA E/S DIGITALES Ya va siendo hora de que estudiemos las funciones del lenguaje Arduino encargadas de controlar las líneas de entrada o salida (E/S) de nuestra tarjeta Arduino NANO. Fundamentalmente son tres y muy sencillas: 4-1 Función pinMode() Configura una línea digital (patillas D0 - D13) para que actúe como entrada o como salida. Normalmente se suele poner al principio de un programa. Por defecto, al iniciar el sistema, todas las líneas de E/S quedan configuradas como entradas. Sintaxis: pinMode(pin,modo) pin: Expresa el número de la patilla de E/S que vamos a configurar (D0-D13) modo: Establece si actúa como entrada (INPUT) o salida (OUTPUT) Ejemplos: pinMode(6,OUTPUT); pinMode(13,OUTPUT); pinMode(3,INPUT);

//La línea D6 se configura como salida digital //La línea D13 se configura como salida digital //La línea D3 se configura como entrada. Es opcional

4-2 Función digitalRead() Lee y devuelve el estado (“1” o “0”, “HIGH” o “LOW”) de cualquiera de las patillas digitales. Sintaxis: digitalRead(pin) pin:

Expresa el número de la patilla que vamos leer (D0-D13)

Ejemplos; V=digitalRead(6); V=digitalRead(3);

//Lee el estado actual de la patilla digital D6 y lo guarda en la variable V. //Lee el estado actual de la patilla digital D3 y lo guarda en la variable V.

4-3 Función digitalWrite() Escribe o saca por una patilla digital de salida el valor binario “1” o “0”, “HIGH” o “LOW”. Sintaxis: digitalWrite(pin,valor) pin: valor:

Expresa el número de la patilla de salida sobre la que vamos a escribir. Indica el valor de salida: “HIGH” =”1”, o bien “LOW” = “0”.

Ejemplos digitalWrite(6,HIGH); digitalWrite(13,LOW); digitalWrite(6,digitalRead(3));

//La salida D6 se pone a nivel “1” (+5V) //La salida D13 se pone a nivel “0” (0V) //Lee el valor de la entrada D3 y lo saca por la salida D6

2-4

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

5.- EL PRIMER EJEMPLO: “FUNCION SI” ¡Manos a la obra! Vamos a resolver íntegramente nuestro primer proyecto al que llamaremos “Función SI”. Será una cosa muy sencilla pero que nos permitirá utilizar las tres funciones anteriores y observar el aspecto general de un programa escrito en el lenguaje Arduino.

5-1 Montaje práctico

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

+5Vcc

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

Se trata de leer el estado lógico de un interruptor conectado con la entrada D3, y reflejarlo sobre un led conectado con la salida D2. SI el interruptor vale “1”, el led también valdrá “1”. SI el interruptor vale “0”, el led también valdrá “0”. Fíjate en el esquema eléctrico de conexiones de la figura 2-7.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

ARDUINO NANO

Vamos a usar el entrenador Universal Trainer V3 (o el V1 / V2) que, como ya sabemos, dispone de múltiples dispositivos de prueba. Conectamos el led S0 con la señal D2 de la tarjeta Arduino NANO (patilla 5). El interruptor E0 lo conectamos con la señal D3 (patilla 6). Suponemos que la tarjeta de control Arduino NANO está insertada sobre el módulo board del entrenador, y alimentada debidamente como ya se explicó en el tema anterior.

S0

E0

Figura 2-7. Esquema eléctrico para el primer ejemplo La fotografía de la figura 2-8 muestra el montaje práctico realizado sobre el entrenador. Procura emplear cablecillos de diferentes colores para, por ejemplo, distinguir entre las entradas y las salidas.

Figura 2-8. Montaje práctico

2-5

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

5.2 El programa “Función_SI” En primer lugar vamos a ver qué aspecto tiene un programa escrito en el lenguaje Arduino, sobre su entorno IDE de trabaja. Observa la figura 2-9.

Figura 2-9. Aspecto de un programa en el lenguaje Arduino Vallamos por partes. Ya ves que hemos dividido la pantalla de trabajo en tres secciones. Vamos a detallarlas. Sección 1 Aunque no solemos hacerlo por pura pereza, es una muy buena práctica documentar los programas. Los comentarios sirven para informar de quien es el autor, la empresa, versión del programa, fecha de creación y todo aquello que se considere oportuno. También se puede indicar qué herramientas hardware o software se necesitan para ejecutar el programa y, lo más importante, explicar brevemente qué es lo que hace.

2-6

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

Podemos escribir cualquier tipo de texto siempre y cuando vaya encerrado entre los signos /* ……… */. También se puede documentar cada sentencia o grupo de sentencias del programa, para explicar qué es lo que hacen. Se suele hacer mediante textos sencillos que van precedidos de los signos //. En, general podemos poner cualquier texto en cualquier lugar del programa. Si es un texto de varias líneas, se encierra entre /* …. */, y si es de una única línea, suele ir precedido de //. Sección 2 En el lenguaje Arduino es necesario incluir la función setup(). Normalmente suele ir al principio del programa. Todas las sentencias que estén incluidas dentro de las llaves, se ejecutan una única vez, al iniciar el sistema. Por este motivo aquí suelen ponerse las funciones de configuración, como por ejemplo: void setup() { pinMode( 2 , OUTPUT ); } La señal D2 queda configurada como salida y no es muy probable que esta situación cambie a lo largo de un mismo programa. Puedes poner cualquier tipo de función, pero recuerda: sólo se ejecutan una vez. En ocasiones quizá no necesites configurar nada. En este caso, aunque vacía, también es necesario ponerla: void Setup() { } Sección 3 Esta función también es imprescindible y contiene el cuerpo principal de nuestro programa. Todas las funciones que lo componen deben estar cerradas entre las llaves. En nuestro ejemplo: Void loop() { digitalWrite( 2, digitalRead(3)); } Todas las funciones que estén incluidas entre las llaves {……} se ejecutan de forma indefinida, desde la primera a la última y de nuevo la primera. En nuestro ejemplo, la lectura de la entrada D3 y la escritura sobre la salida D2, se ejecutan constantemente a la velocidad propia del controlador. En otros lenguajes de alto nivel como el C, está función también es imprescindible y suele recibir el nombre de “main()”. 5-3 Grabación del programa Una vez tenemos escrito nuestro programa, el siguiente paso es transferirlo a la memoria Flash del controlador. Es una tarea muy sencilla. Basta con pulsar el botón “Cargar” del entorno de trabajo IDE de Arduino. Transcurrido un cierto tiempo, nos aparecerá un mensaje de “Carga terminada”, así como un resumen de la memoria que consume nuestro programa sobre el total disponible. Ver de nuevo la figura 2-9. Es importante que sepas que, una vez que cargas un programa en el controlador, este se mantiene por tiempo indefinido aunque desconectes la alimentación. La única forma de borrarlo es cargando otro programa nuevo.

2-7

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

5-4 Comprobación Es el último paso. Es la hora de comprobar si todo, tanto el hardware como el software, funciona correctamente. Nuestro actual ejemplo es muy sencillo de verificar. Basta que introduzcas un nivel “1” con el interruptor E0 (interruptor hacia arriba). El led S0 se debe iluminar. Cuando introduces un nivel “0” (interruptor E0 hacia abajo), el led se apaga. Debes tener en cuenta que a la velocidad que el controlador ejecuta nuestro programa, cualquier cambio que se produzca en la entrada D3 (interruptor E0), repercute inmediatamente sobre la salida D2 (Led S0). En este instante seguro que te estás cuestionando si es necesario utilizar un controlador para iluminar una simple bombilla mediante un interruptor. Tiempo al tiempo, ya se irán complicando los programas e irás viendo las casi infinitas posibilidades que posee. 5.5 Trabajo personal No te limites a comprobar el funcionamiento de los ejemplos que te vamos a ir proponiendo. Casi seguro que funcionan. Lo interesante sería que, además de estudiarlos, los modifiques a tu gusto y los adaptes a tus necesidades con objeto de que vayas cogiendo el hábito de la programación. Por ejemplo, puedes modificar tanto el esquema eléctrico como el programa anterior para controlar el encendido de varios leds mediante varios interruptores. Te propongo controlar cuatro leds de salida conectados con las señales D2, D3, D3 y D4, mediante 4 interruptores conectados con las señales D5, D6, D7 y D8 del controlador. Dibuja a continuación el esquema eléctrico y escribe el programa correspondiente.

2-8

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

6.- PRINCIPALES FUNCIONES LOGICAS En el mundo digital es muy frecuente hacer ciertas operaciones llamadas “Funciones lógicas”. Realmente, el ejemplo anterior respondía a una de ellas: la función “SI”. En la figura 2-10 su resume el funcionamiento. La “tabla de la verdad” resume el valor binario de la salida S, en función del valor binario de la entrada E. Es muy sencillo. Si E=0  S=0, si E=1  S=1. También se representa el diagrama de tiempos. Si lo miras con cuidado verás que equivale a la tabla de la verdad. Por último se muestra el símbolo eléctrico que se emplea para esta función. Figura 2-10 La función lógica SI El funcionamiento del programa “Función_SI” del ejemplo anterior respondía exactamente a esta tabla de la verdad. También podemos establecer la ecuación lógica para esta función:

= 6-1 Función lógica NO Se trata de lo contrario a la función SI. También se le suele llamar función “NOT”. En la figura 2-11 se resume su funcionamiento. La salida S es lo contrario de la entrada E. Si E=0  S=1 y si E=1  S=0. Analiza la tabla de la verdad y el correspondiente diagrama de tiempos. Figura 2-11. La función NOT

El símbolo “ ! ” se emplea para expresar la función NO al escribir nuestros programas. Dicha función responde a la siguiente ecuación lógica:

= Estudia el siguiente programa, “Función_NO”. Lo escribes y lo grabas. void setup() { pinMode( 2 , OUTPUT); //D2 Salida } void loop() { digitalWrite(2, ! digitalRead(3)); //D2 e la función NO con D3 } Comprueba que cuando el interruptor E0 está a “0” (hacia abajo), el led S0 está ………………………………… Comprueba que cuando el interruptor E0 está a “1” (hacia arriba), el led S0 está ………………………………… ¿Cuál es la diferencia con respecto al ejemplo previo? ……………………………………………………………….. ………………………………………………………………………………………………………………………………….

2-9

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

6-2 Función lógica Y Se le conoce también como función AND y su funcionamiento se resume en la figura 2-12. La salida S es “1” cuando las entradas E1 y E2 también están a nivel “1”. Emplearemos el símbolo “ & ” en nuestros programas y se dice que realiza un producto lógico. Su ecuación responde a:

=

∙ +5Vcc

La patilla 5 de la tarjeta de control Arduino NANO se corresponde con la señal D2 y se conecta con el led S0 del entrenador.

ARDUINO NANO

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Realizar el montaje representado en el esquema eléctrico de la figura 213. Este mismo montaje lo vamos a emplear en los siguientes ejemplos con los que vamos a finalizar el presente tema.

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

Figura 2-12. La función Y (AND)

Las patillas 6 y 7 corresponden a las señales D3 y D4 y se conectan con los interruptores E2 y E1 del entrenador Universal Trainer. S0

E2

E1

Figura 2-13. Esquema para experimentar con las funciones lógicas

La fotografía de la figura 2-14 muestra el montaje práctico sobre el entrenador.

Figura 2-14. Montaje práctico

Aquí tienes el programa de ejemplo “Función_AND”. Lo estudias, lo escribes y lo grabas sobre la tarjeta controladora Arduino NANO.

2 - 10

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

void setup() { pinMode( 2 , OUTPUT); //D2 Salida } void loop() { digitalWrite(2, digitalRead(3) & digitalRead(4)); //Función AND entre D3 y D4 } Comprueba que si cualquier entrada está a “0”, la salida se mantiene a nivel lógico……………. La salida es de nivel lógico ……………… cuando ambas entradas están a nivel ………………..

6-3 Función O También se le conoce como función “OR” y su funcionamiento se representa en la figura 2-15. La salida S es “1” cuando cualquiera de las entradas E1 o E2, o ambas, están a nivel “1”. Emplearemos el símbolo “ | ” en nuestros programas y se dice que realiza la suma lógica (que no aritmética). Su ecuación responde a:

=

+

Figura 2-15. La función o (OR) Emplearemos el mismo esquema eléctrico y el mismo montaje práctico que se mostraba en las figuras 2-13 y 2-14. Analiza y escribe el ejemplo “Funcion_OR” que se muestra a continuación. Grábalo y verifica su funcionamiento. void setup() { pinMode( 2 , OUTPUT); //D2 Salida } void loop() { digitalWrite(2, digitalRead(3) | digitalRead(4)); //Función OR entre D3 y D4 } Comprueba que la salida es “0” cuando las entradas están a nivel …………………………. Si cualquiera de las entradas está a “1”, la salida queda a nivel …………………………….. La salida es “1” cuando ambas entradas están a nivel lógico ………………………………..

2 - 11

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

7.- FUNCIONES LOGICAS DERIVADAS Como consecuencia de combinar entre sí las funciones lógicas anteriores, podemos obtener otras funciones lógicas derivadas. Vamos a estudiarlas a continuación. 7-1 Función NO-Y También se le conoce como función “NAND” y es consecuencia de combinar una función AND y una función NOT. Su funcionamiento se representa en la figura 2-16. La salida S es “1” cuando cualquiera de las entradas E1 o E2, o ambas, están a nivel “0”. Su ecuación responde a:

=

∙ Figura 2-16. Función NAND

Se trata de una función AND (&) a cuya salida se le aplica una función NOT (!). El programa “Función_NAND” puede ser algo así como esto. void setup() { pinMode( 2 , OUTPUT); //D2 Salida } void loop() { digitalWrite(2, ! (digitalRead(3) & digitalRead(4))); //Función NAND entre D3 y D4 } Observa con cuidado los paréntesis. Siempre se ejecutan las funciones que estén en los paréntesis más internos. En este caso se leen las entradas D3 y D4 y se realiza la función AND (&) con ellas. A continuación, con el resultado obtenido, se realiza la función NOT (!) y el resultado se escribe sobre la salida D2. Escribe y carga el programa sobre la tarjeta Arduino NANO. Comprueba el funcionamiento. 7-2 Función NO-O También se le conoce como función “NOR” y es consecuencia de combinar una función OR y una función NOT. Su funcionamiento se representa en la figura 2-17. La salida S es “1” cuando las entradas E1 y E2 están a nivel “0”. Su ecuación responde a:

=

+

Figura 2-17. Función NOR Se trata de una función OR (|) a cuya salida se le aplica una función NOT (!). Realiza una suma lógica (que no aritmética) invertida. El programa “Función_NOR” que resuelve esta ecuación puede ser el siguiente.

2 - 12

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

void setup() { pinMode( 2 , OUTPUT); //D2 Salida } void loop() { digitalWrite(2, ! (digitalRead(3) | digitalRead(4))); //Función NOR entre D3 y D4 } Observa con cuidado los paréntesis. Siempre se ejecutan las funciones que estén en los paréntesis más internos. En este caso se leen las entradas D3 y D4 y se realiza la función OR (|) con ellas. A continuación, con el resultado obtenido, se realiza la función NOT (!) y el resultado final se escribe sobre la salida D2. Escribe y carga el programa, y comprueba el funcionamiento. 7-3 Función Exclusiva-O También se le conoce como función “EOR” o bien “XOR” y es consecuencia de combinar funciones AND, OR y NOT. Su funcionamiento se representa en la figura 2-18. La salida S es “1” cuando el número de las entradas E1 y E2 que valen “1” es impar. Su ecuación responde a:

=(

)∙

)+(

∙(

) Figura 2-18. La función XOR

Una función AND realiza el producto lógico de las entradas E1 invertida y E2. Otra función AND realiza el producto de E1 y E2 invertida. Con el resultado de ambas funciones AND se realiza una suma lógica (que no aritmética) mediante una función OR que ofrece el resultado final. Fíjate en los paréntesis del programa de ejemplo “Función_XOR”, que resuelve la ecuación. void setup() { pinMode( 2 , OUTPUT); //D2 Salida } void loop() { digitalWrite(2, (( ! digitalRead(3) & digitalRead(4)) | (digitalRead(3) & ! digitalRead(4)))); //Función XOR } Lee e invierte (!) el estado de la entrada D3 y realiza la función AND (&) con D4. Luego lee e invierte (!) D4 y realiza la función AND (&) con D3. Con los resultados de ambas funciones AND se realiza una función OR (|), cuyo resultado final se escribe sobre la salida D2.

2 - 13

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

7-4 Función NO-Exclusiva-O También se le conoce como función “XNOR” y es consecuencia de combinar funciones AND, OR y NOT. Su funcionamiento se representa en la figura 2-19. La salida S es “1” cuando el número de las entradas E1 y E2 que valen “1” es par, lo contrario de la función XOR. Su ecuación responde a:

=(

)∙

+

∙(

)

Figura 2-19. La función XNOR Una función AND realiza el producto lógico de las entradas E1 invertida y E2. Otra función AND realiza el producto de E1 y E2 invertida. Con el resultado de ambas funciones AND se realiza una suma lógica (que no aritmética) mediante una función OR. El resultado de esta función OR se invierte para obtener el resultado final. Fíjate en los paréntesis del programa de ejemplo “Función_XNOR”, que resuelve la ecuación. void setup() { pinMode( 2 , OUTPUT); //D2 Salida } void loop() { digitalWrite(2, ! (( ! digitalRead(3) & digitalRead(4)) | (digitalRead(3) & ! digitalRead(4)))); XNOR entre D3 y D4 }

//Función

Lee e invierte (!) el estado de la entrada D3 y realiza la función AND (&) con D4. Luego lee e invierte (!) D4 y realiza la función AND (&) con D3. Con los resultados de ambas funciones AND se realiza una función OR (|). El resultado de esta función OR se vuelve a invertir (!) para obtener el resultado final que se escribe sobre la salida D2. 8.- LOS PUERTOS Hasta el momento, todas las líneas de entrada o salida de nuestro controlador Arduino NANO, se han manipulado de forma individual. Mediante las sentencias pinMode(), digitalRead() y digitalWrite() podemos configurar, leer y escribir cualquiera de las 14 líneas de E/S digitales numeradas de la D0 a la D13. Es una forma muy sencilla de controlar ciertos periféricos como pueden ser pulsadores, interruptores, leds, relés, etc…, pero SIEMPRE de forma individual. Se lee o se escribe sobre una determinada línea, valores de un único bit: el “0” o el “1”. Sin embargo, hay ocasiones en que necesitaremos poder leer o escribir en algún periférico, varios bits AL MISMO TIEMPO: una pantalla, un display de 7 segmentos o, por ejemplo, un conjunto de relés que deben reaccionar al unísono. Hacerlo mediante las funciones que conocemos no es recomendable ya que solo pueden manipular un bit cada vez. En primer lugar debemos saber que todas las líneas del Arduino NANO se distribuyen o agrupan en lo que se denominan “Puertos”. Cada puerto tiene 8 bits. La figura 2-20 nos muestra qué puertos tenemos y qué líneas de E/S los forman. Figura 2-20. Los puertos de E/S

2 - 14

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

De las 14 líneas de E/S que dispone Arduino NANO, 8 de ellas se encuentran en el Puerto D. Se trata de las líneas digitales D0-D7 y se encuentran en las patillas 1, 2, 5, 6, 7, 8, 9 y 10 del controlador respectivamente. Las 6 patillas de E/S restantes se encuentran en el Puerto B. Corresponden a las líneas digitales D8-D13 y se encuentran en las patillas 11 a la 16. Se recomienda repasar la figura 1-9. Los 8 bits del Puerto C se corresponden con las 8 entradas analógicas A0-A7. Se corresponden con las patillas 19-26 respectivamente. Se recomienda repasar la figura 1-9. A partir de este momento, si conseguimos leer o escribir en cualquiera de esos puertos, estaremos haciendo transferencias de datos de 8 bits simultáneamente, y no de un solo bit como lo hemos venido haciendo hasta ahora. Cada puerto se controla mediante 3 registros a través de los cuales podemos configurarlo como entrada o salida, leer un valor de 8 bits procedentes de las patillas de un puerto de entrada o escribir un valor de 8 bits sobre las patillas de un puerto de salida. La siguiente tabla resume dichos registros. PUERTO

REGISTRO DDRD

PUERTO D PORTD PIND DDRB PUERTO B PORTB PINB DDRC PUERTO C PORTC PINC

DESCRIPCION Registro para la configuración de las líneas D0-D7 como entrada o como salida. Un bit “1” configura una patilla como salida, un “0” como entrada. Es de lectura/escritura. Registro de salida de datos. Lo que en él se almacene sale por las patillas de salida D0-D7. Es de lectura/escritura. Registro de entrada de datos. El valor presente en las patillas de entrada D0-D7 se puede leer desde este registro. Es de solo lectura. Registro para la configuración de las líneas D8-D13 como entrada o como salida. Un bit “1” configura la patilla como salida, un “0” como entrada. Es de lectura/escritura. Registro de salida de datos. Lo que en él se almacene sale por las patillas de salida D8-D13. Es de lectura/escritura. Registro de entrada de datos. El valor presente en las patillas de entrada D8-D13 se puede leer desde este registro. Es de solo lectura. Registro para la configuración de las líneas A0-A7 como entrada o como salida. Un bit “1” configura la patilla como salida, un “0” como entrada. Es de lectura/escritura. Registro de salida de datos. Lo que en él se almacene sale por las patillas de salida A0-A7. Es de lectura/escritura. Registro de entrada de datos. El valor presente en las patillas de entrada A0-A7 se puede leer desde este registro. Es de solo lectura.

El lenguaje de programación Arduino permite manejar esos registros en forma de variables. Podemos leer el valor que contienen en un momento dado y también escribir nuevos valores en ellos. Un ejemplo vale más que mil palabras. Ejemplos: DDRD = B00001111;

Escribe el valor binario (B) sobre el registro DDRD. Esto configura las líneas D0-D3 como salida y las líneas D4-D7 como entradas. PORTD = B00000110; Saca el valor binario por las líneas de salida D0-D3. D1 y D2 se ponen a nivel “1”; D0 y D3 se ponen a nivel “0”. DDRB = 0; Las líneas D8-D13 del Puerto B se configuran como entradas. A = PINB; La variable A se carga con el valor presente en las líneas de entrada del Puerto B Ya ves que es muy sencillo. Basta con expresar qué valores quieres almacenar en cada registro para que puedas, bien configurarlo, o bien sacar un determinado valor por sus correspondientes patillas. Dicho valor lo puedes expresar en binario (B00001111), en hexadecimal (0xF) o bien en decimal (15). Todos ellos son equivalentes. La opción en binario es especialmente útil en estos casos.

2 - 15

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

NOTA: El uso de esta técnica nos permite actuar simultáneamente sobre varias líneas de entrada o salida, pero puede provocar ciertos problemas. Ten en cuenta que algunas líneas tienen otras funciones. Por ejemplo, D0 y D1 pueden ser usadas como recepción (Rx) y transmisión (Tx) en serie. D5 y D6 pueden ser salidas PWM, la línea D4 puede ser la señal SDA en comunicaciones I2C, etc… Estas funciones son gestionadas por ciertas sentencias del propio lenguaje Arduino. Ahora bien, si cambiamos sus configuraciones esas sentencias pueden no funcionar correctamente. Si no es estrictamente necesario, es mejor usar las sentencias pinMode(), digitalRead() y digitalWrite() ya conocidas. 8-1 Ejemplo: “Leer_Puerto” +5Vcc

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

Observa el esquema del montaje de la figura 2-21. Tenemos 4 interruptores, E3:E0, conectados con las líneas D11:D8 respectivamente. Estas se encuentran en el Puerto B y habrá que configurarlas como entradas. También se emplean los leds S3:S0 del laboratorio Universal Trainer, que se conectan con las líneas D3:D0 respectivamente. Estas se encuentran en el Puerto D y habrá que configurarlas como salidas.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

ARDUINO NANO

E3

S3

S2

S0

S1

E2

El programa lee simultáneamente el estado lógico de los 4 interruptores de entrada y lo saca simultáneamente por los 4 leds de salida. Si un interruptor cualquiera, por ejemplo E2, está a nivel “1”, el led correspondiente, S2, se ilumina. Si el interruptor está a “0”, el led se apaga.

E1 E0

Figura 2-21. Esquema de montaje

Ahora echemos un vistazo al programa “Leer_Puerto”. void setup() { DDRD = B00001111; DDRB = 0; } void loop() { PORTD = PINB; }

//D3:D0 salidas //D11:D8 entradas

//Lee las entradas D11:D8 y lo guarda en las salidas D3:D0

En la función void setup() configuramos las entradas y salidas. En DDRD se configura que las líneas D3:D0 actúan como salidas. En DDRB se configuran todas las líneas como entradas. Aunque en este caso sólo se emplean las líneas D11:D8, siempre es recomendable configurar también como entradas, aquellas líneas que no se usen. La función void loop() es el programa principal. Simplemente carga en PORTD (salidas D3:D0) el resultado de leer PINB (entradas D11:D8). Tanto la lectura de las cuatro entradas como la escritura sobre las cuatro salidas se hace simultáneamente. Si hubiéramos empleado las sentencias digitalRead() y digitalWrite() el programa hubiera sido bastante más largo y menos eficiente. Tendríamos que hacer tantas lecturas y escrituras como líneas queramos explorar. Además, esas lecturas y escrituras se harían de una en una, no de forma simultánea.

2 - 16

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

8-2 Ejemplo: “Calculadora_Binaria”

Realiza el montaje correspondiente al esquema de la figura 222. Los interruptores E3:E0 se conectan con las líneas D11:D8 respectivamente. Se configurarán como entradas. Con ellos vamos a introducir, a modo de dato variable, un número binario de 4 bits que puede ir desde 0000 (0) hasta 1111 (15).

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

+5Vcc

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

ARDUINO NANO

E3

Los 8 leds S7:S0 del laboratorio Universal Trainer se conectan con las líneas D7:D0 que se configuran como salidas. En estos leds vamos a visualizar, en binario, el resultado de realizar diferentes operaciones aritméticas entre el valor binario introducido por los interruptores, y diferentes constantes establecidas en el programa.

E2 E1

S7

S6

S5

S4

S3

S2

S0

S1

E0

Por ejemplo, si con los interruptores introducimos en binario el valor 1001 (9), y le sumamos la constante 0101 (5), el resultado que veremos en los leds será 00001110 (14).

Figura 2-22. Esquema de la “Calculadora_Binaria”

Miremos el cuerpo principal del programa: void loop() { PORTD = (PINB & B00001111) + 5; //Suma 5 al valor de las entradas D11:D8 } Al leer el Puerto B (PINB) se obtiene el estado lógico de TODAS sus líneas de entrada (que son 6). Sin embargo en este ejemplo solo nos interesa el estado de las líneas D11:D8 (las 4 de menos peso), a las que hemos conectado los 4 interruptores. Para evitar leer valores impredecibles en las líneas no conectadas, es muy frecuente emplear una función lógica, en este ejemplo la función AND, con objeto de descartarlas (PINB & B00001111). El resultado de la lectura de esas entradas siempre será B0000XXXX. Modifica convenientemente el programa para realizar las operaciones que se proponen en la siguiente tabla. Anota en ella los diferentes resultados de salida. OPERACION

Sumar 9

Restar 3

Multiplicar 13

Dividir 4

ENTRADA E3:E0 DECIMAL 1001 9 0010 2 1111 15 0110 6 1111 15 0010 2 0110 5 1111 15 1000 8 0110 6 1100 12 1000 8

SALIDA S7:S0 DECIMAL

2 - 17

ARDUINO: La tecnología al alcance de todos TEMA 2: Las entradas y salidas Digitales www.microcontroladores.com

2 - 18

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com

TEMA 3: Temporizaciones, expresiones y sonido,

ARDUINO NANO

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

De momento únicamente vamos a emplear el led S0 del entrenador, que lo conectaremos con la señal D2 (patilla 5) del controlador Arduino NANO.

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

Es posible que hasta este momento no te hayas dado cuenta de la gran velocidad a la que trabajan los controladores. Nuestro Arduino NANO no podía ser menos. Monta el circuito de prueba según el esquema mostrado en la figura 3-1.

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

+5Vcc

1.- INTRODUCCIÓN

S0

Figura 3-1. Esquema del circuito de prueba A continuación analiza el siguiente programa, lo escribes, lo grabas y lo pruebas: void setup() { pinMode( 2 , OUTPUT); //D2 Salida } void loop() { digitalWrite(2,HIGH); digitalWrite(2,LOW); }

//La salida D2 se pone a "1" //La salida D2 se pone a "0"

Es muy sencillo. La salida D2 se pone a nivel “1” (el led S0 se enciende) y luego la salida D2 se pone a nivel “0” (el led S0 se apaga). Ambas funciones están dentro de la función principal void loop(), por lo que se ejecutan de forma indefinida y el led se estará apagando y encendiendo constantemente. Ahora bien, ¿cómo ves el led S0 de salida? Lo ves permanentemente encendido. ¿Por qué? Porque a la velocidad que trabaja el controlador, el encendido y apagado es tan rápido que la retina de nuestros ojos ve al led siempre encendido. ¡Es una sensación óptica! El led sí que se apaga, pero no lo vemos. Un controlador como el Arduino NANO es capaz de ejecutar cientos de miles de instrucciones por segundo. Es una velocidad tan rápida que, en ocasiones, vamos a tener que obligarle a que realice ciclos de espera o “temporizaciones”. 2.- FUNCIONES DE TEMPORIZACION Una función de temporización en un programa, detiene la ejecución del mismo durante un determinado tiempo. El tiempo que deseamos “perder” se puede expresar en microsegundos o en milisegundos. El lenguaje Arduino de programación dispone de dos funciones para ello. 2-1 Función delayMicroseconds() Realiza una temporización de tantos microsegundos (µS) como se indiquen. Recuerda que: 1 segundo = 1000 mS, y 1 mS = 1000 µS. Así que: 1 segundo = 1.000.000 µS. Sintaxis: delayMicroseconds(n)

3-1

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com

n:

Expresa el número de microsegundos que se desea temporizar. Se trata de un número entero (16 bits) sin signo (“unsigned int”). Actualmente el número más grande que se puede indicar para realizar una temporización con precisión es de 16.383 (aproximadamente 16 mS). Esto puede variar en futuras versiones del lenguaje. Para realizar temporizaciones mayores se recomienda emplear la función delay().

Ejemplos: A=100; delayMicroseconds(A); delayMicroseconds(1000);

//Temporiza 100 µS = 0.1 mS = 0.0001 segundos //Temporiza 1000 µS = 1 mS = 0,001 segundos

2-2 Función delay() Realiza una temporización de tantos milisegundos (mS) como se indiquen. Recuerda que: 1 segundo = 1000 mS, y 1 mS = 1000 µS. Sintaxis: delay(n) n:

Expresa el número de milisegundos que se desea temporizar. Se trata de un número que puede ser un entero largo (32 bits) sin signo (“unsigned long”). Un número entero largo, con sus 32 bits, ocupa 4 32 bytes y puede representar un valor desde 0 hasta 4.294.967.295 (2 -1).

Ejemplos: A=100; delay(A); delay(1000); delay(60000);

//Temporiza 100 mS = 0,1 segundo //Temporiza 1000 mS = 1 segundo //Temporiza 60000 mS = 60 segundos = 1 minuto

3.- EJEMPLO: INTERMITENCIA El programa “Intermitencia” es una versión mejorada del ejemplo anterior. Observa que se intercala una temporización cada vez que se enciende o apaga el led. Se parece al programa “Test” que vimos en el Tema 1. int Tiempo=1000;

//Variable con el valor de la temporización

void setup() { pinMode( 2 , OUTPUT); //D2 Salida } void loop() { digitalWrite(2,HIGH); delay(Tiempo); digitalWrite(2,LOW); delay(Tiempo); }

//La salida D2 se pone a "1" //Temporiza //La salida D2 se pone a "0" //Temporiza

Cuando lo cargues sobre el controlador Arduino NANO, ahora sí que puedes apreciar perfectamente que el led se enciende y apaga a intervalos de un segundo.

3-2

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com

El ejemplo crea una variable, “Tiempo”, a la que se le carga con el valor de temporización deseado, en este caso 1000 mS = 1 seg. El valor de esa variable se puede modificar para hacer una intermitencia más o menos rápida. Cada vez que se cambie, debes volver a cargar el programa sobre el controlador. 3-1 Trabajo personal Puedes modificar el valor de la variable “Tiempo” tanto como desees. Proponemos que lo vayas reduciendo de forma sucesiva hasta que no se aprecie la intermitencia del led. Anota aquí el valor de “Tiempo” a partir del cual el led lo ves permanentemente iluminado. Valor: ……………………………….………………………………………………………………………………… 4.- MAS EJEMPLOS Mediante una serie de ejemplos, vamos a seguir jugando con las temporizaciones. Puedes usar tu imaginación para realizar programas cada vez más complejos y llamativos. 4-1 El “Faro” Se trata de un ejemplo muy sencillo que trata de simular el funcionamiento de un faro o baliza que señala su posición, mediante una serie de destellos regulares. En el ejemplo se producen tres destellos rápidos seguidos de una pausa de 1.5 segundos. 4-1-1 Trabajo personal  

Modificar los tiempos de los destellos y de la pausa. Hacer un programa con una secuencia de cinco destellos.

Más adelante aprenderás funciones y técnicas de programación que te permitirán escribir este mismo programa con muchas menos instrucciones, haciendo que sea más óptimo y consuma menos memoria del controlador. 4-2 “Juego de luces”

S2 S1 S0

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

+5Vcc

El programa enciende secuencialmente, de derecha a izquierda, desde S0 a S3, cada uno de los leds, dando una sensación de movimiento. Ver el montaje en la figura 3-3.

S3

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

ARDUINO NANO

Otro sencillo y vistoso ejemplo. Se trata de hacer un juego de luces. Vamos a emplear cuatro leds del entrenador, S3:S0, que se conectan respectivamente con las salidas D2:D5 de nuestro controlador, tal y como se muestra en el esquema de la figura 3-2.

Figura 3-2. Esquema del “Juego de luces”

Figura 3-3. Montaje práctico

3-3

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com

4-2-1 Trabajo personal   

Varía la temporización al objeto de variar el efecto de “movimiento” de las luces. Modifica el programa para que el movimiento sea ahora de izquierda a derecha. Más difícil todavía: combina ambos movimientos. Es decir desplaza de izquierda a derecha y seguidamente de derecha a izquierda.

4-3 “Semáforo V1”

El pulsador E10 se conecta con la entrada de RESET. Se emplea para iniciar la secuencia de funcionamiento del semáforo.

VERDE S2 AMBAR S1 ROJO S0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

ARDUINO NANO

El led S2 se conecta con la señal D2 y emula a la luz verde. El led S1 se conecta con D3 y emula a la luz ámbar. S0 se conecta con D4 y emula a la luz roja.

E10 RESET

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

+5Vcc

Es la primera versión de un programa que trata de emular el funcionamiento de un semáforo. El esquema de conexiones se muestra en la figura 3-4.

Figura 3-4. Esquema del semáforo.

Se recomienda grabar el programa antes de conectar el pulsador RESET en la patilla 3 Si te fijas en el programa verás un detalle importante. Todas las funciones que lo componen están incluidas en la función void setup(). Esto quiere decir que sólo se van a ejecutar una única vez: cada vez que se reinicie el sistema. Por su parte, la función void loop() está vacía. No contiene ninguna instrucción para ejecutar. Cuando el controlador entra en ella, se queda sin hacer nada en un bucle infinito. En otras palabras, la secuencia del semáforo sólo se produce cuando pulses el botón RESET de reinicio. 4-3-1 Trabajo personal  

Modifica los tiempos en que cada luz permanece encendida y/o apagada. Si te fijas en un semáforo convencional, verás que antes de que la luz verde pase a ámbar, y la ámbar pase a roja, ambas luces realizan una serie de destellos de aviso. ¡Date prisa!

5.- EXPRESIONES A estas alturas habrás observado que las instrucciones que hemos visto hasta el momento, y la mayoría de las instrucciones del lenguaje Arduino, necesitan uno o más parámetros u operandos para su correcto funcionamiento. Estos van cerrados entre paréntesis y separados por “,”. De momento hemos estudiado:     

pinMode (pin, modo) digitalRead (pin) digitalWriyte (pin,valor) delay (tiempo) delayMicroseconds (tiempo)

Hay que indicar nº de patilla y si es entrada o salida Hay que indicar nº de patilla a leer Hay que indicar nº de patilla y valor a sacar por ella Indicamos el tiempo en milisegundos que deseamos temporizar Indicamos el tiempo en microsegundos que deseamos temporizar

Esos parámetros los podemos indicar de diferentes formas. Es más, algunas de ellas ya las hemos usado en los diferentes programas de ejemplo propuestos. Llamaremos “Expresión” a la forma en que vamos a indicar esos parámetros. Básicamente utilizaremos tres formas:

3-4

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com



Constante: El valor del parámetro se proporciona directamente en la propia función. Por ejemplo: delay(1000). Temporiza directamente 1000 mili segundos.



Variable: El valor del parámetro está previamente definido y guardado en una variable. Por ejemplo: delay(Tiempo). El valor a temporizar está guardado en la variable “Tiempo” y el controlador debe ir a buscarlo.



Operación: El valor del parámetro se obtiene como consecuencia de realizar cualquier tipo de operación aritmético/lógica entre variables y/o constantes. Por ejemplo: delay((Tiempo+1000)/3). Temporiza tantos milisegundos como resulten de calcular el valor de la variable “Tiempo” más 1000 y todo ello dividido entre 3.

No se puede decir cuál de estas formas de expresar los parámetros o datos es la mejor. Las usaremos en cada caso según mejor nos convenga. 5-1 Constantes Cuando en un programa se utiliza un valor que siempre es fijo y nunca varía, se emplea como un dato “constante”. Si en un momento dado tienes que realizar una temporización que siempre es igual, por ejemplo de 1 segundo, emplearás delay(1000). El controlador ejecuta esa instrucción siempre con el mismo parámetro (1000). NO se puede variar dinámicamente durante la ejecución del programa. La única forma de cambiarlo es modificando el programa y grabándolo nuevamente en la memoria del controlador. Otro ejemplo. Imagina que debes realizar un programa para calcular la longitud de una circunferencia en función de un diámetro dado. La ecuación a resolver sería: = ∙ , donde: l = El resultado con la longitud de la circunferencia calculada d = Diámetro de esa circunferencia π = el valor 3.1416 A la vista del ejemplo tú mismo puedes responder: ¿Qué dato es constante? …………………..……… ¿y cuál es variable? ……………………………………. Los datos constantes forman parte del propio programa y se encuentran como parámetros en las propias instrucciones o funciones del mismo. Se guardan por tanto en la memoria FLASH de programa del controlador. Se trata de una memoria NO VOLATIL de sólo lectura. No se puede modificar (salvo cuando se graba el programa) y su contenido se mantiene incluso cuando se desconecta la alimentación. En algunos de los ejemplos que ya hemos hecho se han empleado palabras como: HIGH o LOW, INPUT u OUTPUT o TRUE o FALSE. Son palabras “clave” del lenguaje Arduino tratadas como “constantes”. 5-2 Variables Las variables son espacios de memoria RAM que se reservan para guardar datos. Cómo se muestra en la figura 3-5, te las puedes imaginar como un conjunto de recipientes donde podemos guardar información de diferente tipo para usarla posteriormente cuando nos haga falta. La memoria RAM es una memoria que se puede leer y escribir tantas veces como necesitemos. Su contenido SI se puede modificar dinámicamente durante la ejecución de un programa. Es volátil y toda su información desaparece cuando falta la tensión general de alimentación. Figura 3-5. Variables

3-5

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com

Como ya hemos hecho en alguno de los ejemplos anteriores, las variables han de ser declaradas previamente para luego poder ser utilizadas, según la siguiente sintaxis: tipo nombre = valor tipo:

Establece qué tipo de información va a contener la variable. Puede ser números, letras o textos.

nombre:

Es el nombre que vamos a asignar a la variable y con el que la vamos referenciar en lo sucesivo a lo largo del programa. Lo ideal es que se empleen nombres no muy largos y que recuerden un poco su contenido. El nombre de una variable debe empezar siempre por una letra, no por un número y no debe contener espacios en blanco.

valor:

Es el valor que metemos en la variable o recipiente. Es opcional. Podemos crear una variable vacía, sin introducir ninguna información en su interior. Simplemente le hacemos una reserva en la memoria RAM del controlador para cuando la necesitemos. La siguiente tabla resume algunos de los tipos más corrientes para la declaración de variables. TIPO char

BYTES 1

byte o unsigned char int

1

unsigned int o word long

2

unsigned long

4

float

4

2

4

DESCRIPCION Almacena un valor del tipo carácter (8 bits) que debe ir entre comilla simple (‘). Es con signo y codifica números del rango -128 a +127 Almacena un número de 8 bits sin signo del 8 rango 0 a 255 (2 -1) Es el tipo por defecto. Almacena un número de 16 bits con signo en el rango de -32768 a +32767. Almacena un número de 16 bits sin signo 16 con un rango de 0 a 65535 (2 -1) Almacena un número de 32 bits con signo en el rango de -2.147.483.648 a +2.147.483.647 Almacena un número de 32 bits sin signo 32 con un rango de 0 a 4.294.967.295 (2 -1) Almacena un número de 32 bits en coma +38 flotante con un máximo de 3.4028235 y un -38 mínimo de 3.4028235

EJEMPLOS char opción = ‘1’ char letra = ‘A’

byte C = 23 byte resultado = C + 18 int C = 2453 int valor = C * 10 unsigned int valor = 12000 * 3 word valor = 12000 * 3 long Contador = -123456789 unsigned long Velocidad_Luz = 299792468 float PI = 3.1416 float L = 4 * PI

En función del tipo de variable que vayamos a crear, debemos saber que se consume una mayor o menor cantidad de memoria RAM. Es conveniente definir adecuadamente una variable según el tipo de información que vaya a contener. Por ejemplo, una variable tipo “long” consume 4 bytes de memoria RAM. Su uso es bastante poco recomendable si la información que va a contener es, supongamos, de tipo byte. La memoria RAM es limitada y un uso inadecuado de variables la puede terminar agotando. Por otra parte si se declara una variable de, por ejemplo tipo byte, y se introduce un valor superior a 255, dicha variable se desbordará, perdiéndose parte de la información. Es algo parecido a lo que le pasará al cuentakilómetros de la figura 3-6. Cuando se desborde vuelve otra vez a 0.

Figura 3-6. Desbordamiento de un cuentakilómetros Por ejemplo, imagina que a una variable tipo byte que contiene el valor 253, se le suma 6. El resultado debiera ser 259, sin embargo vemos que es 3. ¿Por qué? Porque en una variable tipo byte el valor 8 máximo que cabe es de 0 a 255 (2 -1). Luego se desborda, vuelve a 0 y empieza de nuevo.

3-6

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com

Otro tipo de variables son los llamados Arrays. Un array es una colección de variables de cualquiera de los posibles tipos estudiados. Para acceder a una variable en particular dentro de una colección, se debe indicar el índice de la misma. Mira estos ejemplos: 

int Tabla[4] Crea un array llamado “Tabla” capaz de almacenar 4 números de tipo int. Ocupa por tanto 8 bytes de la memoria RAM. Ver la figura 3-7 Figura 3-7. Array de 4 celdas



int Tabla[ ]={5678,750,1234} Crea el array “Tabla” y almacena los valores indicados, quedando como se muestra en la figura 3-8. Figura 3-8. El array “Tabla”



int Suma = Tabla[0] + Tabla[2] Extrae del array “Tabla” el valor de su variable 0 (5678) y el de su variable 2 (1234). Hace la suma y almacena el resultado (6912) en la variable “Suma”



unsigned int Valores[12] Crea un array llamado “Valores” con capacidad para 12 variables de tipo entero sin signo. Ocupa 24 bytes de memoria RAM en total.



Valores[4] = 12345 En la variable 4 del array “Valores” se introduce el número 12345



char Texto[8] = “ARDUINO” Crea un array de tipo carácter llamado “Texto”. Ocupa 8 bytes de RAM y se almacena la cadena “ARDUINO\o” (\o es el código Null de control). Ver la figura 3-9. Figura 3-9. Un array de texto



char Letra=Texto[2] Extrae la variable 2 del array “Texto” (letra D) y la almacena sobre la variable “Letra”

5-2-1 Tipos de variables Según el lugar del programa donde declares las variables, estas pueden ser “globales” o bien “locales”. Esta distinción puede ser importante cuando empieces a desarrollar programas de cierta complejidad y tamaño. Globales: Son las variables que se declaran o definen fuera de todas las funciones que haya en el programa, incluidas las funciones void setup() y void loop(). En el ejemplo que se muestra en la figura 3-10, las variables “Dato” y “Resultado” son globales. Pueden ser usadas por cualquiera de las funciones existentes en el programa. Locales: Son variables que únicamente pueden ser usadas o vistas dentro de la función en donde se crearon. Se evita así que una variable que se declara en una función, pueda ser utilizada por otra función distinta a ella (excepto que sea una variable global). Figura 3-10. Variables globales y locales

3-7

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com

Una vez que finaliza la ejecución de una función, todas sus variables locales desaparecen hasta que volvamos a usarla. Según la figura, en la función Mi_función_1(), las variables “Tiempo”, “Hora” y “Resultado” son locales. Observa las variables locales del resto de las funciones de la figura 3-10 de ejemplo. 5-3 Operaciones Como ya habrás adivinado, tanto los parámetros que acompañan a las sentencias del lenguaje Arduino, como los valores que cargamos en las variables, pueden obtenerse como resultado de hacer todo tipo de operaciones aritméticas entre variables y/o constantes. Las operaciones matemáticas clásicas son: = + * / %

Asignación Suma Resta Multiplicación División Módulo (el resto de una división entre dos números enteros)

Al igual que cuando operamos nosotros, cualquier expresión se calcula de izquierda a derecha. La multiplicación y la división tienen prioridad sobre la suma y la resta. Se pueden usar los paréntesis para establecer la prioridad deseada en la operación. Mira estos ejemplos:     

3 +5 – 2 = 6 20 - 2 * 3 = 14 y no 54 (20-2) * 3 = 54 y no 14 20 / 2 * 3 = 30 24 / (2 * 3) = 4

    

(12 – 2) + 5 * 3 = 25 y no 45 ((12 – 2) + 5) * 3 = 45 y no 25 13 % 4 = 1 7%5=2 5%5=0

Teniendo en cuenta todo lo visto en esta sección, a partir de ahora podrás determinar los parámetros que usan las funciones del lenguaje Arduino, de una forma mucho más flexible y potente. Fíjate en los siguientes ejemplos y trata de responder a las preguntas. byte Luz = 3; pinMode(Luz+1,OUTPUT); digitalRead(Luz); digitalWrite((1+Luz)*2,HIGH); ¿Qué patilla se configura como salida?……………………………………………………………………………. ¿Qué patilla se lee?…………………………………………………………………………………………………… ¿Qué patilla se pone a nivel “1”?……………………………………………………………………………………. byte A = 250; byte B; byte C; unsigned int D; A = A + 3; B = (A-200) * 2 / 4; C = A * 2 + 20; D = (A * 100) % 2; A = …………………….; B = ……………………..; C = …………………….; D = …………………….. byte A=10; delay((A+2) * 1000 / 5): La temporización realizada es de ……………………………………………….

3-8

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com

6.- SONIDO Aprovechando que ya sabemos manejar las entradas y salidas digitales, es el momento de ver cómo podemos generar sonido con nuestro controlador Arduino NANO. Al fin y al cabo una señal de sonido no es otra cosa que una señal eléctrica que varía a una determinada frecuencia produciendo diferentes tonos. Mira la figura 3-11.

Figura 3-11. Señal de diferentes frecuencias y tonos Esta señal la podemos aplicar a un transductor como puede ser un altavoz. Este traduce la señal eléctrica en una serie de movimientos mecánicos que producen cambios de presión, vibraciones u ondas en el aire, llegando así hasta nuestro oído. El oído humano es capaz de percibir y escuchar vibraciones que van desde los 20Hz (Hertzios) has los 20000Hz (o 20KHz). Las vibraciones por debajo de los 20Hz reciben el nombre de “infrasonidos”, y por encima de los 20KHz, “ultrasonidos”. Teóricamente el oído humano no es capaz de percibir ninguno de esos sonidos, aunque algunos animales sí. Según la figura anterior, vamos a generar señales audibles compuestas de niveles lógicos: “1” y “0”. Esto ya lo sabemos hacer. Solo nos queda por calcular la frecuencia que deseamos para esa señal. Es fácil: 1. A partir de la frecuencia F deseada (por ejemplo 1000Hz), calculamos lo que debe durar un ciclo. Un ciclo es la parte que se repite de la señal (nivel “1” y nivel “0”). También se le llama “periodo” o T. =

=

= .

=

=

2. Ahora calculamos el semiperiodo S, o lo que es igual, el tiempo que la señal va a estar a nivel “1” y a nivel “0”. =

=

.

= .

= .

=

Observa el siguiente programa, “Tonos_1”, y verás que no tiene mayor dificultad. Estamos aplicando todo lo que hemos aprendido hasta el momento: float F=1000; float C=1/F; unsigned long T=C*1000000; unsigned long S=T/2;

//Valor de la frecuencia deseada (F) //Calcula la duración del ciclo en segundos //Calcula el periodo T en microsegundos //Calcula el valor del semiperiodo (S)

Creamos diferentes variables. “F” contiene la frecuencia de la señal sonora deseada. En “C” se calcula la duración del ciclo o periodo en segundos, según la fórmula anterior. En “T” tenemos la duración del ciclo o periodo convertida en microsegundos. Finalmente, la variable “S” se carga con la duración del semiperiodo. Todas estas variables están fuera de las funciones void setup() y void loop(), por lo que son variables globales.

3-9

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com

Por lo demás, el cuerpo principal del programa no nos enseña nada nuevo: void loop() { digitalWrite(12,HIGH); delayMicroseconds(S); digitalWrite(12,LOW); delayMicroseconds(S); }

//El altavoz se activa //Temporiza //El altavoz se desactiva //Temporiza

La salida digital 12 se pone a “1”, se temporiza según el valor calculado para el semiperiodo (S), se pone a nivel “0” y se vuelve a temporizar según S. Para probar este ejemplo necesitamos del altavoz que se incluye en el presente módulo. Como se muestra en la figura 3-12, le vamos a colocar o soldar dos cablecillos que nos permitan a su vez conectarlo con la tarjeta de control Arduino NANO. Figura 3-12. El altavoz +5Vcc

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

Ahora veamos el esquema eléctrico de conexiones que se muestra en la figura 3-13. Uno de los cablecillos del altavoz se conecta con la patilla D12 de la tarjeta Arduino NANO. Por esta patilla vamos a sacar la señal sonora. El otro de los cablecillos del altavoz se conecta con la señal GND de alimentación.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

ARDUINO NANO

Figura 3-13. Esquema eléctrico del ejemplo La fotografía de la figura 3-14 muestra el montaje práctico sobre el entrenador Universal Trainer. Figura 3-14. Montaje práctico Prueba a variar la frecuencia modificando en el programa el valor de la variable F. Oirás sonidos con diferentes tonos. A frecuencia bajas, tonos graves; a frecuencias altas, tonos agudos. También puedes hacer un análisis de tus propias capacidades auditivas. Completa la siguiente tabla. Frecuencia (F) Periodo (T) Semiperiodo (S) ¿Lo oyes? (SI/NO)

20 Hz

200 Hz

1 KHz

4 KHz

10 KHz

15 KHz

18 KHz

20 KHz

6-1 Sentencias de sonido Como no podía ser menos, el lenguaje de programación Arduino dispone de sus propias funciones o instrucciones para generar todo tipo de sonidos. Esto facilita enormemente la programación ya que no tendremos que calcular ni periodos ni semiperiodos para una frecuencia deseada. Lo hará el propio lenguaje.

3 - 10

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com

6-1-1 Función tone() Genera una señal de onda cuadrada con la frecuencia y la duración deseada. La frecuencia mínima que puede generar es de 31Hz. La señal de salida es simétrica. El nivel “1” dura lo mismo que el nivel “0”. Sintaxis: tone(pin,frecuencia,duración) pin: frecuencia: duración:

Indica la patilla por donde va generarse la señal audible. Valor entero sin signo que expresa, en hertzios (Hz), la frecuencia de la señal Valor entero sin signo que expresa, en milisegundos, la duración del tono. Es opcional. Si no se indica la salida de la señal o el tono se mantiene permanentemente hasta que se ejecute la función noTone().

Ejemplos: tone(12,1000,1000); tone(3, A + 100,300); tone(6,2500);

Genera una señal o tono de 1000Hz durante 1 segundo por la patilla 12 Genera una señal cuya frecuencia resulta de sumar el contenido de la variable “A” con 100, por la patilla 3. La duración del tono es de 300mS (0.3s). Genera una señal de 2500 Hz por la patilla 6 de forma permanente hasta que se ejecute la función noTone().

6-1-2 Función noTone() Detiene la generación de la señal audible producida por la última función tone() ejecutada en el programa. Sintaxis: noTone(pin) pin:

Indica la patilla por donde se está generando la señal audible que se desea detener.

Ejemplo: tone(6,2500); noTone(6);

Genera una señal audible permanente de 2500Hz por la patilla 6 Interrumpe la señal audible que sale por la patilla 6

6-2 Ejemplo: “Tonos_V2” Graba y prueba el funcionamiento del programa “Tonos_V2”. Se comporta exactamente igual que el programa “Tonos_V1” del ejemplo anterior, pero estarás de acuerdo en que es mucho más sencillo: void loop() { tone(12,F); }

//Genera una señal de frecuencia F por la patilla 12

No solo eso, también es mucho más eficiente. Efectivamente, en el programa “Tonos_V1”, mientras el controlador está temporizando para activar o desactivar la patilla por donde sale la señal audible (la 12),… ¡NO PUEDE ESTAR HACIENDO NINGUNA OTRA TAREA! Sin embargo, si empleamos la función tone(), el controlador realiza los ajustes internos necesarios para sacar la señal deseada y a continuación continúa ejecutando las instrucciones de nuestro programa.

3 - 11

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com

6-3 Ejemplo: “Tonos_V3” Vamos ahora con el ejemplo “Tonos_V3” para corroborar lo que acabamos de decir. En la función void setup() se ha incluido la función tone(12,F). Sabemos por tanto que solo se ejecuta una vez y el controlador queda ajustado para producir permanentemente una señal audible por la patilla 12. Por su parte, la función principal void loop() se limita a activar y desactivar la salida D2 con un intervalo de 0.3 segundos. Monta el circuito mostrado en el esquema de la figura 3-15. Una vez que grabes el programa, comprueba que el tono de 1KHz se mantiene a pesar de que el controlador está metido en un bucle infinito, activando/desactivando la salida D2, donde hemos conectado el led S0 del entrenador.

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

+5Vcc

ARDUINO NANO

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

¿Serías capaz de hacer lo mismo pero usando la técnica empleada en el programa “Tonos_V1”?

Figura 3-15. El ejemplo Tonos_V3 S0

6-4 Ejemplo: “Tonos_V4”

+5Vcc

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

Otro ejemplo de uso de la función tone(). Se trata de sacar una señal acústica de aviso cada vez que se reinicie el sistema activando la señal RESET. Se generan tres tonos de diferentes frecuencias y duración.

Figura 3-16. Esquema del ejemplo “Tonos_V4”

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

ARDUINO NANO

Monta el circuito del esquema de la figura 3-16. Se recomienda que el pulsador E10 lo conectes con la entrada de RESET (patilla 3) después de grabar el programa, para evitar problemas de transferencia entre el PC y la tarjeta de control Arduino NANO.

E10

RESET

6-5 Ejemplo: “Melodías” Naturalmente, con la función tone() del lenguaje Arduino también puedes crear tus propias melodías. Este ejemplo te lo demostrará. Ten en cuenta que a cada nota musical le corresponde una frecuencia. Si sabes solfeo te basta con buscar la relación entre las notas de la partitura con sus correspondientes frecuencias, para poder así reproducir una melodía. Según el sistema latino de notación musical, las notas básicas son siete: “do, re, mi, fa, sol, la, si”. En el sistema inglés de notación, también denominado “denominación literal”, se corresponden con “C, D, E, F, G, A, B” respectivamente. A partir de ellas se obtienen los sostenidos, bemoles y una combinación de todos ellos. Además de las notas (o frecuencias), en una melodía también se debe establecer la duración de cada una así como el intervalo entre una nota y la siguiente. La duración se suele establecer en 1/4, 1/8, etc… de segundo, es decir: 1000 mS / 4, 1000 mS / 8, etc… La duración de una nota se puede establecer en la misma función tone(). El intervalo entre una nota y la siguiente suele ser un 30% de la duración de la misma. Dichos intervalos se pueden conseguir fácilmente mediante la función delay().

3 - 12

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com

El programa del ejemplo reproduce 8 conocidas notas. Todas ellas, salvo en frecuencia, duración e intervalo, son similares. Observa las funciones tone() y delay() de la primera nota. Se corresponde con la nota C4 (262Hz), con una duración de 250 mS y un intervalo de espera del 30% de la duración (325 mS). Te sirve el mismo circuito de la figura 3-16. Acuérdate de grabar el programa antes de conectar el pulsador E10 con la señal de RESET (patilla 3). 6-6 Ejemplo Semáforo_V2 Aquí tienes una segunda versión mejorada del ejemplo del semáforo, el “Semáforo_V2”. Aprovechando lo que ya sabemos sobre el sonido, el programa emula el funcionamiento de un semáforo con señales acústicas para invidentes. La secuencia se inicia al activar la señal de RESET. El encendido secuencial de las diferentes luces va acompañado de sus correspondientes señales acústicas de aviso. Si te fijas, todas las instrucciones del programa se encuentran incluidas en la función void setup(), por lo que únicamente se ejecutan tras reiniciar el sistema mediante el RESET. El programa te puede parecer largo pero no complicado. Con lo que sabemos de momento es lo único que podemos hacer. En el próximo tema vamos a estudiar y a emplear sentencias de control. Con ellas vamos a poder hacer programas mucho más cortos y eficientes. Tiempo al tiempo. En la figura 3-17 se muestra el esquema de conexiones para este ejemplo. No hay mucho que explicar ya que es similar al empleado en ejemplos anteriores. Recuerda que es aconsejable grabar el programa antes de conectar el pulsador E10 con la entrada RESET (patilla 3). E10 RESET

ROJO1 S0

ARDUINO NANO

AMBAR1 S1

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

+5Vcc

VERDE1 S2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Figura 3-17. Esquema para el “Semáforo_V2”

3 - 13

ARDUINO: La tecnología al alcance de todos TEMA 3: Temporizaciones, expresiones y sonido www.microcontroladores.com

3 - 14

ARDUINO: La tecnología al alcance de todos TEMA 4: Toma de decisiones y sentencias de control www.microcontroladores.com

TEMA 4: Toma de decisiones y sentencias de control: 1.- INTRODUCCIÓN Los seres humanos somos capaces de analizar nuestro entorno y situación y, en función de nuestros intereses, sentimientos, capacidad, intuición, obligación, etc…, tomamos decisiones que nos llevan a realizar una tarea u otra con mayor o menor éxito. Los programas que hemos desarrollado hasta el momento eran programas muy secuenciales. Las instrucciones se van ejecutando una tras otra, desde la primera hasta la última y sin ninguna otra consideración. Sin embargo Arduino, al igual que cualquier otro controlador, también tiene capacidad de tomar decisiones y ejecutar los programas o tareas apropiadas en caso. Ahora bien, Arduino no tiene sentimientos, ni intuición, ni tan siquiera es inteligente. Es una máquina que solo sabe manejar números, y como tal, sus decisiones se toman en base a ellos: cálculos aritméticos/lógicos, comparaciones entre números, estados de las señales digitales de entrada, valores analógicos leídos de un sensor, etc… 1-1 Operadores de comparación Ya sabemos que Arduino puede realizar operaciones aritméticas como sumar y restar diferentes números o datos que podemos expresar en forma de “constantes”, “variables” o combinación de ambas cosas. También puede hacer comparaciones entre datos o entre los resultados que ofrecen a su vez otras funciones. Los operadores de comparación, así como los símbolos que los representan, son los siguientes:      

Igualdad (==) Distinto de (¡=) Menor que () Menor o igual que (=)

Como resultado de una comparación, sea del tipo que sea, solo se obtienen dos resultados posibles: verdadero (true) o falso (false). Mira y analiza los siguientes ejemplos: Suponiendo que … char Letra = ‘J’; byte A = 13; int B = 12345; float PI = 3.1416; Entonces … Letra == “J” Letra ¡= “Q” 18 < A A == 8 + 5 B >= A PI * 2 > 8.16 B – 1000 “K” Letra < “K”

//……………………. //……………………. //……………………. //……………………. //……………………. //…………………….

4-1

ARDUINO: La tecnología al alcance de todos TEMA 4: Toma de decisiones y sentencias de control www.microcontroladores.com

1-2 Operadores booleanos Incluso es posible relacionar entre sí varias de las comparaciones o expresiones anteriores. Para ello, Arduino dispone de tres operadores lógicos o “booleanos” que, seguro que te recuerdan algo. Aquí los tienes junto con los símbolos que los representan:   

Y (&&) O (||) NO (¡)

De igual forma, como consecuencia de relacionar dos o más expresiones mediante estos operadores lógicos, también se generan dos posibles resultados: verdadero (true) o falso (false). Observa los siguientes ejemplos. Cada expresión que relacionamos va encerrada entre paréntesis para evitar errores. (Letra == ‘X’) && (A > 10) (A == 10+3) && (B >= 12345) && (Letra ¡= ‘Q’) (B > 12300) || (PI = 3.1412) (A == B) || (A > 10 + 4) ¡(A == B) (digitalRead(4) == 1) && (digitalRead(8)==1)

//Falso //Verdad //Verdad //Falso //Verdad //Verdad si ambas entradas (D4 y D8) está a nivel “1”

2.- SENTENCIA IF (… ) Es la sentencia de control más elemental. Permite evaluar y tomar decisiones en base a expresiones como las que acabamos de ver. En informática, en los esquemas conocidos como “diagramas de flujo”, es muy frecuente emplear símbolos como el mostrado en la figura 4-1, que representa a una toma de decisión. El controlador evalúa la expresión. Si es verdadera ejecuta todas las instrucciones que se encuentren cerradas entre las llaves {… }. Si resulta ser falsa no se ejecutan y el programa sigue su curso. Figura 4-1. Sentencia if (…) Debemos recordar que una expresión puede estar formada por operaciones aritméticas entre constantes y/o variables relacionadas entre sí por operadores de comparación, que a su vez, se relacionan mediante operadores lógicos o booleanos. Repasa los ejemplos anteriores. Sintaxis: if(expresión) { …. …. } expresión:

Establece la condición que Arduino debe evaluar. Puede ser la comparación entre datos constantes y/o variables. Puede haber una o más comparaciones relacionadas entre sí mediante los operadores lógicos. También se pueden comparar los resultados obtenidos al ejecutar operaciones aritméticas u otras funciones del propio lenguaje Arduino.

llaves:

Como en un bocadillo, encierran las sentencias que el controlador debe ejecutar en caso de que se cumpla la condición (true). No hacen falta si únicamente se va a ejecutar una instrucción o sentencia.

4-2

ARDUINO: La tecnología al alcance de todos TEMA 4: Toma de decisiones y sentencias de control www.microcontroladores.com

2-1 Ejemplo: “Timbre”

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

+5Vcc

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

ARDUINO NANO

Veamos un ejemplo muy sencillo que ilustra perfectamente el funcionamiento de la función if(). Se trata de emular un timbre electrónico que se activa al accionar un pulsador. El esquema de la figura 4-2 muestra el montaje a realizar sobre el entrenador Universal Trainer. El pulsador E10 se conecta con la entrada D2 (patilla 5) del controlador. Este pulsador trabaja con lógica inversa. En reposo proporciona nivel “1” y cuando se acciona nivel “0”. El altavoz se conecta con la salida D12 como en anteriores ejemplos.

E10

Figura 4-2. El ejemplo “Timbre”

TIMBRE

void loop() { if(digitalRead(2)==0) { tone(12,400); delay(300); tone(12,300,300); } }

//Si la entrada D2 está a "0" ... //Genera una frecuencia de 400Hz... //... durante 0.3" //Genera una frecuencia de 300Hz durante 0.3"

Si la entrada D2 está a nivel “0” (true) se generan los dos tonos que simulan el timbre. Uno es de 400Hz y el otro de 300Hz. Ambos tienen una duración de 0.3 s. Si la entrada D2 está a nivel “1”, la condición no se cumple (false) y las instrucciones encerradas entre las llaves no se ejecutan. Consejo: Cuando emplees sentencias condicionales en tus programas, es una buena costumbre alinear las llaves de forma que se vea claramente el emparejamiento de la que abre, con la llave que cierra. En el ejemplo se distingue claramente las llaves que abren y cierran la función void loop() principal, y las que corresponden a las de la función if().

3.- SENTENCIA IF( … ) ELSE Se trata de otra sentencia de control que se derivada de la sentencia if() anterior. Permite establecer claramente qué hacer si no se cumple la condición (else). La figura 4-3 puede ayudar a entender su funcionamiento. Se evalúa la expresión o condición. Si ésta se cumple (true), se ejecutan todas las sentencias encerradas entre las llaves: igual que en la función if(). Si la condición NO se cumple (false), se ejecutan todas las instrucciones cerradas entre las llaves que siguen a la palabra else (sino). Una vez ejecutas las instrucciones en cualquiera de los dos casos, la ejecución del programa continua su curso. Figura 4-3. Sentencia if (…) else

4-3

ARDUINO: La tecnología al alcance de todos TEMA 4: Toma de decisiones y sentencias de control www.microcontroladores.com

Sintaxis: if(expresión) { …. …. } else { …. …. } expresión:

Establece la condición que Arduino debe evaluar. Puede ser la comparación entre datos constantes y/o variables. Puede haber una o más comparaciones relacionadas entre sí mediante los operadores lógicos. También se pueden comparar los resultados obtenidos al ejecutar operaciones aritméticas u otras funciones del lenguaje Arduino.

llaves:

Engloban a todas las sentencias que el controlador debe ejecutar tanto en caso de que se cumpla la condición (if), como si no se cumple (else). Las llaves no hacen falta si únicamente se necesita ejecutar una instrucción en cada caso, por ejemplo: if (A > 13) A = A + 25; else A = B;

3-1 Ejemplo: “Juego de luces_V2”

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

+5Vcc

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

ARDUINO NANO

El programa puede parecerte largo, pero sin embargo es muy sencillo. Mediante la sentencia if(!digitalRead(2)) se lee y evalúa el estado de la entrada digital D2 (interruptor E0). Mediante el uso de las llaves queda bien claro qué instrucciones se ejecutan si se cumple la condición (interruptor = “0”), y cuáles en caso contrario else (interruptor = “1”).

S0

S1

S2

S3

E0

Una nueva versión del juego de luces que hicimos en el tema anterior. Mediante un interruptor se controla si el desplazamiento es a la izquierda o a la derecha. La figura 4-4 muestra el esquema de conexiones. Los leds de salida S3:S0 se conectan con las líneas D3:D6 respectivamente. El interruptor de entrada E0 se conecta con la línea D2. Cuando está a nivel “0” las luces se encienden describiendo una secuencia de derecha a izquierda. Si el interruptor está a nivel “1” la secuencia de encendido es de izquierda a derecha.

Figura 4-4. Esquema para el programa “Juego de luces _V2”

3-2 Ejemplo: “Semáforo_V3” En la figura 4-5 se muestra el esquema para una nueva versión del ejemplo del semáforo, “Semáforo_V3”. Las líneas D3:D5 actúan como salidas y se conectan con los leds S2:S0 que simulan las luces verde, ámbar y roja del semáforo respectivamente. El pulsador E10 del entrenador Universal Trainer se conecta con la línea D2 que actúa como entrada. El pulsador es accionado por el peatón cada vez que desea cruzar la vía.

4-4

ARDUINO: La tecnología al alcance de todos TEMA 4: Toma de decisiones y sentencias de control www.microcontroladores.com

D1 VIN D0 GND RESET RESET GND +5V D2 A7 D3 A6 D4 A5 D5 A4 D6 A3 D7 A2 D8 A1 D9 A0 D10 AREF D11 3V3 D12 D13

30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

+5Vcc

ARDUINO NANO

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Transcurrido un tiempo de 2 segundos, la luz roja se apaga y comienza la secuencia. Se enciende la luz verde y se generan unos tonos de 1000 Hz, con una duración de 0.5” y una cadencia de 1.1” entre tono y tono. A continuación se enciende la luz ámbar y se generan unos tonos de 1000 Hz, con una duración de 0.4” y una cadencia de 0.7”. Son tonos más breves y rápidos para darle al peatón la sensación de que debe darse prisa al cruzar. Finalmente, se enciende la luz roja con un tono permanente de 2 segundos. Finaliza el tono pero la luz roja se mantiene encendida hasta iniciar una nueva secuencia.

ROJO2 S0

Figura 4-5. Esquema del “Semáforo_V3”

AMBAR2 S1

E10 PASAR

VERDE2 S2

En el programa se distingue claramente qué instrucciones se ejecutan si NO se pulsa E10 (else). Se enciende la luz roja y se apagan las otras dos. En el instante que se detecta la pulsación de E10 (if) se inicia la secuencia de funcionamiento.

4.- SENTENCIA FOR() En cuanto veamos esta sentencia, inmediatamente le buscarás utilidad en alguno de los programas que hemos visto anteriormente, con objeto de hacerlo más pequeño y eficiente. Se trata de una sentencia para realizar bucles controlados. Un bucle es un conjunto de instrucciones cuya ejecución se repetirá un número determinado de veces. Sintaxis: for(inicio; condición; modificador) { …. …. } inicio:

Es una expresión que permite cargar una variable con un valor inicial. Solo se ejecuta una vez, al principio del bucle.

condición:

Es una expresión condicional. Si se cumple la condición (true), se ejecutan todas las instrucciones o sentencias del bucle. Si no se cumple la condición (false), el bucle finaliza y la ejecución del programa sigue su curso. Esta expresión se evalúa cada vez que se repite el bucle.

modificador:

Es una expresión que permite modificar el valor de la variable con objeto de alcanzar la condición. Este modificador se ejecuta cada vez que se repite el bucle.

llaves:

Encierran, a modo de “bocadillo”, a todas las instrucciones que forman el bucle y que deben ejecutarse un número determinado de veces.

Ejemplo: for(byte N = 1; N < 5; N=N+1) { …. …. }

4-5

ARDUINO: La tecnología al alcance de todos TEMA 4: Toma de decisiones y sentencias de control www.microcontroladores.com

Una imagen vale más que mil palabras. Observa el diagrama de flujo de la figura 4-6. Se declara la variable “N”, de tipo byte, y se le carga con el valor inicial 1 (byte N = 1). Se evalúa y, si es menor que 5 (N < 5), se ejecutan todas las sentencias cerradas entre las llaves. El valor de la variable “N” se modifica automáticamente y, en este caso, se incrementa en una unidad (N = N + 1). Vuelve a repetirse la evaluación de la condición. Si es cierta se vuelven a ejecutar las sentencias y el proceso se repite hasta que la condición sea falsa. En el ejemplo de la figura, las sentencias encerradas entre las llaves se ejecutan 4 veces: mientras “N” sea menor de 5. Figura 4-6. Esquema de funcionamiento de un bucle for()

Para establecer el inicio, la condición y el modificador de cualquier bucle for(), se pueden emplear todo tipo de expresiones aritméticas, booleanas o lógicas y de comparación entre variables y/o constantes. Por ejemplo: int A = 5; for(byte N=A+3); N
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF