You are on page 1of 91

Recetas para iniciar, expandir, y mejorar sus proyectos

EN ESPAOL

TRADUCCIN: HENRY ALVARADO

Prlogo vii

Electrnica/Software Ingeniera/Robtica

Arduino Cookbook
Desea crear dispositivos que interacten con el mundo fsico? Este libro es perfecto para cualquiera quien desee experimentar con el popular microcontrolador Arduino y su entorno de programacin. Usted encontrar ms de 200 consejos y tcnicas para construir una variedad de objetos y prototipos como juguetes, detectores, robots y ropa interactiva que puede sentir y responder al tacto, sonido, posicin, calor, y luz. Usted no necesita experiencia con Arduino o programacin para iniciar. Actualizado para Arduino 1.0 liberado, las recetas en esta segunda edicin incluyen ejemplos prcticos y orientacin para ayudarle a empezar, expandir, y mejorar sus proyectos inmediatamente ya sea usted un artista, diseador, aficionado, estudiante o ingeniero.
Ponerse al da rpidamente sobre la placa Arduino y conceptos esenciales de software Aprender tcnicas bsicas para lectura digital y seales analgicas Usar Arduino con una variedad de populares dispositivos de entrada y sensores Controlar pantallas visuales, generar sonido, y controlar varios tipos de motores Interactuar con dispositivos que utilizan controles remotos, incluyendo Televisores y electrodomsticos Aprender tcnicas para manejo retrasos de tiempo y medicin del tiempo Aplicar avanzada codificacin y manejo de tcnicas de memoria

El conjunto de recetas de Michael es un buen regalo para la creciente comunidad de Arduino. Cualquiera que sea su conocimiento o habilidad, el libro provee soluciones para ese proyecto con el que est luchando hoy en da y estmulo para imaginar lo que construir maana. Dudo que alguna vez dejar mi mesa de trabajo
-Mikal Hart Arduino Uno Asesor Equipo

Michael Margolis es un tecnlogo en el campo de la computacin en tiempo real, con experiencia en el desarrollo de hardware y software para interactuar con el entorno. l tiene ms de 30 aos de experiencia en niveles superiores con Sony, Microsoft, and Lucent/Bell Labs, y ha escrito libreras y ncleo de software incluido en la distribucin Arduino 1.0

Prlogo viii

SEGUNDA EDICIN

Arduino Cookbook

Michael Margolis

Arduino Cookbook, Segunda Edicin


