Your SlideShare is downloading. ×
Curso introducción a arduino
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Curso introducción a arduino

7,945
views

Published on


0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,945
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
598
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Introducción a Arduino I: Jugando con Leds y pulsadores
  • 2. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores "El verdadero progreso es el que pone la tecnología al alcance de todos." (Henry Ford)FabLab León 1
  • 3. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadoresÍndice:1 ¿Qué es FabLab León?........................................................... 92 Plataforma electrónica Arduino UNO ...................................... 103 Software de Arduino ........................................................... 12 3.1 Programación ..................................................... 135 Estructura básica de Lenguaje Arduino .................................. 15 5.1 setup() .............................................................. 15 5.2 loop() ................................................................ 166 Ejemplos a implementar ...................................................... 17 6.1 Led intermitente.................................................. 17 6.1.1 Código ............................................................ 18 6.1.2 Circuito .......................................................... 18 6.1.3 Montaje en Protoboard ..................................... 19 6.1.4 Ejercicio 1: ...................................................... 19 6.2 Botones o pulsadores ........................................... 20 6.2.1 Código ............................................................ 21 6.2.2 Circuito ........................................................... 21 6.2.3 Montaje en Protoboard ..................................... 22 6.2.4 Ejercicio 2: ...................................................... 23 6.2.5 Ejercicio 3 complementario: ............................... 237 Anexo: Guía de lenguaje Arduino. ......................................... 24 7.1 Funciones ........................................................... 24 7.2 {} entre llaves .................................................... 24 7.3 ; punto y coma ................................................... 25 FabLab León 2
  • 4. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores7.4 /*… */ bloque de comentarios ............................... 257.5 // línea de comentarios ........................................ 257.6 Variables ............................................................ 267.7 Declaración de variables ....................................... 277.8 utilización de una variable .................................... 277.9 Tipos de datos .................................................... 28 7.9.1 Byte ............................................................... 28 7.9.2 Int ................................................................. 28 7.9.3 Long .............................................................. 28 7.9.4 Float .............................................................. 28 7.9.5 arrays ............................................................ 297.10 aritmética .......................................................... 307.11 asignaciones compuestas ..................................... 307.12 operadores de comparación .................................. 317.13 operadores lógicos ............................................... 317.14 constantes ......................................................... 317.15 cierto/falso (true/false) ........................................ 327.16 High/Low ........................................................... 327.17 Input/Output ...................................................... 327.18 Control de flujo ................................................... 32 7.18.1 if (si condicional) ............................................ 32 7.18.2 if… else (si….. sino ..) ...................................... 33 7.18.3 for................................................................ 34 7.18.4 while ............................................................ 34 7.18.5 do… while ...................................................... 357.19 e/s digitales ........................................................ 35 FabLab León 3
  • 5. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores 7.19.1 pinMode(pin, mode) ........................................ 35 7.19.2 digitalRead(pin) ............................................. 36 7.19.3 digitalWrite(pin, value) .................................... 367.20 E/s analógicas..................................................... 37 7.20.1 analogRead(pin) ............................................. 37 7.20.2 analogWrite(pin, value) ................................... 377.21 Control del tiempo ............................................... 38 7.21.1 delay(ms) ..................................................... 38 7.21.2 millis() .......................................................... 387.22 Matemáticas ....................................................... 39 7.22.1 min(x, y)....................................................... 39 7.22.2 max(x, y) ...................................................... 397.23 aleatorios ........................................................... 39 7.23.1 randomSeed(seed) ......................................... 39 7.23.2 random(max), random(min, max) .................... 397.24 comunicación serie .............................................. 40 7.24.1 Serial.begin(rate) ........................................... 40 7.24.2 Serial.println(data) ......................................... 40 7.24.3 Serial.print(data, data type) ............................. 41 7.24.4 Serial.avaible() .............................................. 41 7.24.5 Serial.Read() ................................................. 42 FabLab León 4
  • 6. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadoresMateriales: por alumno  1 x Arduino Uno, con su cable USB.  5 x Led (colores varios).  5x resistencias 220 ohm.  15 x cables de conexión.  2 x Pulsadores PCB  2 x Resistencias 10K  1 x Protoboard  1 x Ordenador (PC) por alumno. FabLab León 5
  • 7. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadoresGlosario:ATmega8U2: Microcontrolador usado en las placas Arduino para establecerla conexión USBBit: es el acrónimo de Binary digit o dígito binario. Un bit es un dígito delsistema de numeración binarioBootloader: Es un gestionador de arranque. Es una programación de quedisponen todos los micros de Arduino para facilitar la comunicación con elPC y la programación.Byte: secuencia de 8 bits contiguos.CAD: Computer Aided Design o diseño asistido por ordenadorCAN: es un protocolo de comunicaciones desarrollado por la firma alemanaRobert Bosch GmbH, basado en una topología bus para la transmisión demensajes en ambientes distribuidos, además ofrece una solución a lagestión de la comunicación entre múltiples CPUs (unidades centrales deproceso).Clavija: Parte macho de un conector.CPU: Central Proces Unit o unidad central de procesoConversor A/D: Dispositivo electrónico encargado de convertir una señalanalógica en una sucesión de bits o señal digitalDrivers: Son pequeños programas que permiten que el Sistema Operativosepa utilizar las capacidades de un periférico. Software que se encarga deinteractuar entre el sistema operativo y los dispositivos (hardware).DFU: (Device Firmware Update), Actualización del Firmware del Dispositivose trata de un modo que disponen muchos dispositivos que permitereprogramarle. Es posible reprogramar el dispositivo mientras estaencendido sin necesidad de programador externo.EEPROM: son las siglas de Electrically-Erasable Programmable Read-OnlyMemory (ROM programable y borrable eléctricamente). En español se lasuele denominar "E²PROM" y en inglés "E-Squared-PROM". Es un tipo dememoria no volátil que puede ser programado, borrado y reprogramadoeléctricamente.Firmware: Programación interna de un dispositivo que le permite controlarsu propio hardware.FLASH: La memoria flash es una forma desarrollada de la memoriaEEPROM que permite que múltiples posiciones de memoria sean escritas oborradas en una misma operación de programación mediante impulsoseléctricos, frente a las anteriores que sólo permite escribir o borrar unaúnica celda cada vez. Por ello, flash permite funcionar a velocidades muy FabLab León 6
  • 8. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadoressuperiores cuando los sistemas emplean lectura y escritura en diferentespuntos de esta memoria al mismo tiempo.I2C: es un bus de comunicaciones serie. Su nombre viene de Inter-Integrated Circuit. La principal característica de I²C es que utiliza dos líneaspara transmitir la información: una para los datos y por otra la señal dereloj.PAD: o huella de un componente es la forma que deben tener las pistas delcircuito impreso para recibir el componente y así pueda ser soldadocorrectamente. Cada componente tiene una huella distinta.Patilla: también llamado terminal. Son los contactos terminales de unconector o componente electrónico, fabricado de un material conductor dela electricidad. Estos se utilizan para poder realizar una conexión sin soldar.PCB: Printed Circuit Board o circuito impreso, es un medio para sostenermecánicamente y conectar eléctricamente componentes electrónicos, através de rutas o pistas de material conductor, grabados en hojas de cobrelaminadas sobre un sustrato no conductor.Pines: también llamados terminales. Son los contactos terminales de unconector o componente electrónico, fabricados de un material conductor dela electricidad. Estos se utilizan para poder realizar una conexión sin soldar.Puerto COM: Un puerto serie o puerto serial es una interfaz decomunicaciones de datos digitales, frecuentemente utilizada porcomputadoras y periféricos, donde la información es transmitida bit a bitenviando un solo bit a la vez. Puerto muy usado hasta la aparición del USB(que es una versión del COM).Resistencias Pull-up: Son resistencias que permiten que una entradanunca quede desconectada. Son de valor alto (5K o 10K) y conectan laentrada con el negativo o positivo de modo que en ausencia de señal elvalor en la entrada es bajo o alto respectivamente.PWM: Pulse-Width Modulation en inglés o modulación por ancho de pulsosde una señal o fuente de energía es una técnica en la que se modifica elciclo de trabajo de una señal periódica (por ejemplo sinusoidal o cuadrada)ya sea para transmitir información a través de un canal de comunicacioneso como control de la cantidad de energía que se envía a una carga.RAM: (en inglés: Random Access Memory cuyo acrónimo es RAM) es lamemoria desde donde el procesador recibe las instrucciones y guarda losresultados.Rpm: revoluciones por minutoSRAM: Static Random Access Memory o memoria estática de accesoaleatorio. FabLab León 7
  • 9. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadoresSMD: Surface Mount Device o dispositivos de montaje superficial. Se tratade los componentes electrónicos que se sueldan sobre la superficie de unaplaca electrónica sin necesidad de hacer agujerosSocket: en inglés zócalo. Parte hembra de un conector.SPI: (Serial Peripheral Interface Bus): Es un bus de comunicaciones serieestandarizado por Motorola que opera en modo full dúplex. Los dispositivosson esclavos/maestros donde el maestro inicia las comunicaciones. Este busadmite múltiples dispositivos conectados simultáneamente con distintosnúmeros de esclavo identificativos. Esta comunicación necesita 4 hilos.Sketch: Un sketch es el nombre que usa Arduino para un programa. Es launidad de código que se sube y ejecuta en la placa Arduino.TTL: es la sigla en inglés de transistor-transistor logic, es decir, "lógicatransistor a transistor". Es una familia lógica o lo que es lo mismo, unatecnología de construcción de circuitos electrónicos digitales. En loscomponentes fabricados con tecnología TTL los elementos de entrada ysalida del dispositivo son transistores bipolares. Los niveles lógicos vienendefinidos por el rango de tensión comprendida entre 0,2V y 0,8V para elestado L (bajo) y los 2,4V y Vcc para el estado H (alto).TWI: I2C es un bus de comunicaciones en serie. Su nombre viene de Inter-Integrated Circuit. Se necesitan solamente dos líneas, la de datos (SDA) yla de reloj (SCL). Cada dispositivo conectado al bus tiene un código dedirección seleccionable mediante software. Habiendo permanentemente unarelación Master/ Slave entre el micro y los dispositivos conectados. El buspermite la conexión de varios Masters, ya que incluye un detector decolisiones. El protocolo de transferencia de datos y direcciones posibilitadiseñar sistemas completamente definidos por software. Los datos ydirecciones se transmiten con palabras de 8 bits.USB: Universal Serial Bus o bus universal serie, abreviado comúnmenteUSB, es un puerto que sirve para conectar periféricos a un ordenador.UART: El corazón del sistema de comunicaciones serie es la UART,acrónimo de Universal Asynchronous Receiver-Transmitter. Es un chip cuyamisión principal es convertir los datos recibidos del bus del PC en formatoparalelo, a un formato serie que será utilizado en la transmisión hacia elexterior. También realiza el proceso contrario: transformar los datos serierecibidos del exterior en un formato paralelo entendible por el bus. FabLab León 8
  • 10. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores1 ¿Qué es FabLab León? La misión de Fab Lab León es convertirse en un ecosistema quealiente y ayude a las personas a construir (casi) todo lo que puedanimaginar. Un Fab Lab es un proyecto de la organización sin ánimo delucro tMA, y consiste en un espacio de trabajo comunitario, a uncoste razonable, que sirve como incubadora de investigación, deiniciativas creativas y de negocios, que permite el crecimientopersonal, el desarrollo económico e incrementa las capacidadeslocales. El concepto de Fab Lab refleja un nuevo paradigma de lafabricación en el que las personas definen los problemas, crean lassoluciones y comercializan los productos. El Fab Lab elimina barreras como el capital fundacional, elacceso a equipamiento y el acceso a expertos, alentando un cambiosistémico de los entornos educacionales, de innovación y deemprendimiento. FabLab León 9
  • 11. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores2 Plataforma electrónica Arduino UNO Arduino es una plataforma de electrónica abierta para lacreación de prototipos basada en software y hardware flexibles yfáciles de usar. Se creó para artistas, diseñadores, aficionados ycualquiera interesado en crear entornos u objetos interactivos. Arduino UNO Arduino puede tomar información del entorno a través de suspines de entrada de toda una gama de sensores y puede afectaraquello que le rodea controlando luces, motores y otros actuadores.El microcontrolador en la placa Arduino se programa mediante ellenguaje de programación Arduino (basado en Wiring) y el entorno dedesarrollo Arduino (basado en Processing). Los proyectos hechos conArduino pueden ejecutarse sin necesidad de conectar a un ordenador,si bien tienen la posibilidad de hacerlo y comunicar con diferentestipos de software (p.ej. Flash, Processing, MaxMSP). FabLab León 10
  • 12. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores Las placas pueden ser hechas a mano o compradas montadasde fábrica; el software puede ser descargado de forma gratuita. Losficheros de diseño de referencia (CAD) están disponibles bajo unalicencia abierta, así pues eres libre de adaptarlos a tus necesidades. Existen diversas tarjetas con diferentes microcontroladores,cada una con unas características concretas. Nosotros usaremosArduino UNO por ser el buque insignia de la familia Arduino. Ademásuna vez que eres capaz de comprender el funcionamiento de la UNO,ya puedes usar cualquiera de las demás. FabLab León 11
  • 13. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores3 Software de Arduino La Arduino Uno tiene una gran cantidad de posibilidades para lacomunicación con un ordenar, u otros microcontroladores. Elmicrocontrolador de esta placa (Atmega328) proporcionacomunicación serie UART TTL (5V), que está disponible en los pinesdigitales 0 (RX) y 1 (TX). El ATmega8U2 integrado en la tarjetapermite transfiere esta comunicación sobre el USB y aparece con unpuerto COM virtual para el software del ordenador. El firmware del8U2 emplea los drivers estándar para el puerto USB, por lo tanto noson necesarios drivers externos. Sin embargo bajo Windows esnecesario un archivo .inf. El software the Arduino incluye un monitorserie que permite el envío y recepción de datos de texto plano entreel ordenador y la tarjeta. Los leds de RX y TX se iluminaran durantela transmisión de los datos vía el chip conversor USB-a-serie y laconexión USB al ordenador La librería SoftwareSerial permite la comunicación serie encualquiera de los pines digitales de la Uno. El ATmega328 también soporta comunicaciones I2C (TWI) ySPI. El software de Arduino incluye la librería Wire para simplificar eluso del bus I2C; ver la documentación para más información. Para lacomunicación SPI se usa la librería SPI. Encabezado del software de Arduino FabLab León 12
  • 14. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores Sencillez en la interfaz del software Arduino3.1 Programación El Arduino Uno puede ser programado con el software gratuitoArduino (descargable de su página web). Una vez descargado no esnecesario instalarlo basta con descomprimir la carpeta y ejecutararduino.exe. A continuación se debe conectar la tarjeta con su cable USB.Windows tratara de buscar el controlador adecuado, como no loencontrara, nosotros debemos de actualizar el controlador. FabLab León 13
  • 15. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores Para ello debemos acceder al administrador de dispositivos yhacer clic derecho sobre el dispositivo recién instalado, actualizamosel controlador eligiendo como carpeta donde se encuentra el driver lade Arduino (recién descomprimida). Una vez hecho lo anterior estamos listos para comenzar aprogramar la tarjeta. Solo es necesario una vez en la interfazseleccionar “Arduino Uno” en el menú Tools > Board. El chip ATmega328 que usa Arduino Uno viene pre programadocon un bootloader (consultar glosario) que permite introducirle nuevocódigo sin necesidad de un programador externo. Se comunicausando el protocolo STK500. También es posible ignorar el bootloader y programar elmicrocontrolador a través del conector ICSP (In-Circuit SerialProgramming). El firmware que usa el ATmega8U2 también está disponible.Este chip está cargado con un bootloader DFU, que puede seractivado conectando el jumper de soldadura en la parte posterior dela placa y posteriormente reseteando el 8U2. Así después se podráhacer la programación con un programador DFU (no usado en estetaller). FabLab León 14
  • 16. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores5 Estructura básica de Lenguaje Arduino La estructura básica del lenguaje de programación de Arduinoes bastante simple y se compone de al menos dos partes. Estas dospartes necesarias, o funciones, encierran bloques que contienendeclaraciones, estamentos o instrucciones. vo i d se t u p () { i n str u cci o n e s; } vo i d l oo p () { i n str u cci o n e s; } En donde setup() es la parte encargada de recoger laconfiguración y loop() es la que contienen el programa que seejecutará cíclicamente (de ahí el termino loop –bucle-). Ambasfunciones son necesarias para que el programa funcionecorrectamente. La función de configuración debe contener ladeclaración de las variables. Es la primera función a ejecutar en elprograma, se ejecuta sólo una vez, y se utiliza para configurar oinicializar pinMode (modo de trabajo de las E/S), configuración de lacomunicación en serie y otras. La función bucle (loop) siguiente contiene el código que seejecutara continuamente (lectura de entradas, activación de salidas,etc.) Esta función es el núcleo de todos los programas de Arduino y laque realiza la mayor parte del trabajo.5.1 setup() La función setup() se invoca una sola vez cuando el programaempieza. Se utiliza para inicializar los modos de trabajo de los pines,o el puerto serie. Debe ser incluido en un programa aunque no hayadeclaración que ejecutar. Así mismo se puede utilizar para establecerel estado inicial de las salidas de la placa. FabLab León 15
  • 17. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores vo i d se t u p () { p i n Mo d e( pi n , O UT PUT ) ; / / co n fi g ur a el pi n co mo sa li d a d i gi t alW rit e ( pi n , HI G H) ; / / p o n e e l ‘p in ’ e n e st a do / / HI G H }5.2 loop() Después de finalizar setup(), la función loop() haceprecisamente lo que sugiere su nombre, se ejecuta de forma cíclica,lo que posibilita que el programa este respondiendo continuamenteante los eventos que se produzcan en la placa. vo i d l oo p () { d i gi t alW rit e ( pi n , HI G H) ; / / p o n e e n u no ( o n , 5 v) el ´p in ´ d e l a y( 1 0 00 ) ; / / e sp e ra u n seg u n d o ( 10 0 0 ms) d i gi t alW rit e ( pi n , L OW ) ; / / p o n e e n ce ro ( o f f , 0 v. ) el d e l a y( 1 0 00 ) ; / / ´ pi n ´ } FabLab León 16
  • 18. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores6 Ejemplos a implementar6.1 Led intermitente En la mayoría de los lenguajes de programación, el primerprograma que escribes imprime en la pantalla del ordenador la frase"Hola Mundo". Ya que una placa Arduino no tiene una pantalla (ya lase la pondremos), podemos hacer parpadear un Led. Las placas están diseñadas para que hacer parpadear un Ledsea muy fácil. Algunas tienen un Led directamente incorporado en laplaca para este pin. Si no lo tiene, usarlo es igual de sencillo solonecesitamos una resistencia de 220 Ohm y el Led. Los Leds tienen polaridad, lo que significa que solo encenderánsi están correctamente polarizados. El terminal más largo es elpositivo y deberá estar conectado al pin elegido. El terminal cortodebe conectarse con la tierra (GND), la capsula del LED tiene unborde plano en este extremo. Si el LED no enciende, trata deconectarlo de manera opuesta, intercambiando los terminales deposición (no dañaras el LED si lo conectas en sentido opuesto). FabLab León 17
  • 19. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores6.1.1 CódigoEl código de ejemplo es sencillo: /* Bli n k T u r n s o n a n L ED o n f o r o n e se co n d , t h e n o f f f o r on e se co nd , r e p e a t edl y. T hi s e xa mp l e co d e i s i n t h e p u bli c do ma i n . */ vo i d se t u p () { / / ini ti al i ze t h e d igi t al pi n a s a n o ut pu t . / / Pi n 1 2 h a s a n L ED co n n e ct e d o n mo st Ar d u i n o b o a rd s: p i n Mo d e( 1 2 , O UT PUT ) ; } vo i d l oo p () { d i gi talW rit e ( 12 , HI G H ) ; / / se t t h e LED o n d e la y ( 1 00 0 ) ; // wa i t fo r a se co n d d i gi talW rit e ( 12 , L OW ) ; / / set t h e LED o f f d e la y ( 1 00 0 ) ; // wa i t fo r a se co n d }6.1.2 Circuito FabLab León 18
  • 20. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores 6.1.3 Montaje en Protoboard 6.1.4 Ejercicio 1: Construir y programar una tira de 5 Leds que simule el efecto“coche fantástico” FabLab León 19
  • 21. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores6.2 Botones o pulsadores Los pulsadores o switches conectan dos puntos de un circuito alser pulsados. Conecta tres cables a la placa Arduino. Los dos primeros, rojo ynegro, conectan a las dos hileras largas verticales de los laterales dela placa universal (breadboard ) para proporcionar acceso a la fuentede 5 voltios y a masa (ground). El tercer cable va desde el pin digital2 a una patilla del pulsador. Esa misma patilla del pulsador seconecta a través de una resistencia pull-down (en este caso 10KOhms) a masa. El otro extremo del pulsador se conecta a la fuentede 5 voltios. Cuando el pulsador está abierto (sin pulsar) no hay conexiónentre las dos patas del pulsador, de forma que el pin está conectadoa tierra (a través de la resistencia pull-down) y leemos un LOW (bajoó 0). Cuando el botón se cierra (pulsado), se establece la unión entresus dos extremos, conectando el pin a 5 voltios, por lo que leemos unHIGH (alto ó 1). También puedes cablear el circuito en sentido contrario, conuna resistencia "pull-up" que mantenga la entrada en HIGH, y quepase a LOW cuando se pulse el botón. Así, el comportamiento delprograma (sketch) se invertirá, con el LED normalmente encendido yapagado cuando se pulsa el botón. Si se desconectas el pin digital de E/S del todo, el LED puedeparpadear de forma errática. Esto se debe a la entrada es "flotante",es decir, al azar se tornará en HIGH o LOW. Por eso se necesita laresistencia pull-up o pull-down en el circuito. Combinando el primer ejemplo y este podemos controlar el ledcon el pulsador. FabLab León 20
  • 22. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores 6.2.1 Código No te preocupes si ahora no comprendes todo el código, bastacon que sepas modificar alguna parte y veas lo que va sucediendo. /* Bu t t o n */ / / co n st a n t s wo n t ch a n g e . T h e y r e u s e d h e r e t o / / se t pi n nu mb e r s: co n st in t b u tt o n Pin = 2 ; / / t h e n u mb e r o f th e p u shb u t t o n pi n co n st in t l e d Pi n = 1 2; / / t h e n u mb e r o f t he L ED pi n / / va ri a bl e s will ch an g e : i n t bu t t o n St a te = 0 ; / / vari a bl e fo r r e ad in g t h e p u sh bu t t o n st a t u s vo i d se t u p () { / / ini ti al i ze t h e L ED p in a s a n o u t p u t: p i n Mo d e(l e d Pi n , O UT PUT) ; / / ini ti al i ze t h e p u sh b u tt o n pi n a s a n i n pu t : p i n Mo d e( b u t to n Pi n, I NPUT ) ; } vo i d l oo p () { / / r e a d t h e st at e o f th e p u shb u t t o n va l u e: b u t t o n St a t e = di gi t al Re a d( b u t t on Pi n) ; / / ch e ck i f t he p u shb u t t o n i s p r e ssed. / / if i t i s, t h e b u t t o n St at e i s HI G H: i f ( b u t t on St a t e == HI G H) { / / t u rn L ED o n : di gi t alW ri t e (le d Pin , HI G H) ; } e l se { / / t u rn L ED o f f : di gi t alW ri t e (le d Pin , L OW ) ; } } 6.2.2 Circuito FabLab León 21
  • 23. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores6.2.3 Montaje en Protoboard FabLab León 22
  • 24. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores 6.2.4 Ejercicio 2: A partir del ejercicio 1 hacer que la tira de leds se detenga alpulsar el botón. 6.2.5 Ejercicio 3 complementario: Con los montajes anteriores colocar 2 pulsadores uno queencienda el efecto “coche fantástico” y otro que lo apague. Páginas web de consulta: http://www.arduino.cc/ http://www.fablableon.org/ http://www.arduinoacademy.com/ Si tienes alguna duda pregúntame: Arduino y electrónica Fab Lab León: David Benéitez david.beneitez@fablableon.org FabLab León 23
  • 25. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores7 Anexo: Guía de lenguaje Arduino.7.1 Funciones Una función es un bloque de código que tiene un nombre y un conjunto deinstrucciones que son ejecutadas cuando se llama a la función. Son funcionessetup() y loop() de las que ya se ha hablado. Las funciones de usuario pueden serescritas para realizar tareas repetitivas y para reducir el tamaño de un programa.Las funciones se declaran asociadas a un tipo de valor. Este valor será el quedevolverá la función, por ejemplo int se utilizara cuando la función devuelva undato numérico de tipo entero. Si la función no devuelve ningún valor entonces secolocara delante la palabra “void”, que significa “función vacía”. Después dedeclarar el tipo de dato que devuelve la función se debe escribir el nombre de lafunción y entre paréntesis se escribirán, si es necesario, los parámetros que sedeben pasar a la función para que se ejecute. t i p o n o mb r e F u n ci ó n (p a r á me t r o s) { i n str u cci o n e s; } La función siguiente devuelve un numero entero, delayVal() se utiliza paraponer un valor de retraso en un programa que lee una variable analógica de unpotenciómetro conectado a una entrada de Arduino. Al principio se declara comouna variable local, ´v´ recoge el valor leído del potenciómetro que estarácomprendido entre 0 y 1023, luego se divide el valor por 4 para ajustarlo a unmargen comprendido entre 0 y 255, finalmente se devuelve el valor ´v´ y seretornaría al programa principal. i n t del a yVal ( ) { i n t v; / / cr ea u n a va ri a bl e te mp o r a l v v= a n a lo g Re a d( p o t ); / / l e e e l val o r del p o te n ci ó me t r o v / = 4 ; / / co n vi er t e 0 - 1 0 2 3 a 0 -2 5 5 r e t u r n v; / / d e vu el ve el val or fi n al }7.2 {} entre llaves Las llaves sirven para definir el principio y el final de un bloque deinstrucciones. Se utilizan para los bloques de programación setup(), loop(), if.., etc. t yp e f u n ci ó n( ) { i n str u cci o n e s; } FabLab León 24
  • 26. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores Una llave de apertura “{“ siempre debe ir seguida de una llave de cierre “}”, si no es así el compilador dará errores. El entorno de programación de Arduinoincluye una herramienta de gran utilidad para comprobar el total de llaves. Solotienes que hacer clic en el punto de inserción de una llave abierta einmediatamente se marca el correspondiente cierre de ese bloque (llave cerrada).7.3 ; punto y coma El punto y coma “;” se utiliza para separar instrucciones en el lenguaje deprogramación de Arduino. También se utiliza para separar elementos en unainstrucción de tipo “bucle for”. i n t x = 1 3 ; / / de cl a r a l a va ri a bl e x como t i p o / / e n t e ro d e val or 1 3 Nota: Si olvidáis poner fin a una línea con un punto y coma se producirá enun error de compilación. El texto de error puede ser obvio, y se referirá a la falta deun punto y coma, o puede que no. Si se produce un error raro y de difícil detecciónlo primero que debemos hacer es comprobar que los puntos y comas estáncolocados al final de las instrucciones.7.4 /*… */ bloque de comentarios Los bloques de comentarios, o comentarios multi-linea son áreas de textoignorados por el programa que se utilizan para las descripciones del código ocomentarios que ayudan a comprender el programa. Comienzan con / * y terminancon * / y pueden abarcar varias líneas. / * e st o e s u n bl oq u e de co me n t a r i o no se d e b e ol vid a r ce r r a r lo s co me n t a r i o s e st o s d eb e n est a r e q uili br a d o s */ Debido a que los comentarios son ignorados por el compilador y no ocupanespacio en la memoria de Arduino pueden ser utilizados con generosidad. Tambiénpueden utilizarse para "comentar" bloques de código con el propósito de anotarinformaciones para depuración y hacerlo más comprensible para cualquiera. Nota: Dentro de una misma línea de un bloque de comentarios no se puedeescribir otra bloque de comentarios (usando /*..*/).7.5 // línea de comentarios Una línea de comentario empieza con / / y terminan con la siguiente línea decódigo. Al igual que los comentarios de bloque, los de línea son ignoradas por elprograma y no ocupan espacio en la memoria. / / Est o e s u n co me n t a ri o FabLab León 25
  • 27. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores Una línea de comentario se utiliza a menudo después de una instrucción,para proporcionar más información acerca de lo que hace esta o para recordarlamás adelante.7.6 Variables Una variable es una manera de nombrar y almacenar un valor numéricopara su uso posterior por el programa. Como su nombre indica, las variables sonnúmeros que se pueden variar continuamente en contra de lo que ocurre con lasconstantes cuyo valor nunca cambia. Una variable debe ser declarada y,opcionalmente, asignarle un valor. El siguiente código de ejemplo declara unavariable llamada variableEntrada y luego le asigna el valor obtenido en la entradaanalógica del PIN2: i n t vari a bl e En tr a d a = 0 ; / / d e cl ar a u na va ri a bl e y le / / a sig n a el valo r 0 va r ia bl e En t r ad a = a n al og Re a d (2 ) ; / / la va ri a bl e r e co g e / / e l va lo r an al ó gi co de l PI N2 variableEntrada es la variable en sí. La primera línea declara que será detipo entero “int”. La segunda línea fija a la variable el valor correspondiente a laentrada analógica PIN2. Esto hace que el valor de PIN2 sea accesible en otraspartes del código. Una vez que una variable ha sido asignada, o re-asignada, ustedpuede probar su valor para ver si cumple ciertas condiciones, o puede utilizardirectamente su valor. Como ejemplo ilustrativo veamos tres operaciones útiles convariables: el siguiente código prueba si la variable “entradaVariable” es inferior a100, si es cierto se asigna el valor 100 a “entradaVariable” y, a continuación,establece un retardo (delay) utilizando como valor “entradaVariable” que ahoraserá como mínimo de valor 100: i f (e n t r ad a Va ri a bl e < 1 0 0 ) / / p re g u n t a si l a vari a bl e e s { / / me n o r d e 1 0 0 e n t r a d a Vari a bl e = 1 00 ; / / si e s ci er t o a si g na el val or } //100 d e l a y( e n tr a d a Va ria bl e ) ; // u sa el va lor co mo r e t a r d o Nota: Las variables deben tomar nombres descriptivos, para hacer el códigomás legible. Los nombres de variables pueden ser “contactoSensor” o “pulsador”, para ayudar al programador y a cualquier otra persona a leer el código yentender lo que representa la variable. Nombres de variables como “var” o “valor”, facilitan muy poco que el código sea inteligible. Una variable puede sercualquier nombre o palabra que no sea una palabra reservada en el entorno deArduino. FabLab León 26
  • 28. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores7.7 Declaración de variables Todas las variables tienen que declararse antes de que puedan serutilizadas. Para declarar una variable se comienza por definir su tipo como int(entero), long (largo), float (coma flotante), etc., asignándoles siempre un nombre,y, opcionalmente, un valor inicial. Esto solo debe hacerse una vez en un programa,pero el valor se puede cambiar en cualquier momento usando aritmética yreasignaciones diversas. El siguiente ejemplo declara la variable entradaVariable como una variablede tipo entero “int”, y asignándole un valor inicial igual a cero. Esto se llama unaasignación. i n t en t r ad a Va ri a bl e = 0; Una variable puede ser declarada en una serie de lugares del programa y enfunción del lugar en donde se lleve a cabo la definición esto determinara en quepartes del programa se podrá hacer uso de ella.7.8 utilización de una variable Una variable puede ser declarada al inicio del programa antes de la parte deconfiguración setup(), a nivel local dentro de las funciones, y, a veces, dentro de unbloque, como para los bucles del tipo if.. for.., etc. En función del lugar dedeclaración de la variable así se determinara el ámbito de aplicación, o la capacidadde ciertas partes de un programa para hacer uso de ella. Una variable global es aquella que puede ser vista y utilizada por cualquierfunción y estamento de un programa. Esta variable se declara al comienzo delprograma, antes de setup(). Una variable local es aquella que se define dentro de una función o comoparte de un bucle. Solo es visible y solo puede utilizarse dentro de la función en laque se declaró. Por lo tanto, es posible tener dos o más variables del mismo nombre endiferentes partes del mismo programa que pueden contener valores diferentes. Lagarantía de que solo una función tiene acceso a sus variables dentro del programasimplifica y reduce el potencial de errores de programación. El siguiente ejemplo muestra como declarar a unos tipos diferentes devariables y la visibilidad de cada variable: i n t valu e ; / / val u e e s vi si bl e pa r a cua l q uie r f u n ció n vo i d se t u p () { FabLab León 27
  • 29. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores / / n o e s ne ce sa ri o co n fi g ur a r na d a e n e st e e je mp l o } vo i d l oo p () { f o r (i n t i =0 ; i <20 ; ) / / i so lo e s vi si bl e { / / d e n tr o d el b u cl e f or i ++ } / / f e s vi si bl e so lo f l o a t f ; / / de n t r o d e l o op ( ) }7.9 Tipos de datos 7.9.1 Byte Byte almacena un valor numérico de 8 bits sin decimales. Tienen un rangoentre 0 y 255. b yt e u n a Va ri abl e = 1 8 0 ; / / d e cl ar a u na Va r i abl e co mo / / d e ti p o b y t e 7.9.2 Int Enteros son un tipo de datos primarios que almacenan valores numéricos de16 bits sin decimales comprendidos en el rango 32,767 to -32,768. i n t u n a Vari a bl e = 1 50 0 ; / / d e cl a r a u na Va r i abl e co mo / / u n a var ia bl e d e ti p o e nt e r o Nota: Las variables de tipo entero “int” pueden sobrepasar su valormáximo o mínimo como consecuencia de una operación. Por ejemplo, si x = 32767y una posterior declaración agrega 1 a x, x = x + 1 entonces el valor se x pasara aser -32.768. (algo así como que el valor da la vuelta). 7.9.3 Long El formato de variable numérica de tipo extendido “long” se refiere anúmeros enteros (tipo 32 bits) sin decimales que se encuentran dentro del rango -2147483648 a 2147483647. l o n g u n a Va ri abl e = 9 0 0 00 ; / / de cl a r a u n a Va ri a bl e co mo / / d e ti p o l on g 7.9.4 Float El formato de dato del tipo “punto flotante” “float” se aplica a losnúmeros con decimales. Los números de punto flotante tienen una mayorresolución que los de 32 bits con un rango comprendido 3.4028235E +38 a +38-3.4028235E. FabLab León 28
  • 30. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores f l o a t u n a Va ri abl e = 3 . 1 4; / / d e cl ar a un a Va r ia bl e co mo / / d e ti p o flo t a n t e Nota: Los números de punto flotante no son exactos, y pueden producirresultados extraños en las comparaciones. Los cálculos matemáticos de puntoflotante son también mucho más lentos que los del tipo de números enteros, por loque debe evitarse su uso si es posible. 7.9.5 arrays Un array es un conjunto de valores a los que se accede con un númeroíndice. Cualquier valor puede ser recogido haciendo uso del nombre de la matriz yel número del índice. El primer valor de la matriz es el que está indicado con elíndice 0, es decir el primer valor del conjunto es el de la posición 0. Un array tieneque ser declarado y opcionalmente asignados valores a cada posición antes de serutilizado. i n t mi Ar r a y[ ] = { val o r 0, val o r 1, val o r2 .. . } Del mismo modo es posible declarar una matriz indicando eltipo de datos y el tamaño y posteriormente, asignar valores a unaposición especifica: i n t mi Ar r a y[ 5 ]; / / d e cla r a un a rr a y d e e n t e r o s d e 6 / / p o si cio n e s mi Ar r a y[ 3 ] = 1 0 ; / / a s i gn a l val or 1 0 a l a po si ció n 4 Para leer de un array basta con escribir el nombre y la posición a leer: x = mi Ar r a y[ 3 ] ; / / x a h o r a e s i gu al a 10 q u e e st á e n / / l a p o si ci ó n 3 d el a rr a y Las matrices se utilizan a menudo para estamentos de tipo bucle, en los quela variable de incremento del contador del bucle se utiliza como índice o puntero delarray. El siguiente ejemplo usa una matriz para el parpadeo de un LED. Utilizandoun bucle tipo for, el contador comienza en cero 0 y escribe el valor que figura en laposición de índice 0 en la serie que hemos escrito dentro del array parpadeo[], eneste caso 180, que se envía a la salida analógica tipo PWM configurada en el PIN10,se hace una pausa de 200 ms y a continuación se pasa al siguiente valor queasigna el índice “i”. i n t l ed Pi n = 1 0 ; / / L ED e n el PI N 1 0 b yt e p a rp a d e o [] = { 1 8 0, 3 0 , 25 5 , 2 00 , 1 0 , 9 0 , 1 5 0 , 6 0} ; / / a r r a y d e 8 va lo r e s vo i d se t u p () { p i n Mo d e( le d Pin , O UT PUT) ; / / con fi g ur a l a sali d a } FabLab León 29
  • 31. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores vo i d l oo p () { f o r (i n t i =0 ; i <7 ; i ++) { a n a lo gW ri t e( le d Pin , p ar p a d e o[ i] ) ; d e l a y( 2 0 0) ; / / e sp e r a 2 0 0 ms } }7.10 aritmética Los operadores aritméticos que se incluyen en el entorno de programaciónson suma, resta, multiplicación y división. Estos devuelven la suma, diferencia,producto, o cociente (respectivamente) de dos operandos. y = y + 3; x = x - 7; i = j * 6; r = r / 5; La operación se efectúa teniendo en cuenta el tipo de datos que hemosdefinido para los operandos (int, dbl, float, etc..), por lo que, por ejemplo, sidefinimos 9 y 4 como enteros “int”, 9 / 4 devuelve de resultado 2 en lugar de2,25 ya que el 9 y 4 se valores de tipo entero“int” (enteros) y no se reconocenlos decimales con este tipo de datos. Esto también significa que la operación puede sufrir un desbordamiento si elresultado es más grande que lo que puede ser almacenada en el tipo de datos.Recordemos el alcance de los tipos de datos numéricos que ya hemos explicadoanteriormente. Si los operandos son de diferentes tipos, para el cálculo se utilizarael tipo más grande de los operandos en juego. Por ejemplo, si uno de los números(operandos) es del tipo float y otra de tipo integer, para el cálculo se utilizara elmétodo de float es decir el método de coma flotante. Elija el tamaño de las variables de tal manera que sea lo suficientementegrande como para que los resultados sean lo precisos que usted desea. Para lasoperaciones que requieran decimales utilice variables tipo float, pero sea conscientede que las operaciones con este tipo de variables son más lentas a la hora derealizarse el cómputo. Nota: Utilice el operador (int) para convertir un tipo de variable a otro sobrela marcha. Por ejemplo, i = (int) 3,6 establecerá i igual a 3.7.11 asignaciones compuestas Las asignaciones compuestas combinan una operación aritmética con unavariable asignada. Estas son comúnmente utilizadas en los bucles tal como sedescribe mas adelante. Estas asignaciones compuestas pueden ser: x ++ / / i g u al q u e x = x +1 , o i n cre me n t o d e x e n +1 x - - / / i gu al q u e x = x - 1 , o d e cre me n t o d e x e n - 1 FabLab León 30
  • 32. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores x += y / / i g u al q u e x = x + y, o i n cre me n t o d e x e n +y x - = y / / i g u al qu e x = x - y, o d e cr e me n t o d e x e n - y x * = y / / i g u al q u e x = x * y, o mu l t i plica x p o r y x / = y / / i g u al q ue x = x / y, o d i vi d e x p o r y Nota: Por ejemplo, x * = 3 hace que x se convierta en el triple del antiguovalor x y por lo tanto x es reasignada al nuevo valor.7.12 operadores de comparación Las comparaciones de una variable o constante con otra se utilizan confrecuencia en las estructuras condicionales del tipo if.. para testear si una condiciónes verdadera. En los ejemplos que siguen en las próximas páginas se verá suutilización práctica usando los siguientes tipo de condicionales: x == y / / x e s i g u al a y x ! = y / / x n o e s ig u al a y x < y / / x e s me n o r q u e y x > y / / x e s ma yo r q u e y x <= y / / x e s me n o r o i gu a l q u e y x >= y / / x e s ma yo r o i g ual q u e y7.13 operadores lógicos Los operadores lógicos son usualmente una forma de comparar dosexpresiones y devolver un VERDADERO o FALSO dependiendo del operador. Existentres operadores lógicos, AND (&&), OR (||) y NOT (!), que a menudo se utilizan enestamentos de tipo if: Lógica AND: i f ( x > 0 && x < 5 ) / / ci er t o sól o si l a s d o s e xp r e si o n e s / / so n ci er t a s Lógica OR: i f ( x > 0 || y > 0 ) / / ci e r to si u n a cu al qu i er a d e la s / / e xp r e si on e s e s ci er t a Lógica NOT: i f (! x > 0 ) / / cie r t o so lo si l a e xp r e si ó n e s / / f al sa7.14 constantes El lenguaje de programación de Arduino tiene unos valorespredeterminados, que son llamados constantes. Se utilizan para hacer losprogramas más fáciles de leer. Las constantes se clasifican en grupos. FabLab León 31
  • 33. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores7.15 cierto/falso (true/false) Estas son constantes booleanas que definen los niveles HIGH (alto) y LOW(bajo) cuando estos se refieren al estado de las salidas digitales. FALSE se asociacon 0 (cero), mientras que TRUE se asocia con 1, pero TRUE también puede sercualquier otra cosa excepto cero. Por lo tanto, en sentido booleano, -1, 2 y -200son todos también se definen como TRUE. (esto es importante tenerlo en cuanta). i f (b == T RUE) ; { e je cu t a r l a s in st r u cci o ne s; }7.16 High/Low Estas constantes definen los niveles de salida altos o bajos y se utilizan parala lectura o la escritura digital para las patillas. ALTO se define como en la lógica denivel 1, ON, o 5 voltios, mientras que BAJO es lógica nivel 0, OFF, o 0 voltios. d i gi t alW rit e ( 1 3, HI G H) ; / / a cti va l a sal i d a 1 3 co n u n / / n i ve l al t o (5 v. )7.17 Input/Output Estas constantes son utilizadas para definir, al comienzo del programa, elmodo de funcionamiento de los pines mediante la instrucción pinMode de talmanera que el pin puede ser una entrada INPUT o una salida OUTPUT. p i n Mo d e( 1 3 , O UT PUT ) ; / / d e si g n a mo s q u e el PI N 1 3 e s / / u n a sali d a7.18 Control de flujo 7.18.1 if (si condicional) if es un estamento que se utiliza para probar si una determinada condiciónse ha alcanzado, como por ejemplo averiguar si un valor analógico está por encimade un cierto número, y ejecutar una serie de declaraciones (operaciones) que seescriben dentro de llaves, si es verdad. Si es falso (la condición no se cumple) elprograma salta y no ejecuta las operaciones que están dentro de las llaves, Elformato para if es el siguiente: i f (u n a Va ri ab le ? ? val or ) { e je cu t a I n st r u cci o n e s ; } En el ejemplo anterior se compara una variable con un valor, el cual puedeser una variable o constante. Si la comparación, o la condición entre paréntesis se FabLab León 32
  • 34. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadorescumple (es cierta), las declaraciones dentro de los corchetes se ejecutan. Si no esasí, el programa salta sobre ellas y sigue. Nota: Tenga en cuenta el uso especial del símbolo =, poner dentro de if (x= 10), podría parecer que es válido pero sin embargo no lo es ya que esa expresiónasigna el valor 10 a la variable x, por eso dentro de la estructura if se utilizaríaX==10 que en este caso lo que hace el programa es comprobar si el valor de x es10.. Ambas cosas son distintas por lo tanto dentro de las estructuras if, cuando se pregunte por un valor se debe poner el signo doble de igual “==”. 7.18.2 if… else (si….. sino ..) if… else viene a ser un estructura que se ejecuta en respuesta a la idea “siesto no se cumple haz esto otro”. Por ejemplo, si se desea probar una entradadigital, y hacer una cosa si la entrada fue alto o hacer otra cosa si la entrada esbaja, usted escribiría que de esta manera: i f (in p u t Pi n == HI G H) { i n str u cci o n e sA; } e l se { i n str u cci o n e sB; } Else puede ir precedido de otra condición de manera que se puedenestablecer varias estructuras condicionales de tipo unas dentro de las otras(anidamiento) de forma que sean mutuamente excluyentes pudiéndose ejecutar ala vez. Es incluso posible tener un número ilimitado de estos condicionales.Recuerde sin embargo que solo un conjunto de declaraciones se llevara a cabodependiendo de la condición probada: i f (in p u t Pi n < 5 0 0) { i n str u cci o n e sA; } e l se i f (i n p u t Pi n >= 1 00 0 ) { i n str u cci o n e sB; { e l se { i n str u cci o n e sC ; } Nota: Un estamento de tipo if prueba simplemente si la condición dentro delparéntesis es verdadera o falsa. Esta declaración puede ser cualquier declaraciónvalida. En el anterior ejemplo, si cambiamos y ponemos (inputPin == HIGH). En FabLab León 33
  • 35. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadoreseste caso, el estamento if solo comprobaría si la entrada especificada esta en nivelalto (HIGH), o +5v. 7.18.3 for La declaración for se usa para repetir un bloque de sentencias encerradasentre llaves un número determinado de veces. Cada vez que se ejecutan lasinstrucciones del bucle se vuelve a testear la condición. La declaración for tiene trespartes separadas por (;), vemos el ejemplo de su sintaxis: f o r (i ni ci ali za ci ó n; co n di ci ó n ; e xp r e sió n ) { I n st r u cci o n e s; } La inicialización de una variable local se produce una sola vez y la condiciónse testea cada vez que se termina la ejecución de las instrucciones dentro delbucle. Si la condición sigue cumpliéndose, las instrucciones del bucle se vuelven aejecutar. Cuando la condición no se cumple, el bucle termina. El siguiente ejemplo inicia el entero i en el 0, y la condición es probar que elvalor es inferior a 20 y si es cierto i se incrementa en 1 y se vuelven a ejecutar lasinstrucciones que hay dentro de las llaves: f o r (i n t i =0 ; i <20 ; i ++) / / d e cla r a i y p ru e b a si e s { / / me n o r q u e 2 0 , i n cr e me n t a i . d i gi t alW rit e ( 1 3, HI G H) ; / / e n ci e n de el p i n 1 3 d e l a y( 2 5 0) ; / / e sp e r a ¼ se g . d i gi t alW rit e ( 1 3, L OW ) ; // a p a ga el pi n 1 3 d e l a y( 2 5 0) ; / / e sp e r a ¼ d e se g . } Nota: El bucle en el lenguaje C es mucho más flexible que otros buclesencontrados en algunos otros lenguajes de programación, incluyendo BASIC.Cualquiera de los tres elementos de cabecera puede omitirse, aunque el punto ycoma es obligatorio. También las declaraciones de inicialización, condición yexpresión puede ser cualquier estamento valido en lenguaje C sin relación con lasvariables declaradas. Estos tipos de estados son raros pero permiten disponersoluciones a algunos problemas de programación raras. 7.18.4 while Un bucle del tipo while es un bucle de ejecución continua mientras secumpla la expresión colocada entre paréntesis en la cabecera del bucle. La variablede prueba tendrá que cambiar para salir del bucle. La situación podrá cambiar aexpensas de una expresión dentro el código del bucle o también por el cambio deun valor en una entrada de un sensor. FabLab León 34
  • 36. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores wh i l e ( u n a Va ri ab le ? ? v alo r ) { e je cu t a r Se n t e n ci a s; } El siguiente ejemplo testea si la variable "unaVariable” es inferior a 200 y,si es verdad, ejecuta las declaraciones dentro de los corchetes y continuaraejecutando el bucle hasta que unaVariable no sea inferior a 200. W hil e (u n a Va ri a ble < 2 0 0) / / t e ste a si e s me n o r q u e 2 0 0 { i n str u cci o n e s; / / e je cu t a l a s i n st ru ccio n e s / / e n t r e ll a ve s u n a Va ri a bl e ++; / / i n cr e me n t a l a vari ab l e e n 1 } 7.18.5 do… while El bucle do while funciona de la misma manera que el bucle while, con lasalvedad de que la condición se prueba al final del bucle, por lo que el buclesiempre se ejecutara al menos una vez. do { I n st r u cci o n e s; } wh i l e ( u na Va ri a bl e ?? val o r) ; El siguiente ejemplo asigna el valor leído leeSensor() a la variable x, espera50 milisegundos, y luego continúa mientras que el valor de la x sea inferior a 100: do { x = l e e Se n so r () ; d e l a y( 5 0) ; } wh i l e ( x < 1 0 0 ) ;7.19 e/s digitales 7.19.1 pinMode(pin, mode) Esta instrucción es utilizada en la parte de configuración setup () y sirvepara configurar el modo de trabajo de un PIN pudiendo ser INPUT (entrada) uOUTPUT (salida). p i n Mo d e( pi n , O UT PUT ) ; / / co n fi g ur a ‘p i n ’ co mo sa li d a Los terminales de Arduino, por defecto, están configurados como entradas,por lo tanto no es necesario definirlos en el caso de que vayan a trabajar comoentradas. Los pines configurados como entrada quedan, bajo el punto de vistaeléctrico, como entradas en estado de alta impedancia. Estos pines tienen a nivelinterno una resistencia de 20 KΩ a las que se puede acceder mediante software.Estas resistencias se acceden de la siguiente manera: FabLab León 35
  • 37. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores p i n Mo d e( pi n , I NPUT ); / / co n fig u r a e l ‘p i n ’ co mo / / e n t r ad a d i gi t alW rit e ( pi n , HI G H) ; / / a cti va l a s re si st en cia s / / i nt e r n a s Las resistencias internas normalmente se utilizan para conectar las entradasa interruptores. En el ejemplo anterior no se trata de convertir un pin en salida, essimplemente un método para activar las resistencias interiores. Los pinesconfigurado como OUTPUT (salida) se dice que están en un estado de bajaimpedancia estado y pueden proporcionar 40 mA (miliamperios) de corriente aotros dispositivos y circuitos. Esta corriente es suficiente para alimentar un diodoLED (no olvidando poner una resistencia en serie), pero no es lo suficiente grandecomo para alimentar cargas de mayor consumo como relés, solenoides, o motores. Un cortocircuito en las patillas Arduino provocara una corriente elevada quepuede dañar o destruir el chip Atmega. A menudo es una buena idea conectar en laOUTUPT (salida) una resistencia externa de 470 o de 1000 Ω. 7.19.2 digitalRead(pin) Lee el valor de un pin (definido como digital) dando un resultado HIGH (alto)o LOW (bajo). El pin se puede especificar ya sea como una variable o una constante(0-13). va l or = di gi t al Re a d( Pin ) ; / / h a ce qu e va l or se a i gu al / / a l e st a d o le í d o en ´ Pi n ´ 7.19.3 digitalWrite(pin, value) Envía al ´pin´ definido previamente como OUTPUT el valor HIGH o LOW(poniendo en 1 o 0 la salida). El pin se puede especificar ya sea como una variableo como una constante (0-13). d i gi t alW rit e ( pi n , HI G H) ; / / d e p o s i t a e n e l pi n u n va l or / / HI G H ( al t o o 1 ) El siguiente ejemplo lee el estado de un pulsador conectado a una entradadigital y lo escribe en el ´pin´de salida LED: i n t l ed = 1 3 ; / / a si g n a a L ED el val o r 1 3 i n t bo t o n = 7 ; / / a si g na a b o tó n el valo r 7 i n t v alo r = 0 ; // d e fi n e el val o r y le a sig n a el / / va lo r 0 vo i d se t u p () { p i n Mo d e( le d , O UT PUT ) ; / / co n fi g ur a el l e d ( pi n 1 3) co mo sa li d a p i n Mo d e( b o t o n, I NPUT ) ; / / co n fi g ur a b o t ó n (p in 7 ) co mo entrada } vo i d l oo p () FabLab León 36
  • 38. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores { va l or = di gi t al Re a d( b o to n ) ; / /le e el e st a d o d e l a / / e n t r ad a b o tó n d i gi t alW rit e (l e d , val o r) ; / / e n ví a a l a sa li d a ´l e d ´el } / / val o r le í d o7.20 E/s analógicas 7.20.1 analogRead(pin) Lee el valor de un determinado pin definido como entrada analógica con unaresolución de 10 bits. Esta instrucción solo funciona en los pines (0-5). El rango devalor que podemos leer oscila de 0 a 1023. va l or = a n al o g Re a d (p in ) ; / / a si g n a a va l or l o q ue l e e / / e n l a e nt r a d a ´ pi n Nota: Los pines analógicos (0-5) a diferencia de los pines digitales, nonecesitan ser declarados como INPUT u OUPUT ya que son siempre Inputs. 7.20.2 analogWrite(pin, value) Esta instrucción sirve para escribir un pseudo-valor analógico utilizando elprocedimiento de modulación por ancho de pulso (PWM) a uno de los pines deArduino marcados como “pin PWM”. El más reciente Arduino, que implementa elchip ATmega168, permite habilitar como salidas analógicas tipo PWM los pines 3, 5,6, 9, 10 y 11. Los modelos de Arduino más antiguos que implementan el chipATmega8, solo tiene habilitadas para esta función los pines 9, 10 y 11. El valor quese puede enviar a estos pines de salida analógica puede darse en forma de variableo constante, pero siempre con un margen de 0-255. a n a lo gW ri t e( pi n , val or ) ; / / e scri b e valo r e n el pin / / d e fi ni d o co mo a n al ó gi co Si enviamos el valor 0 genera una salida de 0 voltios en el pin especificado;un valor de 255 genera una salida de 5 voltios de salida en el pin especificado. Paravalores de entre 0 y 255, el pin saca tensiones entre 0 y 5 voltios - el valor HIGHde salida equivale a 5v (5 voltios). Teniendo en cuenta el concepto de señal PWM,por ejemplo, un valor de 64 equivaldrá a mantener 0 voltios de tres cuartas partesdel tiempo y 5 voltios a una cuarta parte del tiempo; un valor de 128 equivaldrá amantener la salida en 0 la mitad del tiempo y 5 voltios la otra mitad del tiempo, yun valor de 192 equivaldrá a mantener en la salida 0 voltios una cuarta parte deltiempo y de 5 voltios de tres cuartas partes del tiempo restante. Debido a que estaes una función de hardware, en el pin de salida analógica (PWN) se generara unaonda constante después de ejecutada la instrucción analogWrite hasta que se llegue FabLab León 37
  • 39. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadoresa ejecutar otra instrucción analogWrite (o una llamada a digitalRead o digitalWriteen el mismo pin). Nota: Las salidas analógicas a diferencia de las digitales, no necesitan serdeclaradas como INPUT u OUTPUT.. El siguiente ejemplo lee un valor analógico de un pin de entrada analógica,convierte el valor dividiéndolo por 4, y envía el nuevo valor convertido a una salidadel tipo PWM o salida analógica: i n t l ed = 1 0 ; / / d e fi n e e l pi n 1 0 co mo ´ l e d´ i n t an al o g = 0 ; / / d e fi ne el pi n 0 co mo ´ a n al o g´ i n t valo r ; / / d e fi n e l a va ri a bl e ´ val or ´ vo i d se t u p () { } / / n o e s n e ce sari o co n fig u r a r / / e n t r ad a s y sali d a s vo i d l oo p () { va l or = a n al o g Re a d (a n al o g) ; / / l e e el p i n 0 y l o a so ci a a / /l a vari a bl e valo r va l or / = 4 ; / /d i vid e val o r e n t re 4 y l o / / r e a si g n a a val o r a n a lo gW ri t e( le d , val ue ) ; / / e scri b e e n e l pi n1 0 val or }7.21 Control del tiempo 7.21.1 delay(ms) Detiene la ejecución del programa la cantidad de tiempo en msque se indica en la propia instrucción. De tal manera que 1000equivale a 1seg. d e l a y( 1 0 00 ) ; / / e sp e ra 1 se gu n d o 7.21.2 millis() Devuelve el número de milisegundos transcurrido desde el inicio delprograma en Arduino hasta el momento actual. Normalmente será un valor grande(dependiendo del tiempo que esté en marcha la aplicación después de cargada odespués de la última vez que se pulso el botón “reset” de la tarjeta). va l or = mi lli s( ) ; / / val o r r e co ge el n ú me r o d e / / mi l i se g u n do s Nota: Este número se desbordara (si no se resetea de nuevo a cero),después de aproximadamente 9 horas. FabLab León 38
  • 40. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores7.22 Matemáticas 7.22.1 min(x, y) Calcula el mínimo de dos números para cualquier tipo de datos devolviendoel número más pequeño. va l or = mi n ( val o r , 10 0 ) ; / / a si g n a a val o r el má s / / p e q u e ño s d e l o s d o s / / n ú me r o s e sp e ci fi ca d o s. Si valor es menor que 100 valor recogerá su propio valor si ´valor´ esmayor que 100 valor pasara a valer 100. 7.22.2 max(x, y) Calcula el máximo de dos números para cualquier tipo de datos devolviendoel número mayor de los dos. va l or = ma x( va l o r , 1 0 0 ) ; / / a si g na a va l or el ma yo r d e / / l o s d o s n ú me r o s val or y // 100. De esta manera nos aseguramos de que valor será como mínimo 100.7.23 aleatorios 7.23.1 randomSeed(seed) Establece un valor, o semilla, como punto de partida para la funciónrandom(). r a n d o mSe e d ( va l or ) ; / / h a ce qu e val or se a la se mi ll a d el // random Debido a que Arduino es incapaz de crear un verdadero numero aleatorio,randomSeed le permite colocar una variable, constante, u otra función de controldentro de la función random, lo que permite generar números aleatorios "al azar".Hay una variedad de semillas, o funciones, que pueden ser utilizados en estafunción, incluido millis () o incluso analogRead () que permite leer ruido eléctrico através de un pin analógico. 7.23.2 random(max), random(min, max) La función random devuelve un número aleatorio entero de un intervalo devalores especificado entre los valores min y max. va l or = r a nd o m( 1 0 0 , 2 0 0 ) ; / / a si g n a a l a vari a bl e / / val o r u n n u me r o a l ea t o ri o / / co mp r e n d i d o e n t r e 1 0 0 -2 0 0 FabLab León 39
  • 41. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores Nota: Use esta función después de usar el randomSeed(). El siguiente ejemplo genera un valor aleatorio entre 0-255 y lo envía a unasalida analógica PWM : i n t r a n d Nu mb e r ; / / va ria bl e q ue al ma c e n a el val or / / a le a t o rio i n t l ed = 1 0 ; / / d e fi n e l ed co mo 1 0 vo i d se t u p () { } / / n o e s n e ce sari o co nfi g ur a r na d a vo i d l oo p () { r a n d o mSe e d ( mi lli s() ) ; / / g e n er a u na se mi l l a p a r a / / a le a t o rio a p ar ti r / / d e l a f un ció n mi lli s() r a n d Nu mb e r = r a n d o m( 2 5 5 ) ; / / g e n er a n ú me r o a l e a t ori o / / e n t r e 0 - 2 55 a n a lo gW ri t e( le d , ra n d Nu mb e r ) ; / / e n vía a la sali d a / / l ed d e ti po PW M el / / va lo r d e l a y( 5 0 0) ; / / e sp e r a 0 , 5 seg . }7.24 comunicación serie 7.24.1 Serial.begin(rate) Abre el puerto serie y fija la velocidad en baudios para la transmisión dedatos en serie. El valor típico de velocidad para comunicarse con el ordenador es9600, aunque otras velocidades pueden ser soportadas. vo i d se t u p () { Se r i al . be gi n ( 96 0 0 ); / / a br e el Pu er t o se r ie } / / co n fi gu r a n do l a vel o ci d ad e n 96 00 b p s Nota: Cuando se utiliza la comunicación serie los pines digital 0 (RX) y 1(TX) no puede utilizarse al mismo tiempo. 7.24.2 Serial.println(data) Imprime los datos en el puerto serie, seguido por un retorno de carroautomático y salto de línea. Este comando toma la misma forma que Serial.print(),pero es mas fácil para la lectura de los datos en el Monitor Serie del software. Se r i al . pri n tl n (a n al o g Val u e) ; / / e n ví a el val or / / a n al og Va lu e a l / / p u e r to Nota: Para obtener más información sobre las distintas posibilidades deSerial.println () y Serial.print () puede consultarse el sitio web de Arduino. El siguiente ejemplo toma de una lectura analógica pin0 y envía estos datosal ordenador cada 1 segundo. FabLab León 40
  • 42. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores vo i d se t u p () { Se r i al . be gi n ( 96 0 0 ); / / co n fig u r a e l p ue r t o se rie a // 9600bps } vo i d l oo p () { Se r i al . pri n tl n (a n al o g Rea d ( 0) ) ; / / e n vía va lo r a nal ó gi co d e l a y( 1 0 00 ) ; / / e sp e ra 1 se gu n d o } 7.24.3 Serial.print(data, data type) Vuelca o envía un número o una cadena de caracteres, al puerto serie. Dichocomando puede tomar diferentes formas, dependiendo de los parámetros queutilicemos para definir el formato de volcado de los números. Parámetros data: el número o la cadena de caracteres a volcar o enviar. Data type: determina el formato de salida de los valores numéricos (decimal,octal, binario, etc...) DEC, OCT, BIN, HEX, BYTE , si no se pone nada vuelca ASCII Ejemplos: Se r i al . pri n t (b ) / / Vu el ca o e n vía el valo r d e b co mo / / u n n ú me r o d e ci ma l e n ca r a ct e r e s / / ASCI I . int b = 79; Se r i al . pri n t (b ) ; / / i mp r i me l a ca de n a "7 9 " . Se r i al . pri n t (b , HEX) ; / / Vu el ca o e n vía e l val o r de / / b co mo u n n ú me r o h e xa d e ci ma l / / e n ca ra ct e r e s ASCI I " 4 F " . Se r i al . pri n t (b , O CT) ; / / Vu el ca o e n vía e l val o r de / / b co mo u n n ú me r o O ct a l e n / / ca r a ct er e s ASCI I " 1 1 7" . Se r i al . pri n t (b , BI N) / / Vu el ca o e n ví a e l val or d e / / b co mo u n n ú me r o b i n a ri o e n / / ca r a ct er e s ASCI I " 1 0 01 1 1 1 " . Se r i al . pri n t (b , BYT E) ; / / De vue l ve el ca r á ct e r " O " , / / e l cu al r ep r e sen t a el / / ca r á ct er ASCI I d el val o r / / 7 9 . ( Ve r t a bl a ASCI I ) . Se r i al . pri n t ( str ) ; // Vu el ca o en ví a l a ca d e n a d e / / ca r a ct er e s co mo u n a ca d e na ASCI I . Se r i al . pri n t (" Hel lo W o rl d! ") ; / / vu el ca " He ll o W orl d! " . 7.24.4 Serial.avaible() Devuelve Un entero con el número de bytes disponibles para leer desde elbuffer serie, o 0 si no hay ninguno. Si hay algún dato disponible, SerialAvailable()será mayor que 0. El buffer serie puede almacenar como máximo 64 bytes. i n t Se ria l. a vail a bl e( ) / / Ob ti e n e u n n úme r o e n t e r o / / co n el n ú me r o d e b yte s / / ( ca r a ct e r e s) di sp o ni ble s / / p a r a l ee r o ca p t u ra r d e sd e / / e l p u e rt o se ri e FabLab León 41
  • 43. Taller 1: Introducción a Arduino. Jugando con Leds y pulsadores Ejemplo i n t i n co mi n g Byt e = 0 ; / / al ma ce n a e l da t o se ri e vo i d se t u p () { Se r i al . be gi n ( 96 0 0 ); / / a b r e el pu e r t o se r ie , y l e a si gn a / / l a vel o ci d a d d e 9 6 00 b p s } vo i d l oo p () { i f ( Seri al . a vail a bl e( ) > 0) / / e n ví a d a tos só l o si { / / l o s r e cib e : i n co mi n g Byt e = Se ri al . re a d () ; / / l e e el b yt e d e e nt r a da : / / l o vu el ca a pa n t all a Se r i al . pri n t (" I r e ce i ve d : ") ; Se r i al . pri n tl n (in co mi n g Byt e , DEC) ; } } 7.24.5 Serial.Read() Lee o captura un byte (un carácter) desde el puerto serie. Devuelve elsiguiente byte (carácter) desde el puerto serie, o -1 si no hay ninguno. Ejemplo: i n t i n co mi n g Byt e = 0 ; / / al ma ce n a r el d a t o se ri e vo i d se t u p () { Se r i al . be gi n ( 96 0 0 ); / / a br e el pu e r t o se r ie , y l e a si gn a / / l a vel o ci d a d d e 9 6 00 b p s } vo i d l oo p () { i f ( Seri al . a vail a bl e( ) > 0) / / e n vía d a t os só l o si lo s { / / r e ci be i n co mi n g Byt e = Se ri al . re a d () ; / / l ee el b yt e d e / / e n t r ad a y l o vue l ca Se r i al . pri n t (" I r e ce i ve d : ") ; / / a p a n t alla Se r i al . pri n tl n (in co mi n g Byt e , DEC) ; } } FabLab León 42