1
Primeros pasos con Arduino
Tabla de contenido
2
Prefacio Reconocimientos Cómo contactar con nosotros
1. Introducción Público destinatario El diseño de interacción es el diseño de cualquier experiencia interactiva. Qué es la computación física?
2. El Arduino Camino de prototipos Tinkering Parches Circuit Bending Hacks teclado We Love basura! La colaboración de piratería Juguetes
3. La Plataforma Arduino
3
El hardware Arduino 14 pines IO Digital (pines 0-13) 6 análogo en pasadores (pins 0-5)
6 pins Analogue Out (pines 3, 5, 6, 9, 10, y 11)
El software (IDE) Instalación de Arduino en su ordenador Instalación de los controladores: Macintosh Drivers Instalación: Identificación de puertos de Windows: Macintosh Identificación de puertos: Windows
4. Realmente Introducción a Arduino anatomía de un dispositivo interactivo Sensores y Actuadores pestañear un LED a pasar el queso parmesano Arduino no es para Quitters reales manitas Escribir Comentarios El Código, paso a paso lo que vamos a construir lo que es la electricidad?
El uso de un pulsador para controlar el LED ¿Cómo funciona esto? Uno de los circuitos, mil Comportamientos
5. Entrada y Salida avanzada
4
Otro probar On / Off Sensores Los termostatos interruptores interruptores magnéticos (también conocidos como "relés de láminas") Alfombra Interruptores de inclinación
El control de luz con PWM Utilizar un sensor de luz en lugar de la entrada analógica pulsador Probar otros sensores analógicos Comunicación en serie
Manejar cargas más grandes (motores, lámparas, y similares) Sensores complejos
6. Hablando con la salida de la nube digital Salida Salida analógica digital Entrada digital Entrada analógica Planificación de serie Comunicación Codificación
Montaje del Circuito Aquí es cómo montarlo: 7. Solución de problemas
5
Comprensión Comprensión La simplificación y la Exclusión la segmentación y la certeza Prueba de la Junta
Prueba de su Breadboarded Circuito de aislamiento de problemas Problemas con el IDE Cómo Obtener ayuda en pantalla
A. El cortar el pan B. Las resistencias y condensadores de lectura
C. Arduino referencia rápida
6
ESTRUCTURA DE SÍMBOLOS ESPECIALES
; (Punto y coma) {} (llaves) comentarios CONSTANTES VARIABLES
Char booleano byte int
unsigned int largo unsigned long float matriz de doble cadena
ESTRUCTURAS DE CONTROL if ... else para conmutar caso, mientras que hacer ... mientras continúe ruptura de retorno
ARITMÉTICA y fórmulas operadores de comparación
7
Operadores booleanos Los operadores COMPUESTOS
incremento y decremento (- y ++) + =, - =, * = y / = ENTRADA Y SALIDA FUNCIONES pinMode (pin, modo) digitalWrite (pin, valor) int digitalRead (pin) int analogRead (pin) analogWrite (pin, valor) SHIFTOUT (pinDatos, pinReloj, bitOrder, valor) sin firmar largos PulseIn (pin), el valor de las funciones de tiempo
unsigned millis largo () de retardo (ms) delayMicroseconds (US) FUNCIONES MATEMĂ TICAS
min (x, y) max (x, y) abs (x)
limitar (x, a, b) mapa (valor,
fromLow,
fromHigh,
en lo alto)
doble pow (base, exponente) doble sqrt (x) doble sin (rad) cos dobles (rad) doble tan (rad)
8
muy bajo,
FUNCIONES número aleatorio randomSeed (semilla)
de largo aleatorio (max) de largo aleatorio (min, max) COMUNICACIÓN SERIAL Serial.begin (velocidad)
Serial.print (datos) Serial.print (datos, codificación)
Serial.println (datos,
Serial.println (datos) codificación)
int Serial.available () int Serial.read () Serial.flush ()
D. Diagramas esquemáticos de lectura
9
Primeros pasos con Arduino
Massimo Banzi Copyright © 2009 Massimo Banzi libros de O'Reilly pueden ser adquiridos para uso educacional, comercial, o el uso promocional de ventas. Para obtener más información, póngase en contacto con nuestro departamento corporativo / institucional ventas: 800-998-9938 o corporate@oreilly.com .
El logotipo de O'Reilly es una marca comercial registrada de O'Reilly Media, Inc. Marca: Las designaciones serie de proyectos y la imagen comercial son marcas comerciales de O'Reilly Media, Inc. Las marcas comerciales de terceros utilizados en este trabajo son propiedad de sus respectivos propietarios.
Mensaje importante para nuestros lectores: Su seguridad es su propia responsabilidad, incluyendo el uso adecuado del equipo y la seguridad de engranajes, y determinar si usted tiene la habilidad y la experiencia adecuada. Electricidad y otros recursos utilizados para estos proyectos son peligrosos si no se utiliza correctamente y con las precauciones adecuadas, incluyendo el equipo de seguridad. Algunas fotos ilustrativas no representan las precauciones de seguridad o equipos, con el fin de mostrar el proyecto
10
pasos con mayor claridad. Estos proyectos no están destinados para su uso por los niños.
El uso de las instrucciones y sugerencias en Primeros pasos con Arduino es a su propio riesgo. O'Reilly Media, Inc. y el autor declinan toda responsabilidad por cualquier daño, lesión o gasto resultante. Es su responsabilidad asegurarse de que sus actividades cumplan con las leyes aplicables, incluyendo los derechos de autor.
Hacer
11
Prefacio Hace algunos años me dieron un reto muy interesante: enseñar a los diseñadores el mínimo en la electrónica para que pudieran construir prototipos interactivos de los objetos que se diseñan.
Empecé siguiendo un instinto subconsciente para enseñar a la electrónica de la misma manera que me enseñaron en la escuela. Más tarde me di cuenta de que simplemente no estaba funcionando tan bien como me gustaría, y empecé a recordar sentado en una clase, aburrido como el infierno, escuchando a todo lo que la teoría de ser arrojado a mí sin ninguna aplicación práctica para ello.
En realidad, cuando estaba en la escuela que ya sabía la electrónica de una manera muy empírica: muy poca teoría, pero una gran cantidad de experiencia práctica.
Empecé a pensar en el proceso por el cual realmente aprendí la electrónica:
•
Tomé aparte cualquier dispositivo electrónico que podría poner en mis manos.
•
Aprendí poco a poco lo fueron todos esos componentes.
• Empecé a jugar con ellos, cambiando algunas de las
conexiones dentro de ellos y ver lo
12
pasó con el dispositivo: por lo general algo entre una explosión y una nube de humo.
•
•
Empecé a construir algunos kits vendidos por revistas de electrónica.
Combiné dispositivos que había hackeado y reutilizados kits y otros circuitos en los que se encuentran en revistas para obligarlos a hacer cosas nuevas.
Como un niño pequeño, siempre me fascinó descubrir cómo funcionan las cosas; Por lo tanto, he usado de desarmarlas. Esta pasión creció como He orientado cualquier objeto sin usar en la casa y luego lo llevó aparte en pequeños trozos. Con el tiempo, la gente trajo todo tipo de dispositivos para mí para diseccionar. Mis mayores proyectos en ese momento eran un lavavajillas y un ordenador temprano que vino de una compañía de seguros, que tenía un enorme impresora, tarjetas electrónicas, lectores de tarjetas magnéticas, y muchas otras partes que resultó muy interesante y desafiante para tomar completamente aparte.
Después de un buen montón de esta disección, sabía lo que eran los componentes electrónicos y más o menos lo que hicieron. Además de eso, mi casa estaba llena de viejas revistas de electrónica que mi padre debe haber comprado a principios de la década de 1970. Me pasé horas leyendo los artículos y mirando a los diagramas de circuitos sin entender mucho. Este proceso de lectura de los artículos una y otra vez, con el beneficio de los conocimientos adquiridos, teniendo además circuitos, crea un círculo virtuoso lento.
13
Un gran avance se produjo una Navidad, cuando mi padre me dio un kit que permite a los adolescentes a aprender acerca de la electrónica. Cada componente se encuentra en un cubo de plástico que magnéticamente a presión junto con otros cubos, el establecimiento de una conexión; el símbolo electrónico fue escrito en la parte superior. Poco sabía que el juguete fue también un punto de referencia de diseño alemán, porque Dieter Rams diseñado de nuevo en la década de 1960.
Con esta nueva herramienta, que podría poner rápidamente en conjunto circuitos y probarlos para ver qué pasaba. El ciclo de creación de prototipos se hace más corto y más corto. Después de eso, he construido radios, amplificadores, circuitos que producirían ruidos horribles y sonidos agradables, sensores de lluvia y pequeños robots.
He pasado mucho tiempo en busca de una palabra en Inglés que resumir esa forma de trabajar sin un plan específico, a partir de una idea y terminar con un resultado totalmente inesperado. Por último, "retoques" llegó. Reconocí cómo esta palabra ha sido utilizada en muchos otros campos para describir una forma de operar y para representar a las personas que se propusieron en un camino de exploración. Por ejemplo, la generación de directores franceses que dio origen a la "Nouvelle Vague" fueron llamados los "manitas". La mejor definición de retoques que he encontrado nunca viene de una exposición celebrada en el Exploratorium de San Francisco:
Retoques es lo que sucede cuando se intenta algo que no sé muy bien cómo hacerlo, guiada por el capricho, la imaginación,
14
y la curiosidad. Cuando Tinker,
no existen
instrucciones pero también hay fracasos, no hay maneras correctas o incorrectas de hacer las cosas. Se trata de averiguar cómo funcionan las cosas y volver a trabajar ellos.
Artefactos, máquinas, objetos violentamente coincidentes que trabajan en armonía, esta es la materia de retoques. Trasteando es, en su forma más básica, un proceso que se casa jugar y consulta.
- www.exploratorium.edu/tinkering Desde mis primeros experimentos sabía la cantidad de experiencia que le necesita con el fin de ser capaz de crear un circuito que haría lo que quería a partir de los componentes básicos.
Otro avance se produjo en el verano de 1982, cuando fui a Londres con mis padres y pasé muchas horas visitando el Museo de la Ciencia. Que acababa de abrir una nueva ala dedicada a los ordenadores, y siguiendo una serie de experimentos guiadas, aprendí los fundamentos de la matemática binaria y programación.
No me di cuenta de que en muchas aplicaciones, los ingenieros ya la construcción de circuitos de componentes básicos no eran, sino que fueron la implementación de una gran cantidad de la inteligencia en sus productos utilizando microprocesadores. Software estaba reemplazando muchas horas de diseño electrónico, y permitiría un ciclo más corto retoques.
15
Cuando regresé empecé a ahorrar dinero, porque quería comprar un ordenador y aprender a programar. Mi primera y más importante proyecto después de que estaba usando mi equipo ZX81 nuevas para controlar una máquina de soldar. Sé que no suena como un proyecto muy interesante, pero no había una necesidad de ella y fue un gran desafío para mí, porque al igual que había aprendido cómo programar. En este punto, se hizo evidente que la escritura de líneas de código tomaría menos tiempo que la modificación de circuitos complejos.
Una veintena de años más tarde, me gustaría pensar que esta experiencia me permite enseñar a la gente que ni siquiera recordar tomar cualquier clase de matemáticas y de infundir con el mismo entusiasmo y capacidad para retocar que tuve en mi juventud y que tienen mantenido desde entonces.
- Massimo
Expresiones de gratitud Este libro está dedicado a Luisa y Alexandra. En primer lugar quiero agradecer a mis compañeros en el equipo de Arduino: David Cuartielles, David Mellis, Gianluca Martino, y Tom Igoe. Es una experiencia increíble trabajar con ustedes.
dieciséis
Barbara Ghella, ella no lo sabe, pero, sin su consejo precioso, Arduino y este libro no podría haber ocurrido.
Bill Verplank por haberme enseñado a más de Physical Computing.
Gillian Crampton-Smith por darme una oportunidad y por todo lo que he aprendido de ella.
Hernando Barragan para el trabajo que ha hecho en el cableado. Brian Jepson por ser un gran editor y entusiasta desde el principio.
Nancy Kotary, Brian Scott, Terry Bronson, y Patti Schiendelman para convertir lo que escribí en un libro terminado.
Quiero dar las gracias a mucha más gente, pero Brian me dice que estoy quedando sin espacio así que voy a enumerar un pequeño número de personas que tengo que agradecer por muchas razones:
Adam Somlai-Fisher, Ailadi Cortelletti, Alberto Pezzotti, Alessandro Germinasi, Alessandro Masserdotti, Andrea Piccolo, Anna Capellini, Casey Reas, Chris Anderson, Claudio Moderini, Clementina Coppini, Concetta Capecchi, Csaba Waldhauser, Dario Buzzini, Dario Molinari, Dario Parravicini, Donata Piccolo, Edoardo Brambilla, Elisa Canducci, Fabio Violante, Fabio Zanola, Fabricio Pignoloni, Flavio Mauri, Francesca Mocellin, Francesco Monico, Giorgio Olivero, Giovanna Gardi,
17
Giovanni Battistini, Heather Martin, Jennifer Bove, Laura Dellamotta, Lorenzo Parravicini, Luca Rocco, Marco Baioni, Marco Eynard, Maria Teresa Longoni, Massimiliano Bolondi, Matteo Rivolta, Matthias Richter, Maurizio Pirola, Michael Thorpe, Natalia Jordan, Ombretta Banzi, Oreste Banzi, Oscar Zoggia, Pietro Dore, el profesor Salvioni, Raffaella Ferrara, Renzo Giusti, Sandi Athanas, Sara Carpentieri, Sigrid Wiederhecker, Stefano Mirti, Ubi De Feo, Veronika Bucko.
18
Cómo contactarnos Hemos verificado la información de este libro a la medida de nuestras posibilidades, pero usted puede encontrar cosas que han cambiado (o incluso que hemos cometido errores!). Como lector de este libro, nos puede ayudar a mejorar las ediciones futuras mediante el envío de sus comentarios. Por favor, háganos saber acerca de los errores, inexactitudes declaraciones engañosas o confusas, y los errores tipográficos que se encuentran en cualquier parte de este libro. Por favor déjenos saber lo que podemos hacer para que este libro sea más útil para usted. Tomamos en serio sus comentarios y trataremos de incorporar las sugerencias razonables en ediciones futuras.
Puede escribirnos a: Media Maker 1005 carretera de Gravenstein Norte Sebastopol, CA 95472 (800) 998-9938 (en los EE.UU. o Canadá) (707) 829 a 0.515 (internacional / local) (707) 829-0104 (fax)
Media Maker es una división de O'Reilly Media dedicada exclusivamente a la creciente comunidad de personas con recursos que creen que si usted puede imaginarlo, puedes hacerlo. Que consiste en la revista Make, la revista artesanía, la Maker Faire, así como la Hacks, Marca: Proyectos, y el bricolaje Ciencias serie de libros, Media Maker fomenta la
19
Do-it-yourself mentalidad proporcionando inspiración creativa e instrucción. Para obtener más información acerca de Media Maker, visite nuestro sitio Web:
HACER
www.makezine.com
ARTE:
www.craftzine.com
La Maker Faire: www.makerfaire.com
Hacks:
www.hackszine.com
Para hacer comentarios sobre el libro, envía un correo electrónico a
bookquestions@oreilly.com.
El sitio web de O'Reilly Primeros pasos con Arduino enumera ejemplos, erratas, y planes para futuras ediciones. Usted puede encontrar
esta
a
página
www.makezine.com/
getstartedarduino . Para obtener más información acerca de este libro y otros, véase el sitio web de O'Reilly: www.oreilly.com . Para más
información sobre Arduino, foros de discusión y documentación adicional, consulte www.arduino.cc .
20
incluso
Capítulo 1 Introducción Arduino es una plataforma de computación física de código abierto basada en una sencilla placa de entrada / salida (E / S) y un entorno de desarrollo que implementa el lenguaje Processing ( www.processing.org ). Arduino se puede utilizar para desarrollar objetos interactivos autónomos o puede ser conectado a software en su ordenador (como Flash, Processing, VVVV, o Max / MSP). Las placas se pueden montar a mano o comprados pre-ensamblada; el IDE de código abierto (Integrated Development Environment) se puede descargar de forma gratuita desde www.arduino.cc
Arduino es diferente de otras plataformas en el mercado debido a estas características:
• Es un entorno multiplataforma; se puede ejecutar en Windows, Macintosh y Linux.
• Se basa en el IDE de programación Processing, un entorno de desarrollo fácil de usar utilizado por artistas y diseñadores.
• Se programa a través de un cable USB, no un puerto serie. Esta característica es útil, ya que muchos equipos modernos no tienen puertos serie.
• Es el hardware y el software de código abierto, si lo desea, puede descargar el diagrama del circuito, compra
21
todos los componentes, y hacer su propio, sin tener que pagar nada a los fabricantes de Arduino.
•
El hardware es barato. La placa USB cuesta alrededor de 20 € (en la actualidad, alrededor de US $ 35) y su sustitución por un chip quemado en el tablero es fácil y no cuesta más de 5 € o US $ 4. Por lo que puede permitirse el lujo de cometer errores.
• Hay una comunidad activa de usuarios, por lo que hay mucha gente que le pueden ayudar.
• El proyecto Arduino se desarrolló en un ambiente educativo y, por tanto, es muy bueno para los recién llegados a hacer las cosas de trabajo rápidamente. Este libro está diseñado para ayudar a los principiantes a entender cuáles son los beneficios que pueden obtener de aprender a usar la plataforma Arduino y adoptar su filosofía.
Público destinatario Este libro fue escrito para los "originales" Arduino usuarios: diseñadores y artistas. Por lo tanto, se trata de explicar las cosas de una manera que podría conducir a algunos ingenieros loco. En realidad, uno de ellos llamado los capítulos introductorios de mi primer proyecto "pelusa". Ese es precisamente el punto. Seamos realistas: la mayoría de los ingenieros no son capaces de explicar lo que hacen a otro ingeniero, y mucho menos un ser humano normal. Ahora vamos a profundizar en la pelusa.
22
Nota Arduino se basa en el trabajo de tesis Hernando Barragan hizo en la plataforma de cableado mientras se estudia bajo Casey Reas y yo en IDII Ivrea.
Después de Arduino comenzó a popularizarse, me di cuenta de lo experimentadores, aficionados y los piratas informáticos de todo tipo estaban empezando a utilizarlo para crear objetos bellos y locos. Me di cuenta de que eres todos los artistas y diseñadores en su propio derecho, por lo que este libro es para usted también.
Arduino nació para enseñar Interaction Design, una disciplina de diseño que pone de prototipos en el centro de su metodología. Hay muchas definiciones de diseño de interacción, pero el que prefiero es:
El diseño de interacción es el diseño de cualquier experiencia interactiva.
En el mundo actual, diseño de interacción se refiere a la creación de experiencias significativas entre nosotros (los humanos) y los objetos. Es una buena manera de explorar la creación de incluso controvertidos-experiencias hermosas-y tal vez entre nosotros y la tecnología.
Diseño de interacción
23
alienta diseño a través de un proceso iterativo basado en prototipos de
cada vez mayor
fidelidad.
Esta
enfoque también parte de algunos tipos de diseño puede "convencional" extenderse para incluir la creación de prototipos con la tecnología; en particular, la creación de prototipos con la electrónica. El campo específico del diseño de interacción involucrado con Arduino es Physical Computing (o diseño de interacción física).
24
Qué
Físico
Es
¿Informática? Computación físico utiliza la electrónica para crear prototipos de nuevos materiales para los diseñadores y artistas.
Implica el diseño de objetos interactivos que pueden comunicarse con los humanos el uso de sensores y actuadores controlados por un comportamiento implementado como software que se ejecuta dentro de un microcontrolador (un pequeño ordenador en un solo chip).
En el pasado, usando electrónica significaba tener que lidiar con los ingenieros de todo el tiempo, y la construcción de circuitos de un pequeño componente en el momento; estos temas mantienen las personas creativas de jugar un poco con el medio directamente. La mayoría de las herramientas estaban destinados para los ingenieros y un amplio conocimiento requerido.
En los últimos años, los microcontroladores tienen
más barato y más fácil de usar, que permite la creación de mejores herramientas.
El progreso que hemos hecho con Arduino es llevar estas herramientas un poco más a los novatos, permitiendo que la gente comience a cosas edificio después de sólo dos o tres días de un taller.
25
Con Arduino, un diseñador o artista puede llegar a conocer los fundamentos de la electrónica y sensores muy rápidamente y puede comenzar la construcción de prototipos con muy poca inversión.
26
Capítulo 2. El Arduino Camino
La filosofía de Arduino se basa en hacer diseños en lugar de hablar de ellos. Es una constante búsqueda de formas más rápidas y más poderosas para construir mejores prototipos. Hemos explorado muchas técnicas de prototipado y formas de pensar con las manos desarrollado. la ingeniería clásica se basa en un estricto proceso para llegar de A a B; el Arduino manera se deleita en la posibilidad de perderse en el camino y la búsqueda de C en su lugar. Este es el proceso de retoques que tanto nos gusta de jugar con el medio de una manera abierta y encontrar lo inesperado. En esta búsqueda de mejores maneras de construir prototipos, también seleccionaron una serie de paquetes de software que permiten el proceso de manipulación constante del medio de software y hardware.
Las siguientes secciones presentan algunas filosofías, eventos y pioneros que han inspirado el Arduino Láctea.
prototipado Prototipado está en el corazón del Camino de Arduino: hacemos las cosas y construir objetos que interactúan con otros objetos,
27
personas, y redes. Nos esforzamos para encontrar una manera más simple y más rápido para crear prototipos en la forma más barata posible. Una gran cantidad de principiantes se acercan a la electrónica por primera vez piensan que tienen que aprender cómo construir todo desde cero. Esto es un desperdicio de energía: lo que quiere es ser capaz de confirmar que algo está funcionando muy rápidamente por lo que se puede motivarse para dar el siguiente paso o incluso motivar a alguien más para darle una gran cantidad de dinero para hacerlo.
Es por esto que hemos desarrollado "prototipos oportunista": ¿por qué gastar tiempo y generadores de energía de cero, un proceso que requiere tiempo y un profundo conocimiento técnico, cuando podemos tener dispositivos prefabricados y cortar con el fin de explotar el trabajo duro hecho por las grandes empresas y los buenos ingenieros?
Nuestro héroe es James Dyson, que hizo 5127 prototipos de su aspiradora antes de que él estaba convencido de que había conseguido eso
derecho
( www.international.dyson.com/jd/
1947.asp ).
28
Tinkering Creemos que es esencial para jugar con la tecnología, explorando diferentes posibilidades directamente en hardware y software'sometimes sin un objetivo muy definido. La reutilización de la tecnología existente es una de las mejores maneras de retoques. Conseguir los juguetes baratos o equipos desechados de edad y la piratería ellos para obligarlos a hacer algo nuevo es una de las mejores maneras de llegar a grandes resultados.
29
parcheo Siempre he estado fascinado por la modularidad y la capacidad de construir sistemas complejos mediante la conexión de dispositivos simples juntos. Este proceso está muy bien representada por Robert Moog y sus sintetizadores analógicos. Músicos construyen sonidos, tratando de combinaciones sin fin por "parches juntos" diferentes módulos con cables. Este enfoque hacía que el sintetizador como un conmutador telefónico de edad, pero combinado con los numerosos botones, que era la plataforma perfecta para juguetear con el sonido y la música innovadora. Moog describió como un proceso entre "testimonio y descubrir". Estoy seguro de que la mayoría de los músicos en un principio no sabían qué todos esos cientos de perillas hicieron, pero tratado y tratado, refinando su propio estilo sin interrupciones en el flujo.
Reducir el número de interrupciones en el flujo es muy importante para la creatividad, la más transparente el proceso, más retoques sucede.
Esta técnica se ha traducido en el mundo del software por los entornos de programación visual "" como Max, Pure Data, o VVVV. Estas herramientas pueden ser visualizados como "cajas" para las diferentes funcionalidades que proporcionan, permitiendo al usuario construir "parches" mediante la conexión de estas cajas juntas. Estos ambientes permiten el experimento de usuario con la programación sin la constante interrupción típica del ciclo habitual: "tipo de programa,
30
compilar, maldiciรณn, hay un error, reparar el error, compilar, ejecutar". Si son mรกs visualmente mente, recomiendo que usted los pruebe.
31
Circuit Bending
flexión circuito es una de las formas más interesantes de retoques. Es la creatividad cortocircuitos de baja tensión, dispositivos de audio electrónicos que funcionan con baterías, como los pedales de efectos de guitarra, juguetes para niños pequeños, y los sintetizadores para crear nuevos instrumentos musicales y generadores de sonido. El corazón de este proceso es el "arte de la casualidad". Se inició en 1966, cuando Reed Ghazala, por casualidad, un cortocircuito de salida de un amplificador de juguete contra un objeto metálico en el cajón de su escritorio,
32
resultante en una corriente de sonidos inusuales. Lo que me gusta de los dobladores de circuito es su capacidad para crear los dispositivos más salvajes manipulando distancia con la tecnología sin necesidad de entender lo que están haciendo en la parte teórica.
Es un poco como el Sniffin pegamento fanzine que se muestra aquí: durante la era del punk, a sabiendas de tres acordes en una guitarra era suficiente para formar una banda. No deje que los expertos en un campo
33
le dirรก que nunca serรกs uno de ellos. Ignorarlos y la sorpresa.
34
Hacks teclado
35
teclados de computadoras siguen siendo la principal forma de interactuar con un ordenador después de más de 60 años. Alex Pentland, director académico del MIT Media Laboratory, una vez comentó: "Perdone la expresión, pero urinarios de los hombres son más inteligentes que las computadoras Las computadoras están aislados de lo que hay a su alrededor.". [ 1 ]
Como manitas, podemos implementar nuevas formas de interactuar con el software mediante la sustitución de las teclas con los dispositivos que son capaces de percibir el medio ambiente. Desmontar un teclado de computadora revela un dispositivo muy simple (y barato). El corazón de la misma es una pequeña placa. Es normalmente un circuito verde o marrón maloliente con dos juegos de contactos que van a dos capas de plástico que sujetan las conexiones entre las diferentes teclas. Si se quita el circuito y utiliza un cable puente entre dos contactos, verá una letra aparece en la pantalla del ordenador. Si usted va a comprar un detector de detección de movimiento y la conecta a su teclado, verá una tecla que se presiona cada vez que alguien entra en la parte frontal del equipo. Ubicación a su software favorito, y que haya hecho su equipo tan inteligente como un urinario.
[ 1 ] Citado
en Sara Reese Hedberg, "la búsqueda del MIT Media Lab para
ordenadores perceptivos," Sistemas Inteligentes y sus Aplicaciones, IEEE, julio / agosto de 1998.
36
We Love basura! La gente tira mucha tecnología en estos días: las impresoras antiguas, computadoras, máquinas de oficina, equipos técnicos extraños, e incluso muchos de materia militar. Siempre ha habido un gran mercado para esta tecnología excedentes, especialmente entre los jóvenes piratas informáticos y / o más pobres y los que están empezando. Este mercado se hacen evidentes en Ivrea, donde hemos desarrollado Arduino. La ciudad solía ser la sede de la empresa Olivetti. Habían estado haciendo computadoras desde la década de 1960; a mediados de 1990, tiraron todo por la borda en depósitos de chatarra en la zona. Estos están llenos de piezas de computadoras, componentes electrónicos y dispositivos extraños de todo tipo. Pasamos innumerables horas allí, la compra de todo tipo de artilugios por muy poco dinero y la piratería en nuestros prototipos. Cuando usted puede comprar un millar de altavoces por muy poco dinero, usted re obligado a subir con una idea en la final. Acumular basura y pasar por ella antes de empezar a construir algo desde cero.
37
38
Juguetes de piratería Los juguetes son una fantástica fuente de tecnología barata para cortar y volver a usar, como lo demuestra la práctica de la flexión del circuito se mencionó anteriormente. Con la afluencia actual de miles de juguetes muy baratos de alta tecnología de China, se puede construir ideas rápidas con unos gatos ruidosos y un par de espadas de luz. He estado haciendo esto durante unos años para que mis estudiantes a entender que la tecnología no es de miedo o de difícil acceso. Una de mis recursos favoritos es el folleto "Low Tech Sensors and Actuators" por Usman Haque
y Adán Somlai-Fischer ( lowtech.propositions.org.uk ). Creo que se han descrito perfectamente esta técnica en ese manual, y yo he estado usando desde entonces.
39
Colaboración La colaboración entre los usuarios es uno de los principios fundamentales que se en
el Arduino a través del mundo
el
foro en
www.arduino.cc , Personas de diferentes partes del mundo ayudan mutuamente a aprender acerca de la plataforma. El equipo de Arduino anima a la gente a colaborar a nivel local, así ayudando a establecer grupos de usuarios en cada ciudad que visitan. También hemos creado un Wiki llamado "Zona de juegos" ( www.arduino.cc/playground ) Donde los usuarios documentar sus hallazgos. Es tan sorprendente ver la cantidad de conocimiento que estas personas vierten en la web para todo el mundo para su uso. Esta cultura de compartir y ayudar a los demás es una de las cosas que estoy más orgulloso en lo que respecta a Arduino.
40
Capítulo 3. La Plataforma Arduino Arduino se compone de dos partes principales: la placa Arduino, que es la pieza de hardware que trabaja en cuando cree sus objetos; y el IDE Arduino, la pieza de software se ejecuta en el ordenador. Se utiliza el IDE para crear un boceto (un pequeño programa informático) que se carga en la placa Arduino. El dibujo cuenta la tabla de qué hacer.
No hace mucho tiempo, trabajando en el hardware significó la construcción de circuitos a partir de cero, utilizando cientos de diferentes componentes con nombres extraños como resistencia, condensador, inductor, el transistor, y así sucesivamente.
Cada circuito se "conecta" para hacer una aplicación específica, y hacer los cambios que requiere para cortar cables, conexiones de soldadura, y mucho más.
Con la aparición de la tecnología digital microprocesadores,
tecnologías y
estas funciones, que eran una vez
implementado con cables, fueron sustituidos por programas de software.
El software es fácil de modificar que el hardware. Con unas pocas pulsaciones de teclas, puede cambiar radicalmente la lógica de un dispositivo
41
y tratar dos o tres versiones de la misma cantidad de tiempo que le tomaría para soldar un par de resistencias.
El hardware Arduino La placa Arduino es una pequeña placa de desarrollo, que es un pequeño circuito (la junta) que contiene un ordenador todo en un pequeño chip (microcontrolador). Este equipo es al menos mil veces menos potente que el MacBook que estoy usando para escribir esto, pero es mucho más barato y muy útil para construir dispositivos interesantes. Mira a la placa Arduino: verá un chip negro con 28 "patas", es decir chip es el ATmega168, el corazón de su tablero.
Nosotros (el equipo de Arduino) hemos colocado en este tablero todos los componentes que se requieren para este microcontrolador funcione correctamente y para comunicarse con el ordenador. Hay muchas versiones de esta tarjeta; la vamos a utilizar en este libro es el Arduino Duemilanove, que es el más sencillo de utilizar y el mejor para aprender sobre. Sin embargo, estas instrucciones se aplican a las versiones anteriores de la junta, incluyendo la más reciente Arduino Diecimila y el mayor Arduino NG. Figura 3-1 muestra el Arduino Duemilanove; Figura 3-2 muestra el Arduino NG. En esos ejemplos, se ve la placa Arduino. Al principio, todos los conectores podrían ser un poco confuso. He aquí una explicación de lo que hace cada elemento de la tabla:
42
14 pines IO Digital (pines 0-13) Estos pueden ser entradas o salidas, que se especifica mediante el dibujo que se crea en el IDE.
43
6 anĂĄlogo en los pernos (pines 0-5)
Estos pines de entrada analĂłgicas dedicado toman valores analĂłgicos (es decir, lecturas de voltaje de un sensor) y los convierten en un nĂşmero entre 0 y 1.023.
44
6 pins Analogue Out (pines 3,
5, 6, 9, 10, y 11) Estas son en realidad seis de los pines digitales que pueden ser reprogramados para la salida analógica con el dibujo que se crea en el IDE.
La junta puede ser alimentado desde el puerto USB de su ordenador, la mayoría de los cargadores USB o un adaptador de CA (9 voltios recomienda, 2.1mm punta de cuerpo, centro positivo). Si no hay una fuente de alimentación conectada a la toma de corriente, la potencia vendrá de la placa USB, pero tan pronto como se conecta una fuente de alimentación, la junta lo utilizará automáticamente.
Nota NOTA:
Si está utilizando la mayor Arduino-NG o
Arduino Diecimila, tendrá que configurar el puente de selección de alimentación (etiquetado PWR_SEL en el tablero) para especificar EXT (externa) o de alimentación USB. Este puente se puede encontrar entre el enchufe para el adaptador de CA y el puerto USB.
45
La Figura 3-1. El Arduino Duemilanove
46
La Figura 3-2. El Arduino GN
47
El software (IDE) El IDE (Integrated Development Environment) es un programa especial que se ejecuta en su computadora que le permite escribir bocetos para la placa Arduino en un lenguaje sencillo modelada
después
el
Tratamiento
( www.processing.org ) idioma. La magia sucede cuando se presiona el botón que carga el boceto a la junta: el código que ha escrito se traduce en el lenguaje C (que en general es bastante difícil para un principiante a utilizar), y se pasa al compilador avr-gcc , una pieza importante del software de código abierto que hace que la traducción final en el lenguaje entendido por el microcontrolador. Este último paso es muy importante, porque es donde Arduino hace la vida más sencilla al ocultar distancia lo más posible de las complejidades de la programación de microcontroladores.
El ciclo de programación de Arduino es básicamente la siguiente manera:
• Conecte su tarjeta en un puerto USB del ordenador.
• Escribir un boceto que traerá el tablero a la vida. • Sube este bosquejo a la placa a través de la conexión USB y esperar un par de segundos para que la junta se reinicie.
48
• La junta ejecuta el boceto que usted escribió.
Nota NOTA: La instalación de Arduino en Linux se complica un poco en el momento de escribir estas líneas. Ver www.arduino.cc/playground/ Aprendizaje / Linux para obtener instrucciones completas.
49
Instalación de Arduino en el equipo Para programar la placa Arduino, primero debe descargar el entorno de desarrollo (IDE) desde aquí: www.arduino.cc/en/Main/Software . Elegir la versión correcta para su sistema operativo. Descargar el archivo y haga doble clic en él para descomprimirlo; esto creará una carpeta con el nombre arduino- [versión], como Arduino-0012. Arrastre esa carpeta a donde le gustaría que fuera: el escritorio, el / aplicaciones carpeta (en un Mac), o su C: \ Archivos de programa carpeta (en Windows). Ahora, cada vez que desee ejecutar el IDE Arduino, vamos a abrir el Arduino carpeta y haga doble clic en el icono de Arduino. No hacer esto por el momento, sin embargo; hay un paso más para llevar a cabo.
Nota NOTA: Si tiene problemas al ejecutar el Arduino IDE,
ver Capítulo 7 ,
Solución de problemas.
Ahora hay que instalar los controladores que permiten al ordenador para hablar con su tablero a través del puerto USB.
50
Instalación
Controladores:
Macintosh Busca el drivers carpeta dentro de la Arduino-0012 carpeta
y
haga doble clic
FTDIUSBSerialDriver_x_x_x.dmg
el
archivo
llamado
( x_x_x será
ser
reemplazado con el número de versión del controlador, por ejemplo
FTDIUSBSerialDriver_v2_2_9_Intel.dmg). Haga doble clic en el. dmg presentar para montarlo.
Nota Nota: Si está usando un Mac basado en Intel, como un MacBook, MacBook Pro, MacBook Air, Mac Pro o Mac basado en Intel Mini o iMac, asegúrese de instalar el controlador con "Intel" en su nombre, como en
FTDIUSBSerialDriver_v2_2_9_Intel.dmg. Si no está usando un Mac basado en Intel, instale el uno sin "Intel" en su nombre. A continuación, instale el software desde el paquete FTDIUSBSerialDriver haciendo doble clic sobre él. Siga las instrucciones proporcionadas por el instalador y escriba la contraseña de un usuario de administración si se le pide. Al final de este proceso, reinicie su máquina para asegurarse de que los controladores están correctamente cargados. Ahora conecte la tarjeta en su ordenador.
51
La luz PWR en el tablero debe encenderse y el LED amarillo con la etiqueta "L" debe empezar a parpadear. Si no es así, consulte Capítulo 7 , Solución de problemas.
52
Instalación
Controladores:
ventanas Conecte la placa Arduino en el ordenador; cuando la ventana Asistente para hardware nuevo encontrado aparece, Windows primero tratar de encontrar el controlador en el sitio de Windows Update.
Windows XP le preguntará si desea comprobar la actualización de Windows; si no desea utilizar Windows Update, seleccione la opción "No, no en este momento" y haga clic en Siguiente. En la siguiente pantalla, seleccione "Instalar desde una lista o ubicación específica" y haga clic en Siguiente.
Marque la casilla "Incluir esta ubicación en la búsqueda", haga clic en Examinar, seleccione la carpeta en la que instaló Arduino y seleccione la Drivers \
controladores USB FTDI carpeta como la ubicación. Haga clic en Aceptar y, a continuación. Windows Vista primero intentará encontrar el controlador en Windows Update; si eso no funciona, puede indicar que se vea en el Drivers \
controladores USB FTDI carpeta.
Irás a través de este procedimiento dos veces, porque el equipo primero instala el controlador de bajo nivel, a continuación, instala un trozo de código que hace que el tablero como un puerto serie al ordenador.
53
Una vez instalados los controladores, puede iniciar el IDE Arduino y comenzar a usar Arduino. A continuación, debe averiguar qué puerto serie se asigna a la placa Arduino-usted necesita esa información para programar más tarde. Las instrucciones para obtener esta información se encuentran en las siguientes secciones.
54
Puerto
IdentificaciĂłn:
Macintosh En el menĂş Herramientas en el IDE de Arduino, seleccione "Puerto Serie" y seleccione
que comienza con / dev /
el puerto
cu.usbserial-; este es el nombre que el equipo utiliza para referirse a la placa Arduino. Figura 3-3 muestra la lista de puertos.
55
Figura 3-3. lista de los puertos serie del IDE Arduino
56
Puerto
Identificación de
Windows: En Windows, el proceso es un poco más complicado, al menos al principio. Abra el Administrador de dispositivos, haga clic en el menú Inicio, haga clic en Equipo (Vista) o Mi PC (XP), y eligiendo Propiedades. En Windows XP, haga clic en Hardware y seleccione Administrador de dispositivos. En Vista, haga clic en Administrador de dispositivos (como aparece en la lista de tareas en la parte izquierda de la ventana).
Busque el dispositivo Arduino en la lista bajo "Puertos (COM y LPT)". El Arduino aparecerá como un puerto serie USB y tendrá un nombre como COM3, como se muestra en
Figura 3-4 .
57
La Figura 3-4. El Administrador de dispositivos de Windows que muestra todos los puertos serie disponibles
58
Nota Nota: En algunas máquinas Windows, el puerto COM tiene un número mayor que 9; esta numeración crea algunos problemas cuando Arduino está tratando de comunicarse con él. Ver Capítulo 7 , Solución de problemas para obtener ayuda sobre este problema.
Una vez que haya descubierto la asignación de puerto COM, puede seleccionar ese puerto desde el menú Herramientas> puerto serie en el IDE de Arduino.
Ahora el entorno de desarrollo Arduino puede hablar con la placa Arduino y programarlo.
59
Capítulo 4. Realmente
Primeros pasos con Arduino
Ahora usted aprenderá cómo construir y programar un dispositivo interactivo.
Anatomía
de
un
dispositivo interactivo Todos los objetos vamos a construir usando Arduino sigue un patrón muy simple que nosotros llamamos el "dispositivo interactivo". El dispositivo interactivo es un circuito electrónico que es capaz de sentir el medio ambiente utilizando sensores (componentes electrónicos que convierten las mediciones del mundo real en señales eléctricas). El dispositivo procesa la información que recibe de los sensores con el comportamiento que se implementan como software. El dispositivo será capaz de interactuar con el mundo a través de actuadores, componentes electrónicos que pueden convertir una señal eléctrica en una acción física.
60
La Figura 4-1. El dispositivo interactivo
61
Los sensores y actuadores Sensores y actuadores son componentes electrónicos que permiten que una pieza de la electrónica para interactuar con el mundo. A medida que el microcontrolador es un equipo muy simple, que sólo puede procesar señales eléctricas (un poco como los impulsos eléctricos que se envían entre las neuronas en el cerebro). Para que perciben la luz, la temperatura, u otras magnitudes físicas, que necesita algo que puede convertirlos en electricidad. En nuestro cuerpo, por ejemplo, el ojo convierte la luz en señales que son enviadas al cerebro mediante los nervios. En electrónica, podemos utilizar un dispositivo simple llamado una resistencia dependiente de la luz (LDR una o fotorresistencia) que puede medir la cantidad de luz que golpea e informar de ello como una señal que puede ser entendido por el microcontrolador.
Una vez que los sensores han sido leídos, el dispositivo tiene la información necesaria para decidir cómo reaccionar. La toma de decisiones proceso
es
manejado
por
el
microcontrolador, y la reacción se lleva a cabo por medio de actuadores. En nuestro cuerpo, por ejemplo, los músculos reciben señales eléctricas desde el cerebro y los convierten en un movimiento. En el mundo electrónico, estas funciones podrían ser realizadas por una luz o un motor eléctrico. En las siguientes secciones, aprenderá cómo leer sensores de diferentes tipos y controlar diferentes tipos de actuadores.
62
Parpadeo un LED El boceto LED parpadeante es el primer programa que se debe ejecutar para probar si tu placa Arduino está funcionando y está configurado correctamente. También es generalmente el primer ejercicio de programación que alguien hace cuando se está aprendiendo a programar un microcontrolador. Un diodo emisor de luz (LED) es un pequeño componente electrónico que es un poco como una bombilla de luz, pero es más eficiente y requiere tensiones más bajas para operar.
Su placa Arduino viene con un LED preinstalado. Ha marcado "L". También puede añadir su propio LED a conectarlo como se muestra en Figura 4-2 .
K indica el cátodo (negativo), o de entrega más cortos; A indica el ánodo (positivo), o el plomo más tiempo. Una vez que se conecte, la luz, es necesario contar Arduino qué hacer. Esto se hace a través de código, es decir, una lista de instrucciones que damos el microcontrolador para que haga lo que queremos.
63
La Figura 4-2. Conexión de un LED para Arduino
En el ordenador, vaya abra la carpeta en la que copió el IDE Arduino. Haga doble clic en el icono de Arduino para iniciarlo. Seleccione Archivo> Nuevo y se le pedirá que elija un nombre de carpeta boceto: aquí es donde se almacenará el boceto Arduino. Nombralo Blinking_LED y haga clic en OK. A continuación, escriba el texto siguiente ( Ejemplo 4-1 ) En el editor de esquemas de Arduino (la ventana principal del IDE de Arduino).
Tú
poder
además
64
descargar
eso
de
www.makezine.com/getstartedarduino . Debe aparecer como se muestra en Figura 4-3 .
Ejemplo 4-1. LED parpadeante # definen LED 13 // LED conectado a // pin digital 13 void setup () {PinMode (LED, OUTPUT); // establece el // pin digital como salida } Void loop () {DigitalWrite (LED, HIGH); // Enciende el LED // espera una segunda // Enciende el LED off // espera una segunda
retardo (1000); digitalWrite (LED, LOW); retardo (1000); }
sesenta y cinco
La Figura 4-3. El IDE de Arduino con su primer boceto cargado
Ahora que el código está en su IDE, es necesario verificar que es correcta. Presione el botón "Verificar" ( Figura 4-3 muestra su ubicación); Si todo es correcto, aparecerá el mensaje "Done compilación" aparecerá en la parte inferior de la IDE de Arduino. Este mensaje significa que el IDE Arduino ha traducido su dibujo en un programa ejecutable que se puede ejecutar por la junta, un poco como un archivo .exe en Windows o un archivo .app en un Mac.
66
En este punto, puede cargarlo en la pizarra: pulse el botón Cargar en Junta de E / S (ver Figura 4-3 ). Esto restablecerá la junta, lo que obligó a detener lo que está haciendo y escuchar las instrucciones que vienen desde el puerto USB. El IDE de Arduino envía el dibujo actual a la junta, que almacenará en su memoria y, finalmente ejecutarlo.
Verá algunos mensajes aparecen en el área de color negro en la parte inferior de la ventana, y justo encima de esa zona, podrás ver el mensaje "Hecho de subir" aparece para hacerle saber que el proceso ha finalizado correctamente. Hay dos LEDs, marcados RX y TX, en el tablero; éstos parpadean cada vez que un byte es enviado o recibido por la junta. Durante el proceso de carga, mantienen parpadeo.
Si no ve los LED parpadean, o si aparece un mensaje de error en lugar de "subir Hecho", entonces hay un problema de comunicación entre el ordenador y Arduino. Asegúrese de que ha seleccionado el puerto serie correcto (ver Capítulo 3 ) En el menú Tools> Serial Port. Asimismo, compruebe el menú Herramientas> Junta para confirmar que el modelo correcto de Arduino se selecciona allí. Si todavía tiene problemas, compruebe Capítulo 7 , Solución de problemas.
Una vez que el código se encuentra en la placa Arduino, permanecerá allí hasta que coloque otro boceto en él. El boceto sobrevivirá si la junta se reinicia o apaga, un poco como los datos en el disco duro de su ordenador.
67
Suponiendo que el dibujo se ha cargado correctamente, verá el LED "L" se enciende por un segundo y luego se apagará durante un segundo. Si ha instalado un LED separado como se muestra en la espalda Figura 4-2 , Que LED parpadeará, también. Lo que acaba de escribir y corrió es un "programa de ordenador", o croquis, como los programas de Arduino se llaman. Arduino, como he mencionado antes, es un pequeño ordenador, y puede ser programado para hacer lo que quiera. Esto se hace usando un lenguaje de programación para escribir una serie de instrucciones en el IDE de Arduino, lo que lo convierte en un archivo ejecutable de la placa Arduino.
Me siguiente te voy a mostrar cómo entender el boceto. En primer lugar, el Arduino ejecuta el código de arriba a abajo, por lo que la primera línea en la parte superior es la primera lectura; entonces se mueve hacia abajo, un poco como la forma en la barra de reproducción de un reproductor de vídeo como QuickTime Player o Windows Media Player se mueve de izquierda a derecha que muestra dónde en la película que eres.
68
Pass Me parmesano Note la presencia de llaves, que se utilizan para agrupar líneas de código. Estos son particularmente útiles cuando se quiere dar un nombre a un grupo de instrucciones. Si estás en la cena y le preguntas a alguien, "Por favor pásame el queso parmesano," esto se inicia una serie de acciones que se resumen por la pequeña frase que usted acaba de decir. Como seres humanos que somos, todo viene naturalmente, pero todas las pequeñas acciones individuales necesarios para ello se deben explicar a la Arduino, porque no es tan poderoso como nuestro cerebro. Así que para agrupar una serie de instrucciones, que se adhieren a { antes de su código y un después}.
Se puede ver que hay dos bloques de código que se definen de esta manera aquí. Antes de cada uno de ellos hay un comando extraño:
void setup () Esta línea da un nombre a un bloque de código. Si tuviera que escribir una lista de instrucciones que enseñan Arduino cómo pasar el queso parmesano, usted escribiría passTheParmesan anular ()
al principio de un bloque, este bloque y se convertiría en una instrucción que se puede llamar desde cualquier parte del código de Arduino. Estos bloques son llamadas funciones. Si después de esto, se escribe passTheParmesan
() cualquier parte del código, Arduino ejecutará esas instrucciones y continuar donde lo dejó.
69
Arduino
No es
para
que dejaron de fumar Arduino espera dos funciones que existe uno llamado
preparar() Y el uno lazo(). preparar() es donde se pone todo el código que se desea ejecutar una vez al comienzo de su programa y lazo()
contiene el núcleo de su programa, que se ejecuta una y otra vez. Esto se hace porque Arduino no es como sus regulares ordenador no puede ejecutar varios programas al mismo tiempo y los programas no pueden dejar de fumar. Al encender el tablero, el código se ejecuta; cuando se quiere parar, sólo lo apaga.
70
Manitas reales escriben Comentarios Cualquier texto que comienza con // es ignorado por Arduino. Estas líneas son comentarios, que son las notas que usted deja en el programa por sí mismo, de modo que pueda recordar lo que hizo cuando lo escribió, o para otra persona, para que puedan entender su código.
Es muy común (Lo sé porque lo hago todo el tiempo) para escribir una pieza de código, cargarlo en el tablero, y decir "Ok-estoy nunca va a tener que tocar este lechón de nuevo!" sólo para darse cuenta de que seis meses más tarde tiene que actualizar el código o corregir un error. En este punto, se abre el programa, y si no se ha incluido ninguna comentarios en el programa original, se le pensar,
"Wow, ¡qué lío! ¿Por dónde empiezo?" A medida que nos movemos a lo largo, verá algunos trucos sobre cómo hacer sus programas más legible y fácil de mantener.
71
El Código, paso a paso Al principio, es posible considerar este tipo de explicación al innecesaria, un poco como cuando estaba en la escuela y tuve que estudiar Dante Divina Comedia ( cada estudiante italiano tiene que pasar por eso, así como otro libro llamado Los novios, o los novios -OH, las pesadillas). Para cada línea de los poemas, había un centenar de líneas de comentarios! Sin embargo, la explicación será mucho más útil aquí como pasar a escribir sus propios programas.
// Ejemplo 01: LED parpadeante
Un comentario es una manera útil para que escribamos pequeñas notas. El comentario título que precede simplemente nos recuerda que este programa, Ejemplo 4-1 , Parpadea un LED.
# definen LED 13 // LED conectado a // pin digital 13
# definir es como una búsqueda automática y reemplazar su código; en este caso, se está diciendo Arduino para escribir el número 13 cada vez que la palabra LED aparece. La sustitución es el primero que se hace cuando se hace clic en Cargar para verificar o I O Junta (nunca se ven los resultados de la sustitución y cuando se hace detrás de las escenas) /. Estamos utilizando este comando
72
para especificar que el LED parpadea es que estamos conectado al pin de Arduino 13.
voidsetup () Esta línea le dice a Arduino que el siguiente bloque de código se llama preparar().
{ Con este corchete de apertura, un bloque de código comienza.
pinMode (LED, OUTPUT); // establece lo digital // pin como salida Por último, una instrucción muy interesante. pinMode Arduino dice cómo configurar un determinado pin. pines digitales se pueden utilizar como entrada o salida. En este caso, necesitamos un pin de salida para controlar nuestra LED, por lo que ponemos el número del pasador y su modo dentro de los paréntesis.
pinMode es una función, y las palabras (o números) especificados dentro de los paréntesis son argumentos. De entrada y salida son constantes en el lenguaje de Arduino. (Igual que las variables, las constantes son valores asignados, excepto que los valores constantes están predefinidos y nunca cambian.)
} Esta llave de cierre significa el final de la preparar() función.
void loop ()
{
73
lazo() es donde se especifica el comportamiento principal de su dispositivo interactivo. Se repite una y otra vez hasta que cambie la junta fuera. digitalWrite (LED, HIGH);
// Enciende el LED
A medida que el comentario dice, digitalWrite () es capaz de activar (o desactivar) cualquier pin que se ha configurado como una salida. El primer argumento (en este caso, LED) especifica qué pin debe estar encendido o apagado (recordemos que LED es un valor constante que se refiere a la clavija 13, por lo que este es el pin que está conmutada). El segundo argumento puede girar el pasador (ALTO) o apagado (BAJO).
Imagínese que cada pin de salida es una toma de corriente pequeña, como las que ya tienes en las paredes de su apartamento. las europeas son 230 V, los americanos son 110 V, y Arduino trabaja en un modesto 5 V. La magia aquí es cuando el software se convierte en el hardware. Cuando se escribe
digitalWrite (LED, HIGH), resulta el pin de salida de 5 V, y si se conecta un LED, que se iluminará. Así que en este momento de su código, una instrucción en el software hace que algo suceda en el mundo físico mediante el control del flujo de electricidad a la clavija. Encendiendo y apagando el pasador ahora nos permitirá traducir estas en algo más visible para un ser humano; el LED es nuestro actuador.
retardo (1000);
// espera una segunda
Arduino tiene una estructura muy básica. Por lo tanto, si quieres cosas que suceden con cierta regularidad, usted le dice a sentarse en silencio y no hacer nada hasta que es hora de ir al siguiente paso. retrasar() básicamente hace que el procesador de sentarse allí y
74
hacer nada por la cantidad de milisegundos que se pasa como argumento. Milisegundos son miles de segundos; Por lo tanto, 1000 milisegundos es igual a 1 segundo. Por lo que el LED permanece encendido durante un segundo aquí.
digitalWrite (LED, LOW);
// Enciende el LED off
Esta instrucción ahora se apaga el LED que previamente encendido. ¿Por qué usamos altas y bajas? Bueno, es una vieja convención en la electrónica digital. ALTA significa que el pasador está encendido, y en el caso de Arduino, se fijó en 5
V. BAJA significa 0 V. También puede reemplazar estos argumentos mentalmente con ON y OFF. retardo (1000); // espera una segunda A continuación, se demora un segundo más. El LED se apagará durante un segundo.
} Esta llave de cierre marca final de la función de bucle.
En resumen, este programa hace esto:
• Resulta pasador 13 en una salida (solo una vez al principio)
•
Entra en un bucle
•
Los interruptores en el LED conectado al pin 13
• Espera un segundo
75
• Se apaga el LED conectado al pin 13 • Espera un segundo • Vuelve al principio del bucle Espero que no era demasiado doloroso. Vas a aprender más acerca de cómo programar a medida que avanza a través de los ejemplos posteriores. Antes de pasar a la siguiente sección, quiero que juegue con el código. Por ejemplo, reducir la cantidad de retardo, usando diferentes números para los impulsos de encendido y apagado de manera que se pueden ver diferentes patrones de parpadeo. En particular, debería ver lo que sucede cuando usted hace las demoras muy pequeño, pero utiliza diferentes retardos de encendido y apagado ... hay un momento en que sucede algo extraño; esta
"Algo" va a ser muy útil cuando se aprende acerca de la modulación por ancho de pulso más adelante en este libro.
76
Lo que vamos a edificio
Ser
Siempre he estado fascinado por la luz y la capacidad de controlar diferentes fuentes de luz a través de la tecnología. He tenido la suerte de trabajar en algunos proyectos interesantes que implican el control de la luz y por lo que es interactuar con la gente. Arduino es realmente bueno en esto. A lo largo de este libro, vamos a trabajar sobre cómo diseñar lámparas "interactivos", usando Arduino como una manera de aprender los conceptos básicos de cómo los dispositivos se construyen interactiva.
En la siguiente sección, voy a tratar de explicar los fundamentos de la electricidad de una manera que le llevaba un ingeniero, pero no voy a asustar a un nuevo programador Arduino.
77
¿Qué es la electricidad? Si usted ha hecho toda la plomería en el hogar, electrónica no será un problema para que usted pueda entender. Para entender cómo la electricidad y circuitos eléctricos funcionan, la mejor manera es usar algo que se llama la "analogía del agua". Vamos a echar un dispositivo simple, como el ventilador portátil alimentado por batería se muestra en la Figura 4-4 .
78
La Figura 4-4. Un ventilador portátil
Si se toma un ventilador aparte, verá que contiene una pequeña batería, un par de cables, y un motor eléctrico, y que uno de los cables que van al motor se interrumpe por un interruptor. Si usted tiene una pila nueva y encienda el interruptor de encendido, el motor empezará a girar, proporcionando el frío necesario. ¿Como funciona esto? Bueno, imagina que
79
la batería es a la vez un depósito de agua y una bomba, el interruptor es un grifo, y el motor es una de esas ruedas que se ven en los molinos de agua. Al abrir el grifo, el agua fluye desde la bomba y empuja la rueda en movimiento. En este sencillo sistema hidráulico, se muestra en la Figura 4-5 , Dos factores son importantes: la presión del agua (esto se determina por la potencia de la bomba) y la cantidad de agua que fluirá en las tuberías (esto depende del tamaño de los tubos y la resistencia que la rueda proporcionará a la corriente de agua que caen sobre ella).
La Figura 4-5. Un sistema hidráulico
80
Rápidamente se dará cuenta de que si quiere que la rueda gire más rápido, es necesario aumentar el tamaño de las tuberías (pero esto sólo funciona hasta cierto punto) y aumentar la presión que la bomba puede alcanzar. El aumento del tamaño de los tubos permite un mayor flujo de agua para ir a través de ellos; haciéndolos más grande, hemos reducido efectivamente la resistencia de las tuberías para el flujo de agua. Este enfoque funciona hasta cierto punto, en el que la rueda no gire más rápido, debido a que la presión del agua no es lo suficientemente fuerte. Cuando se llega a este punto, es necesario que la bomba sea más fuerte. Este método de acelerar el molino de agua puede seguir así hasta el punto en que la rueda se desmorona debido a que el flujo de agua es demasiado fuerte para ella y que se destruye. Otra cosa que se nota es que a medida que la rueda gira, el eje se calentará un poco, porque no importa lo bien que hemos montado la rueda, la fricción entre el eje y los orificios en el que está montado en generará calor. Es importante entender que en un sistema como este, no toda la energía que la bomba en el sistema se convertirá en movimiento; algunos se perderá en una serie de ineficiencias y generalmente se mostrará como calor que emana de algunas partes del sistema. ¿Cuáles son las partes importantes del sistema? La presión producida por la bomba es uno; la resistencia que ofrecen los tubos y ruedas para el flujo de agua y la corriente real de agua (digamos que esto está representado por el número de litros de agua que fluyen en un segundo) son los otros. La electricidad funciona un poco como el agua. Tiene una especie de bomba (cualquier fuente de energía eléctrica,
81
"gotas" de la electricidad) abajo tubos, que están representados por los cables-algunos dispositivos son capaces de utilizar éstos para producir calor (manta térmica de la abuela), luz (lámpara dormitorio), sonido (su estéreo), el movimiento (su ventilador ), y mucho más.
Así que cuando se lee que el voltaje de una batería es de 9 V, piense de esta tensión como la presión del agua que potencialmente puede ser producida por esta pequeña "bomba". El voltaje se mide en voltios, el nombre de Alessandro Volta, el inventor de la primera batería.
Al igual que la presión del agua tiene un equivalente eléctrico, la velocidad de flujo de agua hace, también. Esto se denomina corriente, y se mide en amperios (después de André-Marie Ampère, electromagnetismo pionero). La relación entre la tensión y la corriente se puede ilustrar mediante la devolución de la rueda de agua: una tensión más alta (presión) le permite girar una rueda más rápido; un caudal mayor (actual) le permite girar una rueda más grande.
Por último, la resistencia opuesta a la circulación de corriente a través de cualquier camino que
eso
viaja se llama-lo has adivinado
IT-resistencia, y se mide en ohmios (después del físico alemán Georg Ohm). Herr Ohm también fue responsable de
ley en electricidad y la única fórmula que realmente necesita recordar. Él fue capaz de demostrar que en un circuito de la tensión, la corriente y la resistencia están relacionados entre sí, y en particular, que la resistencia de una la formulación de
la mayor parte
82
importante
circuito determina la cantidad de corriente que fluirá a través de él, dada una cierta tensión de alimentación. Es muy intuitivo, si se piensa en ello. Tome una batería de 9 V y conectarlo a un circuito simple. Mientras que la corriente de medición, se encuentra que los más resistencias que se agregan al circuito, al menos corriente viajarán a través de él. Volviendo a la analogía del agua que fluye en las tuberías, dado un cierto bomba, si se instala una válvula (que podemos relacionar con una resistencia variable
en electricidad),
cuanto más cierro
el
resistencia al agua creciente válvula de caudal-la menos agua fluirá a través de las tuberías. Ohm resumió su ley en estas fórmulas:
R (resistencia) = V (voltaje) / I (corriente) V = R * II = V / R
Esta es la única regla que realmente tiene que memorizar y aprender a usar, ya que en la mayor parte de su trabajo, este es el único que realmente se necesita.
83
El uso de un botón pulsador para controlar el LED Parpadear un LED fue fácil, pero no creo que se quedara en su sano juicio si su lámpara de escritorio fueron a parpadear continuamente mientras que estaba tratando de leer un libro. Por lo tanto, es necesario aprender a controlarlo. En nuestro ejemplo anterior, el LED fue nuestra actuador, y nuestro Arduino estaba controlando ella. Lo que falta para completar el cuadro es un sensor.
En este caso, vamos a utilizar la forma más simple de sensores disponibles: un pulsador. Si se va a desarmar un pulsador, se vería que se trata de un dispositivo muy simple: dos trozos de metal mantienen separados por un resorte, y una tapa plástica que cuando se pulsa trae los dos trozos de metal en contacto. Cuando los trozos de metal son separados, no hay circulación de corriente en el pulsador (un poco como cuando una válvula de agua está cerrada); cuando nos presiona, hacemos una conexión.
Para supervisar el estado de un interruptor, hay una nueva instrucción de Arduino que vas a aprender: la digitalRead ()
función.
digitalRead () comprueba si hay alguna tensión aplicada al pin que se especifica entre paréntesis,
84
y devuelve un valor de alto o bajo, dependiendo de sus conclusiones. Las otras instrucciones que hemos usado hasta ahora no se han devuelto ninguna información que sólo ejecutan lo que les pidió que hicieran. Pero ese tipo de función es un poco limitado, ya que nos obligará a seguir con secuencias muy predecibles de instrucciones, sin entrada del mundo exterior. Con digitalRead
(), podemos "hacer una pregunta" de Arduino y recibir una respuesta que puede ser almacenada en la memoria algún lugar y se utiliza para tomar decisiones inmediatamente o más tarde. Construir el circuito mostrado en la Figura 4-6 . Para construir este, necesitará obtener algunas partes (éstos serán útiles a medida que trabaja en otros proyectos también):
•
sin soldadura
tablero de circuitos:
Radio Shack
( www.radioshack.com ) Número de pieza 276-002, Shed Maker ( www.makershed.c ) Número de pieza MKKN3. Apéndice A es una introducción a la protoboard sin soldadura.
• Pre-corte kit cable de puente: RadioShack 276-173, máquina de Shed MKKN4
• Una 10K Ohm resistor: RadioShack 271 a 1335 (5-pack), Sparkfun
( www.sparkfun.com )
COM-08374
• Momentánea pulsador táctil: Sparkfun COM-00097
85
Figura 4-6. Conexión de un pulsador
Nota en lugar de comprar cable de puente precortado, también se puede comprar 22 AWG cable de conexión de núcleo sólido en pequeñas bobinas y cortar y pelar usando cortadores de alambre y pelacables.
86
Vamos a echar un vistazo al código que vamos a utilizar para controlar el LED con nuestro botón:
Ejemplo 4-2. Encienda el LED mientras se pulsa el botón
# definir LED 13 // el pasador para el LED # definir BOTÓN 7 // el pin de entrada donde el // pulsador está conectado int val = 0; // val será utilizado para almacenar el estado // del pin de entrada void setup () { pinMode (LED, OUTPUT); // diga Arduino LED es una salida pinMode (botón, INPUT); // y el botón es una entrada} void loop () {
val = digitalRead (botón); // leer el valor de entrada y almacenarlo // comprueba si la entrada (botón pulsado) si (val == HIGH) { digitalWrite (LED, HIGH); // enciende el LED ON} else { digitalWrite (LED, LOW); }}
En Arduino, seleccione Archivo> Nuevo (si tiene otro boceto abierta, es posible que desee guardar en primer lugar). Cuando le pregunta Arduino
a nombre de la nueva carpeta de dibujo,
tipo
PushButtonControl. Escribe el Ejemplo 4-2 código en Arduino (o descargarlo de www.makezine.com/ getstartedarduino y pegarlo en el IDE de Arduino). Si todo es correcto, el LED se ilumina cuando se pulsa el botón.
87
¿Como funciona esto? He introducido dos nuevos conceptos con este programa de ejemplo: funciones que devuelven el resultado de su trabajo y la Si declaración. los Si declaración es posiblemente el más importante de instrucciones en un lenguaje de programación, ya que permite al ordenador (y recuerde,
la Arduino es una pequeña computadora) para tomar decisiones. Después de la Si palabra clave, usted tiene que escribir una "pregunta" paréntesis dentro, y si la "respuesta", o el resultado, es cierto, se ejecutará el primer bloque de código; de lo contrario, se ejecutará el bloque de código después de lo demás. Tenga en cuenta que he utilizado el símbolo == en lugar de =. El primero se utiliza cuando se comparan dos entidades, y devuelve VERDADERO o FALSO; este último asigna un valor a una variable. Asegúrese de que utiliza la correcta, ya que es muy fácil de hacer que el error y utilizar simplemente =, en cuyo caso el programa no va a funcionar. Lo sé, porque después de 25 años de programación, todavía cometer el mismo error.
La celebración de su dedo sobre el botón durante todo el tiempo que necesita la luz no es práctico. Aunque sería hará pensar en la cantidad de energía que está perdiendo cuando usted camina lejos de una lámpara que lo dejó en, tenemos que encontrar la manera de hacer que el botón de "palo".
88
Uno
Circuito,
UN
Comportamientos mil La gran ventaja de la electrónica digital, la electrónica programable más clásicos se convierte ahora evidente: Yo te mostraré cómo poner en práctica muchas diferentes "comportamientos" utilizando el mismo circuito electrónico como en el apartado anterior, con sólo cambiar el software.
Como he mencionado antes, no es muy práctico tener que mantener el dedo sobre el botón para que la luz encendida. Por lo tanto, debemos poner en práctica algún tipo de "memoria", en la forma de un mecanismo de software que va a recordar cuando hemos pulsado el botón y la luz se mantendrá incluso después de que hemos liberado.
Para ello, vamos a utilizar lo que se llama una variable. (Hemos utilizado uno ya, pero no lo hemos explicado.) Una variable es un lugar en la memoria de Arduino que puede almacenar datos. Piense en ello como una de esas notas adhesivas que se utilizan para recordar acerca de algo, como por ejemplo un número de teléfono: se toma una, se escribe "Luisa 02 555 1212" en él, y que se adhieren a su monitor de la computadora o de su refrigerador. En el lenguaje de Arduino, es igualmente simple: sólo tiene que decidir qué tipo de datos que desea guardar (un número o un texto, por ejemplo), darle un nombre, y cuando se quiere, se pueden almacenar los datos o recuperarlo . Por ejemplo:
89
int val = 0;
int significa que la variable almacenará un número entero,
val es el nombre de la variable, y = 0 asigna un valor inicial de cero.
Una variable, como los nombres de los íntimos, se puede modificar cualquier parte del código, para que más tarde en su programa, se podría escribir:
val = 112; lo que vuelve a asignar un nuevo valor, 112, a la variable.
Nota ¿Ha notado que en Arduino, cada instrucción, con una excepción (# definir), termina con un punto y coma? Esto se hace para que el compilador (la parte de Arduino que convierte su boceto en un programa que se puede ejecutar el microcontrolador) sabe que su estado de cuenta está terminado y uno nuevo comienza. Recuerde que debe utilizar todo el tiempo, con exclusión de cualquier línea que comienza con
# definir. Los # definir s se sustituyen por el compilador antes de que el código se traduce en un archivo ejecutable Arduino. En el siguiente programa, val se utiliza para almacenar el resultado de
digitalRead (); Arduino lo recibe de la entrada termina en la variable y permanecerá allí hasta que otra línea de
90
código cambia. Tenga en cuenta que las variables utilizan un tipo de memoria llamada memoria RAM. Es bastante rápido, pero cuando se apaga el tablero, todos los datos almacenados en la memoria RAM se pierde (lo que significa que cada variable se restablece a su valor inicial cuando el tablero se enciende de nuevo). Sus propios programas se almacenan en la memoria flash-este es el mismo tipo que utiliza su teléfono móvil a los números -que tienda de teléfono retiene su contenido incluso cuando la placa se apaga.
Ahora vamos a utilizar otra variable para recordar si el LED debe permanecer encendido o apagado después de que suelte el botón. Ejemplo 4-3 es un primer intento de lograr lo siguiente:
Ejemplo 4-3. Encienda el LED cuando se pulsa el botón y mantenerlo en después de haberlo publicado # definir LED 13 // el pasador para el LED # definir BOTÓN 7 // el pin de entrada donde el // pulsador está conectado int val = 0; // val será utilizado para almacenar el estado // del pin de entrada int estado = 0; // 0 = LED apagado mientras que 1 = LED en void setup () { pinMode (LED, OUTPUT); // diga Arduino LED es una salida pinMode (botón, INPUT); // y el botón es una entrada} void loop () { val = digitalRead (botón); // leer el valor de entrada y almacenarlo // comprueba si la entrada ALTA (botón pulsado) // y cambiar el estado si (val == HIGH) {
STATE = 1 - state; }
91
si (== estado 1) { digitalWrite (LED, HIGH); // enciende el LED ON} else { digitalWrite (LED, LOW); }}
Ahora ve a probar este código. Usted se dará cuenta de que algo funciona .... Usted encontrará que la luz cambia tan rápidamente que no se puede establecer de forma fiable y apaga con una pulsación de botón. Veamos las partes interesantes del código: estado es una variable que almacena ya sea 0 o 1 de recordar si el LED está encendido o apagado. Después de soltar el botón, inicializamos a 0 (LED apagado).
Más tarde, se lee el estado actual del botón, y si se pulsa ( val == ALTO), cambiamos el estado de 0 a 1, o viceversa. Hacemos esto mediante un pequeño truco, como el estado sólo puede ser 1 o 0. El truco que utilizo implica una pequeña expresión matemática basada en la idea de que el 1 - 0 es 1 y 1 1 es 0:
STATE = 1 - state; La línea puede no tener mucho sentido en matemáticas, pero lo hace en la programación. El símbolo = significa "asignar el resultado de lo que está detrás de mí en el nombre de la variable antes que yo", en este caso, el nuevo valor de estado se le asigna el valor de 1 menos el valor antiguo del estado.
92
Más adelante en el programa, se puede ver que usamos estado para averiguar si el LED tiene que ser encendido o apagado. Como ya he mencionado, esto conduce a resultados algo escamosa. Los resultados son escamosa debido a la forma en que leemos el botón. Arduino es muy rápido; ejecuta sus propias instrucciones internas a un ritmo de 16 millones por segundo, que bien podría ser ejecutando unos pocos millones de líneas de código por segundo. Así que esto significa que mientras el dedo está presionando el botón, Arduino podría ser la lectura de la posición del botón de unos pocos miles de veces y cambiando estado en consecuencia. Por lo que los resultados terminan siendo impredecible; podría ser apagado cuando lo quería en, o viceversa. Ya que incluso un reloj roto es correcta dos veces al día, el programa podría mostrar el comportamiento correcto de vez en cuando, pero gran parte del tiempo que va a estar mal.
¿Cómo arreglamos esto? Bueno, tenemos que detectar el momento exacto en que se pulsa el botón, que es el único momento que tenemos que cambiar de estado. La forma en que me gusta hacer es almacenar el valor de val antes de leer un nuevo; esto me permite comparar la situación actual del botón con el anterior y el cambio de estado sólo cuando el botón se vuelve alta después de haber estado BAJO.
Ejemplo 4-4 contiene el código para hacerlo:
Ejemplo 4-4. Encienda el LED cuando se pulsa el botón y mantenerlo en después de haberlo publicado Ahora, con una nueva y mejorada fórmula!
93
# definir LED 13 // el pasador para el LED # definir BOTÓN 7 // el pin de entrada donde el // pulsador está conectado int val = 0; // val será utilizado para almacenar el estado // del pin de entrada int old_val = 0; // Esta variable almacena los últimos // valor de "val" int estado = 0; // 0 = LED apagado y 1 = LED en void setup () { pinMode (LED, OUTPUT); // diga Arduino LED es una salida pinMode (botón, INPUT); // y el botón es una entrada} void loop () {
val = digitalRead (botón); // leer el valor de entrada y almacenarlo // yum, fresca // comprobar si había una transición if ((val == HIGH) && (old_val == LOW)) { STATE = 1 - state; } Old_val = val; // val es ya viejo, vamos a almacenar si (estado == 1) {
digitalWrite (LED, HIGH); // enciende el LED ON} else { digitalWrite (LED, LOW); }}
Prueba de ello: ya casi hemos llegado!
Usted puede haber notado que este enfoque no es del todo perfecto, debido a otro problema con los interruptores mecánicos. Botones pulsadores son dispositivos muy simples: dos trozos de metal mantienen separados por un resorte. Cuando se pulsa el botón, los dos contactos se unen y la electricidad puede fluir. Esta
94
suena bien y simple, pero en la vida real la conexión no es tan perfecta, especialmente cuando el botón no se presiona por completo, y que genera unas señales falsas llamadas de rebote.
Cuando el pulsador está rebotando, la Arduino ve una secuencia muy rápida de dentro y fuera de señales. Hay muchas técnicas desarrolladas para hacer de-rebote, pero en este simple trozo de código que he dado cuenta que por lo general es suficiente para añadir una demora de 10 a 50 milisegundos cuando el código detecta una transición.
Ejemplo 4-5 es el código final:
Ejemplo 4-5. Encienda el LED cuando se pulsa el botón y mantenerlo en después de haberlo publicado incluyendo sencilla de-rebotando Ahora, con otra fórmula nueva y mejorada !! # definir LED 13 // el pasador para el LED # definir BOTÓN 7 // el pin de entrada donde el // pulsador está conectado int val = 0; // val será utilizado para almacenar el estado // del pin de entrada int old_val = 0; // Esta variable almacena los últimos // valor de "val" int estado = 0; // 0 = LED apagado y 1 = LED en void setup () { pinMode (LED, OUTPUT); // diga Arduino LED es una salida pinMode (botón, INPUT); // y el botón es una entrada} void loop () {
val = digitalRead (botón); // leer el valor de entrada y almacenarlo // yum, fresca
95
// comprobar si habĂa una transiciĂłn if ((val == HIGH) && (old_val == LOW)) { STATE = 1 - state; de retardo (10); } Old_val = val; // val es ya viejo, vamos a almacenar si (estado == 1) {
digitalWrite (LED, HIGH); // enciende el LED ON} else { digitalWrite (LED, LOW); }}
96
Capítulo 5. Entrada y Salida avanzada Lo que acabas aprendido en Capítulo 4 son las operaciones más elementales que podemos hacer en Arduino: control de la producción digital y lectura digital de entrada. Si Arduino fuera una especie de lenguaje humano, los habría dos letras de su alfabeto. Considerando que hay sólo cinco letras de este alfabeto, se puede ver cómo mucho más trabajo que tenemos que hacer antes de poder escribir poesía Arduino.
Otro probar On / Off Sensores Ahora que ha aprendido a utilizar un pulsador, usted debe saber que hay muchos otros sensores muy básicas que funcionan según el mismo principio:
interruptores Al igual que un pulsador, pero no cambia automáticamente el estado cuando se libera
97
termostatos Un interruptor que se abre cuando la temperatura alcanza un valor establecido
98
interruptores magnéticos
(además
conocido como "relés de láminas") Tiene dos contactos que se juntan cuando están cerca de un imán; utilizado por las alarmas antirrobo para detectar cuando se abre una ventana
99
interruptores de alfombras Alfombras pequeĂąas que se pueden colocar debajo de una alfombra o un felpudo para detectar la presencia de un ser humano (o gato pesado)
100
Los interruptores basculantes Un componente electrónico simple que contiene dos contactos y una bola de metal poco (o una gota de mercurio, pero no recomienda el uso de aquellos) Un ejemplo de un interruptor de inclinación se denomina un sensor de inclinación. Figura 5-1 muestra el interior de un modelo típico. Cuando el sensor se encuentra en su posición vertical, la pelota tiende un puente sobre los dos contactos, y esto funciona como si se hubiera pulsado un botón pulsador. Cuando inclina este sensor, la bola se mueve, y se abre el contacto, que es justo como si se hubiera lanzado un pulsador. El uso de este componente simple, se puede implementar, por ejemplo, interfaces gestuales que reaccionan cuando un objeto se mueve o se sacude.
101
La Figura 5-1. El interior de un sensor de inclinaciĂłn
Otro sensor que es posible que desee probar el sensor de infrarrojos es como se encuentra en las alarmas antirrobo (tambiĂŠn conocido como un sensor de infrarrojos o PIR pasivo; ver Figura 5-2 ). Este pequeĂąo dispositivo se dispara cuando un ser humano (u otro ser vivo) se mueve dentro de su proximidad. Es una forma sencilla de detectar el movimiento.
102
103
La Figura 5-2. sensor PIR Típica
Ahora debería experimentar examinado todos los posibles dispositivos que tienen dos contactos que se cierran, al igual que el termostato que fija la temperatura de una habitación (utilizar una vieja que ya no está conectado), o simplemente la colocación de dos contactos uno junto al otro y dejando caer agua sobre ellos. Por ejemplo, utilizando el ejemplo final de Capítulo 4
y un sensor PIR, que podría hacer que su lámpara de responder a la presencia de los seres humanos, o se puede utilizar un interruptor de inclinación para construir una que se apaga cuando está inclinada a un lado.
104
El control de luz con PWM
Con el conocimiento que han adquirido hasta ahora, se podría construir un sistema interactivo
lámpara que
puede ser
controlado, y no sólo con un aburrido de encendido / apagado, pero tal vez de una manera que es un poco más elegante. Una de las limitaciones del parpadeo ejemplos que hemos utilizado hasta ahora es que se puede encender la luz sólo en y fuera de LED. Una lámpara interactiva de fantasía tiene que ser regulable. Para resolver este problema, podemos utilizar un pequeño truco que hace que una gran cantidad de cosas tales como la televisión o el cine sea posible: persistencia de la visión.
Como insinué después de que el primer ejemplo en Capítulo 4 , Si cambia los números en la función de retardo hasta que no se ve el LED parpadea más, usted notará que el LED parece estar atenuado en el 50% de su brillo normal. Ahora cambia los números de modo que el LED está encendido es una cuarta parte del tiempo que está fuera. Ejecutar el boceto y verá que el brillo es más o menos 25%. Esta técnica se denomina ancho de pulso modulación (PWM), una forma elegante de decir que si parpadean el LED lo suficientemente rápido, no lo ve parpadear más, pero se puede cambiar su brillo cambiando la relación entre el tiempo y el tiempo libre. Figura 5-3 muestra cómo funciona esto.
105
Esta técnica también funciona con dispositivos que no sean un LED. Por ejemplo, se puede cambiar la velocidad de un motor de la misma manera.
Mientras que la experimentación, se verá que el parpadeo del LED poniendo retrasos en su código es un poco incómodo, porque tan pronto como usted desea leer un sensor o enviar datos en el puerto serie, el LED parpadeará mientras se está esperando a que termine la lectura del sensor. Por suerte, el procesador utilizado por la placa Arduino tiene una pieza de hardware que se puede abrir y cerrar de manera muy eficiente tres LED, mientras que el boceto hace otra cosa. Este hardware se implementa en las patillas 9, 10 y 11, que puede ser controlado por el analogWrite () instrucción.
106
La Figura 5-3. PWM en la acciรณn
107
Por ejemplo, la escritura analogWrite (9128) establecerá el brillo de un LED conectado al pin 9 a 50%. ¿Por qué 128? analogWrite () espera un número entre 0 y 255 como un argumento, donde 255 significa brillo completo y 0 significa off.
Nota Tener tres canales es muy bueno, porque si usted compra LED rojo, verde y azul, se pueden mezclar sus luces y hacer que la luz de cualquier color que te gusta!
Vamos a probarlo. Construir el circuito que se ve en Figura 5-4 . Tenga en cuenta que los LEDs están polarizados: el pasador de largo (positivo) debe ir a la derecha, y el pin corto (negativo) a la izquierda. También, la mayoría de los LEDs tienen un lado negativo aplanada, como se muestra en la figura.
108
La Figura 5-4. LED conectado al pin PWM
A continuación, cree un nuevo boceto en Arduino y el uso ejemplo 5-1 (También se puede descargar ejemplos de código de
www.makezine.com/getstartedarduino :
109
Ejemplo 5-1. Fade un LED de entrada y salida como en un ordenador Apple dormir # definen LED 9 // el PIN de la int LED i = 0; // Usaremos esto para contar hacia arriba y abajo void setup () { pinMode (LED, OUTPUT); // decir Arduino LED es una salida} void loop () {
for (i = 0; i <255; i ++) {// bucle desde 0 a 254 (aumento gradual) analogWrite (LED, i); // ajustar el brillo del LED de retardo (10); // espera 10 ms porque analogWrite // es instantánea y nos // no ver ningún cambio } For (i = 255; i> 0; i--) {// bucle desde 255 a 1 (desvanecimiento) analogWrite (LED, i); // establecer el retardo de brillo del LED (10); // Esperar 10 ms }}
Ahora usted tiene una replicado una característica de lujo de un ordenador portátil (tal vez es un poco de una pérdida de usar Arduino para algo tan simple). de dejar que el uso de este conocimiento para mejorar nuestra lámpara.
Añadir el circuito utilizamos para leer un botón (de nuevo en Capítulo 4 ) A esta placa. Ver si se puede hacer esto sin tener en cuenta la siguiente página, porque yo quiero que empezar a pensar en el hecho de que cada circuito elemental que muestro aquí es un "bloque de construcción" para hacer proyectos más grandes y más grandes. Si tiene que mirar hacia el futuro, no se preocupe; lo más importante es que pasar algún tiempo pensando en cómo podría mirar.
110
Para crear este circuito, se debería combinar el circuito que acaba de construir (se muestra en la Figura 5-4 ) Con el circuito de pulsador se muestra en la Figura 4-6 . Si desea, puede simplemente construir dos circuitos en diferentes partes del tablero; usted tiene un montón de espacio. Sin embargo, una de las ventajas del tablero (ver Apéndice A ) Es que hay un par de carriles de rodadura horizontalmente a través de la parte inferior y superior. Uno es rojo (para el positivo) y la otra de color azul o negro (por tierra).
Estos carriles se utilizan para distribuir la energía y la tierra a donde más se necesita. En el caso del circuito que necesita para construir para este ejemplo, tiene dos componentes (dos de ellos resistencias) que necesitan ser conectado al pin GND (tierra) en el Arduino. Debido a que el Arduino tiene dos pines GND, usted podría simplemente conectar estos dos circuitos exactamente como se muestra en cada una de las dos figuras; simplemente conectar a ambos hasta el Arduino al mismo tiempo. O bien, puede conectar un cable desde la barra de tierra del tablero a uno de los pines GND en el Arduino, y luego tomar los cables que están conectados a GND en las figuras y conectarlos en cambio al carril de tierra placa. Si no está listo para probar esto, no se preocupe: simplemente cablear los dos circuitos de la placa Arduino, como se muestra en las figuras
Figura 4-6 y Figura 5-4 . Usted verá un ejemplo que utiliza los raíles del suelo y breadboard positivo en Capítulo 6 .
Volviendo a esta siguiente ejemplo, si tenemos un solo pulsador, ¿cómo podemos controlar el brillo de una lámpara?
111
Vamos a aprender una nueva técnica de diseño de interacción: detectar cuánto tiempo un botón ha sido presionado. Para ello, necesito actualizar Ejemplo 4-5 de Capítulo 4 añadir atenuación. La idea es construir una "interfaz" en el que una acción de presionar y soltar enciende la luz de encendido y apagado, y una prensa y mantenga acción cambia el brillo. Vamos a echar un vistazo al boceto:
Ejemplo 5-2. Encienda el LED cuando se pulsa el botón y mantenerlo en después de haberlo publicado incluyendo sencilla de-rebote. Si se presiona el botón, el brillo cambios.
# definir LED 9 // el pasador para el LED # definir BOTÓN 7 // pin de entrada del pulsador int val = 0; // almacena el estado de la patilla de entrada int old_val = 0; // almacena el valor anterior de "val" int estado = 0; // 0 = LED apagado mientras que 1 = LED en
int brillo = 128; // Almacena el valor de brillo unsigned long horaInicio = 0; // ¿cuándo empezamos presionando? void setup () { pinMode (LED, OUTPUT); // diga Arduino LED es una salida pinMode (botón, INPUT); // y el botón es una entrada} void loop () {
val = digitalRead (botón); // leer el valor de entrada y almacenarlo // yum, fresca // comprobar si había una transición if ((val == HIGH) && (old_val == LOW)) { STATE = 1 - state; // cambiar el estado de apagado a encendido // o viceversa horaInicio = millis (); // millis () es el reloj Arduino // devuelve el número de milisegundos // transcurrido desde la placa tiene
112
// ha restablecido. // (esta línea recuerda cuando el // botón última pulsación) de retardo (10); } // comprobar si el botón se mantiene pulsado if ((val == HIGH) && (old_val == HIGH)) { // Si el botón se mantiene durante más de 500 ms. si (estado == 1 && (Millis () fecha de inicio)> 500) { brillo ++; // Valor mínimo de brillo por 1 de retardo (10); // retardo para evitar el brillo de ir demasiado rápido // si (brillo> 255) {// 255 es el brillo máximo brillo = 0; // si vamos más de 255 // volvamos a 0 }} } Old_val = val; // val es ya viejo, vamos a almacenar si (estado == 1) {
analogWrite (LED, el brillo); // enciende LED ON en el // nivel de brillo actual } Else { analogWrite (LED, 0); // enciende LED OFF}}
Ahora probarlo. Como se puede ver, nuestro modelo de interacción está tomando forma. Si pulsa el botón y soltarlo de inmediato, se cambia la lámpara encendida o apagada. Si mantiene presionado el botón, cambia el brillo; acaba de dejar ir cuando se ha alcanzado el brillo deseado.
Ahora vamos a aprender cómo utilizar algunos sensores más interesantes.
113
Utilizar un sensor de luz en vez
de
el
Presionar el botĂłn Ahora vamos a hacer un experimento interesante. Tome un sensor de luz, como el ilustrado en Figura 5-5 . Usted puede obtener un paquete de cinco de ellos de RadioShack (nĂşmero de pieza 276-1657).
114
Figura 5-5. resistor dependiente de la luz (LDR)
En la oscuridad, la resistencia de un resistor dependiente de la luz (LDR) es bastante alto. Al brillar un poco de luz en ella, la resistencia disminuye rรกpidamente y se convierte en un razonable buen conductor de la electricidad. Por lo tanto, es una especie de interruptor activado por luz.
115
Construir el circuito que viene con Ejemplo 4-2 (Consulte "Uso de un botón pulsador para controlar el LED" en Capítulo 4 ), A continuación, cargar el código de Ejemplo 4-2 a tu Arduino. Ahora conecte el LDR en el tablero en lugar del pulsador. Usted se dará cuenta de que si se cubre la LDR con las manos, el LED se apaga. Descubre el LDR, y la luz se enciende. Usted sólo ha construido su primer LED verdadera producida por el sensor. Esto es importante porque por primera vez en este libro, estamos utilizando un componente electrónico que no es un dispositivo mecánico simple: se trata de un sensor rica real.
116
entrada analógica Como se vio en la sección anterior, Arduino es capaz de detectar si hay un voltaje aplicado a uno de sus pines e informar de ello a través de la digitalRead
() función. Este tipo de bien / o la respuesta está muy bien en muchas aplicaciones, pero el sensor de luz que hemos usado es capaz de decirnos no sólo si hay luz, sino también la cantidad de luz que hay. Esta es la diferencia entre un encendido / apagado del sensor (que nos dice si algo es allí) y un sensor analógico, cuyo valor cambia continuamente. Para poder leer este tipo de sensor, necesitamos un tipo diferente de alfiler. En la parte inferior derecha de la placa Arduino, verá seis pines marcados "Analog In"; estos son pasadores especiales que nos puede decir no sólo si hay un voltaje aplicado a ellos, pero si es así, también su valor. Mediante el uso de la analogRead ()
función, se puede leer la tensión aplicada a uno de los pasadores. Esta función devuelve un número entre 0 y 1023, lo que representa voltajes entre 0 y 5 voltios. Por ejemplo, si hay una tensión de 2,5 V aplicada al pin número 0, analogRead (0) devuelve 512. Si ahora construir el circuito que se ve en Figura 5-6 , Utilizando una resistencia de 10k, y ejecutar el código que aparece en Ejemplo 5-3 , Verá el LED bordo (también se puede insertar su propio LED en los pines 13 y GND como se muestra en "parpadeo de un LED" en Capítulo 4 ) Parpadear a un ritmo que es dependiente de la cantidad de luz que llega al sensor.
117
Figura 5-6. Un circuito sensor analรณgico
Ejemplo 5-3. Parpadeo del LED a una tasa especificada por el valor de la entrada analรณgica # definir LED 13 // el pasador para el LED int val = 0; // variable que se utiliza para almacenar el valor // procedente del sensor
118
void setup () { pinMode (LED, OUTPUT); // LED es como una salida // Nota: pins analógicos se // establecen automáticamente como entradas} void loop () {
val = analogRead (0); // leer el valor de // el sensor digitalWrite (13, HIGH); // enciende el LED de retardo (val); // detener el programa de // algun tiempo digitalWrite (13, LOW); // enciende el retraso LED apagado (val); // detener el programa de // algun tiempo }
Ahora intenta Ejemplo 5-4 : Pero antes de hacerlo, tendrá que modificar su circuito. Echa un vistazo a Figura 5-4 de nuevo y enganche el LED hasta la patilla 9 como se muestra. Debido a que ya tienes algunas cosas en el tablero, tendrá que encontrar un lugar en el tablero donde el LED, cables, y la resistencia no se solaparán con el circuito de LDR.
Ejemplo 5-4. Ajuste el brillo de LED a un brillo especificado por el valor de
el
entrada analógica # definir LED 9 // el pasador para el LED int val = 0; // variable que se utiliza para almacenar el valor // procedente del sensor void setup () { pinMode (LED, OUTPUT); // LED es como una salida // Nota: pines analógicos se ajustan automáticamente // como entradas}
119
void loop () { val = analogRead (0); // leer el valor de // el sensor analogWrite (LED, val / 4); // enciende el LED en // el brillo ajustado // por el sensor de retardo (10); // detener el programa de // algun tiempo }
Nota especificamos el brillo dividiendo val por 4, porque analogRead () devuelve un nĂşmero hasta 1023, y analogWrite () acepta un mĂĄximo de 255.
120
Pruebe otros sensores analógicos Usando el mismo circuito que ha visto en la sección anterior, se puede conectar una gran cantidad de otros sensores resistivos que trabajan en más o menos la misma manera. Por ejemplo, se puede conectar un termistor, que es un dispositivo simple cuya resistencia cambia con la temperatura. En el circuito, le he mostrado cómo los cambios en la resistencia se convierten en cambios de voltaje que pueden ser medidos por Arduino. Si usted trabaja con un termistor, tenga en cuenta que no hay una conexión directa entre el valor de leer y la temperatura real medida. Si necesita una lectura exacta, debe leer los números que van saliendo de la clavija analógica mientras se mide con un termómetro real. Usted podría poner este lado de los números al lado del otro en una mesa y encontrar una forma de calibrar los resultados analógicas a las temperaturas del mundo real.
Hasta ahora, sólo hemos utilizado un LED como dispositivo de salida, pero ¿cómo leer los valores reales que se Arduino lectura del sensor? No podemos hacer la junta parpadear los valores en código Morse (así, podríamos, pero hay una manera más fácil para los seres humanos para leer los valores). Para ello, podemos tener Arduino hablar con un ordenador a través de un puerto serie, que se describe en la siguiente sección.
121
Comunicación serial Usted aprendió a principios de este libro que Arduino tiene una conexión USB que se utiliza por el IDE para cargar el código en el procesador. La buena noticia es que esta conexión también puede ser utilizado por los bosquejos que escribimos en Arduino para enviar datos al ordenador o para recibir órdenes de él. Para este fin, vamos a utilizar un objeto en serie (un objeto es un conjunto de capacidades que se juntan para la comodidad de la gente que escribe bocetos).
Este objeto contiene todo el código que necesitamos para enviar y recibir datos. Ahora vamos a utilizar el último circuito se construyó con la fotorresistencia y enviar los valores que se leen de nuevo al equipo. Escriba este código en un nuevo dibujo (también se puede descargar el código de
www.makezine.com/getstartedarduino ):
Ejemplo 5-5. Enviar al ordenador los valores leídos de la entrada analógica 0 Asegúrese de hacer clic en "Serial Monitor" después de subir # definir SENSOR 0 // selecciona el pin de entrada para el // resistor sensor int val = 0; // variable para almacenar el valor que viene // desde el sensor void setup () { Serial.begin (9600); // abre el puerto serie para enviar // datos a la computadora en
122
// 9600 bits por segundo } Void loop () { val = analogRead (sensor); // leer el valor de // el sensor Serial.println (val); // imprimir el valor de // el puerto serie retardo (100); // espera 100ms entre // cada envío }
Después de haber subido el código a su Arduino, presione el botón "Serial Monitor" en el IDE de Arduino (el botón más a la derecha en la barra de herramientas); verá los números de rodadura pasado en la parte inferior de la ventana. Ahora, cualquier software que pueda leer desde el puerto serie puede hablar con Arduino. Hay muchos lenguajes de programación que le permiten escribir programas en su ordenador que puede hablar con el puerto serie. procesamiento ( www.processing.org ) Es un gran complemento para Arduino, porque los lenguajes y entornos de desarrollo son tan similares.
123
Manejar cargas más grandes (motores, lámparas, y similares)
Cada uno de los pines en una placa Arduino se puede utilizar para alimentar dispositivos que utilizan hasta 20 miliamperios: esta es una muy pequeña cantidad de corriente, lo suficiente para conducir un LED. Si intenta conducir algo así como un motor, el pasador de inmediato dejar de trabajar, y podría llegar a quemar todo el procesador. Para manejar cargas más grandes, como los motores o incandescente
lámparas, tenemos que utilizar una externa componente que puede cambiar estas cosas dentro y fuera y que es impulsado por un pin de Arduino. Un tal dispositivo se llama un transistor MOSFET-ignorar el divertido nombre, que es un interruptor electrónico que se puede conducir mediante la aplicación de una tensión a uno de sus tres pines, cada uno de los cuales se denomina una portón. Es algo así como el interruptor de la luz que utilizamos en casa, donde la acción de un dedo encender la luz de encendido y apagado se sustituye por un pasador en la placa Arduino que envía voltaje a la puerta del MOSFET.
Nota medio
MOSFET
"Metal-óxido-semiconductor
efecto de campo
transistor." Es un tipo especial de transistor
124
que funciona basándose en el principio de efecto de campo. Esto significa que la electricidad fluirá a través de una pieza de material semiconductor (entre los pasadores de drenaje y fuente) cuando se aplica un voltaje al pin Gate. A medida que la puerta está aislado del resto a través de una capa de óxido de metal, no hay corriente que fluye desde Arduino en el MOSFET, lo que es muy sencilla de interfaz. Son ideales para el encendido y apagado de grandes cargas a altas frecuencias. En Figura 5-7 , Se puede ver como se puede utilizar un MOSFET como el IRF520 para encender y apagar un pequeño motor conectado a un ventilador. También se dará cuenta de que el motor toma su fuente de alimentación del conector de 9 V en la placa Arduino. Este es otro de los beneficios del MOSFET: nos permite conducir los dispositivos cuya fuente de alimentación difiere de la utilizada por Arduino. A medida que el MOSFET está conectado al pin 9, también podemos utilizar
analogWrite () para controlar la velocidad del motor a través de PWM.
125
Sensores complejos Definimos sensores complejas como las que producen un tipo de información que requiere un poco más de una digitalRead () o un analogRead () función a utilizar. Estos por lo general son pequeños circuitos con un pequeño microcontrolador dentro de esa pre procesa la información. Algunos de los sensores complejos disponibles incluyen rangers ultrasónicos, guardas de infrarrojos, y el acelerómetro. Puede encontrar ejemplos de cómo utilizarlos en nuestro sitio web en el "Tutoriales" sección
( www.arduino.cc/en/Tutorial/
Página principal ). Tom Igoe de Making Things Talk ( O'Reilly) tiene una amplia cobertura de estos sensores y muchos otros sensores complejos.
126
La Figura 5-7. Un circuito de motor para Arduino
127
Capítulo 6. Hablar
a
la nube En los capítulos anteriores, ha aprendido los conceptos básicos de Arduino y los bloques fundamentales de construcción disponibles para usted. Permítanme que les recuerde lo que constituye el "Arduino alfabeto":
Salida digital Salida digital Lo usamos para controlar un LED, pero, con el circuito adecuado, que puede ser utilizado para controlar motores, hacer sonidos, y mucho más.
128
Salida analĂłgica Esto nos da la capacidad de controlar el brillo de los LED, no sĂłlo activarlo o desactivarlo. Incluso podemos controlar la velocidad de un motor con ĂŠl.
129
Entrada digital Esto nos permite leer el estado de los sensores simples, como pulsadores o interruptores de inclinaciรณn.
130
Entrada analogica Podemos leer las señales de los sensores que envían una señal continua que no se trata sólo dentro o fuera, como por ejemplo un potenciómetro o un sensor de luz.
131
Comunicación serial Esto nos permite comunicar con un ordenador e intercambiar datos o simplemente un seguimiento de lo que está pasando con el dibujo que se está ejecutando en el Arduino.
En este capítulo, vamos a ver cómo armar una aplicación de trabajo utilizando lo que ha aprendido en los capítulos anteriores. En este capítulo se debe mostrar cómo cada ejemplo se puede utilizar como un bloque de construcción para un proyecto complejo.
Aquí es donde el diseñador aspirante en mí sale. Vamos a hacer que la versión del siglo XXI de una lámpara clásica de mi diseñador favorito italiano, Joe Colombo. El objeto que vamos a construir es inspirada por una lámpara llamada "Aton" de 1964.
132
La Figura 6-1. La lámpara acabada
La lámpara, como se puede ver en Figura 6-1 , Es una simple esfera sentado en una base con un agujero grande para mantener la esfera ruede fuera de su escritorio. Este diseño le permite orientarse la lámpara en diferentes direcciones.
En términos de funcionalidad, queremos construir un dispositivo que conectarse a Internet, ir a buscar la lista actual de artículos en el blog Make ( blog.makezine.com ) Y contar el número de veces que las palabras "paz", "amor", y
133
se mencionan "Arduino". Con estos valores, vamos a generar un color y mostrarlo en la lámpara. La lámpara en sí tiene un botón que podemos utilizar para encenderlo y fuera, y un sensor de luz para la activación automática.
134
Planificación Veamos lo que queremos lograr y lo partes y piezas que necesitamos. En primer lugar, necesitamos Arduino para poder conectarse a Internet. A medida que la placa Arduino sólo tiene un puerto USB, no podemos conectarlo directamente a una conexión a Internet, así que tenemos que encontrar la manera de puente entre los dos. Por lo general, lo que la gente se ejecuta una aplicación en un equipo que va a conectarse a Internet, el proceso de los datos, y enviar algunos Arduino poco simple de la información destilada.
Arduino es un equipo sencillo con una pequeña memoria; que no puede procesar archivos de gran tamaño fácilmente, y cuando nos conectamos a una fuente de alimentación que va a obtener un archivo XML muy detallado que requeriría mucha más memoria RAM. Vamos a implementar un proxy para simplificar el código XML usando el lenguaje de procesamiento.
Tratamiento
El procesamiento es donde Arduino vino. Nos encanta esta lengua y utilizarla enseñar programación para principiantes, así como para construir código hermoso. Procesamiento y Arduino son la combinación perfecta. Otra ventaja es que el procesamiento es de código abierto y se ejecuta en todas las principales plataformas (Mac, Linux y Windows). También puede generar aplicaciones independientes que se ejecutan en esas plataformas. Lo que es más,
el
135
comunidad de procesamiento es animado y servicial, y se pueden encontrar miles de programas de ejemplo prefabricados.
El proxy realiza lo siguiente trabajo para nosotros: se descarga el canal RSS de makezine.com y extrae todas las palabras del archivo XML resultante. A continuación, pasar por todos ellos, se cuenta el número de veces que la "paz", "amor", y "Arduino" aparecen en el texto. Con estos tres números, vamos a calcular un valor de color y enviarlo a Arduino. La junta devolverá la cantidad de luz medida por el sensor y mostrarlo en la pantalla del ordenador.
En cuanto al hardware, combinaremos el ejemplo pulsador, el ejemplo de sensor de luz, el control PWM (multiplicado por 3!) Y la comunicación en serie LED. Como Arduino es un dispositivo simple, tendremos que codificar el color de una manera sencilla. Vamos a utilizar la forma estándar que se representan los colores en HTML: # seguido de seis dígitos hexadecimales.
Los números hexadecimales son muy útiles, ya que cada número de 8 bits se almacena en exactamente dos caracteres; con números decimales esto varía de uno a tres caracteres. La previsibilidad también hace que el código más simple: que esperar hasta que veamos un #, a continuación, leemos los seis caracteres que siguen en una buffer ( una variable usada como un área de almacenamiento temporal de datos). Por último, nos volvemos cada grupo de dos personajes
136
en un byte que representa el brillo de uno de los tres LEDs.
137
Codificación Hay dos bocetos que se le ejecuta: uno de Processing, y un boceto Arduino. Aquí está el código para el boceto de procesamiento. Puede descargarlo desde www.makezine.com/getstartedarduino .
Ejemplo 6-1. Arduino piezas de la lámpara en red del código se inspiran en un blog por Tod E. Kurt (todbot.com)
importar processing.serial. *; alimentación String = "http://blog.makezine.com/index.xml"; int intervalo = 10; // recuperar alimentación cada 60 segundos; int LastTime; // la última vez que fue a buscar el contenido amor int = 0; int paz = 0; int Arduino = 0; int luz = 0; // nivel de luz medida por el puerto de serie de la lámpara; de color c; cs de cuerda;
tampón String = ""; // Acumula caracteres procedentes de la fuente de Arduino pfont; void setup
tamaño (640,480); frameRate (10); // no necesitamos cambios rápidos font = loadFont ( "HelveticaNeue-Bold-32.vlw"); llenar (255); textFont (fuente, 32); // NOTA IMPORTANTE: // El primer puerto serie recuperado por Serial.list () // debe ser su Arduino. Si no es así, elimine la siguiente
138
// línea mediante la supresión de la // ante sí, y volver a ejecutar el boceto // para ver una lista de los puertos serie. Entonces, el cambio del // 0 en el medio [e] para el número de puerto // que su Arduino está conectado. // println (Serial.list ());
Cadena arduinoPort = Serial.list () [0]; port = nueva serie (esto, arduinoPort, 9600); // conectarse a Arduino LastTime = 0; fetchData {
de fondo (c); int n = (intervalo - ((millis () - LastTime) / 1000)); // Construir un color basado en los 3 valores c = color (la paz, el amor, Arduino);
cs = "#" + hex (c, 6); // Preparar una cadena para ser enviado a Arduino texto ( "Arduino en re lámpara", 10,40); texto ( "alimentación de lectura:", 10, 100); texto (alimentación, 10, 140);
texto ( "Próxima actualización en "+ n +" segundos", 10.450); texto ( "paz", 10.200); texto ("" + paz, 130, 200); rect (200.172, la paz, 28); texto ( "amor", 10.240); texto ("" + amor, 130, 240); rect (200.212, el amor, 28); texto ( "Arduino", 10280); texto ("" + Arduino, 130, 280); rect (200252, Arduino, 28);
// escribir la cadena de color al texto de la pantalla ( "enviar", 10, 340); texto (cs, 200340); texto ( "nivel de luz", 10, 380); rect (200, 352, luz / 10.23,28); // esto resulta 1.023 en 100 si (n <= 0) { fetchData (); LastTime = millis ();
139
} Port.write (cs); // enviar datos a Arduino si (port.available ()> 0) {// comprobar si hay datos de espera int inByte = port.read (); // leer un byte si (inByte! = 10) {// si el byte no es nueva línea buffer = tampón + char (inByte); // sólo tiene que añadir al búfer} else {
// nueva línea alcanza, vamos a procesar los datos si (buffer.length ()> 1) {// asegurarse de que no hay suficientes datos // cortar el último carácter, es un retorno de carro // (un retorno de carro es el perso final de una línea de texto //)
buffer = buffer.substring (0, buffer.length () -1); // enciende el búfer de cadena en u número entero = int (tampón); // limpiar el buffer de memoria intermedia para el próximo ciclo de lectura = "";
// probable Estamos quedarse atrás en la toma de lecturas // de Arduino. Así que vamos a eliminar la acumulación de // lecturas de los sensores de entrada para que la próxima lectura es // Fecha hasta al. port.clear (); }}}
FetchData} void () { // usamos estas cadenas para analizar los datos de la cadena de alimentación; trozo de cuerda; // Poner a cero los contadores aman = 0; paz = 0; Arduino = 0; tratar {
URL url = new URL (alimentación); // un objeto para representar la URL
140
// preparar una conexión URLConnection conn = url.openConnection (); conn.connect (); // ahora conectarse al sitio web // esto es un poco de plomería virtual como nos conectamos // los datos procedentes de la conexión a un lector // tamponada que lee los datos de una línea a la vez. BufferedReader en = new
BufferedReader (nuevo InputStreamReader (conn.getInputStream ())); // leer cada líne alimentación, mientras que ((datos = in.readLine ())! = Null) {
StringTokenizer st = (. de datos, "\" <>, () [] ") nueva StringTokenizer; // descomponerlo tiempo (st.hasM ()) { // cada fragmento de datos se hace trozo minúsculas = st.nextToken () toLowerCase ().; si (chunk.indexOf ( "amor")> = 0) // encontró "amor"? amor ++; // Valor mínimo amor por 1 si (chunk.indexOf ( "paz")> = 0) // encontró "paz"? paz ++; // Valor mínimo de la paz por 1 si (chunk.indexOf ( "Arduino")> = 0) // encontró "Arduino"? Arduino ++; // Valor mínimo de Arduino por 1}
} // Set 64 que es el número máximo de referencias que nos importa. si (la paz> 64) paz = 64)
amor = 64; si (Arduino> 64) Arduino = 64; la paz = paz * 4; // multiplicar por 4 de modo que el máximo es 255, amor = amor * 4; // el cual es muy útil cuando la construcción de una Arduino = Arduino * 4; // el color que se hace de 4 bytes (ARGB)} catch (Exception ex) {// se detiene el boceto ex.printStackTrace (); System.out.println ( "ERROR:" + ex.getMessage ()); }}
141
There are two things you need to do before the Processing sketch will run correctly. First, you need to tell Processing to generate the font that we are using for the sketch. To do this, create and save this sketch. Then, with the sketch still opened, click Processing's Tools menu, then select Create Font. Select
the font named HelveticaNeue-Bold, choose 32 for the font size, and then click OK.
Second, you will need to confirm that the sketch is using the correct serial port for talking to Arduino. You'll need to wait until you've assembled the Arduino circuit and uploaded the Arduino sketch before you can confirm this. On most systems, this Processing sketch will run fine. However, if you don't see anything happening on the Arduino and you don't see any information from the light sensor appearing onscreen, find the comment labeled "IMPORTANT NOTE" in the Processing sketch and follow the instructions there. Here is
the Arduino sketch (also available at www.makezine.com/getstartedarduino ):
Example 6-2. Arduino Networked Lamp
# define SENSOR 0 # define R_LED 9 # define G_LED 10 # define B_LED 11 # define BUTTON 12 int val = 0; // variable to store the value coming from the sensor int btn = LOW; int old_btn = LOW
142
int state = 0; char buffer[7] ; int pointer = 0; byte inByte = 0; byte r = 0; byte g = 0; byte b = 0; void setup() {
Serial.begin(9600); // open the serial port pinMode(BUTTON, INPUT); }void loop() { val = analogRead(SENSOR); // read the value from the sensor Serial.println(val); // print the value to // the serial port if (Serial.available() >0) { // read the incoming byte: inByte = Serial.read(); // If the marker's found, next 6 characters are the colour if (inByte == '#') {
while (pointer < 6) { // accumulate 6 chars buffer[pointer] = Serial.read(); // store in the buffer pointer++; // move the pointer forwa } // now we have the 3 numbers stored as hex numbers
// we need to decode them into 3 bytes r, g and b r = hex2dec(buffer[1]) + hex2dec(buf hex2dec(buffer[3]) + hex2dec(buffer[2]) * 16; b = hex2dec(buffer[5]) + hex2dec(buffer[4 = 0; // reset the pointer so we can reuse the buffer }
}btn = digitalRead(BUTTON); // read input value and store it // Check if there was a transition == HIGH) && (old_btn == LOW)){ state = 1 - state; }
143
old_btn = btn; // val is now old, let's store it if (state == 1) { // if the lamp is on analogWrite(R_LED, r); // turn the leds on analogWrite(G_LED, g); // at the colour analogWrite(B_LED, b); // sent by the computer } else {
analogWrite(R_LED, 0); // otherwise turn off analogWrite(G_LED, 0); analogWrite(B_LED, 0); }
delay(100); // wait 100ms between each send }int hex2dec(byte c) { // converts one HEX character into a number if (c >= '0' && c <= '9') { return c - '0'; } else if (c >= 'A' && c <= 'F') { return c - 'A' + 10; } }
144
Assembling the Circuit Figure 6-2 shows how to assemble the circuit. You need to use 10K resistors for all of the resistors shown in the diagram, although you could get away with lower values for the resistors connected to the LEDs. Remember from the PWM example in Chapter 5 that LEDs are polarized: in this circuit, the long pin (positive) should go to the right, and the short pin (negative) to the left. (Most LEDs have a flattened negative side, as shown in the figure.)
145
Figure 6-2. The "Arduino Networked Lamp" circuit
Build the circuit as shown, using one red, one green, and one blue LED. Next, load the sketches into Arduino and Processing, then run the sketches and try it out. If you run into any problems, check Chapter 7 , "Troubleshooting". Now let's complete the construction by placing the breadboard into a glass sphere. The simplest and cheapest
146
way to do this is to buy an IKEA "FADO" table lamp. It's now selling for about US$14.99/ â&#x201A;Ź14.99/ÂŁ8.99 (ahh, the luxury of being European).
Instead of using three separate LEDs, you can use a single RGB LED, which has four leads coming off it. You'll hook it up in much the same way as the LEDs shown in Figure 6-2 , with one change: instead of three separate connections to the ground pin on Arduino, you'll have a single lead (called the "common cathode") going to ground.
SparkFun sells a 4-lead RGB LED for a few dollars ( www.sparkfun.com ; part number COM-00105). Also, unlike discrete single-color LEDs, the longest lead on this RGB LED is the one that goes to ground. The three shorter leads will need to connect to Arduino pins 9, 10, and 11 (with a resistor between the leads and the pins, just as with the separate red, green, and blue LEDs).
147
Here's How to Assemble It:
Unpack the lamp and remove the cable that goes into the lamp from the bottom. You will no longer be plugging this into the wall.
Strap the Arduino on a breadboard and hot-glue the breadboard onto the back of the lamp.
Solder longer wires to the RGB LED and glue it where the lightbulb used to be. Connect the wires coming from the LED to the breadboard (where it was connected before you removed it). Remember that you will only need one connection to ground if you are using a 4-lead RGB LED.
Either find a nice piece of wood with a hole that can be used as a stand for the sphere or just cut the top of the cardboard box that came with the lamp at approximately 5cm (or 2") and make a hole with a diameter that cradles the lamp. Reinforce the inside of the cardboard box by using hot glue all along the inside edges, which will make the base more stable.
Place the sphere on the stand and bring the USB cable out of the top and connect it to the computer.
148
Fire off your Processing code, press the on/off button, and watch the lamp come to life. As an exercise, try to add code that will turn on the lamp when the room gets dark. Other possible enhancements are:
• Add tilt sensors to turn the lamp on or off by rotating it in different directions.
• Add a small PIR sensor to detect when somebody is around and turn it off when nobody is there to watch.
• Create different modes so that you can get manual
control of the colour or make it fade through many colours. Think of different things, experiment, and have fun!
149
Chapter 7. Troubleshooting There will come a moment in your experimentation when nothing will be working and you will have to figure out how to fix it. Troubleshooting and debugging are ancient arts in which there are a few simple rules, but most of the results are obtained through a lot of work.
The more you work with electronics and Arduino, the more you will learn and gain experience, which will ultimately make the process less painful. Don't be discouraged by the problems that you will findâ&#x20AC;&#x201D;it's all easier than it seems at the beginning.
As every Arduino-based project is made both of hardware and software, there will be more than one place to look if something goes wrong. While looking for a bug, you should operate along three lines:
Understanding Understanding Try to understand as much as possible how the parts that you're using work and how they're supposed to contribute
150
to the finished project. This approach will allow you to devise some way to test each component separately.
151
and
Simplification
segmentation The Ancient Romans used to say divide et impera: divide and rule. Try to break down (mentally) the project into its components by using the understanding you have and figure out where the responsibility of each component begins and ends.
152
Exclusion and certainty While investigating, test each component separately so that you can be absolutely certain that each one works by itself. You will gradually build up confidence about which parts of project are doing their job and which ones are dubious.
Debugging is the term used to describe this process as applied to software. The legend says it was used for the first time by Grace Hopper back in the 1940s, when computers where mostly electromechanical, and one of them stopped working because actual insects got caught in the mechanisms.
Many of today's bugs are not physical anymore: they're virtual and invisible, at least in part. Therefore they require a sometimes lengthy and boring process to be identified.
153
Testing the Board What if the very first example, "blink an LED," didn't work? Wouldn't that be a bit depressing? Let's figure out what to do.
Before you start blaming your project, you should make sure that a few things are in order, as airline pilots do when they go through a checklist to make sure that the airplane will be flying properly before takeoff: Plug your Arduino into a USB plug on your computer.
â&#x20AC;˘ Make sure the computer is on (yes, it sounds silly, but it has happened). If the green light marked PWR turns on, this means that the computer is powering the board. If the LED seems very faint, something is wrong with the power: try a different USB cable and inspect the computer's USB port and the Arduino's USB plug to see whether there is any damage. If all else fails, try a different USB port on your computer or a different computer entirely.
â&#x20AC;˘ If the Arduino is brand new, the yellow LED marked L will start blinking in a bit of a nervous pattern; this is the test program that was loaded at the factory to test the board.
154
â&#x20AC;˘ If you have been using an external power supply and are using an old Arduino (Extreme, NG, or Diecimila), make sure that the power supply is plugged in and that the jumper marked SV1 is connecting the two pins that are nearest to the external power supply connector.
Note When you are having trouble with other sketches and need to confirm that the board is functioning, open the first "blink an LED" example in the Arduino IDE and upload it to the board. The on-board LED should blink in a regular pattern.
If you have gone through all these steps successfully, then you can be confident that your Arduino is working correctly.
155
Your
Testing
Breadboarded Circuit Now connect the board to your breadboard by running a jumper from the 5 V and GND connections to the positive and negative rails of the breadboard. If the green PWR LED turns off, remove the wires immediately. This means there is a big mistake in your circuit and you have a "short circuit" somewhere. When this happens, your board draws too much current and the power gets cut off to protect the computer.
Note If you're a concerned that you may damage your computer, remember that on many computers,
the current protection is usually quite good and responds quickly. Also, the Arduino board is fitted with a "PolyFuse," a current-protection device that resets itself when the fault is removed. If you're really paranoid, you can always connect the Arduino board through a self-powered USB hub. In this case, if it all goes horribly wrong, the USB hub is
156
the one that will be pushing up daisies, not your computer.
If you're getting a short circuit, you have to start the "simplification and segmentation" process. What you must do is go through every sensor in the project and connect just one at a time.
The first thing to start from is always the power supply (the connections from 5 V and GND). Look around and make sure that each part of the circuit is powered properly.
Working step by step and making one single modification at a time is the number one rule for fixing stuff. This rule was hammered into my young head by my school professor and first employer, Maurizio Pirola. Every time I'm debugging something and things don't look good (and believe me, it happens a lot), his face pops in my head saying "one modification at a time â&#x20AC;Ś one modification at a time" and that's usually when I fix everything. This is very important, because you will know what fixed the problem (it's all too easy to lose track of which modification actually solved the problem, which is why it's so important to make one at a time).
Each debugging experience will build up in your head a "knowledge base" of defects and possible fixes. And before you know it, you'll become an expert. This will make you look very cool, because as soon as a newbie
157
says "This doesn't work!" you'll give it a quick look and have the answer in a split second.
158
Isolating Problems Another important rule is to find a reliable way to reproduce a problem. If your circuit behaves in a funny way at random times, try really hard to figure out the exact moment the problem occurs and what is causing it. This process will allow you to think about a possible cause. It is also very useful when you need to explain to somebody else what's going on.
Describing the problem as precisely as possible is also a good way to find a solution. Try to find somebody to explain the problem toâ&#x20AC;&#x201D;in many cases, a solution will pop into your head as you articulate the problem. Brian
W. Kernighan and Rob Pike, in The Practice of Programming ( Addison-Wesley, 1999), tell the story of one university that "kept a teddy bear near the help desk. Students with mysterious bugs were required to explain them to the bear before they could speak to a human counselor."
159
Problems with the IDE In some cases, you may have a problem using the Arduino IDE, particularly on Windows. If you get an error when you double-click on the Arduino icon, or if nothing happens, try double-clicking the
run.bat file as an alternative method to launch Arduino. Windows users may also run into a problem if the operating system assigns a COM port number of COM10 or greater to Arduino. If this happens, you can usually convince Windows to assign a lower port number to Arduino. First, open up the Device Manager by clicking the Start menu, right-clicking on Computer (Vista) or My Computer (XP), and choosing Properties. On Windows XP, click Hardware and choose Device Manager. On Vista, click on Device Manager (it appears in the list of tasks on the left of the window).
Look for the serial devices in the list under "Ports (COM & LPT)." Find a serial device that you're not using that is numbered COM9 or lower. Right-click it and choose Properties from the menu. Then, choose the Port Settings tab and click Advanced. Set the COM port number to COM10 or higher, click OK and click OK again to dismiss the Properties dialog.
160
Now, do the same with the USB Serial Port device that represents Arduino, with one change: assign it the COM port number (COM9 or lower) that you just freed up. If these suggestions don't help, or if you're having a problem not described here, check out the Arduino troubleshooting page at www.arduino.cc/en/Guide/ Troubleshooting .
161
How to Get Help Online If you are stuck, don't spend days running around aloneâ&#x20AC;&#x201D;ask for help. One of the best things about Arduino is its community. You can always find help if you can describe your problem well.
Get the habit of cutting and pasting things into a search engine and see whether somebody is talking about it. For example, when the Arduino IDE spits out a nasty error message, copy and paste it into a Google search and see what comes out. Do the same with bits of code you're working on or just a specific function name. Look around you: everything has been invented already and it's stored somewhere on a web page.
For further investigation, start from the www.arduino.cc main website and look at the FAQ ( www.arduino.cc/en/ Main/FAQ ),
then move on to the playground ( www.arduino.cc/playground ), a freely editable wiki that any user can modify to contribute documentation. It's one of the best parts of the whole open source philosophy. People contribute documentation and examples of anything you can do with Arduino. Before you start a project, search the playground and you'll find a bit of code or a circuit diagram to get you started.
If you still can't find an answer that way, search the forum ( www.arduino.cc/cgi-bin/yabb2 ). If that doesn't
162
help, post a question there. Pick the correct board for your problem: there are different areas for software or hardware issues and even forums in five different languages. Please post as much information as you can:
• What Arduino board are you using? • What operating system are you using to run the Arduino IDE?
• Give a general description of what you're trying to do. Post links to datasheets of strange parts you're using.
The number of answers you get depends on how well you formulate your question.
Your chances increase if you avoid these things at all cost (these rules are good for any online forums, not just Arduino's):
• Typing your message all in CAPITALS. It annoys people
a lot and is like walking around with "newbie" tattooed on your forehead (in online communities, typing in all capitals is considered "shouting").
• Posting the same message in several different parts of the forum.
• "Bumping" your message by posting follow-up comments
asking "Hey, how come no one
163
replied?" or even worse, simply posting the text "bump." If you didn't get a reply, take a look at your posting. Was the subject clear? Did you provide a well-worded description of the problem you are having? Were you nice? Always be nice.
• Writing messages like "I want to build a space shuttle using arduino how do I do that". This means that you want people to do your work for you, and this approach is simply not fun for a real tinkerer. It's better to explain what you want to build and then ask a specific question about one part of the project and take it from there.
• A variation of the previous point is when the question is clearly some-thing the poster of the message is getting paid to do. If you ask specific questions people are happy to help, but if you ask them to do all your work (and you don't share the money), the response is likely to be less nice.
• Posting messages that look suspiciously like school assignments and asking the forum to do your homework. Professors like me roam the forums and slap such students with a large trout.
164
Appendix A. The Breadboard The process of getting a circuit to work involves making lots of changes to it until it behaves properly; it's a very fast, iterative process that's something like an electronic equivalent to sketching. The design evolves in your hands as you try different combinations. For the best results, use a system that allows you to change the connections between components in the fastest, most practical, and least destructive way. These requirements clearly rule out soldering, which is a time-consuming procedure that puts components under stress every time you heat them up and cool them down.
The answer to this problem is a very practical device called the solderless breadboard. As you can see from Figure A-1 , it's a small plastic board full of holes, each of which contains a spring-loaded contact. You can push a component's leg into one of the holes, and it will establish an electrical connection with all of the other holes in the same vertical column of holes. Each hole is a distance of 2.54 mm from the others.
Because most of the components have their legs (known to techies as "pins") spaced at that standard distance, chips with multiple legs fit nicely. Not all of the contacts on a breadboard are created equalâ&#x20AC;&#x201D;there are some
165
differences. The top and bottom rows (coloured in red and blue and marked with + and â&#x20AC;&#x201C;) are connected horizontally and are used to carry the power across the board so that when you need power or ground, you can provide it very quickly with a jumper ( a short piece of wire used to connect two points in the circuits). The last thing you need to know about breadboards is that in the middle, there is a large gap that is as wide as the size of a small chip. Each vertical line of holes is interrupted in the middle, so that when you plug in a chip, you don't short-circuit the pins that are on the two sides of the chip. Clever, eh?
Figure A-1. The solderless breadboard
166
Appendix B. Reading
and
Resistors
Capacitors In order to use electronic parts, you need to be able to identify them, which can be a difficult task for a beginner. Most of the resistors that you find in a shop have a cylindrical body with two legs sticking out and have strange coloured markings all around them. When the first commercial resistors were made, there was no way to print numbers small enough to fit on their body, so clever engineers decided that they could just represent the values with strips of coloured paint.
Today's beginners have to figure out a way to interpret these signs. The "key" is quite simple: generally, there are four stripes, and each colour represents a number. One of rings is usually gold-coloured; this one represents the precision of that resistor. To read the stripes in order, hold the resistor so the gold (or silver in some cases) stripe is to the right. Then, read the colours and map them to the corresponding numbers. In the following table, you'll find a translation between the colours and their numeric values.
167
ColourValue
Black 0 Brown 1
Red 2 Orange3
Yellow4 Green 5
Blue 6 Purple 7
Grey 8 White 9 Silver 10%
168
ColourValue
Gold 5% For example, brown, black, orange, and gold markings mean 103±5%. Easy, right? Not quite, because there is a twist: the third ring actually represents the number of zeros in the value. Therefore 1 0 3 is actually 1 0 followed by 3 zeros, so the end result is 10,000 ohms ±5%. Electronics geeks tend to shorten values by expressing them in kilo ohm (for thousands of ohms) and mega ohms (for millions of ohms), so a 10,000 ohm resistor is usually shortened to 10k, while 10,000,000 becomes 10M. Please note that because engineers are fond of optimising everything, on some schematic diagrams you might find values expressed as 4k7, which means 4.7 kilo ohms, or 4700.
Capacitors are a bit easier: the barrel-shaped capacitors (electrolytic capacitors) generally have their values printed on them. A capacitor's value is measured in farads (F), but most capacitors that you encounter will be measured in micro farads (μF). So if you see a capacitor labelled 100 μF, it's a 100 micro farad capacitor. Many of the disc-shaped capacitors (ceramic capacitors) do not have their units listed, and use a three-digit numeric code indicating the number of pico farads (pF). There are 1,000,000 pF in one μF. Similar to the resistor codes, you use the third number to determine the number
169
of zeros to put after the first two, with one difference: if you see 0â&#x20AC;&#x201C;5, that indicates the number of zeros. 6 and 7 are not used, and 8 and 9 are handled differently. If you see 8, multiply the number that the first two digits form by 0.01, and if you see 9, multiply it by 0.1. So, a capacitor labelled 104 would be 100,000 pF or 0.1 ÎźF. A capacitor labeled 229 would be 2.2 pF.
170
Appendix C. Arduino Quick Reference Here is a quick explanation of all
the standard
instructions supported by the Arduino language. For a more detailed reference, see: arduino.cc/en/ Reference/HomePage
STRUCTURE An Arduino sketch runs in two parts: void setup()
This is where you place the initialisation codeâ&#x20AC;&#x201D;the instructions that set up the board before the main loop of the sketch starts.
void loop()
This contains the main code of your sketch. It contains a set of instructions that get repeated over and over until the board is switched off.
171
SPECIAL SYMBOLS Arduino includes a number of symbols to delineate lines of code, comments, and blocks of code.
; (semicolon) Every instruction (line of code) is terminated by a semicolon. This syntax lets you format the code freely. You could even put two instructions on the same line, as long as you separate them with a semicolon. (However, this would make the code harder to read.) Example:
delay(100);
172
{} (curly braces) This is used to mark blocks of code. For example, when you write code for the loop() function, you have to use curly braces before and after the code. Example:
void loop() { Serial.println("ciao"); }
173
comments These are portions of text ignored by the Arduino processor, but are extremely useful to remind yourself (or others) of what a piece of code does. There are two styles of comments in Arduino:
// single-line: this text is ignored until the end of the line /* multiple-line: you can write a whole poem in here */
174
CONSTANTS Arduino includes a set of predefined keywords with special values. HIGH and LOW are used, for example, when you want to turn on or off an Arduino pin. INPUT and OUTPUT are used to set a specific pin to be either and input or an output
true and false indicate exactly what their names suggest: the truth or falsehood of a condition or expression.
175
VARIABLES Variables are named areas of the Arduino's memory where you can store data that you can use and manipulate in your sketch. As the name suggests, they can be changed as many times as you like.
Because Arduino is a very simple processor, when you declare a variable you have to specify its type. This means telling the processor the size of the value you want to store. Here are the datatypes that are available:
boolean Can have one of two values: true or false.
176
char Holds a single character, such as A. Like any computer, Arduino stores it as a number, even though you see text. When chars are used to store numbers, they can hold values from â&#x20AC;&#x201C;128 to 127.
Note There are two major sets of characters available on computer systems: ASCII and UNICODE. ASCII is a set of 127 characters that was used for, among other things, transmitting text between serial terminals and
time-shared computer systems
such as mainframes
and
minicomputers. UNICODE is a much larger set of values used by modern computer operating systems to represent characters in a wide range of languages. ASCII is still useful for exchanging short bits of information in languages such as Italian or English that use Latin characters, Arabic numerals, and common typewriter symbols for punctuation and the like.
177
byte Holds a number between 0 and 255. As with chars, bytes use only one byte of memory.
178
int Uses 2 bytes of memory to represent a number between
â&#x20AC;&#x201C; 32,768 and 32,767; it's the most common data type used in Arduino.
179
unsigned int Like int, uses 2 bytes but the unsigned prefix means that it can't store negative numbers, so its range goes from 0 to 65,535.
180
long This is twice the size of an int and holds numbers from
â&#x20AC;&#x201C; 2,147,483,648 to 2,147,483,647.
181
unsigned long Unsigned version of
long;
4,294,967,295.
182
it goes from 0 to
float This quite big and can hold floating-point values, a fancy way of saying that you can use it to store numbers with a decimal point in it. It will eat up 4 bytes of your precious RAM and the functions that can handle them use up a lot of code memory as well. So use floats sparingly.
183
double Double-precision floating-point number, with a maximum value of 1.7976931348623157 x 10 308. Wow, that's huge!
184
string A set of ASCII characters that are used to store textual information (you might use a string to send a message via a serial port, or to display on an LCD display). For storage, they use one byte for each character in the string, plus a null character to tell Arduino that it's the end of the string. The following are equivalent:
char string1[] = "Arduino"; // 7 chars + 1 null char char string2[8] = "Arduino"; // Same as above
185
array A list of variables that can be accessed via an index. They are used to build tables of values that can easily be accessed. For example, if you want to store different levels of brightness to be used when fading an LED, you could create six variables called light01, light02, and so on. Better yet, you could use a simple array like:
int light[6] = {0, 20, 50, 75, 100};
The word "array" is not actually used in the variable declaration: the symbols [] and {} do the job.
186
CONTROL STRUCTURES Arduino includes keywords for controlling the logical flow of your sketch.
if â&#x20AC;Ś else This structure makes decisions in your program. if must be followed by a question specified as an expression contained in parentheses. If the expression is true, whatever follows will be executed. If it's false, the block of code following else will be executed. It's possible to use just if without providing an else clause. Example:
if (val == 1) { digitalWrite(LED,HIGH); }
187
for Lets you repeat a block of code a specified number of times. Example:
for (int i = 0; i < 10; i++) { Serial.print("ciao"); }
188
switch case The if statement is like a fork in the road for your program. switch case is like a massive roundabout. It lets your program take a variety of directions depending on the value of a variable. It's quite useful to keep your code tidy as it replaces long lists of if statements. Example:
switch (sensorValue) { case 23: digitalWrite(13,HIGH); break; case 46: digitalWrite(12,HIGH); break; default: // if nothing matches this is executed digitalWrite(12,LOW); digitalWrite(13,LOW); }
189
while Similar to if, this executes a block of code while a certain condition is true. Example:
// blink LED while sensor is below 512 sensorValue = analogRead(1); while (sensorValue < 512) { digitalWrite(13,HIGH); delay(100); digitalWrite(13,HIGH); delay(100); sensorValue = analogRead(1); }
190
do â&#x20AC;Ś while Just like while, except that the code is run just before the the condition is evaluated. This structure is used when you want the code inside your block to run at least once before you check the condition. Example:
do { digitalWrite(13,HIGH); delay(100); digitalWrite(13,HIGH); delay(100); sensorValue = analogRead(1); } while (sensorValue < 512);
191
break This term lets you leave a loop and continue the execution of the code that appears after the loop. It's also used to separate the different sections of a switch case statement. Example:
// blink LED while sensor is below 512 do { // Leaves the loop if a button is pressed if (digitalRead(7) == HIGH) break; digitalWrite(13,HIGH); delay(100); digitalWrite(13,HIGH); delay(100); sensorValue = analogRead(1); } while (sensorValue < 512);
192
continue When used inside a loop, continue lets you skip the rest of the code inside it and force the condition to be tested again. Example:
for (light = 0; light < 255; light++) {// skip intensities between 140 and 200 if ((x > 140) && (x < 200)) continue; analogWrite(PWMpin, light); delay(10); }
193
return Stops running a function and returns from it. You can also use this to return a value from inside a function. For example,
if you have a function called computeTemperature() and you want to return the result to the part of your code that invoked the function you would write something like:
int computeTemperature() { int temperature = 0; temperature = (analogRead(0) + 45) / 100; return temperature; }
194
AND
ARITHMETIC
FORMULAS You can use Arduino to make complex calculations using a special syntax. + and â&#x20AC;&#x201C; work like you've learned in school, and multiplication is represented with an * and division with a /.
There is an additional operator called "modulo" (%), which returns the remainder of an integer division. You can use as many levels of parentheses as necessary to group expressions. Contrary to what you might have learned in school, square brackets and curly brackets are reserved for other purposes (array indexes and blocks, respectively). Examples:
a = 2 + 2; light = ((12 * sensorValue) - 5 ) / 2; remainder = 3 % 2; // returns 2 because 3 / 2 has remainder 1
195
COMPARISON OPERATORS When you specify conditions or tests for if, while, and for statements, these are the operators you can use: == equal to != not equal to < less than
> greater than <= less than or equal to
> = greater than or equal to
196
BOOLEAN OPERATORS These are used when you want to combine multiple conditions. For example, if you want to check whether the value coming from a sensor is between 5 and 10, you would write:
if ((sensor => 5) && (sensor <=10))
There are three operators: and, represented with &&; or, represented with ||; and finally not, represented with !.
197
COMPOUND OPERATORS These are special operators used to make code more concise for some very common operations like incrementing a value. For example, to increment value by 1 you would write: value = value +1;
but using a compound operator, this becomes: value++;
increment and decrement (–– and ++)
These increment or decrement a value by 1. Be careful, though. If you write i++ this increments i by 1 and evaluates to the equivalent of i+1; ++i evaluates to the value of i then increments i. The same applies to ––.
198
+ = , â&#x20AC;&#x201C;=, *= and /= These make it shorter to write certain expressions. The following two expressions are equivalent: a = a + 5; a += 5;
199
INPUT AND OUTPUT FUNCTIONS Arduino includes functions for handling input and output. You've already seen some of these in the example programs throughout the book.
pinMode(pin, mode) Reconfigures a digital pin to behave either as an input or an output. Example:
pinMode(7,INPUT); // turns pin 7 into an input
200
digitalWrite(pin, value) Turns a digital pin either on or off. Pins must be explicitly made into an output using pinMode before digitalWrite will have any effect. Example: digitalWrite(8,HIGH); // turns on digital pin 8
201
int digitalRead(pin) Reads the state of an input pin, returns HIGH if the pin senses some voltage or LOW if there is no voltage applied. Example:
val = digitalRead(7); // reads pin 7 into val
202
int analogRead(pin) Reads the voltage applied to an analog input pin and returns a number between 0 and 1023 that represents the voltages between 0 and 5 V. Example:
val = analogRead(0); // reads analog input 0 into val
203
analogWrite(pin, value) Changes the PWM rate on one of the pins marked PWM.
pin may be 11,10, 9, 6, 5, 3. value may be a number between 0 and 255 that represents the scale between 0 and 5 V output voltage. Example:
analogWrite(9,128); // Dim an LED on pin 9 to 50%
204
clockPin,
shiftOut(dataPin,
bitOrder, value) Sends data to a shift register, devices that are used to expand the number of digital outputs. This protocol uses one pin for data and one for clock. bitOrder indicates the ordering of bytes (least significant or most significant) and value is the actual byte to be sent out. Example:
shiftOut(dataPin, clockPin, LSBFIRST, 255);
205
unsigned long pulseIn(pin, value)
Measures the duration of a pulse coming in on one of the digital inputs. This is useful, for example, to read some infrared sensors or accelerometers that output their value as pulses of changing duration. Example:
time = pulsein(7,HIGH); // measures the time the next // pulse stays high
206
TIME FUNCTIONS Arduino includes functions for measuring elapsed time and also for pausing the sketch.
unsigned long millis() Returns the number of milliseconds that have passed since the sketch started. Example:
duration = millis()-lastTime; // computes time elapsed since "lastTime"
207
delay(ms) Pauses the program for the amount of milliseconds specified. Example:
delay(500); // stops the program for half a second
208
delayMicroseconds(us) Pauses
the program for
the given amount of
microseconds. Example: delayMicroseconds(1000); // waits for 1 millisecond
209
MATH FUNCTIONS Arduino includes many common mathematical and trigonometric functions:
min(x, y) Returns the smaller of x and y.
Example: val = min(10,20); // val is now 10
210
max(x, y) Returns the larger of x and y.
Example: val = max(10,20); // val is now 20
211
abs(x) Returns the absolute value of x, which turns negative numbers into positive. If x is 5 it will return 5, but if x is
â&#x20AC;&#x201C; 5, it will still return 5. Example: val = abs(-5); // val is now 5
212
constrain(x, a, b) Returns the value of x, constrained between a and b. If x is less than a, it will just return a and if x is greater than b,
it will just return b. Example: val = constrain(analogRead(0), 0, 255); // reject values bigger than 255
213
fromLow,
map(value,
fromHigh, toLow, toHigh) Maps a value in the range fromLow and maxLow to the range toLow and toHigh. Very useful to process values from analogue sensors. Example:
val = map(analogRead(0),0,1023,100, 200); // maps the value of
// analog 0 to a value // be and 200
214
double pow(base, exponent) Returns the result of raising a number ( base) to a value ( exponent).
Example: double x = pow(y, 32); // sets x to y raised to the 32nd power
215
double sqrt(x) Returns the square root of a number. Example:
double a = sqrt(1138); // approximately 33.73425674438
216
double sin(rad) Returns the sine of an angle specified in radians. Example:
double sine = sin(2); // approximately 0.90929737091
217
double cos(rad) Returns the cosine of an angle specified in radians. Example:
double cosine = cos(2); // approximately -0.41614685058
218
double tan(rad) Returns the tangent of an angle specified in radians. Example:
double tangent = tan(2); // approximately -2.18503975868
219
NUMBER
RANDOM
FUNCTIONS If you need to generate random numbers, you can use Arduino's pseudorandom number generator.
randomSeed(seed) Resets Arduino's pseudorandom number generator. Although the distribution of the numbers returned by random() is essentially random, the sequence is predictable. So, you should reset the generator to some random value. If you have an unconnected analog pin, it will pick up random noise from the surrounding environment (radio waves, cosmic rays, electromagnetic interference from cell phones and fluorescent lights, and so on). Example:
randomSeed(analogRead(5)); // randomize using noise from pin 5
220
long
random(max)
long
random(min, max) Returns a pseudorandom long integer value between min
and max â&#x20AC;&#x201C; 1. If min is not specified, the lower bound is 0. Example:
long randnum = random(0, 100); // a number between 0 and 99 long randnum = random(11); // a number between 0 and 10
221
SERIAL
COMMUNICATION As you saw in Chapter 5 , you can communicate with devices over the USB port using a serial communication protocol. Here are the serial functions.
Serial.begin(speed) Prepares Arduino to begin sending and receiving serial data. You'll generally use 9600 bits per second (bps) with the Arduino IDE serial monitor, but other speeds are available, usually no more than 115,200 bps. Example:
Serial.begin(9600);
222
Serial.print(data) Serial.print(data, encoding) Sends some data to the serial port. The encoding is optional; if not supplied, the data is treated as much like plain text as possible. Examples:
Serial.print(75); // Prints "75" Serial.print(75, DEC); // The same as above. Serial.print(75, HEX); // "4B" (75 in hexadecimal) Serial.print(75, OCT); // "113" (75 in octal) Serial.print(75, BIN); // "1001011" (75 in binary) Serial.print(75, BYTE); // "K" (the raw byte happens to
// be 75 in the ASCII set)
223
Serial.println(data) Serial.println(data, encoding) Same as Serial.print(), except that it adds a carriage return and linefeed (\ r\n) as if you had typed the data and then pressed Return or Enter. Examples:
Serial.println(75); // Prints "75\r\n" Serial.println(75, DEC); // The same as above. Serial.println(75, HEX); // "4B\r\n" Serial.println(75, OCT); // "113\r\n" Serial.println(75, BIN); // "1001011\r\n" Serial.println(75, BYTE); // "K\r\n"
224
int Serial.available() Returns how many unread bytes are available on the Serial port for reading via the read() function. After you have read() everything available, Serial.available() returns 0 until new data arrives on the serial port. Example:
int count = Serial.available();
225
int Serial.read() Fetches one byte of incoming serial data. Example:
int data = Serial.read();
226
Serial.flush() Because data may arrive through the serial port faster than your program can process it, Arduino keeps all the incoming data in a buffer. If you need to clear the buffer and let it fill up with fresh data, use the flush() function. Example:
Serial.flush();
227
Appendix D. Reading Schematic Diagrams So far, we have used very detailed illustrations to describe how to assemble our circuits, but as you can imagine, it's not exactly a quick task to draw one of those for any experiment you want to document. Similar issues arise, sooner or later, in every discipline. In music, after you write a nice song, you need to write it down using musical notation.
Engineers, being practical people, have developed a quick way to capture the essence of a circuit in order to be able to document it and later rebuild it or pass it to somebody else.
In electronics, schematic diagrams allow you to describe your circuit in a way that is understood by the rest of the community. Individual components are represented by symbols that are a sort of abstraction of either the shape of the component or the essence of them. For example, the capacitor is made of two metal plates separated by either air or plastic; therefore, its symbol is:
228
Another clear example is the inductor, which is built by winding copper wire around a cylindrical shape; consequently the symbol is:
229
The connections between components are usually made using either wires or tracks on the printed circuit board and are represented on the diagram as simple lines. When two wires are connected, the connection is represented by a big dot placed where the two lines cross:
This is all you need to understand basic schematics. Here is a more comprehensive list of symbols and their meanings:
230
You may encounter variations in these symbols (for example, both
variants of resistor symbols are shown here). See en.wikipedia.org/wiki/Electronic_sym for a larger list of electronics symbols. By convention, diagrams are drawn from left to right. For example, a radio would be drawn starting with the antenna on the left, following the path of the radio signal as it makes its way to the speaker (which is drawn on the right). The following schematic describes the push-button circuit shown earlier in this book:
231
232