Michael Margolis
Derechos de autor 2012 Michael Margolis, Nicholas Weldin. Todo derechos reservados Impreso en los EEUU Publicado por O'Reilly Medios, Inc., 1005 Gravenstein Carretera Norte, Sebastopol, California 95472. O'Reilly libros puede ser comprado para educativa, negocio, o venta promocional utilizar. Online ediciones son tambin disponible para ms ttulos ( http://my.safaribooksonline.com). Para ms informacin, pngase en contacto nuestro corporativo/institucional departamento de venta: (800) 998-9938 o corporate@oreilly.com.

Editores: Shawn Wallace y Brian Jepson Produccin Editor: Teresa Elsey Corrector de pruebas: Kiel Furgoneta Cuerno

Indexador: Lucie Haskins Cubierta Diseador: Karen Montgomery Interior Diseador: David Futato Illustrator: Robert Romano

Marzo 2011: Primero Edition.Diciembre 2011: Segundo Edition.

Revisin Historia para la Segundo Edicin:


2011-12-09 Primero liberacin Ver http://oreilly.com/catalog/errata.csp?isbn=9781449313876 para ms detalles.

Nutshell Handbook, el logotipo de Nutshell Handbook, y el logotipo de O'Reilly son marcas registradas de O'Reilly Media, Inc. Arduino Cookbook, la imagen de un juguete conejo, y conexo comercio vestido son marcas comerciales de O'Reilly Medios, Inc. Muchas de las designaciones usadas por los fabricantes y los vendedores para distinguir su productos son reclamados como marcas. Donde aquellas designaciones aparecen en este libro, y O'Reilly Medios, Inc., era consciente de una marca comercial reclamar, la designaciones tener estado impreso en tapas o inicial gorras. Mientras cada precaucin tiene han tomado en la preparacin de este libro, la editor y autores asumir ninguna responsabilidad para errores o omisiones, o para daos y perjuicios resultante desde la utilizar de la informacin mantenida con- en el presente documento.

ISBN: 978-1-449-31387-6 [LSI] 1323465788

Prlogo

Este libro fue escrito por Michael Margolis con Nick Weldin para ayudarle a usted explorar las increbles cosas usted puede hacer con Arduino. Arduino es un familia de microcontroladores (Pequeos ordenadores) y un entorno de creacin de software que hace fcil para usted crear programas (Llamados sketches) que pueden interactuar con el mundo fsico. Las cosas que usted puede hacer con Arduino pueden sentir y responder al tacto, sonido, posicin, calor, y luz. Este tipo de tecnologa, a menudo referido a como computacin fsica, es usado en todo tipo de cosas desde el iPhone hasta sistemas electrnicos de automviles. Arduino hace esto posible para cualquier persona con un inters, incluso personas sin experiencia en programacin o electrnica para usar esta rica y compleja tecnologa.

A quin va dirigido este libro?


A diferencia de otros libros, la experiencia con software y hardware es no indispensable. Este libro es dirigido a los lectores interesados en el uso de la tecnologa de computacin para interactuar con el entorno. Es para personas que quieren a rpidamente encontrar la solucin a los problemas de hardware y software. Las recetas proporcionan la informacin que usted necesita para llevar a cabo un amplio alcance de tareas. Tambin tiene detalles para ayudarle a personalizar soluciones para cumplir sus necesidades especficas. Hay insuficiente espacio en un libro limitado a 700 pginas cubrir a fondo la teora general, as que hay Enlaces a referencias externas son proporcionados a lo largo de la libro. Ver "Qu Fueron dejados en la pgina xiv para algunas referencias generales para aquellos sin experiencia en programacin o electrnica. Si usted no tiene experiencia en programacin experiencia, tal vez usted tiene un gran idea para un proyecto interactivo pero no tiene la habilidades para desarrollarlo, este libro le ayudar a aprender lo que necesita saber para escribir cdigo que funcione, usando ejemplos que cubran ms de 200 tareas comunes. Si usted tiene alguna experiencia en programacin pero es nuevo en Arduino, el libro le ayudar a ser productivo rpidamente demostrando cmo implementar especficamente las capacidades de Arduino para su proyecto.

Prlogo xi

Personas que ya han usado Arduino deberan encontrar el contenido til para rpido aprendizaje de nuevas tcnicas, que son explicadas usando ejemplos prcticos. Este le ayudar a embarcarse en proyectos ms complejos mostrando cmo resolver problemas y utilizando capacidades que pueden ser nuevas para usted. Experimentados programadores en C / C + + pueden encontrar ejemplos de cmo a utilizar recursos de bajo nivel AVR (interruptores, temporizadores, I2C, Ethernet, etc) para construir aplicaciones que utilizan el entorno Arduino.

Estructura del libro


El libro contiene informacin que cubre el amplio alcance de las capacidades de Arduino, desde bsicos conceptos y tareas comunes, hasta tecnologa avanzada. Cada tcnica es explicada en una receta que muestra cmo implementar una capacidad especfica. Usted no necesitar a leer el contenido en secuencia. Donde una receta utiliza una tcnica cubierta en otra receta, el contenido en la otra receta hace referencia en lugar de repetir detalles en mltiples lugares. Captulo 1, Empezando, introduccin al entorno de Arduino y proporcionar ayuda en conseguir el entorno de desarrollo Arduino y hardware instalado y trabajando. El prximo par de captulos introduce al desarrollo de software Arduino. Captulo 2, Haciendo al Sketch realizar su orden, cubre conceptos y tareas esenciales de software, y el Captulo 3, Usando operadores Matemticos, muestra cmo a hacer uso de las ms comunes funciones matemticas. Captulo 4, Comunicaciones Serie, describe cmo a consigue Arduino a conectarse y comunicarse con su ordenador y otro dispositivos. Puerto Serie es el ms comn mtodo para entrada y salida de Arduino, y esta capacidad es usada en muchas de las recetas de todo el libro. Captulo 5, Entrada Digital y Analgica simple, introduce un alcance de bsico tcnicas para la lectura de seales digitales y analgicas. Captulo 6, Entradas desde Sensores, construye sobre esto con recetas que explican cmo a utilizar dispositivos que permiten a Arduino sentir el tacto, sonido, posicin, calor, y luz. Captulo 7, Salidas Visuales, acerca de controladores de luz. Recetas sobre conmutacin en uno o muchos LEDs y control de brillo y de color. Este captulo explica cmo usted puede controlar barras grficas y displays LED numricos, as como crear patrones y animaciones con matrices de LED. Adems, el captulo proporciona una introduccin general a salidas digitales y analgicas para aquellos que son nuevos en esto. Captulo 8, Salida fsica, explica cmo usted puede hacer mover cosas controlando motores con Arduino. El amplio alcance de tipos de motores es cubierta: solenoides, servo motores, DC motores, y motores paso.

Prlogo xii

Captulo 9, Salida de Audio, muestra cmo a generar sonido con Arduino a travs de un dispositivo de salida como un altavoz. Esto cubre reproduccin simple de tonos y melodas y reproduccin de archivos WAV y MIDI. Captulo 10, Controlando Remotamente Dispositivos Externos, describe tcnicas que pueden utilizarse para interactuar con casi cualquier dispositivo que usa alguna forma de control remoto, incluyendo TV, equipos de audio, cmaras, puertas de garaje, electrodomsticos, y juguetes. Esto se basa en tcnicas usadas en anteriores captulos para conectar Arduino a dispositivos y mdulos. Captulo 11, El uso de pantallas, acerca de interfaz de LCD de texto y grficos. El captulo muestra cmo usted puede conectar estos dispositivos para visualizacin de texto, desplazar o resaltar palabras, y crear smbolos y caracteres especiales. Captulo 12, Uso de Tiempo y Fechas, cubre la construccin en Arduino relacionado a funciones de tiempo e introduce muchas tcnicas adicionales para la manipulacin de tiempo de retrasos, medicin de tiempo, y tiempos y fechas en el mundo real. Captulo 13, Comunicacin mediante I2C y SPI, acerca de los estndares, Circuito Inter-Integrado (I2C) e Interfaz Serie Perifrica (SPI). Estos estndares proporcionan formas sencillas para informacin digital a ser transferido entre sensores y Arduino. Este captulo muestra cmo a utilizar I2C y SPI para conectar a dispositivos comunes. Esto tambin muestra cmo para conectar dos o ms placas Arduino, usando I2C para aplicaciones multi-placas. Captulo 14, Comunicacin Inalmbrica, Acerca de la comunicacin inalmbrica con XBee y otros mdulos inalmbricos. Este captulo proporciona ejemplos que van desde simple puerto serie de reemplazo inalmbrico a redes de malla conectando mltiples placas a mltiples sensores. Captulo 15, Ethernet y Networking, describe las muchas formas que usted puede utilizar Arduino con la Internet. Este tiene ejemplos que demuestran cmo a construir y utilizar clientes y servidores web y muestra cmo a utilizar la ms comn conexin comunicacin a protocolos de internet con Arduino. Las libreras de software Arduino son una forma estndar de aadir funcionalidad al Entorno de Arduino. Captulo 16, El uso, Modificacin, y Creacin Libreras, explica cmo utilizar y modificar libreras de software. Este tambin proporciona direccin en cmo a crear sus propias libreras. Captulo 17, Codificacin Avanzada y Manipulacin de Memoria, cubre tcnicas avanzadas de programacin, y la temas aqu son ms tcnicos que las otras recetas en este libro porque ellos cubren cosas que son generalmente ocultas por la amigable envoltura de Arduino. Las tcnicas en este captulo pueden ser usadas para hacer un Sketch ms eficiente, ello puede ayudar a mejorar rendimiento y reducir el tamao del cdigo de sus Sketches. Captulo 18, Uso del Controlador Chip Hardware, muestra cmo acceder y utilizar funciones de hardware que no son completamente expuestos a travs de la documentacin de lenguaje Arduino. Esto cubre uso de hardware de bajo nivel de entrada / salida de registros, temporizadores, e interruptores.

Prlogo xiii

Apndice A, Componentes Electrnicos, proporciona una visin de conjunto de los componentes utilizados a lo largo del libro. Apndice B, Uso Esquemticos, Diagramas y Hojas de Datos, explica cmo a utilizar diagramas esquemticos y hojas de datos. Apndice C, Construccin y Conexin del Circuito, proporciona un breve introduccin a utilizando un protoboard, conectando y uso fuentes de poder y bateras, y utilizando condensadores para desacoplamiento. Apndice D, Consejos en Solucin de problemas de Software, proporciona consejos en arreglo de problemas de compilacin y ejecucin. Apndice E, Consejos en Solucin de problemas de Hardware, incluye problemas con circuitos electrnicos. Apndice F, Pines Digitales y Analgicos, proporciona tablas indicando funcionalidad proporcionada por los pines en placas estndar de Arduino. Apndice G, ASCII y Ampliado Juegos de caracteres, proporciona tablas que muestra caracteres ASCII. Apndice H, Migracin a Arduino 1.0, explica cmo a modificar cdigo escrito para anteriores lanzamientos para ejecutar correctamente con Arduino 1.0.

Qu Fue Dejado Fuera


No hay lugar en este libro para incluir teora y prctica electrnica, aunque orientacin es proveda para construir circuitos usados en la recetas. Para ms detalle, Los lectores pueden querer a remitir a material que es extensamente disponible en la Internet o a libros tal como la siguiente: Make: Electronics Charles Platt (O'Reilly, bsquelo en oreilly.com) Getting Started in Electronics por Forrest M. Mims III (Master Publishing) Physical Computing por Dan O'Sullivan y Tom Igoe (Cengage) Prctical Electronics forInventors por Paul Scherz (McGraw-Hill)

Este libro explica cmo escribir cdigo para lograr tareas especficas, pero es no una introduccin a la programacin. Relevantes conceptos de programacin son brevemente explicados, pero hay insuficiente lugar para incluir detalles. Si usted desea aprender ms acerca de la programacin, usted puede querer a remitir a la Internet o a uno de la siguiente libros: Prctical C Programaming por Steve Oualline (O'Reilly; bsquelo en oreilly.com) A book on C por Al Kelley y Ira Pohl (Addison-Wesley)

Prlogo xiv

Mi favorito, aunque no realmente un libro para principiantes, es el libro que yo he usado para aprender Programacin C: The C Programming Languaje por Brian W. Kernighan y Dennis M. Ritchie (Prentice Hall)

Estilo de Cdigo (Acerca del Cdigo)


El cdigo usado a lo largo de este libro ha sido adaptado para ilustrar claramente el tema tratado en cada receta. Como una consecuencia, algunos atajos comunes de codificacin han sido evitados, particularmente en los primeros captulos. Programadores experimentados en C a menudo utilizan ricas, pero breve expresiones que son eficientes pero pueden ser un poco difcil comprender para principiantes. Por ejemplo, los primeros captulos incrementan variables usando expresiones explicitas que son fciles para no programadores, lase:
resultado = resultado + 1 / / incrementa el contador

Ms bien que la siguiente, comnmente usada por experimentados programadores, que hace lo mismo:
resultado + +; / / incrementa el uso del operador de incremento posterior

Sintase libre de sustituir su estilo preferido. Los principiantes deberan estar tranquilos ya que no hay beneficio en rendimiento o en tamao de cdigo usando la forma breve. Algunas expresiones de programacin son tan comunes que ellas son usadas en su forma breve. Por ejemplo, las expresiones de bucle son escritos de la siguiente manera:
for (int i = 0; i < 4; i++)

Este es equivalente a la siguiente:


int i; for (i = 0; i < 4; i = i+1)

Ver Captulo 2 para ms detalles en estas y otras expresiones usadas a lo largo del libro. Una buena prctica de programacin implica asegurar que valores usados son vlidos (Basura entra igual a basura sale) por revisin antes de usarlos en clculos. Sin embargo, para mantener el cdigo centrado en tema de la receta, muy poca comprobacin de errores cdigo ha sido incluida.

Plataforma Arduino Notas de la versin


Esta edicin ha sido actualizada para Arduino 1.0. Todo el cdigo ha sido probado con la ltima versin Arduino 1.0 (RC2). La descarga del cdigo para esta edicin ha sido actualizada en lnea si es necesario apoyo a la versin final 1.0, a fin de comprobar el libro del sitio web para conseguir el ms reciente cdigo. La descarga contiene un archivo llamado changelog.txt que indicar cdigo que ha sido cambiado desde la edicin publicada.

Prlogo xv

Aunque muchos de los Sketches ejecutar en las ms recientes versiones de Arduino, usted necesita cambiar la extensin desde .ino a .pde para cargar el Sketch en un pre-1.0 IDE. Si usted no ha migrado a Arduino 1.0 y tiene una buena razn para seguir con una versin anterior, usted puede utilizar el cdigo ejemplo en la primero edicin de este libro (Disponibles en http://shop.oreilly .com/product/9780596802486.do), que ha sido probado con versiones desde la 0018 a 0022. Tenga en cuenta que muchos recetas en la segunda edicin han sido mejoradas, as nosotros motivamos a usted a actualizarse a Arduino 1.0. Si usted necesita ayuda para migrar cdigo antiguo, vase el Apndice H. Hay tambin un enlace a erratas en ese sitio. Las erratas dan lectores una manera de hacernos saber acerca de los errores tipogrficos, errores, y otro problemas con el libro. Las erratas sern visibles en la pgina de inmediato, y vamos a confirmar ellas despus de revisarlas. O'Reilly puede tambin corregir erratas en futuras impresiones del libro y en Safari, haciendo para el lector una mejor experiencia rpidamente. Si usted tener problemas haciendo funcionar ejemplos, comprobar el archivo changelog.txt en la ltima descarga de cdigo a ver si el Sketch ha sido actualizado. Si eso no corrige el problema, consulte el Apndice D, el cual incluye la solucin de problemas de software. El foro Arduino es un buen lugar para publicar una pregunta si usted necesitar ms Ayuda: http://www.arduino.cc. Si le gusta o no le gusta este libro, por todo medios, por favor que la gente lo sepa. Las reseas de Amazon son una popular manera para compartir su felicidad u otros comentarios. Usted puede Tambin dejar comentarios en el sitio de O'Reilly para este libro libro.

Convenciones Usadas en Este Libro


Las siguientes convenciones son usadas en este libro: Cursiva Indica nombres de rutas, nombres de archivo, y nombres de programas; direcciones de internet, tal como Dominios y URL; y nuevo artculos donde ellos son definidos.
Constante ancho

Indica lneas de comando y Opciones que deberan ser mecanografiado textualmente; nombres y palabras clave en programas, incluyendo mtodo nombres, nombres de variable, y nombres de clases; y elemento y etiquetas HTML
Constante ancho audaz

Indica nfasis en lneas de cdigo en programas Constante ancho cursivo Indica texto que debera ser reemplazado con valores suministrados por el usuario.
Este icono significa un consejo, sugerencia, o nota general.

Prlogo xvi

Este icono indica una advertencia o precaucin.

Uso de Ejemplos de Cdigo


Este libro est aqu para ayudarle a hacer cosas con Arduino. En general, usted puede utilizar el cdigo en este libro en sus programas y documentacin. Usted no necesita a contactarnos para pedir permiso a menos que est reproduciendo una significativa porcin del cdigo. Por ejemplo, escribir un programa use varios trozos de cdigo desde este libro no requiere permiso. Vender o distribuir un CD-ROM de ejemplos de este libro requiere permiso. Contestar una pregunta citando este libro y citando ejemplo de cdigo hace no necesita permiso. La incorporacin de una significativa cantidad de ejemplo de cdigo de este libro en su del producto documentacin necesita permiso. Nosotros apreciamos, pero no requerimos, atribucin. Una atribucin en general incluye el ttulo, autor, editor, e ISBN. Por ejemplo: "Arduino Cookbook, Segunda Edicin, por Michael Margolis con Nick Weldin (O'Reilly). Derechos de autor 2012 Michael Margolis, Nicholas Weldin, 978-14493-1387-6. " Si usted siente su uso de ejemplos de cdigo cae fuera de su uso justo, o el permiso dado aqu, no dude en contactarnos en permissions@oreilly.com.

Safari Libros Online


Safari Libros Online es una biblioteca digital que le permite usted fcilmente buscar encima de 7500 referencias a libros de tecnologa y creatividad y Vdeos para encontrar la respuestas usted necesitar rpidamente. Con una suscripcin, usted puede leer cualquier pgina y ver cualquier vdeo desde nuestra biblioteca en lnea. Leer libros en su telfono celular y dispositivos mviles. Acceder a nuevos ttulos antes que ellos estn disponibles para imprimir y conseguir exclusivo acceso a manuscritos en desarrollo y publicar comentarios para los autores. Copiar y pegar muestras de cdigo, organizar sus favoritos, descargar captulos, marcar secciones de libros, crear notas, imprimir pginas, y beneficio de toneladas de otras caractersticas de ahorro de tiempo. O'Reilly Medios de comunicacin tiene subido este libro al servicio Safari Libros Online. Para tener completo acceso digital a este libro y otros en similares temas desde O'Reilly y otros publicadores, regstrese gratis en http://my.safaribooksonline.com.

Cmo contactarnos
Nosotros hemos probado y verificado la informacin en este libro a lo mejor de nuestra capacidad, pero puede encontrar que caractersticas han cambiado (O incluso que hemos hechos unos pocos errores).

Prlogo xvii

Por favor, hganos saber acerca de cualquier error que usted encuentre, como bien como sus sugerencias para futuras ediciones, por escrito a: O'Reilly Media, Inc. 1005 Gravenstein Carretera Norte Sebastopol, CA 95472 800-998-9938 (En Estados Unidos o Canad) 707-829-0515 (Internacional / local) 707-829-0104 (Fax) Nosotros tenemos una pgina web para este libro, donde enumeramos fe de erratas, ejemplos, y cualquier informacin adicional. Usted puede acceder a esta pgina en: http://shop.oreilly.com/product/0636920022244.do Para comentarios o preguntas tcnicas acerca de este libro, enviar email a: bookquestions@oreilly.com Para ms informacin acerca de nuestros libros, cursos, conferencias, y noticias, ver nuestro sitio web en http://www.oreilly.com. Encuntrenos en Facebook: http://facebook.com/oreilly Sganos en Twitter: http://twitter.com/oreillymedia Vanos en YouTube: http://www.youtube.com/oreillymedia

Agradecimientos
La contribucin de Mella Weldin fue invaluable para la terminacin de este libro. Este fue
90 por ciento escrito cuando Mella vino al consejo y sin su habilidad y entusiasmo, seguira siendo 90 por ciento escrito. Sus manos en la experiencia Arduino se ejecuta talleres para todos niveles de usuarios habilitados para hacer el asesoramiento en este libro prctico para nuestro amplio alcance de lectores. Gracias, Nick, por su conocimiento y genial, naturaleza colaborativa. Simon St. Laurent fue el editor en O'Reilly quien primero expres inters en este libro. Y en el final, l es el hombre que sac esto juntos. Su apoyo y estmulo nos mantuvo inspirados como nosotros tamizamos nuestro camino a travs de los volmenes de material necesario a hacer la materia justa. Brian Jepson me ayudo a comenzar con la escritura de este libro. Su vasto conocimiento de cosas Arduino y su preocupacin y experiencia para comunicar acerca de la tecnologa claro Ingls establece un alto estndar. l fue una mano rectora para la conformacin del libro y fabricacin de tecnologa fcilmente accesible para lectores. Nosotros tambin tenemos a Brian gracias por el contenido de XBee en el Captulo 14. Brian Jepson y Shawn Wallace fueron editores tcnicos para esta segunda edicin y proporcionaron excelente asesoramiento para mejorar la precisin y claridad del contenido.

Prlogo xviii

Audrey Doyle trabaj incansablemente para erradicar errores tipogrficos y gramticos en el manuscrito inicial y desenredar algunas de las ms complejas expresiones. Philip Lindsay colabor en contenido para el Captulo 15 en la primera edicin. Adrian McEwen, el principal desarrollador para muchas mejoras de la Ethernet mejoras en la versin 1.0, proporcion valioso asesoramiento para asegurar este Captulo reflej todos los cambios en esa versin. Mikal Hart escribi recetas sobre GPS y software serie. Mikal fue la eleccin natural para este no slo porque l escribi las libreras, sino tambin porque l es un comunicador con fluidez, un Arduino entusiasta, y gran colaborador. Arduino es posible por la creatividad del equipo de desarrollo del ncleo Arduino; Massimo Banzi, David Cuartielles, Tom Igoe, Gianluca Martino, y David Mellis. En nombre de todos los usuarios de Arduino, deseo expresar nuestro agradecimiento por sus esfuerzos en fabricar esta fascinante tecnologa simple y su generosidad en hacerlo gratis. Agradecimiento especial a Alexandra Deschamps-Sonsino, cuyos Tinker London workshops proporcionan importante comprensin a las necesidades de los usuarios. Gracias tambin a Peter Knight, que tiene previsto todo tipo de soluciones inteligentes Arduino como bien como la base de un nmero de recetas en este libro. En favor de todo el mundo que ha descargado las libreras contribuidas por usuarios Arduino, Me gustara agradecer a los autores quienes generosamente han compartido su conocimiento. La disponibilidad de un amplio alcance de hardware es un grande parte de lo que hace a Arduino emocionante, gracias a los proveedores por disponibilidad y soporte a un vasto alcance de grandes aparatos. Los siguientes fueron til en proporcionar hardware usado en el libro: SparkFun, Creador Shed, Gravitech, y NKC Electronics. Otros proveedores que han sido tiles incluyen Moderno Dispositivo, Liquidware, Adafruit, MakerBot Industries, Mindkits, Oomlout, y SK Pang. Nick le gustara agradecer a todo el mundo que estuvo involucrado con Tinker London, sobre todo a Alexandra, Peter, Brock Craft, Daniel Soltis y todas las personas quienes asistieron en talleres en los ltimos aos. Nick finalmente agradece a su familia, Jeanie, Emily, y Finn, quien estuvo de acuerdo en dejarle hacer esto en sus vacaciones de verano, y por supuesto, mucho despus de lo que ellos haban pensado, y a su padres, Franco y Eva, por llevarlo hasta a tomar cosas aparte. ltimo pero no menos, Yo expresar gracias a las siguientes personas: Joshua Noble por introducirme a O'Reilly. Su libro, Programming Interactivity, es altamente recomendado para aquellos interesados en ampliar su conocimiento en la computacin interactiva. Robert Lacy-Thompson por afrecer asesoramiento temprano con la primera edicin. Mark Margolis por su apoyo y ayuda como una caja de resonancia en la concepcin y desarrollo del libro.

Prlogo xix

Agradezco a mis padres por ayudarme a ver que las artes creativas y tecnologa no fueron distintas entidades y que, cuando combinada, ellas pueden conducir a extraordinarios resultados. Y finalmente, este libro no habra sido comenzado o terminado sin el apoyo de mi esposa, Brbara Faden. Mi agradecido reconocimiento para ella por mantenerme motivado y por su lectura cuidadosa y contribuciones para el manuscrito.

Notas en la Segunda Edicin


La segunda edicin de este libro ha seguido relativamente rpidamente desde la primera, impulsado por la version de Arduino 1.0. El propsito declarado de 1.0 es introducir un cambio significativo va a allanar el camino para futuras mejoras pero cambiando algunos cdigos escritos para software anterior. Estos han requerido cambios en cdigo en muchos de los captulos de este libro. Ms cambiado es el Captulo 15, Ethernet y Networking, y Captulo 13, Comunicacin Usando I2C y SPI, pero todo de las recetas en esta edicin ha sido migrado a 1.0, con muchas actualizaciones para utilizar caractersticas nuevas en esta versin. Si usted est utilizando una versin anterior a Arduino 1.0, entonces usted puede descargar cdigo de la primera edicin de este libro. Ver " Plataforma Arduino Notas de versin" en pgina xv para descargar detalles. Apndice H, Migracin a Arduino 1. 0, ha sido adicionado para describir los cambios introducidos por Arduino versin 1.0. Este describe cmo actualizar cdigo antiguo para utilizar con Arduino 1.0. Recetas para dispositivos que no son ms extensamente disponibles han sido actualizadas para utilizar reemplazos actuales y algunos nuevos sensores y dispositivos inalmbricos han sido aadidos. Erratas publicadas en el sitio de O'Reilly ha sido corregida, gracias a lectores que se han tomado tiempo para notificarnos de stas. Creemos que le gustarn las mejoras hechas en Arduino 1.0, as como las mejoras hechas para esta edicin de Arduino Cookbook. La primera edicin fue bien recibida; la crtica constructiva es dividida entre las personas que prefirieron ms contenido tcnico y aquellos que prefirieron menos. En un libro que nosotros limitado a slo 700 pginas (para mantener lo asequible y porttil), que parece indicar que el equilibrio adecuado ha sido alcanzado.

Prlogo xx

CAPTULO 1

Empezando

1.0 Introduccin
El entorno de Arduino ha sido diseado para ser de fcil uso para principiantes que no tienen experiencia en software o electrnica. Con Arduino, usted puede construir objetos que pueden responder a y/o controlar luz, sonido, tocar, y movimiento. Arduino ha sido usado para crear una asombrosa variedad de cosas, incluyendo instrumentos musicales, los robots, esculturas de luz, juegos, muebles interactivos, e incluso prendas de vestir interactivas.

Si usted no es un principiante, por favor sintase libre de adelantarse a recetas que le interesen.

Arduino es usado en muchos programas educativos en todo el mundo, particularmente por diseadores y artistas que quieren fcilmente crear prototipos pero hacer sin necesitar una profunda comprensin de los detalles tcnicos detrs sus creaciones. Porque este es diseado para ser utilizado por gente no tcnica, el software incluye muchos ejemplos de cdigo para demostrar cmo utilizar las varias facilidades de la tarjeta Arduino. Aunque este es fcil a utilizar, el hardware subyacente de Arduino trabaja al mismo nivel de sofisticacin que los ingenieros emplear para construir dispositivos embebidos. Personas que ya han con microcontroladores son tambin han sido atrado por Arduino por su gil capacidad de desarrollo y su facilidad para rpida implementacin de ideas. Arduino es mejor conocido por su de hardware, pero usted tambin necesita software para programar dicho hardware. Ambos el hardware y la software se llaman "Arduino". La combinacin le permite a usted crear proyectos que sienten y controlan el mundo fsico. El software es gratuito, de cdigo abierto, y multiplataforma. Las tarjetas son baratas, o usted puede construir su propia tarjeta (El diseo de hardware tambin es de cdigo abierto). Adems, hay es una activa comunidad Arduino como apoyo, esta accesible mundialmente a travs de los foros y wikis de Arduino (Conocido como la Zona de juegos Arduino). Los foros y las

wikis ofrecen ejemplos de proyectos en desarrollo y soluciones par problemas que pueden servir de inspiracin y asistencia sobre como usted realizar sus propios proyectos. Las recetas en este captulo comenzarn por explicar cmo instalar el entorno de desarrollo y cmo a compilar y ejecutar un ejemplo de Sketch.

El cdigo fuente en el que contiene las instrucciones para controlar Arduino funcionalmente es generalmente referido como un Sketch en la comunidad Arduino. La palabra Sketch ser usado a lo largo de este libro para remitir a un Programa de cdigo Arduino.

El Skecth Blink, que viene con Arduino, es usado como un ejemplo para recetas en este captulo, aunque la ltima receta en el captulo va adems por aadir sonido y rene entradas a travs de algunos hardware adicionales, no slo el parpadeo de la luz integrada en la tarjeta. El Captulo 2 incluye cmo estructurar un Sketch para Arduino y proporciona una introduccin a la programacin.

Si usted ya sabe las formas bsicas acerca de Arduino, sintase libre de saltarse hacia prximos captulos. Si es su primera vez usando Arduino, tenga paciencia en estas primeras recetas, tendr ms suaves resultados ms tarde.

Arduino Software
Programas, llamados Sketches, son creados en un ordenador usando el entorno integrado de desarrollo (IDE) Arduino. El IDE permite usted a escribir, editar cdigo y convertir este cdigo en instrucciones que el hardware Arduino entiende. El IDE tambin transfiere aquellas instrucciones a la tarjeta Arduino (Un proceso llamado carga).

Arduino Hardware
La tarjeta Arduino es donde el cdigo que usted escribe es ejecutado. La tarjeta puede slo controlar y responder a la electricidad, as componentes especficos son adjuntados para permitir interactuar con el mundo real. Estos componentes pueden ser sensores, que convierten algn aspecto del mundo fsico a electricidad as que la tarjeta puede sientir esto, o actuadores, que consiguen electricidad desde la tarjeta y la convierten que cambia el mundo fsico. Los ejemplos de sensores incluyen interruptores, acelermetros, y sensores ultrasnicos de distancia. Los actuadores son cosas como luces y LEDs, altavoces, motores, y pantallas. Hay una variedad de tarjetas oficiales que usted puede utilizar con el software Arduino y una amplia gama de tarjetas compatibles con Arduino producidas por miembros de la comunidad. Las tarjetas ms populares tienen conector USB que se utiliza para proporcionar potencia y conectividad para cargar su software en la tarjeta. La Figura 1-1 muestra una tarjeta bsica con la que inicia la mayora de personas, la Arduino Uno.

Figura 1-1. Tarjeta Bsica: Arduino Uno. Fotografa cortesa de todo.to.it.

Arduino Uno tiene un segundo microcontrolador a bordo para manejar toda la comunicacin USB; el pequeo chip montado en superficie (El ATmega8U2) es situado cerca del zcalo USB en la tarjeta. Este puede ser programado por separado para permitir a la tablero para aparecer como diferentes dispositivos USB (Vase Receta 18.14 para un ejemplo). La tarjeta Arduino Leonardo reemplaza los controladores ATmega8U2 y la ATmega328 con un solo chip ATMEGA32U4 que implementa el protocolo USB en software. Las tarjetas compatibles con Arduino Teensy y Teensy de PJRC ( http://www.pjrc.com/teensy/) tambin capaces de emular dispositivos USB. Tarjetas ms antiguas, y ms de las tarjetas compatibles con Arduino, utilizan un chip de la empresa FTDI que proporciona una solucin de hardware USB para conexin al puerto serial de su ordenador. Usted puede conseguir tarjetas tan pequeas como una estampilla, tal como la Arduino Mini y Pro Mini; las tarjetas ms grandes tienen ms opciones de conexin ms potentes procesadores, tal como la Arduino Mega; y tarjetas adaptadas para aplicaciones especficas, tal como la LilyPad para aplicaciones utilizables, la Fio proyectos inalmbricos, y la Arduino Pro para aplicaciones embebidas (Proyectos independientes que a menudo funcionan con bateras). Reciente adiciones al alcance incluiyen la Arduino ADK, que tiene un zcalo USB anfitrin sobre este y que es compatible con la Android Open Accessory Development Kit, el oficialmente aprobado mtodo de adjuncin de hardware para dispositivos Android. La tarjeta Leonardo usa un chip controlador (El ATMEGA32U4) que es capaz de presentarse a s mismo como varios dispositivos HID.

La tarjeta Ethernet incluye conectividad Ethernet, y tiene una opcin Power Over Ethernet, as es posible utilizar un solo cable para conectar y energizar la tarjeta. Otras tarjetas compatibles con Arduino tambin estn disponibles, incluyendo las siguientes:

Arduino Nano, una tarjeta diminuta con capacidad USB, de Gravitech ( http://store.grav itech.us/arna30wiatn.html) Bare Bones Board, una tarjeta de bajo costo disponible con o sin capacidad USB, de Modern Device ( http://www.moderndevice.com/products/bbb-kit) Boarduino, un tarjeta protoboard compatible de bajo costo b, de Adafruit Industrias ( http://www.adafruit.com/) Seeeduino, un flexible variacin de la tarjeta USB estndar, de Seeed Estudio Bazar ( http://www.seeedstudio.com/) Teensy y Teensy + +, tarjetas diminutas pero extremadamente verstiles, de PJRC (http://www.pjrc.com / teensy /) compatibles con Arduino est disponible en

Una lista de tarjetas http://www.freeduino.org/.

Vea tambin
Una visin de conjunto http://www.arduino.cc/en/Main/Hardware. de tarjetas Arduino:

Guas online para comenzar con Arduino estn disponible en http://arduino.cc/en/Gude/Windows para Windows, http://arduino.cc/en/Guide/MacOSX para Mac OS X, y http://www.arduino.cc/playground /Learning/Linux para Linux. Una lista de ms de cien tarjetas que pueden ser usadas con el Entorno de Desarrollo Arduino puede encontrarse en: http://jmsarduino.blogspot.com/2009/03/comprehensive-ardu inocompatible.html

1.1 Instalando el Entorno de Desarrollo Integrado (IDE)


Problema
Usted quiere instalar el Entorno de Desarrollo Arduino desarrollo en su ordenador.

Solucin
El software Arduino para Windows, Mac, y Linux puede ser descargado desde http:// arduino.cc /en/Main/Software. La descarga de Windows es un archivo ZIP. Descomprimir el archivo para cualquier conveniente el directorio Archivos de programa/Arduino es un lugar sensato.

El software gratuito para descomprimir archivos, llamado 7-Zip, puede ser descargado desde http://www.7-zip.org/.

Descomprimir el archivo creara una carpeta llamada Arduino-00<nn> (Donde <nn> es el nmero de versin de Arduino que usted descarg). El directorio contiene el archivo ejecutable (Llamado Arduino.exe), a lado de varios otros archivos y carpetas. Haga doble clic en el archivo Arduino.exe y la pantalla de inicio debera aparecer (Vase Figura 1-2), seguido por la ventana principal del programa (Vase la figura 1-3). Sea paciente, esto puede tomar algn tiempo para cargar el software.

Figura 1-2. pantalla de inicio de Arduino (Versin 1.0 en Windows 7)

La descarga de Arduino para Mac es una imagen de disco (. DMG); haga doble clic en el archivo cuando la descarga est completa. La imagen ser montada (esta aparecer como una tarjeta de memoria en el escritorio).

Figura 1-3. Ventana principal de Arduino (Arduino 1.0 en una Mac)

Dentro de la imagen de disco est la aplicacin Arduino. Copia este a alguna parte conveniente la carpeta Aplicaciones es un lugar sensato. Haga doble clic en la aplicacin una vez que usted lo haya copiado (No es una buena idea ejecutarlo desde la imagen de disco). La pantalla de inicio aparecer, seguido por la ventana principal del programa. La instalacin en Linux vara dependientemente de la Linux distribucin que usted est utilizando. Ver la wiki de Arduino para informacin (http://www.arduino.cc/playground /Learning/Linux). Para permitir al Entorno de Desarrollo Arduino comunicarse con la tarjeta, usted necesita instalar controladores (drivers). En Windows, utilizar el cable USB para conectar su PC y la tarjeta Arduino y esperar a que aparezca el asistente de Nuevo Hardware encontrado. Si usted est usando una tarjeta Uno, dejar al asistente intentar encontrar e instalar los drivers. Puede fallar hacer esto (No se preocupe, este es el comportamiento esperado). Para arreglar esto ahora necesita ir a Men Inicio Panel de control Administrador de dispositivos

En la lista que se visualiza encontrar la entrada Puertos (COM y LPT) llamado Arduino UNO (COM nn). nn ser el nmero que Windows ha asignado al puerto creado para la tarjeta. Usted ver un junto a este un logo de advertencia porque los drivers apropiados no han sido an asignados. Haga clic en la entrada y seleccione Actualizar Software de controlador. Elegir la opcion "Buscar software de controlador en el equipo", y navegar a la carpeta Drivers dentro la carpeta Arduino ha sido descomprimida. Seleccionar el archivo ArduinoUNO.inf y Windows debera entonces completar la instalacin proceso. Si usted est usando una tarjeta anterior (Cualquier tarjeta que use drivers FTDI) con Vista o Windows 7 y est en lnea, usted puede dejar al asistente buscar los drivers y estos se instalarn automticamente. En Windows XP (O si usted no tiene acceso a Internet), que debe especificar la ubicacin de los drivers. Usar el selector de archivos para navegar al directorio FTDI Controladores USB, situado en la directorio donde usted descomprimido los archivos de Arduino. Cuando este controlador est instalado, el asistente de Nuevo Hardware Encontrado aparecer de nuevo, diciendo un nuevo serial puerto ha sido encontrado. Seguir el mismo proceso como antes.

Es importante que usted siga a la secuencia de pasos para instalar los controladores dos veces, o el software no ser capaz de comunicarse con la tarjeta.

En Mac, las ms recientes tarjetas Arduino, tal como la Uno, pueden ser usadas sin controladores adicionales. Cundo usted conecte la tarjeta una notificacin se abrir hasta decir un nuevo puerto de red ha sido encontrado, usted puede rechazar esto. Si usted est usando tarjetas anteriores (Las tarjetas que necesitan drivers FTDI), usted necesitar instalar controladores (Drivers). Hay un paquete llamado FTDIUSBSerialDriver, con un rango de nmeros despus, dentro de la imagen de disco. Haga doble clic en este y el instalador empezar el proceso. Usted necesitar saber la contrasea del Administrador para completar el proceso. En Linux, muchas distribuciones tienen el controlador ya instalado, pero sega el Enlace de Linux dado en este captulo de introduccin para informacin especfico de su distribucin.

Discusin
Si el software falla para empezar, comprobar la seccin de solucin de problemas en el sitio web Arduino, http://arduino.cc/en/Guide/Troubleshooting, para ayudar la resolucin problemas de instalacin.

Vea tambin
Guas online para empezar con Arduino disponibles en http://arduino.cc/en/Guide/Windows para Windows, http://arduino.cc/en/Guide/MacOSX para Mac OS X, y http://www.arduino.cc/playground /Learning/Linux para Linux.

1.2 Inicializando Arduino


Problema

la

tarjeta

Usted quiere encender una nueva tarjeta y verificar que est trabajando.

Solucin
Conecte la tarjeta en un puerto USB en su ordenador y compruebe que el LED verde indicador de alimentacin en la tarjeta se enciende. Tarjetas Arduino estndar (Uno, Duemilanove, y Mega) tienen un LED verde de indicador de alimentacin situado cerca del botn de reseteo. Un LED naranja cerca del centro de la tarjeta (Con la etiqueta "Pin 13 LED " en Figura 1-4) debe parpadear cuando la tarjeta es encendida (Las tarjetas vienen precargadas de fbrica con software para parpadear el LED como una simple revisin de funcionamiento de la tarjeta).

Figura 1-4. Bsico Arduino bordo (Duemilanove y Uno)

Nuevas tarjetas tal como Leonardo tienen los LEDs situados cerca del conector USB; vase la figura 1-5. Recientes tarjetas tienen pines duplicados para utilizar con I2C (Marcada SCL y SDA). Estas tarjetas tambin tienen un pin marcado IOREF que puede utilizarse para determinar el voltaje de funcionamiento del chip.

Figura 1-5. Tarjeta Leonardo Las ms recientes tarjetas tienen tres conexiones adicionales en el nuevo estndar para disposicin de conectores en la tarjeta. Este no afecta la utilizacin de antiguos shields (todos continuarn trabajando con las nuevas tarjetas, slo como lo hicieron en tarjetas anteriores). Las nuevas conexiones proporcionan un pin (IOREF) para shields que detectan la referencia analgica de voltaje (por lo que valores analgicos de entrada pueden ser calibrados a la fuente de voltaje), pines SCL y SDA para permitir una conexin consistente para dispositivos I2C (La ubicacin de los Pines I2C han diferido en anteriores tarjetas debido a diferentes configuraciones de chip). Los Shields diseados para las nuevas disposiciones deberan trabajar en cualquier tarjeta que use las nuevas localizaciones de pines. Un pin adicional (Al lado del Pin IOREF) es no es usado al momento, pero permite nueva funcionalidad para ser implementado en el futuro sin necesidad de cambiar la disposicin de pin de nuevo.

Discusin
Si el LED de encendido no ilumina cuando la tarjeta es conectada a su ordenador, la tarjeta probablemente no est recibiendo energa. El LED intermitente (Conectado a la salida digital pin 13) es controlada por cdigo de ejecutado en la tarjeta (Nuevas tarjetas tienen precargado el Sketch de ejemplo Blink). Si el LED pin 13 parpadea, el Sketch se est ejecutando correctamente, lo que significa que la tarjeta est funcionando. Si el LED verde de encendido est funcionando pero el LED pin 13 no est parpadeando, puede ser que el codigo de fabrica no est en el chip; siga las instrucciones en la Receta 1.3 para cargar el Sketch Blink sobre en la tarjeta para verificar que la tarjeta est funcionando. Si no est usando una tarjeta estndar, esta puede no tener un incorporado LED pin 13, revise la documentacin para detalles de su tarjeta. La tarjeta Leonardo desvanece el LED de arriba a abajo (Esto se ve como si el LED estuviera "Respirando") para mostrar que la tarjeta esta funcionando.

Vea tambin
Guas online para empezar con Arduino disponibles en http://arduino.cc/en/Guide/Windows para Windows, http://arduino.cc/en/Guide/MacOSX para Mac OS X, y http://www.arduino.cc /playground/Learning/Linux para Linux. La gua de solucin de problemas puede encontrarse en http://arduino.cc/en/Guide /Troubleshooting.

1.3 Uso del Entorno de Desarrollo Integrado (IDE) para Preparar un Sketch Arduino
Problema
Usted quiere a conseguir un Sketch y prepararlo para cargarlo a la tarjeta.

Solucin
Use el IDE Arduino para crear, abrir, y modificar Sketches que definen que har la tarjeta. Usted puede utilizar los botones en la parte superior del IDE para realizar estas acciones (Se muestra en la Figura 1-6), o usted puede utilizar los mens o atajos de teclado (Mostrado en Figura 1-7). El rea de edicin de Sketches es usted visualiza y edita un cdigo para un Sketch. Este soporta claves comunes de edicin de texto tal como Ctrl-F ( + F en Mac) para buscar, Ctrl-Z ( + Z en Mac) para deshacer, Ctrl-C ( + C en un Mac) para copiar texto seleccionado, y Ctrl-V ( + V en un Mac) para pegar texto seleccionado La Figura 1-7 muestra cmo cargar el Sketch Blink (El Sketch que viene precargado en una tarjeta Arduino nueva). Despus que haya iniciado el IDE, ir a la Archivo Ejemplos seleccionar 01. Basics Blink, como se muestra en la Figura 1 - 7. La cdigo para parpadeo la incorporado LED voluntad ser desplegado en la Dibujo Editor ventana (Consulte a Figura 1-6). Antes que el cdigo puede ser enviado a la tarjeta, este necesita ser convertido en instrucciones que puedan ser ledas y ejecutadas por el chip controlador de Arduino; esto es llamado compilar. Para hacer esto, clic el botn compilar (El botn en la parte superior izquierda con un visto en su interior), o seleccionar Sketch Verificar/Compilar (Ctrl-R; + R en Mac). Usted debera ver un mensaje que dice "Compilando el Sketch..." y una barra de progreso en el area de mensaje debajo del rea de edicin de texto. Despus de un segundo o dos, aparecer un mensaje que dice "Compilacin terminada". El rea negra de consola contendr el siguiente mensaje:
Tamao binario del Sketch: 1026 bytes (de un mximo de 32.256 bytes)

10

El mensaje exacto puede ser distinto dependiente en su tarjeta y versin de Arduino; este que le dice el tamao del Sketch y el mximo tamao que su tarjeta puede aceptar.

Figura 1-6. IDE Arduino

Discusin
El cdigo fuente para Arduino es llamado un Sketch. El proceso que toma un Sketch y lo convierte en una forma que puede trabajar en la tarjeta es llamado compilacin. El IDE usos un nmero de herramientas de lneas de comandos detrs de escenas para compilar un Sketch. Para ms informacin sobre esto, ver la Receta 17.1. El mensaje final dicindole el tamao del Sketch indica cuanto espacio es necesario para almacenar las instrucciones del programa en la tarjeta. Si el tamao del Sketch compilado es mayor que el disponible en la memoria de la tarjeta, el siguiente mensaje de error se visualiza:

11

Figura 1-7. Men del IDE (Seleccionando el Sketch de ejemplo Blink)


Sketch demasiado grande; ver http://www.arduino.cc/en/Guide/Troubleshooting#size para obtener consejos sobre su reduccin.

Si esto sucede, usted necesita a hacer su Sketch ms pequeo poderlo cargar en la tarjeta, o conseguir una tarjeta con mayor capacidad. Si hay errores en el cdigo, el compilador imprimir uno o ms mensajes de error en la ventana de consola. Estos mensajes pueden ayudar a identificar el error ver Apndice D sobre consejos para la solucin de problemas de software.

Para evitar sobrescribir accidentalmente los ejemplos, el IDE Arduino no permitir guardar los cambios a los ejemplos de Sketches proporcionados. Usted necesita renombrarlos usando la opcin Guardar Como en el men. Usted puede guardar Sketches que haya escrito usted mismo con el botn Guardar (Vase Receta 1,5).

Como usted desarrolla y modifica un Sketch, usted debera tambin considerar usar la opcin en el men Archivo Guardar Como y usar un nombre diferente o nmero de versin regularmente as que como implementa cada poco, usted puede ir regresando a una versin anterior si usted lo necesita.

12

Cdigo subido sobre la bordo no puede descargarse espalda sobre su ordenador. Hacer seguro usted guardar el boceto cdigo en su ordenador. No se puede guardar cambios espalda a la ejemplo archivos; usted necesitar a utilizar Guardar Como y dar la cambiado expediente otro nombrar.

Vea tambin
Receta 1.5 espectculos un ejemplo dibujar. Apndice D tiene consejos en la solucin de problemas de software.

1.4 Cargar y Ejecutar el Sketch Blink


Problema
Usted quiere a transferir su Sketch compilado a la tarjeta Arduino y verlo funcionar.

Solucin
Conectar su tarjeta Arduino a su ordenador usando el cable USB. Cargar el Sketch Blink en el IDE como est descrito en la Receta 1.3. Siguiente, seleccionar Herramientas Tarjeta desde el men desplegable y seleccionar la nombre de la tarjeta que usted ha conectado (Si esta es la tarjeta estndar Uno, es probablemente que sea la primera tarjeta en la lista). Ahora seleccionar Herramientas puerto Serial. Usted conseguir una lista desplegable lista de puertos serial disponible en su ordenador. Cada mquina tendr una diferente combinacin de puertos serial, dependiente de los otros dispositivos usted haya usado con su ordenador. En Windows, ellos sern enumerados como entradas COM. Si hay una sola entrada, seleccione esa. Si hay mltiples entradas, su tarjeta probablemente sea la ltima entrada. En Mac, su

tarjeta ser enumerado dos veces si esta es una tarjeta Uno:

/dev/tty.usbmodem-XXXXXXX /dev/cu.usbmodem-XXXXXXX

Si usted tener un ms viejo bordo, lo ser enumerado como de la siguiente manera:


/dev/tty.usbserial-XXXXXXX /dev/cu.usbserial-XXXXXXX

Cada placa tendr diferentes valores para XXXXXXX. Seleccione cualquiera de las dos entradas. Clic en el botn cargar (En Figura 1-6, es el segundo botn desde la izquierda), o elegir Archivo Cargar usando Programador (Ctrl-U, + U en Mac). El software compilar el cdigo, como en la Receta 1. 3. Despus el software es compilado, y este es subido a la tarjeta. Si usted mira su tarjeta, usted ver el LED dejar de parpadear y dos luces (Etiquetados como LEDs Seriales en la Figura 1 - 4) justo debajo previamente el LED

13

de parpadeo debera parpadear por un par de segundos mientras se carga el cdigo. La luz original debera entonces comenzar a parpadear intermitentemente nuevamente como el cdigo se ejecute.

Discusin
Para el IDE a enviar el cdigo compilado a la tarjeta, la tarjeta necesita ser conectada al ordenador, y usted necesita decirle al IDE que tarjeta y puerto serial est utilizando. Cuando una carga inicia, cualquier Sketch ejecutado en la tarjeta es detenido (Si usted ejecutaba el Sketch Blink, el LED dejar de parpadear). El nuevo Sketch es subido a la tarjeta, sustituyendo al Sketch anterior. El nuevo Sketch comenzar a funcionar cuando la carga haya sido completada exitosamente.

Antiguas tarjetas Arduino y algunas compatibles hacer no interrumpen automticamente el Sketch en funcionamiento al iniciar la carga. En este caso, necesitar presionar el botn Reset en la tarjeta slo despus de esto el software informa que se ha compilado (Cuando usted ve el mensaje acerca del tamao del Sketch). Esto puede tomar unos pocos intentos para conseguir la sincronizacin correcta entre el fin de la compilacin y el presionado del botn Reset.

El IDE visualizar un mensaje de error si la carga no es exitosa. Los problemas son generalmente debido a la equivocada seleccin de tarjetas o puerto serial, o la tarjeta no est conectada. La tarjeta y puerto serie seleccionados actualmente son desplegados en la barra de estado en la parte inferior de la ventana de Arduino. Si usted tiene problemas identificando el correcto puerto en Windows, intente desconectando la tarjeta y entonces seleccione Herramientas Puerto Serial para ver que puerto puerto no se visualizacin en la lista. Otro enfoque es a seleccionar los puertos, uno por uno, hasta que usted vea parpadear las luces en la tarjeta parpadeo para indicar que el cdigo est cargando.

Vea tambin
La pgina de solucin de problemas Arduino: http://www.arduino.cc/en/Guide/Troubleshooting.

1.5 Creando y Guardando un Sketch


Problema
Usted quiere a crear un Sketch y guardarlo en su ordenador.

Solucin
Para abrir un editor para un nuevo Sketch, ejecutar el IDE (Vase la Receta 1.3), ir al men Archivo, y seleccionar Nuevo. Pegue el siguiente cdigo en el editor de Sketch (Es similar al Sketch Blink, pero los parpadeos son dos veces ms largos):

14

const int ledPin = 13 // LED conectado al pin digital 13 void setup () { pinMode (ledPin, OUTPUT); // habilitar salida en ledPin } void loop () { digitalWrite (ledPin, HIGH); // cambia el LED a encendido delay (2000); // esperar durante dos segundos digitalWrite (ledPin, LOW); / / cambia el LED a apagado delay (2000); // esperar durante dos segundos }

Compilar el cdigo haciendo clic al botn compilar (el botn en la parte superior izquierda botn con un visto en el interior), o seleccionar Sketch Verificar / Compilar (Vase Receta 1.3). Cargar el cdigo haciendo clic en el botn cargar, o elegir Archivo Cargar usando programador (vase Receta 1.4). Despus de cargar, el LED deber parpadear cada dos segundos. Usted puede guardar este dibujo a su ordenador haciendo clic en el botn Guardar, o seleccionar Archivo Guardar. Usted puede guardar el Sketch usando un nuevo seleccionando la opcin Guardar Como. Un cuadro de dialogo se abrir donde usted podr ingresar el nombre del archivo.

Discusin
Cuando usted guarda un archivo en el IDE, un cuadro de dilogo estndar del operativo sistema se abrir. Este sugiere guardar el Sketch en una carpeta llamada Arduino en su carpeta Mis Documentos (O su carpeta Documentos en Mac). Usted puede reemplazar el nombre por defecto del Sketch con un nombre que refleja el propsito de su Sketch. Hacer clic en Guardar para guardar el archivo.

El nombre por defecto es la palabra Sketch seguido por la fecha actual. Secuenciales letras comenzando desde la a son usadas para distinguir Sketches creados el mismo da. Sustituir el nombre por defecto por algo significativo le ayuda a usted a identificar el propsito de un Sketch cuando usted vuelva a usarlo nuevamente.

Si usted utiliza caracteres que el IDE no permite (Por ejemplo, la carcter espacio), el IDE automticamente reemplaza estos con caracteres vlidos. Los Sketches de Arduino son guardados como archivos de texto con la extensin .ino. Versiones de los IDE usaban la extensin .pde extensin, tambin usada por Processing. Estas son automticamente guardadas en una carpeta con el mismo nombre del Sketch.

15

Usted puede guardar sus Sketches en cualquier carpeta en su ordenador, pero si usted utiliza la carpeta predeterminada (La carpeta Arduino en su carpeta Documentos) sus Sketches aparecern automticamente en el men del software Arduino y ser fcil de localizar.

Si usted tiene editado uno de los ejemplos de la descarga de Arduino, no podr guardar los cambios expediente usando el mismo nombre del archivo. Esto preserva los ejemplos estndar intactos. Si usted quiere guardar un ejemplo modificado, usted necesitar seleccionar otra ubicacin para el Sketch.

Despus que usted haya hecho cambios, ver un cuadro de dilogo preguntando si usted quiere guardar el Sketch cuando un Sketch es cerrado.

El smbolo siguiendo el nombre del Sketch en la barra superior de la Ventana del IDE indica que el cdigo del Sketch tiene cambios que todava no han sido guardados en el ordenador. Este smbolo es eliminado cuando usted guarda el Sketch.

El software Arduino no proporciona cualquier tipo de versin de control, de modo que si usted quiere ser capaz de revertir a versiones anteriores de un Sketch, usted puede utilizar Guardar Como regularmente y dar a cada revisin del Sketch un nombre ligeramente diferente. Frecuentemente compilar cuando usted modifica o aade cdigo es un buen camino para comprobar para errores cuando usted escribe su cdigo. Este har fcil encontrar y corregir cualquier error porque estos generalmente estarn asociados con lo que usted haya escrito.

Una vez que un Sketch ha sido subido a la tarjeta no hay forma de descargarlo de regreso a su ordenador. Asegrese de guardar cualquier cambio que desee mantener en sus Sketches.

Si usted prueba y guarda un Sketch en una carpeta que no est con el mismo nombre del Sketch, el IDE le informar que este no puede ser abierto como est y sugerir hacer clic para crear una carpeta para el Sketch con el mismo nombre.

Los Sketches pueden ser encontrados en una carpeta con el mismo nombre del Sketch. El IDE crear la carpeta automticamente cuando guarde un nuevo Sketch. Los Sketches hechos con versiones anteriores del software Arduino tienen una extensin de archivo diferente (.pde). El IDE los abrir, cuando usted guarde el Sketch crear un archivo con la nueva extensin (.ino). El Cdigo escrito para las primeras versiones del IDE puede no ser capaz de compilarse en la versin 1.0. Ms de los cambios para conseguir el funcionamiento del cdigo antiguo es fcil de hacer. Ver Apndice H para ms detalles.

16

Vea tambin
El cdigo en esta receta y a lo largo de este libro utiliza la expresin const int para proporcionar nombres significativos (LedPin) para constantes en lugar de nmeros (13). Ver Receta 17.5 para ms sobre el uso de constantes.

1.6 Usando Arduino


Problema
Usted quiere a empezar con un proyecto que es fcil de construir y divertido para usar.

Solucin
Esta receta proporciona una muestra de algunas de las tcnicas que son detalladas en captulos posteriores. La dibujo esta basado en el cdigo de parpadeo de LED de la receta anterior, pero en lugar de utilizar un retraso fijado, la velocidad es determinado por un sensor sensible a la luz llamado Resistor Dependiente de Luz o LDR (ver Receta 6.2). Conectar el LDR como se muestra en la Figura 1-8.

Figura 1-8. Arduino con Resistor Dependiente de Luz (LDR)

Si no est familiarizado con la construccin de un circuito a partir un esquemtico, vase el Apndice B para ilustraciones paso a paso sobre cmo a hacer este circuito en una protoboard.

17

El siguiente Sketch lee el nivel de luz de un LDR conectado al pin analgico 0. El nivel de luz nivel captado por el LDR cambiar la velocidad de parpadeo del LED conectado al pin 13:
const int ledPin = 13 // LED conectado al pin digital 13 const int sensorPin = 0; 0 // conectar el sensor a la entrada analgica

void setup () { pinMode (ledPin, OUTPUT); }

// habilitar la salida en ledPin

void loop () { int velocidad = analogRead(sensorPin); // leer la entrada analgica digitalWrite (ledPin, HIGH); // cambiar el LED a encendido delay (velocidad); // esperar con una duracion dependiente del nivel de luz digitalWrite (ledPin, LOW); // cambiar el LED a apagado delay (velocidad); }

Discusin
El valor del resistor de 4.7K no es crtico. Cualquiera desde 1K a 10K puede ser utilizado. La nivel de luz en el LDR cambiar el nivel de voltaje en el pin analgico 0. La comando analogRead (Vase Captulo 6) proporciona un valor que va desde alrededor de 200 cuando la LDR est oscurecido a 800 cuando lo esta muy iluminado. Este valor determina los tiempos de duracin del encendido y apagado del LED, as el tiempo de parpadeo aumenta la intensidad de la luz. Usted puede escalar la velocidad de parpadeo velocidad usando la funcin map de Arduino de la siguiente manera:

const int ledPin = 13 // LED conectado al pin digital 13 const int sensorPin = 0; // conectar el sensor a la entrada analgica 0 // Las siguientes dos lneas marcan el mnimo y mximo retardo entre parpadeos const int minDuration = 100 // espera minima entre parpadeos const int maxDuration = 1000 // espera mxima entre parpadeos

void setup () { pinMode (ledPin, OUTPUT); // habilitar la salida en ledPin } void loop () { int velocidad = analogRead (sensorPin); // leer la entrada analgica // La lnea siguiente escala la frecuencia de parpadeo entre los valores mnimos y mximos velocidad = map (velocidad, 200,800, minDuration, maxDuration) // convertir a velocidad de parpadeo velocidad = constrain (velocidad, minDuration, maxDuration) // restringir el valor

18

digitalWrite (ledPin, HIGH); // cambia el LED a encendido delay (velocidad); // espera cuya duracin depende del nivel de luz digitalWrite (ledPin, LOW); // cambia el LED a apagado retardo (tasa); }

La Receta 5.7 proporciona ms detalles sobre el uso la funcin map para escalar valores. La Receta 3.5 tiene detalles sobre uso de la funcin constrain para asegurar que valores no excedan un rango dado. Si usted quiere a ver el valor de la variable velocidad en su ordenador, usted puede imprimir esto en el Monitor Serial Arduino como se muestra en el revisado cdigo de bucle cdigo a continuacin. El Sketch visualizar la velocidad de parpadeo el Monitor Serial. Abra abra la Ventana del Monitor Serial en el IDE Arduino haciendo clic en el icono en la parte superior derecha de la barra (Vase el captulo 4 para ms sobre el uso del Monitor Serial):

const int ledPin = 13 // LED conectado al pin digital 13 const int sensorPin = 0; // conectar el sensor a la entrada analgica 0 // Las siguientes dos lneas marcan el retardo minimo y mximo entre parpadeos const int minDuration = 100 // espera minima entre parpadeos const int maxDuration = 1000 // espera mxima entre parpadeos

void setup () { pinMode (ledPin, OUTPUT); // habilitar la salida en ledPin Serial.begin (9600); // inicializa el serial } void loop () { int velocidad= analogRead (sensorPin); // leer la entrada analgica // La siguiente lnea escala la frecuencia de parpadeo entre los valores mnimos y mximos velocidad = map (velocidad, 200800, minDuration, maxDuration) // convertir a velocidad de parpadeo velocidad = constrain (velocidad, minDuration, maxDuration); // restringir el valor Serial.println (velocidad); // imprimir velocidad al monitor serie digitalWrite (ledPin, HIGH); // cambia el LED a encendido delay (velocidad); // espera cuya de duracin depende del nivel de luz digitalWrite (ledPin, LOW); // cambia el LED a apagado delay (velocidad); }

Usted puede utilizar el LDR para control el tono de un sonido conectando un pequeo altavoz al pin, como muestra en Figura 1-9.

19

Figura 1-9. Conexiones para un altavoz con el circuito del LDR

Usted necesitar para aumentar la velocidad de encendido / apagado en el pin una frecuencia en el espectro de audio. Este es conseguido, como se muestra en la siguiente cdigo, por las decrecientes duraciones mnima y mxima:
const int OutputPin = 9; // altavoz conectado al pin digital 9

const int sensorPin = 0; // conectar el sensor a la entrada analgica 0 const int minDuration = 1 // 1 ms encendido, 1 ms apagado (500 Hz) const int maxDuration = 10 // 10 ms encendido, 10 ms apagado (50 Hz) void setup () { pinMode (OutputPin, OUTPUT); }

// habilitar la salida en OutputPin

void loop () { int sensorReading = analogRead (sensorPin) // leer el analgico de la tasa de entrada int velocidad = map (sensorReading, 200800, minDuration, maxDuration); velocidad = constrain (tasa, minDuration, maxDuration) // restringir el valor digitalWrite (OutputPin, HIGH); // cambia el LED a encendido delay (velocidad); // espera cuya duracin depende del nivel de luz digitalWrite (OutputPin, LOW); // cambia el LED a apagado delay (velocidad); }

20

Ver Tambin
Ver Receta 3.5 para detalles sobre el uso de la funcin constrain. Ver Receta 5.7 para una discusin sobre la funcin map. Si usted est interesado en la creacin de sonidos, ver el Captulo 9 para una completa discusin sobre salida de audio con Arduino.

21

CAPTULO 2

Haciendo al Sketch realizar su orden

2.0 Introduccin
Aunque mucho de un proyecto Arduino proyecto involucrar la integracin de la tarjeta Arduino con el soporte de hardware, usted necesitara ser capaz de decirle a la tarjeta qu a har con el resto de su proyecto. Este captulo introduce esenciales elementos de programacin Arduino, muestra a los no programadores cmo utilizar comunes construcciones del lenguaje, y proporciona una visin general de la sintaxis para lectores que no estn familiarizados con C o C + +, el lenguaje que utiliza Arduino. Ya que hacer ejemplos interesantes requiere hacer que Arduino realice algo, las recetas utilizan capacidades fsicas de la tarjeta que son detallados en prximos captulos. Si cualquier cdigo en este captulo no est claro, sintase libre adelantarse, particularmente al Captulo 4 para ms sobre salida serial y el Captulo 5 para ms sobre uso de pines digitales y analgicos. Usted no necesita entender todo el cdigo en los ejemplos, sin embargo, ve cmo funcionan capacidades especficas que son enfocadas en las recetas. Aqu hay algunas de las funciones ms comunes, usadas en los ejemplos que son incluidos en los prximos captulos:
Serial.println(valor);

Imprime el valor al Monitor Serial del IDE Arduino as usted podr ver la Salida de Arduino en su computador; ver la Receta 4.1.
pinMode(pin, mode);

Configura un pin digital para leer (INPUT) o escribir (OUTPUT) un valor digital; ver la introduccin en el Captulo 5.
digitalRead(pin);

Lee un valor digital (HIGH o LOW) en un pin para establecerlo como entrada; ver la Receta 5.1.
digitalWrite(pin, valor);

Escribe un valor digital (HIGH o LOW) en un pin para establecerlo como salida; ver la Receta 5.1.

22

2.1 Estructurando un Programa Arduino


Problema
Usted es nuevo en programacin y quiere entender la construccin de un Programa de Arduino.

Solucin
Programas para Arduino son en generalmente llamados Sketches; los primeros usuarios eran artistas y diseadores y los Sketches reflejan la forma rpida y fcil para realizar una idea. Los trminos Sketches y programa son intercambiables. Los Sketches contienen el cdigo que tiene las instrucciones que la tarjeta llevar a cabo. El Cdigo que necesita ejecutar slo una vez (como configurar la placa para su aplicacin) necesita ser colocado en la funcin setup. El cdigo a ser ejecutar continuamente despus de la configuracin ir en la funcin loop. Aqu un tpico Sketch:
const int ledPin = 13; // LED conectado al pin digital 13

// El mtodo setup () se ejecuta una vez, cuando el Sketch se inicia void setup () { pinMode (ledPin, OUTPUT); // inicializa el pin digital como salida } // El mtodo loop () se ejecuta una y otra vez, void loop () { digitalWrite (ledPin, HIGH); // encender el LED delay (1000); // esperar un segundo digitalWrite (ledPin, LOW); // apagar el LED delay (1000); // esperar un segundo }

Cuando el IDE de Arduino IDE termina de cargar el cdigo, y cada vez que usted potencie la tarjeta despus de haber subido este cdigo, este iniciar y llevara a cabo las instrucciones secuencialmente. Ete ejecuta el cdigo una vez en setup y entonces va a travs del cdigo en loop. Cuando llega al final del loop (Marcada por la llave cerrada, }) este regresa al comienzo del loop.

Discusin
Este ejemplo continuamente parpadea un LED por escritura de salidas HIGH y LOW en un pin. Ver el Captulo 5 para aprender ms acerca del uso de los pines de Arduino. Cuando el Sketch comienza, el cdigo en setup configura el modo del pin (lo que permite iluminar un LED). Despus que el cdigo en setup es completado, el cdigo en loop es repetidamente llamado (para parpadear el LED) siempre y cuando la tarjeta Arduino este potenciada.

23

Usted no necesita saber esto para escribir Sketches Arduino, pero programadores con experiencia en C y C+ + pueden preguntarse a donde se ha ido la esperada funcin main(). Est ah, pero est oculta bajo la cubierta del Entorno de Arduino. El proceso de construccin de crea un archivo intermedio que incluye el cdigo del Sketch y las siguientes declaraciones adicionales:
int main (void) { init (); setup (); for (; ;) loop (); return 0; }

La primera cosa que sucede es una llamada a una funcin init() que inicializa el Hardware Arduino. Siguiente, la funcin setup() de su Sketch es llamada. Finalmente, la funcin loop() es llamado una y una vez. Porque el ciclo for nunca termina, la sentencia return es ejecutada.

Ver Tambin
La Receta 1.4 explica cmo Cargar un Sketch a la tarjeta Arduino. El Captulo 17 y http://www.arduino.cc/en/Hacking/BuildProcess ms informacin sobre el proceso de construccin.

2.2 Uso de Tipos Primitivos Simples (Variables)


Problema
Arduino tiene diferente tipos de variables para representar valores eficientemente. Usted quiere saber cmo seleccionar y utilizar estos tipos de datos de Arduino.

Solucin
Aunque el tipo de dato int (Abreviatura de nmero entero, un valor de 16 bits en Arduino) es la ms comn eleccin para los valores numricos que se encuentran en las aplicaciones de Arduino, usted puede utilizar la Tabla 2-1 para determinar los tipos de datos que espera que encajen en su aplicacin.

24

Tabla 2-1. Tipos de datos Arduino Tipos Numricos


int unsigned int long Unsigned long float double boolean char byte char, falso float verdadero double float int.

Bytes Rango

Uso

Otros tipos
String void

Uso
Representa cadenas de chars (Caracteres) normalmente se utiliza para contener texto Slo se utiliza en las declaraciones de funciones donde no se devuelve ningn valor.

Discusin
Excepto en situaciones donde mximo rendimiento o eficiente memoria son requeridos, variables declaradas usando int sern adecuadas para valores numrico si los valores hacer no exceden su alcance (Mostrado en la primera fila en Tabla 2-1) y si usted no necesita a trabajar con valores fraccionarios. Muchos de los ejemplos oficiales de Arduino declaran variables numricas como int. Pero a veces usted necesitara elegir un tipo que especficamente se ajuste a su aplicacin. A veces usted necesita nmeros negativos y a veces no, por lo que los tipos numricos vienen en dos versiones: signed y unsigned. Valores unsigned son siempre positivos. Variables sin la palabra clave unsigned son signed as que ellos pueden representar valores negativos y positivos. Uno razn para utilizar valores unsigned es cuando la gama de valores signed no encajarn en el rango de la variable (Una variable unsigned tiene dos veces la capacidad que una variable signed). Otra razn por la que los programadores eligen utilizar tipos unsigned es a claramente indicar a las personas que el cdigo esperado nunca ser un nmero negativo. Los tipos boolean tienen dos posibles valores: true o false. Estos son comnmente usados en revisin del estado de un interruptor (Si es pulsado o no). Usted puede tambin utilizar HIGH y LOW como equivalentes a true y false donde este tiene ms sentido; digitalWritte(pin, HIGH)forma es una ms expresiva de encender un LED que digitalWrite(pin, true) o digitalWrite(pin, 1), aunque todo de estos son tratados idnticamente cuando el Sketch es ejecutado, dibujo en realidad carreras, y probablemente vienen todas estas formas de cdigo publicados en la web.

25

Vea tambin
La referencia de Arduino en http://www.arduino.cc/en/Reference/HomePage proporciona detalles sobre tipos de datos.

2.3 Usando Nmeros de Punto Flotante


Problema
Los nmeros de punto flotante son usados para valores expresados con punto decimal (Esta es la forma para representar valores fraccionarios). Usted quiere calcular y comparar estos valores en su Sketch.

Solucin
El siguiente cdigo muestra cmo a declarar variables de punto flotante, ilustrando problemas que puedan encontrarse comparaciones de valores de punto flotante, y demuestra cmo superarlos:

/* * Ejemplo de punto flotante * Este Sketch inicializa un valor flotante a 1,1 * Se reduce varias veces el valor de 0,1 hasta que el valor sea 0 * /

float valor = 1,1; void setup () { Serial.begin (9600); } void loop () { valor = valor - 0.1 / / reducir el valor de 0,1 en cada iteracin del loop if (valor == 0) Serial.println ("El valor es exactamente cero"); else if (almostEqual(valor, 0)) { Serial.print ("El valor"); Serial.print (valor, 7); // para imprimir 7 lugares decimales Serial.println ("es casi igual a cero"); } else Serial.println(valor); delay (100);

26

} // Devuelve un valor true si la diferencia entre a // Cambia el valor de DELTA a la diferencia mxima igualad booleana almostEqual(float a, float b) { float const DELTA = .0001 / / m{axima diferencia igual if (a == 0) return fabs(b) <= DELTA; if (b == 0) return fabs(a) <= DELTA; returns fabs((a - b) / max(fabs(a), fabs(b))) <= } y b es pequea considerada para ser

para ser casi casi

DELTA;

Discusin
Las matemticas de punto flotante no son exactas, y los valores devueltos pueden tener un pequeo error de aproximacin. El error ocurre porque el valor de punto flotante incluye un amplio rango, as la representacin interna de la valor puede slo mantener una aproximacin. Por esto, usted necesita probar si los valores estn dentro de un rango de tolerancia e lugar de una igualdad exacta. La salida del Monitor Serial manera: de este Sketch es de la siguiente

1.00 0.90 0,80 0,70 0,60 0,50 0.40 0,30 0.20 0.10 El valor -0.0000001 es casi igual a cero -0.10 -0.20

La salida contina produce nmeros negativos. Usted puede imprimir el cdigo "La valor es exactamente cero " despus valor es 0.1 y luego 0.1 es restado desde esto. Pero valor nunca es exactamente igual cero; es muy cercano, pero no es suficientemente bueno para pasar la prueba: if (valor == 0). Esto es porque la memoria eficiente de solo puede almacenar una aproximacin de los nmeros de punto flotante que puede contener el enorme rango de valores que puede representar. La solucin para este es comprobar si una variable es cercana al valor deseado, como se muestra en este receta. La funcin almostEqual prueba si la variable valor est dentro del objetivo deseado 0.00001 y retorna true si es as. El rango aceptable es configurado con la constante DELTA, usted puede cambiar sta a menores o mayores valores como lo requiera. La funcin llamada fabs (Abreviatura de floating-point absolute value) retorna el valor absoluto de una variable de punto flotante y esta es usado para probar la diferencia entre los parmetros dados.

27

El punto flotante aproxima nmeros porque este slo usa 32 bits para sostener todos los valores dentro de un enorme rango. Ocho bits son usados para el multiplicador decimal (El exponente), y que deja 24 bits para el signo y el valor solo suficiente para siete dgitos decimales significativos. Aunque las funciones float y double son exactamente lo mismo en Arduino, doubles s tienen un mayor precisin en muchos otras plataformas. Si usted est importando cdigo que usa float y doble desde otra plataforma, comprobar que hay suficiente precisin para su aplicacin.

Vea tambin
La referencia de Arduino para float: http://www.arduino.cc/en/Reference/Float.

2.4 Trabajando con Grupos de Valores


Problema
Usted quiere a crear y utilizar un grupo de valores (Llamados Arrays). Los arrays pueden ser una simple lista o estos pueden tener dos o ms dimensiones. Usted quiere saber cmo determinar el tamao del array y cmo a acceder a los elementos en el array.

Solucin
Este Sketch crea dos arrays: un array de enteros para pines conectado a interruptores y un array de pines conectados a LEDs, como se muestra en la Figura 2-1:
/ * Sketch array un array de interruptores controla un array de LEDs vase el Captulo 5 para ms informacin sobre el uso de los interruptores vase el Captulo 7 para obtener informacin sobre los LED * / int inputPins [] = {2,3,4,5} interruptor int ledPins [] = {10,11,12,13}; // crea un array de pines de salida para LED void setup () { for(int index = 0; index <4; index + +) { pinMode(ledPins [index], OUTPUT); // declara LED como salida pinMode (inputPins [index], INPUT); // declara los interruptores como entrada digitalWrite (inputPins [index], HIGH); // permite levantar las resistencias // (Ver la receta de 5.2) } } // crear un array de pines para entradas de

28

void loop () { for(int index = 0; index <4; index + +) { int val = digitalRead (inputPins [indice]); // lee el valor de entrada if (val == LOW) // Comprobar si se pulsa el interruptor { digitalWrite(ledPins [index], HIGH); // enciende el LED si se pulsa el interruptor } else { digitalWrite(ledPins [index], LOW); // apaga el LED } } }

Figura 2-1. Conexiones para LEDs e interruptores

29

Discusin
Los Arrays son colecciones de variables consecutivas del mismo tipo. Cada variable en la coleccin es llamada un elemento. El nmero de elementos es llamado la tamao del array. La Solucin demuestra un uso comn de arrays en cdigo Arduino: almacenando una coleccin de pines. Aqu los pines conectan a interruptores y LEDs (Un tema cubierto en ms detalle en el Captulo 5). La parte importante de este ejemplo es la declaracin del array y el acceso a los elementos del array. La siguiente lnea de cdigo declara (Crea) un array de enteros con cuatro elementos e inicializa cada elemento. El primero elemento es igual a 2, el segundo a 3, y as en:
int inputPins [] = {2,3,4,5};

Si usted no inicializa valores cuando declara un array (Por ejemplo, cuando los valores slo estn disponibles cuando el Sketch se est ejecutando), usted necesita cambiar cada elemento individualmente. Usted puede declarar el array de la siguiente manera:
int inputPins [4];

Este declara un array de cuatro elementos con el valor inicial de cada elemento establecido a cero. El nmero dentro de los corchetes ([]) es el tamao, y este fija el nmero de los elementos. Este array tiene un tamao de cuatro y puede contener, a lo ms, cuatro valores enteros. El tamao puede ser omitido si el array declarado contiene inicializadores (Como se muestra en el primero ejemplo) porque la compilador hace al array tan grande como se cuente el nmero de inicializadores. El primer elemento de la coleccin es elemento [0]:
int FirstElement = inputPins [0]; / / esta es el primer elemento inputPins[0] = 2; // establece el valor de este elemento igual a 2

El ltimo elemento es uno menor que el tamao, as en la anterior ejemplo, con un tamao de cuatro, el ltimo elemento es 3:
int lastElement = inputPins [3]; // este es el ltimo elemento

Puede parecer extrao que un array con un tamao de cuatro tiene el ltimo elemento accedido usando array[3], pero porque el primero elemento es array [0], los cuatro elementos son:
inputPins[0], inputPins[1], inputPins[2], inputPins[3]

En la anterior Sketch, los cuatro elementos son accedidos usando un ciclo for:
for(int index = 0; index <4; index++) { // Obtener el nmero de pin accediendo a cada elemento del array de pines pinMode (ledPins [ndice], OUTPUT); // declara LED como salida pinMode (inputPins [ndice], INPUT); // declara pulsador como entrada }

Este bucle pasar a travs de la variable index con valores comenzando en 0 y finalizando en 3. Es un error comn error acceder a un elemento que est ms all del tamao actual del array.

30

Este es un error que puede tener muchos sntomas diferentes y debe tener cuidado tomado a evitarlo. Una forma de mantener sus bucles bajo control es establecer el tamao de una matriz por usando constantes de la siguiente manera:
const int PIN_COUNT = 4; // define una constante para el nmero de elementos int inputPins [PIN_COUNT] = {2,3,4,5}; for (int index = 0; index <PIN_COUNT; index++) pinMode (inputPins[index], INPUT);

La compilador no informar un error si usted accidentalmente intentar almacenar o leer ms all del tamao del array. Usted necesita ser cuidadoso ya que usted slo a los elemntos que estn dentro los lmites que ha establecido. Usar una constante para establecer el tamao de un array y en cdigo referente a sus elementos ayuda a su cdigo a permanecer dentro los lmites del array.

Otro uso de los arrays es mantener una cadena de caracteres de texto. En cdigo Arduino, estos se llaman character Strings (Strings para abreviaturas).Una cadena de carcter consiste de uno o ms caracteres, seguido por carcter nulo (El valor 0) a indicar el final de la cadena.

El caracter nulo en el final de una cadena de caracteres no es lo mismo que el caracter 0. El nulo tiene un valor ASCII de 0, mientras 0 tiene un valor ASCII de 48.

Los mtodos para utilizar Strings estn incluidos en las Recetas 2.5 y 2.6.

Vea tambin
Receta 5,2; Receta 7.1

2.5 Usando la Funcionalidad String de Arduino


Problema
Usted quiere manipular texto. Usted necesitar copiar este, aadir bits juntos, y determinar la nmero de caracteres.

Solucin
La receta anterior menciona sobre cmo los arrays de caracteres pueden ser usados para almacenar texto: estos arrays de caracteres son en generalmente llamados Strings. Arduino tiene una capacidad llamada String que aade una rica funcionalidad para almacenar y manipular texto.

31

La palabra String con una S mayscula se refiere a la capacidad de texto proporcionada por la librera String de Arduin. La palabra String con un s en minsculas se refiere al grupo de caracteres en lugar de la Funcionalidad String de Arduino.

Esta receta demuestra cmo utilizar Strings Arduino.


La capacidad String fue introducida en la versin 0019 alfa (anterior a 1.0) de Arduino. Si ests utilizando versin ms vieja, usted puede utilizar la libreria Text-String; ver el enlace al final de esta receta.

Cargar el siguiente Sketch en su tarjeta, y abra el Monitor Serial para visualizar los resultados:
/* Sketch Basic_Strings */ String text1= "Esta cadena"; Cadena texto2 = "tiene ms texto"; Text3 String; // que se asignar en el Sketch void setup () { Serial.begin (9600); Serial.print(texto1); Serial.print("es de"); Serial.print(text1.length ()); Serial.println("Caracteres de largo."); Serial.print("texto2 es"); Serial.print(text2.length ()); Serial.println("caracteres de largo"); texto1.concat(texto2); Serial.println("Texto1 contiene ahora:"); Serial.println(texto1); } void loop () { }

Discusin
Este Sketch crea tres variables de tipo String, llamado texto1, texto2, y texto3. Variables de tipo String tienen incorporadas capacidades para manipular texto. La declaracin texto1.length () retorna (Proporciona el valor de) la longitud (Nmero de caracteres) en la cadena texto1.

32

texto1.concat (texto2) combina el contenido de los strings; en este caso, anexa el contenido de texto2 al final de texto1 (Concat es abreviatura para concatenar).

El Monitor Serial mostrar lo siguiente:


Esta cadena es de 11 caracteres de largo. texto2 es de 14 caracteres de largo. texto1 ahora contiene: Esta cadena tiene ms texto

Otro camino para combinar strings es utilizar el string operador de suma. Aadir estas dos lneas al final del cdigo setup:
texto3 = texto1 + "y ms"; Serial.println(text3);

El nuevo cdigo resultar en el Monitor Serial aadiendo la siguiente lnea a la final de la pantalla:
Se trata de una cadena con ms texto y ms

Usted puede utilizar las funciones indexOf y lastIndexOf para encontrar una instancia de un carcter particular en un string.
Porque la clase String es una reciente adicin a Arduino, que se encontrar una gran cantidad de cdigo que utiliza arrays de caracteres en lugar de tipo string. Ver la Receta 2.6 para ms sobre uso de arrays de caracteres sin la ayuda de la funcionalidad String de Arduino.

Si usted ver una lnea como la siguiente:


char oldString[] = "Este es un array de caracteres";

el cdigo utiliza array de caracteres estilo C (Vase la Receta 2. 6). Si la declaracin se ve de esta manera:
String newString = "esto es un objeto String";

la cdigo usa Strings Arduino. Para convertir array de caracteres estilo C coleccin a un String Arduino, slo asignar el contenido del array al objeto String:
char oldString[] = "Quiero este array de caracteres en un objeto String"; String newString = oldString;

Para utilizar cualquiera de las funciones listadas en la Tabla 2-2, usted necesita invocarlas en un objeto string existente, como en este ejemplo:
int len = myString.Length();

33

Tabla 2-2. Breve visin de conjunto de funciones String de Arduino


charAt(n) compareTo(S2) concat(S2) endsWith(S2) equals(S2) equalsIgnoreCase(S2) getBytes(buffer,len) indexOf(S) lastIndexOf(S) length() replace(A,B) setCharAt(indice,c) startsWith(S2) substring(indice) substring(indice,a) toCharArray(buffer,len) toInt() toLowerCase() toUpperCase() trim() Retorna el n-simo caracter del string Compara el String al String dado S2 Retorna un nuevo String que es la combinacin del String y S2 Retorna true si el String termina con los caracteres S2 Retorna true si el String es exactamente S2 (maysculas y minusculas) Lo mismo que equals pero sin coincidir maysculas y minsculas Copia tamao de caracteres en el suministrado byte buffer Retorna el ndice del String (o caracter)suminitrado o 1 si no es encontrado Lo mismo que indexOf inicia desde el final del String Retorna el nmero de caracteres en el String Reemplaza todas las instancia del String (o carcter) A con las de B Almacena el carcter c en el String en el ndice dado Retorna true si el String inicia con los caracteres S2 Retorna un String con los caracteres a partir del indice hasta el final del string Como el anterior, pero el substring termina en la ubicacin del carcter antes de a Copia hasta len los caracteres al buffer suministrado Retorna el valor entero de los dgitos numricos en el String Retorna un String con todos los caracteres convertidos a minsculas Retorna un String con todos los caracteres convertidos a maysculas Retorna un String con todos los espacios en blanco removidos

Ver las pginas de referencia Arduino para ms acerca del uso y variantes para estas funciones.

Eligiendo entre Strings Arduino y array de caracteres C


Los tipos de datos String incorporados en Arduino son ms fciles de utilizar que los array de caracteres C, pero este se consigue a travs del cdigo complejo en la librera String, que exige mas en su Arduino, y es, por la naturaleza, ms propenso a problemas. Los tipos de datos String son tan flexibles porque hacen uso de la asignacin de memoria dinmica. Que es, cuando usted crear o modificar un Cadena, Arduino requiere una nuevo regin de memoria de la librera C, y cuando ya est uso un String, Arduino necesidades a liberacin esa memoria. Esta generalmente trabaja sin problemas, pero en la prctica hay muchas grietas a travs de las cuales puede fugarse memoria. Los errores en la librera String pueden resultar en que alguna o toda la memoria no sea devuelta adecuadamente. Cuando este sucede, la memoria disponible en Arduino disminuir lentamente (Hasta que reinicie el Arduino). E incluso si no hubo fugas de memoria, es complicado a escribir cdigo para comprobar si una solicitud de String ha fracasado debido a la insuficiente memoria (Las funciones String imitan aquello en Processing, pero a diferencia de esa plataforma, Arduino no tiene excepcin de ejecucin de errores).

34

Quedarse sin memoria dinmica es un error que puede ser muy difcil de localizar porque el Sketch puede ejecutar sin problemas por das o semanas antes que inicie el mal comportamiento a travs de la memoria insuficiente. Si usted utiliza el array de caracteres C, usted est en el control del uso memoria: est asignando una cantidad fija (Esttica) de memoria al momento de compilar as usted no conseguir fugas de memoria. Su Sketch Arduino tendr la mismo cantidad de memoria disponible en todo tiempo que se est ejecutando. Y si usted hacer intenta asignar ms memoria que la disponible, encontrar la causa es fcil porque hay herramientas que le dirn cuanta memoria esttico a usted tiene asignada (Vase la referencia para avr-objdump en la Receta 17.1). Sin embargo, con array de caracteres C, es fcil para usted tener otro problema: C No le impide la modificacin de memoria ms all de los lmites del array. As si asigna un array como myString[4], y asigna myString[4] = 'A' (Recuerde, myString[3] es el final del array), nada le impedir hacer esto. Pero quin sabe qu pieza de memoria se refiere a myString[4]? Y quin sabe si la asignacin de 'A' a la posicin de memoria le causar un problema? Ms probable, har que el Sketch se porte mal. As, la librera String incorporada en Arduino, por virtud del uso de memoria dinmica, corre el riesgo de consumir su memoria disponible. El array de caracteres C exige cuidado epara asegurar que usted no exceda los lmites de los arrays que utilice. Utilizar la librera String incorporada en Arduino si usted necesita capacidad de manejo de texto enriquecido y usted no podr crear y modificar Strings una y otra vez. Si usted necesita crear y modificar estas en un bucle que es constantemente repetido, es mejor asignar asignacin un grande array de caracteres C y la escribir su cdigo cuidadosamente as usted no escribira sobrepasando los lmites de ese array. Otro instancia donde usted puede preferir array de caracteres C sobre Strings Arduino es en grandes Sketches necesitar ms de la RAM o flash disponible. El cdigo ejemplo String Toint usa casi 2 KB ms flash que su equivalente cdigo usando un array de caracteres C y atoi a convertir a un int. La versin String Arduino tambin requiere un poco ms de RAM para contener informacin asignada en adicin al String actual. Si usted hacer sospecha que la librera String, o cualquier otra libreria que hace uso de la memoria dinmica asignada, est fugando memoria, usted puede determinar cuanta memoria esta libre en cualquier tiempo dado; ver la Receta 17.2. Comprobar la cantidad de RAM cuando su Sketch inicie, y monitoree esto para ver si est decreciendo a lo largo del tiempo. Si usted sospecha de un problema con la librera String, busque la lista de errores abiertos (http://code.google.com/p/arduino/issues/lista) para "String".

Vea tambin
La distribucin Arduino proporciona ejemplos String de Sketches (Archivo Ejemplos Strings). La pgina de referencia para String puede ser encontrada en http://arduino.cc/en/Reference /StringObject.

35

Tutoriales para la nueva librera String estn disponibles en http://arduino.cc/en/Tutorial/HomePage y un tutorial para la librera original (Slo necesaria si usted est utilizando una versin de Arduino ms antigua que 0019 alfa) est disponible en http://www.arduino.cc/en/Tutorial/ TextString.

2.6 Usando Caracter String C


Problema
Usted quiere a entender el uso de caracteres String: usted quiere saber cmo crear un String, encontrar su longitud, comparar, y copiar, o anexar strings. La ncleo de lenguaje C lenguaje hace no es compatible con la capacidad String de Arduino, por lo que usted querr entender el cdigo de otras plataformas, escrito para funcionar con primitivos arrays de caracteres.

Solucin
Los arrays de caracteres son a veces llamados character strings (O simplemente strings para abreviar). La Receta 2.4 describe los Arrays de Arduino en en general. Esta receta describe funciones que operan sobre cadenas de caracteres. Usted declara strings como este:
Char stringA[8]; // declarar una cadena de hasta 7 caracteres ms la terminacin nula Char stringB[8] = "Arduino" // como el anterior e inicializa el string a "Arduino" char stringC[16] = "Arduino" // como el anterior, pero la cadena tiene espacio para crecer Char stringD[] = "Arduino" // el compilador inicializa y calcula el tamao del string

Use strlen (abreviatura para string length) para determinar el nmero de caracteres antes de la terminacin nula:
int length = strlen(string); // retorna el nmero de caracteres en el string

length ser 0 para stringA y 7 para los otros strings mostrados en el cdigo anterior. El nulo

que indica el final del cadena no es contado por strlen. Use strcpy (abreviatura para string copy) para copiar una cadena a otra:
strcpy (destino, origen); // copiar cadena de origen a la de destino

Use strncpy para limitar el nmero de caractaress a copiar (til para evitar escribir ms caracteres que el string destino puede contener). Usted puede ver este uso en la Receta 2.7:
// Copiar hasta 6 caracteres del origen al destino strncpy(destino, origen, 6);

Use strcat (Abreviatura para string concatenate) a anexar un string al final de otro:
// Anexar el string de origen al final del string de destino strcat (destino, origen);

36

Asegurese siempre que haya suficiente espacio en el destino cuando copia o concatena strings. No olvide permitir espacio para la terminacin nula.

Use strcmp (abreviatura para string compare) para comparar dos cadenas. Usted puede ver este uso en la Receta 2.7:
if(strcmp(str, "Arduino") == 0) // Hacer algo si la variable str es igual a "Arduino"

Discusin
El texto representado en el Entorno de Arduino usando un array de caracteres son llamados strings. Un string se compone de un nmero de caracteres seguido por un nulo (el valor 0). El nula no es visible, pero es necesario para indicar el final del string al software.

Vea tambin
Vea una de las muchas referencia en lnea sobre C/C + + en pginas, tal como http://www.cplusplus.com/ Referencia / clibrary / cstring / y http://www.cppreference.com/wiki/string/c/start.

2.7 Dividiendo Grupos de Texto Separados por comas


Problema
Usted tiene un string que contiene dos o ms piezas de datos separadas por comas (O cualquier otro separador). Usted quiere a divisin el string de manera usted pueda utilizar cada parte individual.

Solucin
Este Sketch impresiones el texto encontrado entre cada coma:
/ * * * * Sketch SplitSplit Divide una string separado por comas /

String texto = "Peter, Paul, Mary" // una string de ejemplo String mensaje = texto; // mantiene el texto an no dividido int commaPosition; // la posicin de la siguiente coma en la cadena void setup () { Serial.begin (9600); Serial.println (mensaje); // mostrar el string de origen {

37

commaPosition = mensaje.indexOf (','); si (commaPosition!= -1) { Serial.println (mensaje.substring (0, commaPosition)); mensaje = mensaje.substring (commaPosition 1, mensaje.length ()); } else { //Aqu despus de encontrar la ltima coma if(mensaje.length ()> 0) Serial.println (mensaje); // si hay un texto despus de la ltima coma, // Imprimir este } } while(commaPosition> = 0); } void loop () { }

El Monitor Serial mostrar lo siguiente:


Peter, Paul, Mary Peter Paul Mary

Discusin
Este Sketch usa funciones String para extraer texto de entre las comas. La siguiente cdigo:
commaPosition = message.indexOf (',');

establece la variable commaPosition a la posicin de la primero coma en el String llamado mensaje (este ser establecido a -1 si no encuentra comas). Si hay una coma, la funcin substring es usada para imprimir el texto desde el comienzo del cadena hasta a, pero excluyendo la coma. El texto que fue impreso, y su seguida coma, son eliminado del mensaje en esta linea:
mensaje = mensaje.substring (commaPosition 1, mensaje.length ());

substring retorna una cadena comenzando desde commaPosition+1 (La posicin justo despus de

la primera coma) hasta a la longitud de la mensaje. Este resultados en que el mensaje que contiene slo el texto despus de la primera coma. Esto se repite hasta que no encuentre ms comas (commaPosition ser igual a -1). Si usted es un programador experimentado, usted tambin podr utilizar funciones de bajo nivel que son parte de la librera estndar C. La siguiente Sketch tiene similar funcionalidad a el anterior uno usando strings Arduino:
/ * * * * Sketch SplitSplit Divide una cadena separada por comas /

38

const int MAX_STRING_LEN = 20

// establesca esto al string ms grande // que procesar

char StringList [] = "Peter, Paul, Mary" // un string de ejemplo char StringBuffer [MAX_STRING_LEN 1]; // un buffer esttico para el clculo y la salida void setup () { Serial.begin (9600); } void loop () { char * str; char * p; strncpy(StringBuffer, StringList, MAX_STRING_LEN) //copiar cadena de origen Serial.println(StringBuffer) //mostrar la cadena de origen for(str = strtok_r (StringBuffer, ",", &p); // dividir usando comas str; //Bucle while str no es nulo str = strtok_r (NULL,",", &p) //obtener los siguientes smbolos ) { Serial.println (str); } delay (5000); }

La funcionalidad esencial viene de la funcin llamada strtok_r (La nombre de la versin de strtok que viene con el compilador Arduino). La primera vez que usted llama a strtok_r, usted pasar el string que desee a simbolizar (Separar en valores individuales).Pero strtok_r sobrescribe los caracteres en este string cada vez que ste encuentre una nueva muestra, por lo que es mejor pasar una copia del string como se muestra en este ejemplo. Cada llamada que sigue utiliza un NULL para decir a la funcin que debera moverse al prximo smbolo. En este ejemplo, cada uno simblo es impreso al puerto serial. Si su smbolos constan slo de nmeros, ver la Receta 4.5. Este muestras cmo extraer valores numricos separados por comas en una corriente serie de caracteres.

Vea tambin
Ver http://www.nongnu.org/avr-libc/user-manual/group avr string.html para ms sobre funciones string C tales como strtok_r y strcmp. La Receta 2,5; en lnea se referencias a las funciones strtok_r y strcmp en C / C + +.

39

2.8 Convirtiendo un Nmero a un String


Problema
Usted necesita convertir un nmero a un string, quizs para mostrar el nmero en un LCD u otra pantalla.

Solucin
La variable String convertir nmeros a cadenas de caracteres automticamente. Usted puede utilizar valores literales, o el contenido de una variable. Por ejemplo, la siguiente cdigo funcionar:
String myNumber = 1234;

Al igual que este:


int valor = 127; Cadena myReadout = "La lectura fue"; myReadout.concat(valor);

O este:
int valor = 127; String myReadout = "La lectura fue"; myReadout + = valor;

Discusin
Si usted est convirtiendo un nmero a texto para visualizarlo en un LCD o dispositivo serial, la solucin ms simple es a utilizar la capacidad de conversin incluida en las bibliotecas LCD y Serial (Ver la receta 4,2). Pero quizs usted est usando un dispositivo que no tiene este soporte incorporado (vase el Captulo 13) o usted quiere manipular el nmero como un string en su Sketch. La clase String de Arduino automticamente convierte valores numricos cuando estos han sido firmados como una variable string. Usted puede combinar(Concatenar) valores numricos al final de un string usando la funcin concat o el string y el operador +.
La operador + es usado con tipos numricos as como strings, pero este se comportar diferentemente con cada uno.

La siguiente cdigo resultada en un numero teniendo un valor de 13:


int numero = 12; numero + = 1;

Con un String, como muestra aqu:


String textNumber = "12"; textNumber + = 1;

40

textNumber es la cadena de texto "121".

Anterior a la introduccin de la clase String, era comn encontrar cdigo Arduino usando la funcin itoa o ltoa. La nombres vienen de "Entero para ASCII " (Itoa) y "largo para ASCII " (l). La versin String descrita anteriormente es fcil de utilizar, pero la siguiente puede ser usada si usted prefiere trabajar con array de caracteres C como se describe en la Receta 2.6.
itoa o ltoa toman tres Parmetros: el valor a convertir, el buffer que mantendr el string de

salida, y la base numrica (10 para nmeros decimales, 16 para hexadecimales, y 2 para binarios). La siguiente Sketch ilustra cmo a convertir valores numricos usando ltoa:
/ * * NumberToString * Crea una string de un nmero dado * / void setup () { Serial.begin (9600); } char buffer[12]; // tipo de datos long tienen 11 caracteres (incluyendo el // el signo menos) y un terminador nulo void loop () { Long valor = 12345; ltoa (valor, buffer, 10); Serial.print (valor); Serial.print ("tiene"); Serial.print (strlen (buffer)); Serial.println ("dgitos"), valor = 123456789; ltoa (valor, buffer, 10); Serial.print(valor); Serial.print("tiene"); Serial.print(strlen (buffer)); Serial.println("dgitos"); delay (1000); }

Su buffer necesita ser suficientemente grande para mantener el mximo nmero de caracteres en el string. 16 bits para nmeros enteros de base 10 (Decimal), esos son siete caracteres (Cinco dgitos, un posible signo menos, y un terminacin 0 que siempre significa el final de un string); Enteros largos necesitan 32 bits para 12 caracteres (10 dgitos, el signo menos, y la terminacin0). No se da ninguna advertencia si usted excede el tamao del buffer; este es un error que puede causar todo tipo de extraos sntomas, porque el desbordamiento corromper algunas otras partes de la memoria que puede ser usada por su programa. La manera fcil para manejar esto es a siempre utilizar un buffer de 12 caracteres y siempre utilizar ltoa porque este funcionar en valores de 16 bits y 32 bits.

41

2.9 Convirtiendo un String a un Nmero


Problema
Usted necesita convertir un string a un nmero. Quizs usted ha recibido un valor como un string sobre un enlace de comunicacin y usted necesita a utilizar este como un entero o valor de punto flotante.

Solucin
Hay un nmero de formas para resolver esto. Si el string es recibido como datos seriales, puede ser convertido tan pronto como cada carcter es recibido. Ver la Receta 4.3 para un ejemplo de cmo a hacer este usando el puerto serial. Otro enfoque para convertir strings de texto que representan nmeros es a utilizar la function de conversion del lenguaje C llamadas atoi (Para variables int) o atol (Para variables long). Este fragmento de cdigo termina los dgitos entrantes en cualquier carcter que es no un dgitos (o si la buffer est completo). Para que este funcione, sin embargo, necesitara permitir la opcin de salto de lnea en el Monitor Serial o tipo algunos otro terminacin carcter:
/ * * StringToNumber * Crea un nmero desde una string * / const int ledPin = 13 // pin al que el LED est conectado int blinkDelay // velocidad de parpadeo determinada por esta variable Char strValue [6]; //debe ser lo suficientemente grande para contener todos los dgitos y el // 0 que termina la cadena int index = 0; // El ndice en el array que almacena los dgitos recibidos void setup () { Serial.begin (9600); pinMode (ledPin, OUTPUT); // activar pin LED como salida } void loop () { if (Serial.available ()) { char ch = Serial.read (); if (index <5 && isdigit (ch)) { strValue [index + +] = ch // agregar el carcter ASCII a la cadena; } else { // Aqu cuando bfer este o al principio no hay digito strValue [index] = 0; // terminar la serie con un 0 blinkDelay = atoi (strValue); // use atoi para convertir la cadena en un entero int index = 0; }

42

} blink (); } void blink () { digitalWrite (ledPin, HIGH); delay (blinkDelay/2) // esperar la mitad del periodo de parpadeo digitalWrite (ledPin, LOW); delay (blinkDelay / 2) // esperar a la otra mitad }

Discusin
Las funciones oscuramente llamadas atoi (Por ASCII a int) y atol (Por ASCII a de largo) convierten un string en enteros o nmeros enteros largos. Para utilizarlas, usted tener que recibir y almacenar todo el string en un array de carcter antes usted puede llamar a la funcin conversin. El cdigo crea un array de caracteres llamado strValue que puede almacenar hasta a cinco dgitos (Se declar como char strValue[6] porque debe tener espacio para la terminacin nula). Este llena este array con dgitos desde Serial.read hasta que obtiene el primero carcter que no es un dgito vlido. El array es finalizado con un nulo y la funcin atoi es llamada para convertir el array de caracteres en la variable blinkRate. La funcin llamada blink se llama para usar el valor almacenado en blinkDelay. Como se menciona en la advertencia en la Receta 2.4, usted necesita ser cuidadoso para no exceder el lmite del array. Si usted no est seguro de cmo a hacer eso, vea la seccin Discusin de esa receta. El lanzamiento 22 de Arduino adiciona el mtodo toInt para convertir un String a un entero:
String aNumber = "1234"; int value = aNumber.toInt ();

Arduino 1.0 adiciona el mtodo parseInt que puede ser usado para conseguir valores enteros del Serial y Ethernet (O cualquier objeto que deriva desde la clase Stream). La siguiente fragmento convertir secuencias de dgitos numricos en nmeros. Esto es similar al fragmento solucin pero no necesita un buffer (Y no limita el nmero de los dgitos a 5):
int blinkDelay / / velocidad de parpadeo determinada por este bucle variablevoid () { if (Serial.available ()) { blinkRate = Serial.parseInt (); } parpadear (); }

43

Mtodos Stream-Parsing como parseInt utilizan un tiempo de espera para retornar el control a su Sketch si los datos no llegan dentro del intervalo deseado. El tiempo de espera por defecto es un segundo pero este puede ser cambiado por llamando el mtodo setTimeout:
Serial.setTimeout (1000 * 60); // esperar hasta un minuto parseInt (Y todos los otros mtodos Strean) retornar cualquier valor que

se obtuvo antes del tiempo de espera si no se recibido delimitador. El valor de retorno consistir de cualquier valor que se haya recogido; si no hay dgitos que se hayan recibido, el retorno ser cero. Arduino 1.0 no tiene una forma para determinar si un mtodo de anlisis tiene tiempo de espera, pero este capacidad es prevista para una futura versin.

Vea tambin
Documentacin para atoi puede ser encontrada en: http://www.nongnu.org/avrlibc/user-manual/ grupo avr stdlib.html. Hay muchas paginas de referencia sobre C/ C++ incluyendo estas funciones de bajo nivel, como http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/ o http://www.cppreference .com / wiki / cadena / c / atoi. Ver la Receta 4.3 y Receta 4.5 para ms acerca del uso parseInt con Serial.

2.10 Estructurando Su Cdigo en Bloques Funcionales


Problema
Usted quiere saber cmo aadir funciones a un Sketch, y la cantidad correcto de funcionalidad a ir en sus funciones. Usted tambin quiere entender cmo planificar la estructura global del Sketch.

Solucin
Las funciones son usadas para organizar las acciones realizadas por su Sketch en bloques funcionales. Las Funciones empaquetan funcionalmente en bien definidas entradas (Informacin dado a una funcin) y salidas (Informacin prevista por una funcin) que hacen fcil estructurar, almacenar, y reutilizar su cdigo. Usted ya est familiarizado con las dos funciones que estn en cada Sketch Arduino: void y loop. Usted crea una funcin declarando su tipo de retorno (La informacin que proporciona), su nombre, y cualquier parmetro opcional (Los valores) que la funcin recibir cuando es llamada.

44

Los trminos funciones y mtodos son usados para referirse a bloques bien definidos de cdigo que puede ser llamado como una sola entidad por otras regiones de un programa. El lenguaje C se refiere a estos como funciones. Lenguajes orientados a objetos como C + + que exponen funcionalidad a travs de clases tienden a utilizar el trmino mtodo. Arduino usa una mezcla de estilos (La Sketches ejemplo tienden a utilizar estilo C-like, las librerias tienden a ser escritas a exponiendo mtodos de clase C++). En este libro, el trmino funcin es usado usualmente a menos que el cdigo sea expuesto a travs de una clase. No se preocupe; si esos terminos no son claros para usted, trate ambos terminos como el misma.

Aqu hay una simple funcin que slo parpadea un LED. Esta no tiene parmetros y no devuelve nada (La anterior funcion void indica que nada ser devuelto):
// parpadear un led una vez LED blink1 () { digitalWrite delay (500); digitalWrite delay (500); }

(13, HIGH); // encender el LED // esperar 500 milisegundos (13, LOW); // apagar el LED // esperar 500 milisegundos

La siguiente versin tiene un parmetro (El entero llamado count) que determina cuntos veces el LED parpadea:
// Parpadear un LED el nmero de veces determinado en el parmetro count void blink2(int count) { while (count > 0) // repeticin hasta que la cuenta ya no sea mayor que cero { digitalWrite (13, HIGH); delay (500); digitalWrite (13, LOW); delay (500); count = count -1; // decrementa el count } }

Programadores experimentados notarn que ambas funciones podra ser parpadear porque la compilador diferenciar estos por el tipo de valores utilizados para la parmetro. Este comportamiento es llamada funcin sobrecargada. La Arduino print discutida en la Receta 4.2 es un comn ejemplo. Otro ejemplo de sobrecarga es en la discusin de la Receta 4.6.

Esa versin revisa para ver si el valor de count es 0. Si no, esta parpadea el LED y luego reduce el valor de count de a uno. Este ser repetido hasta que count no sea mayor que 0.

45

Un parmetro es a veces referido como un argumento en algunas documentaciones. Por prcticos propsitos, usted puede tratar estos trminos como si significaran lo mismo.

Aqu hay un Sketch ejemplo que toma un parmetro y retorna un valor. El parmetro determina la longitud del tiempo del LED encendido y apagado (En milisegundos). La funcin contina parpadeando el LED hasta que un botn es presionado, y la nmero de veces que el LED parpadeo es devuelto desde la funcin:
/* blink3 sketch Demuestra llamando a una funcin con un parmetro y devolviendo un valor. Utiliza el mismo cableado que el sketch de pull-up de la Receta 5.2 El LED parpadea cuando el programa se inicia y se detiene cuando se pulsa un interruptor conectado al pin digital 2. El programa imprime el nmero de veces que el LED parpadea. * / const int ledPin = 13; // pin de salida para el LED const int InputPin = 2 // pin de entrada para el interruptor; void setup () { pinMode (ledPin, OUTPUT); pinMode (InputPin, INPUT); digitalWrite (InputPin, HIGH); // Uso resistencia interna pull-up (Receta 5.2) Serial.begin (9600); } void loop () { Serial.println ("Pulse y mantenga pulsado el interruptor para detener el parpadeo"); int cuenta = blink3 (250) // parpadear el 250 ms LED encendido y 250 ms apagado Serial.print ("El nmero de veces que el conmutador parpade fue"); Serial.println (cuenta); } // Parpadear un LED utilizando el perodo de retardo dado // Devuelve el nmero de veces que el LED destellaba int blink3 (int perodo) { int resultado = 0; int switchVal = ALTO // con pull-ups, esta ser alta cuando el interruptor est hacia arriba while(switchVal == HIGH) // repetir este bucle hasta que se pulse el interruptor // (esta ser baja cuando se pulsa) { digitalWrite (13, HIGH); delay(perodo); digitalWrite (13, LOW); delay(perodo); resultado = resultado + 1 // incrementar el contador

46

switchVal = digitalRead (InputPin); // lee el valor de entrada } // Aqu switchVal ya no es alto porque el interruptor se presiona return resultado; // se devolver este valor }

Discusin
El cdigo en esta receta de Solucin ilustra las tres formas de funcin llamar que usted se encontrar. blink1 tiene no tiene parmetro y no retorna valor. Su forma es:
void blink1 () { / / Cdigo de aplicacin va aqu ... }

blink2 toma un solo parmetro pero no retorna un Valor:


void blink2 (int count) { / / Cdigo de aplicacin va aqu ... }

blink3 tiene un solo parmetro y retorna un Valor:


int blink3 (int perodo) { // Cdigo de aplicacin va aqu ... }

El tipo de dato que precede el nombre de la funcin indica el tipo de retorno (no retorna si es void). Cuando declara la funcin (Escribirndo el cdigo que define la funcin y su accin), usted no pone un punto y coma siguido al parntesis al final. Cuando utiliza la funcin (Call), usted no necesita un punto y coma al final de la lnea que llama la funcin. La mayor parte de la funciones que se encontrar sern algunas variantes de estas formas. Por ejemplo, aqu hay una funcin que toma un parmetro y retorna un Valor:
int sensorPercent(int pin) { int percent; int val = analogRead(pin) // leer el sensor (rangos de 0 a 1023) percent= map(val, 0,1023,0,100); // percent ir desde 0 a 100. return percent; }

La el nombre de la funcin es sensorPercent. Esta da un nmero de pin analgico para leer y devuelve el valor como un porcentaje (Vase la Receta 5.7 para ms sobre analogRead y map). El int en frente de la declaracin dice al compilador (Y recuerda al programador) que la funcin retornar un nmero entero. Al crear funciones, elegir el tipo de retorno apropiado a la accin que la funcin realiza. Esta funcin retorna un valor entero de 0 a 100, as un tipo de retorno int es apropiado.

47

Es recomendado que de sus funciones nombres significativos, y es una prctica comn combinar palabras escribiendo con mayscula la primera letra de cada palabra, excepto para la primera palabra. Use cualquier estilo que prefiera, pero esto ayuda a otros que lean su cdigo si usted conserva su estilo de nombramiento consistente. sensorPercent tiene un parmetro llamado pin (Cuando la funcin es llamada, pin es da el valor

que es pasado a la funcin). cuerpo de la funcin (La cdigo dentro de los parntesis) realiza la accin quiere que lea un valor desde un pin de entrada analgica y lo convierta a un porcentaje. En el anterior ejemplo, el porcentaje es temporalmente almacenado en una variable llamada percent. La siguiente declaracin causa que el valor almacenado en la variable temporal percent sea regresado a la aplicacin llamada:
return percent;

La misma funcionalidad puede ser alcanzada sin uso la variable temporal percent:
int sensorPercent(int pin) { int val = analogRead (pin) // leer el sensor (rangos de 0 a 1023) return map(val, 0,1023,0,100); // percent ir desde 0 a 100. }

Aqu es cmo la funcin puede ser llamada:


// Imprimir el valor del porcentaje de 6 pines analg icos for int sensorPin = 0; sensorPin <6; sensorPin + +) { Serial.print("Porcentaje de sensor en el pin"); Serial.print(sensorPin); Serial.print("es"); int val = sensorPercent (sensorPin); Serial.print(val); }

Vea Tambin
La pgina de referencia a http://www.arduino.cc/en/Reference/FunctionDe claration las funciones Arduino:

2.11 Retornando Ms Que Uno Valor desde una Funcin


Problema
Usted quiere retornar dos o ms valores desde un funcin. La Receta 2.10 proporciona ejemplos para la ms comn forma de una funcin, una que retorna slo un valor o ninguno en todo. Pero a veces usted necesita modificar o retornar ms que un valor.

48

Solucin
Hay varias formas de resolver esto. La fcil a entender es tener la funcin cambiando algunas variables globales y en realidad no retorna cualquier cosa desde la funcin:
/* Swap sketch demuestra cambiando dos valores usando variables globales * / int x; // x e y son variables globales int y; void setup () {Serial.begin (9600); } void loop () { x = random (10) // recoger algunos nmeros aleatorios y = random (10); Serial.print ("El valor de x e y antes de intercambiar son:"); Serial.print (x); Serial.print (","); Serial.println (y); swap (); Serial.print ("El valor de x e y despus del intercambio son:"); Serial.print (x); Serial.print (","); Serial.println (y); Serial.println (); delay (1000); } // Cambiar los dos valores globales void swap () { int temp; temp = x; x = y; y = temp; }

La funcin swap cambia dos valores usando variables globales. Las variables globales son fciles de entender (Global las variables son valores que son accesible en todas partes y cualquier cosa puede cambiarlas), pero estan son evitadas por programadores experimentados porque esta no advierte la modificacion del valor de una variable o tiene una function detenida funcin porque usted ha cambiado el nombre o tipo de una variable global en otra parte en el Sketch. Una ms segura y ms elegante solucin es pasar referencias a los valores que usted quiere cambiar y permitir a la funcin utilizar las referencias para modificar los valores. Este se hace de la siguiente manera:
/ * functionReferences sketch demuestra devolviendo ms de un valor al pasar referencias * /

49

void setup () { Serial.begin (9600); } void loop () { int x = random (10) / / recoger algunos nmeros aleatorios int y = random (10); Serial.print ("El valor de x e y antes de intercambiar son:"); Serial.print (x); Serial.print (","); Serial.println (y); swap (x, y); Serial.print ("El valor de x e y despus del intercambio son:"); Serial.print (x); Serial.print (","); Serial.println (y); Serial.println (); delay (1000); } // Cambiar los dos valores dados void swap (int &valor1, int &valor2) { int temp; temp = valor1; valor1 = valor2; valor2 = temp; }

Discusin
La funcin swap es similar a las funciones con parmetros descritas en la Receta 2.10, pero el signo (&) smbolo indica que los parmetros son referencias. Esto significa cambios en valores dentro de la funcin, tambin cambiara el valor de la variable que se da cuando la funcin se llama. Usted puede ver cmo este funciona al ejecutar el cdigo en esta Receta de Solucin y verificando que los parmetros son intercambiados. Entonces modificar el cdigo al eliminar la dos signos & en la funcin definicin. La lnea cambiada debera lucir como esta:
void swap(int valor1, valor2 int)

Ejecutando el cdigo muestra que los valores no son intercambiados, los cambios realizados dentro de la funcin son locales a la funcin y son perdidos cuando la funcin retorna.

Si usted est usando la liberacin 21 de Arduino o anterior, usted necesitar crear una funcin declaracin para informar al compilador que su funcin est utilizando referencias. El Sketch para esta receta en la descarga para la primero edicin de este libro muestra cmo a crear la funcin declaracin:
// funciones con referencias deben ser declaradas antes de su uso // La declaracin va en la parte superior, antes de que su cdigo setup y void

50

// Note el punto y coma al final de la declaracin void swap(int &valor1, int &valor2);

La funcin declaracin es un prototipo, una especificacin de los nombres, los tipos de los valores que pueden ser pasados a la funcin, y el tipo de retorno de la funcin. El proceso de contruccion Arduino por lo general crea las declaraciones para usted bajo la cubierta. Pero cuando usted utilizar sintaxis no estndar (para Arduino 21 y anterior, de todos modos), el proceso de construccin no crea la declaracin y usted necesita aadirla a su cdigo, como est hecho con la linea antes de setup. La funcin definicin es la funcin encabezamiento y la funcin cuerpo. La funcin encabezamiento es similar a la declaracin excepto que no tiene un punto y coma al final. La funcin cuerpo es la cdigo dentro de los parentesis que es ejecutada para realizar alguna accin cuando la funcin es llamada.

2.12 Tomando Acciones Basadas en Condiciones


Problema
Usted quiere ejecutar un bloque de cdigo slo si una condicin particular es verdadera. Por ejemplo, puede querer a iluminar un LED si un interruptor es presionado o si un valor analgico es mayor que algun umbral.

Solucin
La siguiente cdigo usa la conexion muestrada en la Receta 5.1:
/* Sketch pulsador un interruptor conectado al pin digital 2 enciende el LED en el pin 13 * / int const ledPin = 13 // seleccionar el pin para el LED const int inputPin = 2 // seleccionar el pin de entrada (por un pulsador) void setup () { pinMode(ledPin, OUTPUT); // declara pin LED como salida pinMode(InputPin, INPUT); // declara pin pulsador como entrada } void loop () { int val = digitalRead(InputPin); // lee el valor de entrada if (val == HIGH) // comprueba si la entrada es ALTA { digitalWrite(ledPin, HIGH); // LED enciende si se pulsa el interruptor } }

51

Discusin
La declaracin if es usada para probar la valor de digitalRead. Una declaracin if necesita tener una prueba dentro de los parntesis que slo pueden ser verdadero(true) o falso(falso). En el ejemplo en esta receta de Soluciones, es val == HIGH, y el bloque de cdigo seguido a la declaracin if slo es ejecutado si la expresin es verdadera. El bloque de cdigo consiste en todo el cdigo dentro las llaves (O si usted no utiliza llaves, el bloque es slo la prxima declaracin ejecutable finalizado por un punto y coma). Si usted quiere hacer una cosa si un declaracin es verdadera y otra si es falsa, utilizar la declaracin if ... else:
/ * Sketch pulsador un interruptor conectado al pin 2 ilumina el LED en el pin 13 * / int const ledPin = 13 // seleccionar el pin para el LED const int inputPin = 2 // seleccionar el pin de entrada (por un pulsador) void setup () { pinMode(ledPin, OUTPUT); // declara pin LED como salida pinMode (inputPin, INPUT); // declara pin pulsador como entrada } void loop () { int val = digitalRead(InputPin); // lee el valor de entrada if(val == HIGH) // comprueba si la entrada es ALTA { // Hacer esto si val es ALTO digitalWrite (ledPin, HIGH); // LED encendido si se pulsa el interruptor } else { // Else hace esto si val no es ALTO digitalWrite(ledPin, LOW); // apaga el LED } }

Vase Tambin
Ver la discusin sobre tipos Boolean en la Receta 2.2.

2.13 Repitiendo una Secuencia de Declaraciones


Problema
Usted quiere repetir un bloque de declaraciones mientras un expresin es verdadera.

52

Solucin
El bucle while repite uno o ms instrucciones mientras una expresin es verdadera:
/ * * Repetir * Parpadea mientras una condicin es verdadera * / const int ledPin = 13 // el LED es conectado al pin digital a const int sensorPin = 0; // entrada analgica 0 void setup () { Serial.begin (9600); pinMode(ledPin, OUTPUT); // activar pin LED como salida } void loop () { while(analogRead (sensorPin)> 100) { blink(); // llamar a una funcin para encender y apagar un LED Serial.print ("."); } Serial.println(analogRead (sensorPin)) // esto no se ejecuta hasta que // El bucle while termina! } void blink () { digitalWrite(ledPin, HIGH); delay (100); digitalWrite(ledPin, LOW); delay (100); }

Este cdigo ejecutar las declaraciones en el bloque dentro las llaves, {}, mientras el valor desde analogRead sea mayor que 100. Este podra ser usado para parpadear un LED como una alarma mientras algunos valores excedan un umbral. El LED es apagado cuando el valor del sensor valor es 100 o menos; este parpadea continuamente cuando el valor es mayor que 100.
La {} smbolos que definir un bloque de cdigo son dado vario nombres, incluyendo soportes, rizado aparatos ortopdicos, y apoyos. Este libro se refiere a como corchetes.

Discusin
Las llaves definen la extension del bloque de cdigo a ser ejecutado en un bucle. Si las llaves no son utilizado, slo la primero lnea de cdigo ser repetido en el bucle:

53

while(analogRead (sensorPin)> 100) blink (); // lnea inmediatamente despus de la expresin bucle se ejecuta Serial.print ("."); // Esto no se ejecuta hasta que despus de que finalice un bucle while!

Loops sin soportes lata comportarse inesperadamente si usted tener ms de un lnea de cdigo.

El bucle do... while es similar al bucle while, pero las instrucciones en el bloque de cdigo son ejecutadas antes que condicin sea revisada. Use este forma cuando usted necesite tener el cdigo ejecutado al menos una vez, incluso si la expresin es falsa:
do { blink(); // llamar a una funcin para encender y apagar un LED } while (analogRead (sensorPin)> 100);

El cdigo anterior parpadear el LED al menos una vez y mantendr intermitente tanto como el valor leido desde un sensor sea mayor que 100. Si el valor no es mayor que 100, el LED slo parpadear una vez. Este cdigo podra ser usado en un circuito cargador de baterias, si fuera llamado una vez cada 10 segundo o por lo que: un solo parpadeo muestra que el circuito est activo, mientras que continuos parpadeos indicant que la batera est cargada.
Slo la cdigo dentro un mientras o hacer bucle voluntad ejecutar hasta la las condiciones lo permiten salida. Si su dibujo necesidades a rotura fuera de un bucle en respuesta hasta cierto otro condicin tal como un tiempo de espera, sensor estado, o otro de entrada, lata utilizar romper:
while(analogRead (sensorPin)> 100) { blink(); if (Serial.available ()) break; // cualquier entrada serial sale del bucle while }

Vase Tambin
Los captulos 4 y 5

2.14 Repitiendo Declaraciones con un Contador


Problema
Usted quiere repetir una o ms declaraciones un cierto nmero de veces. El bucle for es similar al bucle while, pero usted tendr ms control sobre las condiciones inicial y final.

54

Solucin
Este Sketch rcuenta desde cero a tres imprimiendo el valor de la variable i en un bucle for:
/ * Sketch BucleFor demuestra el bucle for * / void setup () { Serial.begin (9600);} void loop () { Serial.println("for (int i=0; i <4; i++)"); for(int i=0; i <4; i++) { Serial.println (i); } }

La salida del Monitor Serial desde este es como sigue (esto ser visualizado una y otra vez):
for(int i=0; i <4; i++) 0 1 2 3

Discusin
El bucle for consiste de tres partes: inicializacin, prueba condicional, e iteracin (Una declaracin que es ejecutado en la final de cada pasada a travs del bucle). Cada parte es separada por un punto y coma. En el cdigo de este La receta de Soluciones, int i=0; inicializa la variable i a 0; i < 4; pruebas la variable para ver si es menor que 4; y i++ incrementa i. El bucle for puede utilizar una variable existente, o lo puede crear una variable para uso exclusivo dentro del bucle. Esta versin usa el valor de la variable j creado anteriormente en el Sketch:
int j; Serial.println("for(j = 0; j <4; j + +)"); for(j = 0; j <4; j + +) { Serial.println (j); }

Esto es casi lo mismo como el anterior ejemplo, pero no tiene palabra clave int en la parte de inicializacin porque la variable j ya fue definida. La salida de esta versin es similar a la salida de la versin anteroir:
for (j = 0; i <4; i + +) 0 1 2 3

55

Usted puede dejar completamente fuera la parte de inicializacin si usted quiere el bucle utiliza el valor de un variable definida anteriormente. Este cdigo inicia el bucle con j igual a 1:
int j = 1; Serial.println("for (; j <4; j + +)"); for(; j <4; j + +) { Serial.println (j); }

La anterior cdigo imprime lo siguiente:


for (; j <4; j + +) 1 2 3

Usted controla cuando detener el bucle en la prueba condicional. El anterior ejemplo prueba si la variable del bucle es menor que 4 y terminar cuando la condicin ya no sea verdadera.

Si su variable del bucle inicia en 0 y usted quiere repetir cuatro veces, su declaracin condicional debera probar para un valor menor que 4. La bucle se repite mientras la condicin sea verdadero y hay cuatro valores que son menores que 4 con un bucle iniciado en 0.

El siguiente cdigo prueba si el valor de la variable del bucle es menor o igual que 4. Se imprimir los dgitos desde 0 a 4:
Serial.println("for (int i = 0; i <= 4; i + +)"); for(int i = 0; i <= 4; i + +) { Serial.println (i); }

La tercera parte de un bucle for bucle es la declaracin iterador que es ejecutada al final de cada pasadaa travs del bucle. Este puede ser cualquier declaracin C / C + + vlida. La siguiente aumenta el valor de i de a dos en cada pasada:
Serial.println("for (int i = 0; i <4; i + = 2)"); for(int i = 0; i <4; i + = 2) { Serial.println (i); }

Esa expresin slo imprime los valores 0 y 2. La expresin iterador puede ser usado para que el bucle cuente de arriba hacia abajo, en este caso desde 3 a 0:
Serial.println("for (int i = 3; i> = 0; i -)"); for(int i = 3; i> = 0; i -) {

56

Serial.println(i); }

Como las otras partes del bucle for, la expresin iterator puede ser dejada en blanco (siempre debe tener la dos punto y coma separando la tres partes incluso si estas estn en blanco). Esta versin slo incrementa i cuando una entrada de un pin es alta. El bucle for no cambia el valor de i; lo es slo cambiado por la declaracin if despus de Serial.print usted necesitar definir inPin y configurar este como INPUT con pinMode ():
Serial.println("for (int i = 0; i <4;)"); for(int i = 0; i <4;) { Serial.println(i); if(digitalRead (inPin) == HIGH) { i++; // slo incrementar el valor de i si la entrada es alta } }

Vase Tambin
La referencia de Arduino para la declaracin for: http://www.arduino.cc/en/Reference/For

2.15 Saliendo de un Bucle


Problema
Usted quiere terminar un bucle antes basado en algunas condicin que usted est probando.

Solucin
Use el siguiente cdigo:
while (analogRead (sensorPin)> 100) { if (digitalRead (switchPin) == HIGH) { break; // salir del bucle, si se pulsa el interruptor } flashLED (); / llamar a una funcin para encender y apagar el LED }

Discusin
Este cdigo es similar a la uno usando el bucle while, pero usa la declaracin break para salir del bucle si un pin digital cambia a alto. Por ejemplo, si un interruptor es conectado en la pin como se muestra en la Receta 5.1, el bucle saldr y la LED dejar de parpadear incluso si la condicin en el bucle while es verdadera.

57

Vase tambin
La referencia Arduino para la declaracin break: http://www.arduino.cc/en/Reference/Break

2.16 Tomando una Variedad de Acciones Basadas en una Sola Variable


Problema
Usted necesita hacer diferentes cosas dependiendo de algunos valores. Usted podra utilizar mltiples declaraciones if y else, pero el cdigo pronto se vuelve complejo y difcil de entender o modificar. Adems, usted puede querer probar para un rango de valores.

Solucin
La declaracin switch sirve para seleccionar de un nmero de alternativas. Lo es funcionalmente similar a multiples declaraciones if / else pero es ms concisa:
/ * * Sketch SwitchCase * Ejemplo mostrando la sentencia switch conectando caracteres desde el puerto serial * Enviando el carcter 1 parpadea el LED una sola vez, el enviando el 2 parpadea dos veces * Enviando + enciende el LED, el enviando - lo apaga * Cualquier otro carcter imprime un mensaje en el Monitor Serial * / int const ledPin = 13 // el Led est conectado al pin 13 void setup () { Serial.begin (9600); // Inicializa el puerto serie para enviar y // Recibir a 9600 baudios pinMode (ledPin, OUTPUT); } void loop () { if(Serial.available ()) // Comprueba si al menos un caracter // est disponible { char ch = Serial.read (); switch (ch) { case '1': blink (); break; case '2': blink (); blink (); break; case '+': digitalWrite(ledPin, HIGH); break;

58

case '-': digitalWrite (ledPin, LOW); break; default: Serial.print(ch); Serial.println("fue recibido, pero no esperado"); break; } } } void blink () { digitalWrite(ledPin, HIGH); delay (500); digitalWrite(ledPin, LOW); delay (500); }

Discusin
La declaracin switch evala la variable ch recibida desde el puerto serial y ramifica a la etiqueta que coincide con su valor. La etiquetas necesariamente deben ser constantes numricas(Se puede utilizar strings en una declaracin case) y dos etiquetas no pueden tener el mismo valor. Si no tiene una declaracin break seguida a cada expresin, la ejecucin fracasar en la declaracin:
case '1': blink (); // sin declaracin break antes de la prxima etiqueta case '2': blink(); // case '1'seguir aqu blink (); break; // la declaracin break saldr de la expresin switch

Si la declaracin break al final de case '1': fue eliminado (Como muestra en el cdigo anterior), cuando ch es igual al caracter 1 la funcin blink ser llamada tres veces. Olidar accidentalmente el break es un error comn. Dejar intencionalmente fuera el break es a veces muy til; esto puede confundir a otros leyendo su cdigo, as es una buena prctica aclarar indicando su intenciones con comentarios en el cdigo.
Si su interruptor declaracin es mal comportamiento, comprobar a asegurar que usted no tiene olvidados la rotura declaraciones.

La etiqueta default: es usada para capturar valores que no coinciden con cualquiera de las etiquetas case. Si no hay la etiqueta default, la expresins switch no har ninguna cosa si hay no hay coincidencia.

59

Vase tambin
Referencia Arduino para la declaracin switch y case: http://www.arduino.cc/en/Reference /SwitchCase

2.17 Comparando Caracteres y Valores Numricos


Problema
Usted quiere determinar la relacin entre valores.

Solucin
Comparar valores enteros usando los operadores relacionales mostrados en la Tabla 2-3.
Tabla 2-3. Operadores de relacin e igualdad Operador Prueba para
== != > < > = <=

Ejemplo
2 == 3 // evala a falso 2 != 3 // evala a verdadero 2 > 3 // evala a falso 2 < 3 // evala a verdadero 2 >= 3 // evala a falso 2 <= 3 // evala a verdadero

El siguiente Sketch demuestra los resultados del uso de los operadores de comparacin:
/ * * * * RelationalExpressions Sketch Demuestra la comparacin de los valores /

int i=1; // algunos valores para empezar int j = 2; void setup () { Serial.begin (9600); } void loop(){ Serial.print("i ="); Serial.print(i); Serial.print("y j ="); Serial.println(j); if(i <j) Serial.println("i es menor que j"); if (i <= j) Serial.println("i es menor o igual a j");

60

if(i!=j) Serial.println ("i no es igual a j"); if (i == j) Serial.println("i es igual a j"); if(i> = j) Serial.println ("i es mayor o igual a j"); if(i> j) Serial.println("i es mayor que j"); Serial.println (); i = i + 1; if(i> j + 1) delay (10000); // largo retraso despus de que i ya no est cerca de j }

Esta es la salida:
i i i i i i i i i i i i = 1 y j = 2 es menor que j es menor o igual a j no es igual a j = 2 y j = 2 es menor o igual a j es igual a j es mayor o igual a j = 3 y J = 2 no es igual a j es mayor o igual a j es mayor que j

Discusin
Note que el operador igualdad es el doble signo igual , ==. Uno de los ms comunes errores de programacin es confundir este con la operador de asignacin, que usa un solo signo igual. La siguiente expresin comparar el valor de i a 3. El programador intenciona esto:
if(i == 3) / / pruena si i es igual a 3

Pero l pone esto en el Sketch:


if(i = 3) // un solo signo igual utilizado por error!!

Este siempre retornar verdadero, porque i ser cambiado a 3, as estos sern igual cuando se comparen.

Un consejo paraa ayudar a evitar esa trampa cuando compare las variables a constantes (valores fijados) es poner la constante en el lado izquierdo de la expresin:

61

if(3 = i) // un solo signo igual utilizado por error!!

El compilador le dir acerca de este error porque este sabe que usted no puede asignar un diferente valor a una constante.

El mensaje de error es algo hostil "Valor necesario como operando de la izquierda de asignacin ". Si usted ve este mensaje, el compilador es que le dice que usted est tratando de asignar un valor a algo que no puede ser cambiado.

Vase tambin
La referencia Arduino para condicionales y operadores de comparacin: http://www.arduino.cc/ es /Reference/If

2.18 Comparando Strings


Problema
Usted quiere a ver si dos strings son idnticos.

Solucin
Hay una funcin para comparar strings, llamado strcmp (abreviatura string compare). Aqu est un fragmento que muestra su uso:
Char cadena1[] = "izquierda"; Char cadena2[] = "derecha"; if(strcmp(cadena1, cadena2) == 0) Serial.print ("cadenas son iguales")

Discusin
strcmp retorna el valor 0 si los strings son iguales y un valor mayor que cero si el primer carcter

que no coincide tiene un valor mayor en el primer string que en el segundo. Este devuelve un valor menor que cero si el primer carcter que no coincide en el primer string es menor que en el segundo. Generalmente usted slo quiere saber si ellos son iguales, y aunque la prueba para cero puede parecer no intuitiva al principio, Pronto conseguir usarla.

62

Tenga en cuenta que strings de desigual longitud no sern evaluados como iguales incluso si el string ms corto est contenida en el ms largo. Por lo tanto:
strcmp("left", "leftcenter") == 0) // esto evaluar como false

Usted puede comparar strings hasta a un nmero dado de caracteres al usar la funcin strncmp. Usted da a strncmp el mximo nmero de caracteres a comparar y dejar de comparar despus de muchos caracteres:
strncmp("left", "leftcenter", 4) == 0) // esto se evaluar como true

Diferentes strings de caracteres, Arduino Strings pueden ser directamente comparados de la siguiente manera:
StringOne String = String ("esto"); if (stringOne == "esto") Serial.println ("esto va a ser verdad"); if (stringOne == "eso") Serial.println ("esto es falso");

Un tutorial sobre comparacin Arduino String est en http://arduino.cc/en/Tutorial/StringCom parisonOperators.

Vase tambin
Ms informacin sobre strcmp est disponible en http://www.cplusplus.com/reference/clibrary/ cstring /strcmp /. Ver la Receta 2.5 para una introduccin al Arduino String.

2.19 Realizando Comparaciones Lgicas


Problema
Usted quiere evaluar la relacin lgica entre dos o ms expresiones. Por ejemplo, usted desea tomar una diferente accin dependiente en la condiciones de una declaracin if.

Solucin
Uso los operadores lgico como se indica en la Tabla 2-4.
Tabla 2-4. Operadores Lgicos Smbolo Funcin && || ! Comentarios verdadero verdadero verdadera falsa && ||

63

Discusin
Los operadores lgicos retornan valores verdaderos o falsos basados en la relacin lgica. La ejemplos que siguen asume que usted tiene sensores conectados a los pines digitales 2 y 3 como es discutido en el Captulo 5. El operador lgico AND (&&) retornar true si sus dos operandos son verdaderos, y false de otro modo:
if (digitalRead(2) && digitalRead (3)) blink(); / / parpadear si ambos pines estn ALTOS

El operador lgico Or (||) retornar true si cualquiera de sus dos operandos son verdaderos, y false si ambos operandos son falsos:
if (digitalRead (2) | | digitalRead (3)) blink (); // parpadea si cualquiera de los pines estn ALTOS

El operador Not (!) tiene slo un operando, cuyo valor es invertido a false si su operando es verdadero y true si su operando es falso:
if(!digitalRead (2)) blink (); // parpadea si el pin no es ALTO

2.20 Realizando Operaciones lgicas booleanas


Problema
Usted quiere cambiar o quitar ciertos bits en un valor.

Solucin
Uso los operadores lgicos booleanos como se indica en la Tabla 2-5.
Tabla 2-5. Operadores bit
Smbolo Funcin &
lgico booleano lgico booleano lgico booleano

Resultado

Ejemplo 3 & 1 equals 1 (11 & 01 equals 01) 3 | 1 equals 3 (11 | 01 equals 11) 3 ^ 1 equals 2 11 ^ 01 ~1 equals 254 (~00000001 equals 11111110) 10

lgica booleana

64

Aqu hay un Sketch que demuestra los valores ejemplo mostrados en la Tabla 2-5:
/ * * bits Sketch * Demuestra operadores lgicos booleanos * / void setup () { Serial.begin (9600); } void loop () { Serial.print ("3 & 1 iguales"); / / AND lgico booleano 3 y 1 Serial.print (3 & 1); // imprimir el resultado Serial.print ("decimal o en binario:"); Serial.println (3 & 1, BIN); // imprime la representacin binaria del resultado Serial.print ("3 | 1 iguales"); // OR lgico booleano 3 o 1 Serial.print (3 | 1); Serial.print ("decimal o en binario:"); Serial.println (3 | 1, BIN); // imprime la representacin binaria del resultado Serial.print ("3 ^ 1 iguales"); // OR exclusivo lgico booleano o 3 o 1 Serial.print (3 ^ 1); Serial.print ("decimal o en binario:"); Serial.println (3 ^ 1, BIN); // imprime la representacin binaria del resultado byte de byteVal = 1; int intval = 1; byteVal = ~byteVal // negacion lgica booleana intval = ~ intval; Serial.print("~ byteVal (1) es igual a"); //negacion lgica booleana de un valor de 8 bits Serial.println(byteVal, BIN); // imprime la representacin binaria del resultado Serial.print("~ intval (1) es igual a "); //negacion lgica booleana un valor de 16 bits Serial.println(intval, BIN); // imprime la representacin binaria del resultado delay (10000); }

Este es desplegado en el Monitor Serial:


3 & 1 es igual a 1 decimal o en binario: 1 3 | 1 es igual a 3 decimal o en binario: 11 3 ^ 1 es igual a 2 decimal o en binario: 10 ~byteVal(1) es igual a 11111110 ~intval(1) es igual a 11111111111111111111111111111110

Discusin
Operadores lgicos booleano son usados para configurar o probar Bits. Cuando usted usa "AND" o "OR" en dos valores, el operador funciona en individualmente en cada bit. Es fcil ver cmo este funciona buscando la representacin binaria de los valores.

65

El decimal 3 es en binario 00000011, y el decimal 1 es 00000001. El AND lgico booleano opera en cada bit. Los bits ms a la derecha son ambos 1, as la resultado de AND es 1. Moviendo a la izquierda, los prximos bits son 1 y 0; AND resulta estos en 0. Todos los bits restantes son 0, as el resultado lgico booleano de estos ser 0. En otras palabras, para cada posicin de bit donde hay un 1 en ambos lugares, la resultado tendr un 1; de lo contrario, lo tendr un 0. As, 11 & 01 es igual a 1. Las Tablas 2-6, 2-7, y 2-8 deberan ayudarle a aclarar los valores lgicos booleano AND, OR y OR exclusivo.

Tabla 2-6. AND lgico booleano Bit1 Bit2 Bit1 and Bit2

Tabla 2-7. OR lgico booleano Bit1 Bit2 Bit1 or Bit2

Tabla 2-8. Or exclusivo lgico booleano Bit1 Bit2 Bit1 ^ Bit2

Todas las expresiones lgicas booleanas funcionan en dos valores, excepto para el operador negacin. Este simplemente invierte cada bit, as 0 se convierte en 1 y 1 se convierte en 0. En el ejemplo, el valor byte (8 bits) 00000001 se convierte en 11111110. El valor int tiene 16 bits, as que cuando cada uno es invertido, el resultado es 15 unos seguidos por un solo cero.

Vase tambin
La referencia Arduino para los operadores lgicos booleanos AND, OR, y OR Exclusivo: http://www.arduino.cc /es/Reference /bit a bit

66

2.21 Combinando Asignacin


Problema

Operaciones

Usted quiere a entender y utilizar operadores compuestos. No es raro a ver cdigo publicado que usa expresiones que hacen ms de una cosa en una sola declaracin. Usted quiere entender a + = b, a >> = b, y a & = b.

Solucin
La Tabla 2-9 muestra los operadores compuestos de asignacin y su equivalente completa expresin.
Tabla 2-9.Operadores compuestos Operador Ejemplo
+ = - = * = / = >> = << = Y = | = valor + = 5; valor - = 4; valor * = 3; valor / = 2; valor >> = 2; valor << = 2;

Expresin equivalente
valor = valor + 5; // aade 5 al valor valor = valor - 4; // sustrae 4 desde valor valor = valor * 3; // multiplica el valor por 3 valor = valor / 2; // divide el valor por 2 valor = valor >> 2; // desplaza el valor dos lugares a la derecha valor = valor << 2; // desplaza el valor dos lugares a la izquierda

enmascarar & = 2; enmascarar = enmascarar & 2; // AND binario enmascarar con 2 enmascarar | = 2; enmascarar = enmascarar | 2; // OR binario enmascarar con 2

Discusin
Estas declaraciones compuestas no son ms eficiente en tiempo de ejecucin que la expresin complete equivalente, y si usted es nuevo programando, use la expresin completa ya que es ms clara. Codificadores Experimentados a menudo utilizan la forma ms corta, por lo que es til para reconocer las expresiones al ejecutar a travs de ellas.

Vase Tambin
Ver http://www.arduino.cc/en/Reference/HomePage para un ndice a las paginas de referencia para operadores compuestos.

67

CAPTULO 3

Usando Operadores Matemticos

3.0 Introduccin
Casi cada Sketch usa operadores matemticos paraa manipular el valor de variables. Este captulo proporciona una breve visin de conjunto de los ms comunes operadores matemticos. Como el captulo anterior, este resumen es ante todo para no programadores o programadores que no estn familiarizados con C o C++. Para ms detalles, ver uno de los libros de referencia sobre C mencionados en el Prlogo.

3.1 Sumando, Restando, Multiplicando, y Dividiendo


Problema
Usted quiere a realizar matemticas simples en valores en su Sketch. Usted quiere controlar el orden en que que las operaciones son realizadas y usted puede necesitar manejar diferentes tipos de variables.

Solucin
Use el siguiente cdigo:
int myValue; myValue = 1 + 2 // Suma myValue = 3 - 2; // resta myValue = 3 * 2 // multiplicacin myValue = 3/2; // divisin (el resultado es 1)

Discusin
Suma, resta, y multiplicacin para enteros funciona mucho como usted espera.

68

Asegrese que su resultado no exceder el mximo tamao de la variable de destino. Ver la Receta 2.2.

La divisin de tipos enteros trunca la fraccin resto en la divisin ejemplo mostrada en esta receta de Solucin; myValue ser igual a 1 despus de la divisin (Vase la Receta 2.3 si su aplicacin requiere resultados fraccionarios):
int valor = 1 + 2 * 3 + 4;

Declaraciones compuestas, tal como la declaracin anterior, puede aparecer ambigua, pero la prioridad (Orden) de cada operador est bien definida. La multiplicacin y divisin tienen una mayor prioridad que la suma y resta, as el resultado ser 11. Es aconsejable utilizar parentesis en su cdigo para hacer clara la prioridad de clculo deseada. int valor = 1 + (2 * 3) + 4; produce el mismo resultado pero es fcil de leer. Use parntesis si usted necesita alterar la prioridad, como en este ejemplo:
int valor = ((1 + 2) * 3) + 4;

El resultado ser 13. La expresin en el interior de los parntesis es calculada primero, as 1 es sumado a 2, este entonces es multiplicado por 3, y finalmente, se suma 4, resultando 13.

Vase tambin
Receta 2.2; Receta 2.3

3.2 Incrementando y Disminuyendo Valores


Problema
Usted quiere aumentar o disminuir el valor de una variable.

Solucin
Use el siguiente cdigo:
int myValue = 0; miValor = miValor + 1; // esto suma uno a la variable miValor miValor + = 1; // Esto hace lo mismo que lo anterior miValor = mivalor 1; // esto resta uno de la miValor miValor - = 1; // Esto hace lo mismo que lo anterior miValor = mivalor + 5; // esto aade cinco a la variable miValor miValor + = 5; // esto hace lo mismo que lo anterior

69

Discusin
Incrementar y disminuir los valores de las variables es una de las tareas ms comunes de programacin, y la tarjeta Arduino tiene operadores para hacer esto fcil. Incrementar un valor por uno es llamado incrementing, y disminuir este por uno es llamado decrementing. La forma larga de hacer esto es de la siguiente manera:
miValor = mivalor + 1; // esto suma uno a la variable miValor

Pero usted puede tambin combinar la incremento y decremento operadores con la asignar operario, como esto:
myValue + = 1 / / Esto hace lo mismo que el anterior

Vea tambin
Receta 3.1

3.3 Encontrando el Residuo Despus de Dividir Dos Valores


Problema
Usted quiere encontrar el residuo despus de dividir dos valores.

Solucin
Use el smbolo % (el operador mdulo) para obtener el residuo:
int miValor0 = 20%10; // obtener el mdulo(residuo) de 20 dividido para 10 int miValor1 = 21%10; // obtener el mdulo (residuo) de 21 dividido para 10

miValor0 es igual a 0 (20 dividido para 10 tiene un residuo de 0). miValor1 es igual a 1 (21

dividido para 10 tiene un residuo de 1).

Discusin
El operador mdulo es sorprendentemente til, particularmente cuando usted quiere ver si un valor es un mltiplo de un nmero. Por ejemplo, el cdigo en esta receta de Solucin puede ser mejorado para detectar cuando un valor es un mltiplo de 10:
int miValor; / / ... Cdigo aqu para fijar el valor de miValor if(miValor%10 == 0) { Serial.println ("El valor es un mltiplo de 10"); }

El cdigo anterior toma el mdulo de la variable miValor y compara el resultado a cero (Ver receta 2.1 7). Si la resultado es cero, un mensaje es impreso diciendo el valor es un mltiplo de 10.

70

Aqu hay un ejemplo similar, pero usando 2 con el operador mdulo, la resultado puede utilizarse para comprobar si un valor es par o impar:
int miValor; / / ... Cdigo aqu para fijar el valor de miValor if(miValor%2 == 0) { Serial.println ("El valor es par"); } else { Serial.println ("El valor es impar"); }

Este ejemplo calcula la hora en un reloj de 24 horas para cualquier nmero dado de hora offset:
void printOffsetHour (int hourNow, int offsetHours) { Serial.println ((hourNow + offsetHours)% 24); } void printOffsetHour (int hourNow, int offsetHours) { Serial.println ((hourNow + offsetHours)% 24); }

Ver Tambin
La referencia Arduino para % (El operador mdulo): http://www.arduino.cc/en/Reference/Modulo

3.4 Determinando Absoluto


Problema

el

Valor

Usted quiere conseguir el valor absoluto de un nmero.

Solucin
abs(x) calcula el valor absoluto de x. El siguiente ejemplo toma el valor absoluto de la diferencia

entre lecturas en dos puertos de entrada analgicos analogRead()):


int x = analogRead (0); int y = analogRead (1);

(Vase el Captulo 5 para ms sobre

if (abs(x)> 10) { Serial.println ("Los valores analgicos difieren en ms de 10"); }

71

Discusin
abs(x-y); retorna el valor absoluto de la diferencia entre x e y. Esto es usado para valores enteros (y enteroslargos). Para retornar el valor absoluto de valores de punto flotante, consulte la Receta

2.3.

Vase tambin
La referencia Arduino para abs: http://www.arduino.cc/en/Reference/Abs

3.5 Limitando un Nmero a un Rango de Valores


Problema
Usted quiere asegurar que un valor est siempre dentro algn limite inferior y superior.

Solucin
constrain(x, min, mx) retorna un valor que est dentro los lmites de min y max:
myConstrainedValue = constrain(myValue, 100, 200);

Discusin
myConstrainedValue es cambiado a un valor que siempre ser mayor o igual a 100 y menor que o igual a 200. Si myValue es menos]r que 100, el resultado ser 100; si este es myor que 200, este

ser cambiado a 200. La Tabla 3-1 muestra algunos ejemplos de valores de salida usando un min de 100 y un max de 200.
Tabla 3-1. Salida desde constreir con min = 100 y max = 200
myValue (el valor de entrada) constrain(myValue, 100, 200)

Vase tambin
Receta 3.6

72

3.6 Encontrando el Mnimo o Mximo de Algunos Valores


Problema
Usted quiere encontrar el mnimo o mximo de dos o ms valores.

Solucin
min(x, y) retorna el menor de dos nmeros. max(x, y) retorna el mayor de dos nmeros:

myValue = analogRead (0); myMinValue = min (myValue, 200); // myMinValue ser el ms pequeo de los // MyVal o 200 myMaxValue = mx (myValue, 100); // myMaxValue ser el ms grande de los // MyVal o 100

Discusin
La Tabla 3-2 muestra algunos ejemplo de valores de salida usando un min de 200. La tabla muestra que el salida es la mismo como la entrada (myValue) hasta que el valor se convierte en mayor que 200.
Tabla 3-2. Salida desde min(myValue, 200)
myValue (el valore de entrada) min (myValue, 200)

La Tabla 3-3 muestra la salida usando un max de 100. La tabla muestra que la salida es la mismo que la entrada (myValue) cuando el valor es mayor o igual a 100.
Tabla 3-3. Salida desde max(myValue, 100)
myValue (el valor de entrada) max(myValue, 100)

73

Use min cuando usted quiera limitar el lmite superior. Esto puede ser contrario a la intuicin, pero al retornar el valor menor de la entrada y el valor mnimo, la salida desde min nunca ser mayor que el valor mnimo (200 en el ejemplo). Del mismo modo, utilizar max para limitar el lmite inferior. La salida desde max voluntad nunca ser menor que el mximo valor (100 en el ejemplo). Si quiere encontrar el min o max de ms que dos valores, usted puede poner los valores en cascada de la siguiente manera:
// myMinValue ser el menor de las tres lecturas analgicas: int myMinValue = min(analogRead(0), min(analogRead (1), analogRead (2)));

En este ejemplo, el valor mnimo valor se encuentra en los puertos analgicos 1 y 2, y luego el mnimo de eso y el puerto 0. Esto puede ser ampliado para tantos tems como usted necesite, pero tenga cuidado al ubicar los parntesis correctamente. EL siguiente ejemplo obtiene el mximo de cuatro valores:
int myMaxValue = mx (analogRead (0), mximo (analogRead (1), max (analogRead (2), analogRead (3))));

Vase tambin
Receta 3.5

3.7 Elevando un Nmero a una Potencia


Problema
Usted quiere elevar un nmero a una potencia.

Solucin
pow(x, y) retorna el valor de x elevado a la potencia y:
miValor = pow(3,2);

Este calcula 3 2, as miValor ser igual a 9.

Discusin
La funcin pow puede funcionar en enteros o valores de punto flotante y este retorna el resultado como un valor de punto flotante:
Serial.print(pow (3,2)) / / esto imprime 9.00 int z = pow (3,2); Serial.println (z) / / esto imprime 9

La primera salida es 9.00 y la segundo es 9; estos son no exactamente lo mismo porque la primera impresin visualiza la salida como un nmero de punto flotante nmero y la segunda trata el valor como un entero antes la impresin, y por lo tanto se visualiza sin el punto decimal.

74

Si usted utiliza la funcin pow , usted podria querer leer la Receta 2.3 para entender la diferencia entre estos y valores enteros. Aqu hay un ejemplo de potencia elevada a un nmero a un fraccionario:
float s = pow(2, 1,0 / 12) // la duodcima raz de dos

La duodcima raz de dos es la misma como 2 a la potencia de 0.083333. El valor resultante, s, es 1.05946 (Este es el radio de la frecuencia de dos notas adyacentes en un piano).

3.8 Sacando Cuadrada


Problema

la

Raz

Usted quiere calcular la raz cuadrada de un nmero.

Solucin
La funcin sqrt(x) retorna la raz cuadrada de x:
Serial.print (sqrt (9)); // esto imprime 3.00

Discusin
La funcin sqrt retorna un nmero de punto flotante (Vase la funcin pow discutida en la Receta 3.7).

3.9 Redondeando Nmeros de Punto Flotante


Problema
Usted quiere el prximo valor entero mayor o menor, de un nmero de punto flotante (floor o ceil).

Solucin
floor(x) retorna el anterior valor entero que no es mayor que x. ceil(x) retorna el valor proximo entero que no es menor que x.

Discusin
Estas funciones son usadas para redondear nmeros de punto flotante; utilice floor (x) para conseguir el anterior entero que no sea mayor que x. Utilice ceil para conseguir el proximo entero que sea mayor que x. Aqu hay algunos ejemplos de salidas usando floor:
Serial.println(floor (1)) // esto imprime 1.00 Serial.println(floor (1,1)) // esto imprime 1.00

75

Serial.println(floor(0)) // esto imprime 0.00 Serial.println(floor(0,1)) // esto imprime 0.00 Serial.println(floor(-1)) // esto imprime -1.00 Serial.println(floor(-1,1)) // esto imprime -2.00

Aqu hay algunos ejemplos de salidas usando ceil:


Serial.println(ceil Serial.println(ceil Serial.println(ceil Serial.println(ceil Serial.println(ceil Serial.println(ceil (1)); (1.1)); (0)); (0.1)); (-1)); (-1,1)); // // // // // // esto esto esto esto esto esto imprime 1.00 imprime 2.00 imprime 0,00 imprime 1.00 imprime -1:00 imprime -1:00

Usted redondear al entero ms cercano de la siguiente manera:


if(floatValue> 0,0) result = floor(floatValue + 0,5); else result = ceil(num - 0.5);

Usted puede truncar un nmero de punto flotante nmero por casting (Conversin) a un int, pero este hace no redondea correctamente. Nmeros negativos tal como -1,9 debe redondearse a -2, pero cuando cambia a un int este es redondeado hasta -1. El mismo problema existe con nmeros positivos: 1.9 debera redondearse a 2 pero se redondea a 1. Use floor y ceil para conseguir resultados correctos.

3.10 Usando Funciones Trigonomtricas


Problema
Usted quiere conseguir el seno, coseno, o tangente de un ngulo dado en radianes o grados.

Solucin
sin(x) retorna el seno del ngulo x. cos(x) retorna el coseno del ngulo x. tan(x) retorna la tangente del ngulo x.

Discusin
Los ngulos son especificados en radianes y el resultado es un nmero de punto flotante (Vase la Receta 2.3). El siguiente ejemplo ilustra las funciones trigonomtricas:

float grados = 30 // ngulo en grados float rad = grados * PI/180 // convertir a radianes Serial.println(rad); // imprimir los radianes Serial.println(sin (rad)); // imprime el seno Serial.println(cos (rad)); // imprime el coseno

76

Este convierte los ngulo en radianes e imprime el seno y coseno. Aqu est la salida con anotaciones aadidas:
0.52 30 grados es 0.5235988 radianes, imprimiendo slo se muestra dos decimales 0.50 seno de 30 grados es 0.5000000, aparece aqu con dos decimales 0.87 coseno es 0,8660254, que se redondea hasta 0,87

Aunque el Sketch calcula estos valores usando la completa precisin de nmeros de punto flotante, la rutina Serial.print muestra los nmeros de punto flotante con dos lugares decimales. La conversin desde radianes a grados y viceversa es material de trigonometra. PI es la familiar constante para (3.14159265 ...). PI y 180 son ambas constantes, y Arduino proporciona algunos constantes precalculadas que usted puede utilizar para realizar conversiones grados/radianes:
rad = deg*DEG_TO_RAD // una forma de convertir grados a radianes deg = rad*RAD_TO_DEG // una forma de convertir radianes a grados

Usar grados * DEG_TO_RAD luce ms eficiente que grados*PI/180, pero no lo es, ya que el compilador Arduino compilador es suficientemente inteligente para reconocer que PI/180 es una constante (el que nunca cambiar), as este sustituye el resultado de dividir PI para 180, que pasar a ser el mismo valor de la constante DEG_TO_RAD (0,017453292519 ...). Use cualquiera enfoque que usted prefiera.

Vea tambin
Las referencias Arduino para sin ( http://www.arduino.cc/en/Reference/Sin), cos ( http://ardui no.cc / es / Referencia / Cos), y tan ( http://arduino.cc/en/Reference/Tan)

3.11 Generando Nmeros Aleatorios


Problema
Usted quiere conseguir un nmero aleatorio, cualquiera dentro del rango que va desde cero hasta a un mximo especificado o restringido entre un mnimo y mximo valor que usted proporcione.

Solucin
Use la funcin random para retornar un nmero aleatorio. Llamar random con un solo parmetro configura el lmite superior; el valor devuelto estar en el rango de cero a un valor menor que el lmite superior:
random(max) // devuelve un nmero aleatorio entre 0 y max -1

Llamando azar con dos parmetros conjuntos la inferior y superior lmites; la valores regresado oscilar desde la inferior unida (inclusive) a uno menos que la superior dependiente:
aleatorio (min, max); / / devuelve un nmero aleatorio entre min y max -1

77

You might also like