Está en la página 1de 47

DISEÑO

DE PROYECTOS
BÁSICOS CON
ARDUINO

Víctor Santiago Manzano Villafuerte


INTRODUCCIÓN

Este libro está pensado para aquellas personas que siempre


han tenido un apego por la programación de microcontroladores
pero por la complejidad en el aprendizaje de estos, quedaba
relegado todos sus deseos por incursionar en este campo.
Gracias a la nueva tecnología que está revolucionando la
electrónica digital se presenta una solución a este problema de
aprendizaje en cuando a la facilidad del lenguaje de
DISEÑO DE PROYECTOS BÁSICOS CON ARDUINO
Víctor Santiago Manzano Villafuerte programación y el armado de los circuitos, esta tecnología se
llama Arduino.
ISBN: 978-9942-13-437-0
Arduino se basa en hardware libre y código abierto con la
IEPI CERTIFICADO No QUI-042567
posibilidad de utilizarlo sin conocimientos previos de
electrónica, permitiendo el desarrollo de proyectos electrónicos
con gran facilidad.

Además existe gran cantidad de software para la implementación


y simulación de circuitos electrónicos y microcontroladores,
Impreso: Editorial "PIÓ XH" destacando Proteus VSMde Labcenter Electronics, el cual ofrece
Teléfono: 2 421806 la posibilidad de simular la placa de Arduino.
Ambato- Noviembre -2013
Primera Edición Por otra parte para la creación de diagramas físicos existe el
software Fritzing, el cual permite tener un esquema del prototipo
real a ser implementado.
DEDICATORIA

A Dios por ser mi luz y sabiduría

A mis padres: Manuel y Rosita.

A mi esposa: Elizabeth, a mi hijo: Josué

A mis hermanos: Irene, Enrique, Andreita.,


a mi cuñado Mauricio y a mis sobrinos.

Por todo el amor, cariño y sobre todo el


apoyo incondicional.

También a mis amigos por haber


compartido su tiempo y sus conocimientos.
ÍNDICE GENERAL
CAPÍTULO 1 11

Programando Arduino 11
1.1 Entornodel IDEdeArduino 11
1.2 Introducción a la programación 15
1.2.1 Comentarios 18
1.2.2 Bloques 19
1.2.3 Tipos de datos 19
1.2.4 Constantes 19
1.2.5 Variables 20
1.2.6 Operadores aritméticos 20
1.2.7 Operadores 21
1.2.8 Funciones 21
1.2.9 Estructuras de control 22
1.2.9.1 Sentencias condicionales 22
1.2.9.2 Bucle o Estructuras de repetición 24
1.2.9.3 Saliendo de los bucles 26
1.2.10 Siringo cadenas de caracteres 27
1.2.11 Entradas y salidas digitales y analógicas 28
1.3 Librerías 29
1.3.1 Otras Librerías 31

CAPÍTULO II 33

PROTEUS 33
2.1 Introducción 33
2.2 Entorno Gráfico ISIS 33
2.3 Manejo Arduino en Proteus 36
CAPÍTULO III 39 ÍNDICE DE FIGURAS
Proyectos 39
I ir.uuA 1.1: INTERFAZ IDEARDUINO 12
3.1 Proyectos con Leds 39
I K.IIUA 1. 2 VENTANA DE COMPILACIÓN 15
3.1.1-EncenderunLed 39
FIGURA 1. 3: IDEARDUINO 17
3.1.2 Encendido Progresivo y Apagado de Led 42
FIGURA 1. 4: FORMATO DE UNA FUNCIÓN 22
3.1.3 Secuencia de Leds con un pulsador. 44
3.1.4 Cruce de Semáforos 47
FIGURA 2. 1: IDE DE PROTEUS 34
3.1.5 Contador de O a 99 con dos display de 7 segmentos.. 50
FIGURA 2. 2: INTERFAZ DE ISIS PROTEUS 36
3.2 Proyecto con Frecuencias 53 FIGURA 2.3: INTERFAZ ARDUINO MEGA2560 37
3.2.1 Zumbador. 53 FiGURA2. 4: CONEXIÓN DE DISPOSITIVOS CON ARDUINO MEGA2560 37
3.2.2 Variación de Frecuencias 55 FIGURA 2. S:CARGAR CÓDIGO AL ARDUINO 38
3.2.3 Sonidos 57 FIGURA 2. 6: SIMULACIÓN DE PROGRAMA EN ISIS PROTEUS 38
3.3 Proyectos Entradas y Salidas 61
3.3.1. Control de Temperatura 61 FIGURAS. 1: PROGRAMA ENCIENDE UN LED 40
3.3.2 Control de luz con AC 66 FIGURAS. 2: ESQUEMA DE CONEXIÓN ISIS PROTEUS ENCENDER UN LED.... 41
3.3.3 Control de Motores DC 69 FIGURAS. 3: ESQUEMA CONEXIÓN FÍSICA PARA ENCENDER EL LED 41
3.3.4Teclado 72 FIGURAS. 4: ESQUEMA DE CONEXIÓN ISIS PROTEUS ENCENDER UN LED.... 43

3.4 Transmisión serie, Protocolo de Comunicación I2C y FIGURAS. 5: ESQUEMA CONEXIÓN FÍSICA PARA ENCENDER EL LED 43

Almacenamiento en la memoria EEPROM 78 FIGURA 3.6: ESQUEMA DE CONEXIÓN DE LA SECUENCIA DE LEDS CON UN PULSADOR 46
FIGURA 3.7: ESQUEMA DE CONEXIÓN FÍSICA SECUENCIA DE LEDS CON UN PULSADOR 46
3.4.1 Leer Datos desde Puerto Serie 78
FIGURA 3. 8: CRUCE EN UNA INTERSECCIÓN 47
3.4.2 Protocolo de Comunicación I2C 81
FIGURA 3.9: ESQUEMA DE CONEXIÓN EN ISIS PROTEUS CRUCE DE SEMÁFORES 49
3.4.3 Transmisión serie del valor de temperatura
FIGURAS. 10: ESQUEMA CONEXIÓN FÍSICA CRUCE SEMÁFOROS 49
utilizando el Protocolo de Comunicación I2C y
FIGURAS. 11: ESQUEMA DE CONEXIÓN CONTADOR DEL O AL 99 52
Almacenamiento en la memoria EEEPROM 84
FIGURAS. 12: ESQUEMA DE CONEXIÓN FÍSICA CONTADOR O AL 99 52
Bibliografía 90 FIGURA 3. 13: ESQUEMA EN ISIS PROTEUS ZUMBADOR 54
FIGURA 3. 14: ESQUEMA Físico ZUMBADOR 54
FIGURA 3.15: ESQUEMA EN ISIS PROTEUS VARIACIÓN DE FECUENCIAS 56
FIGURA 3.16: ESQUEMA Físico VARIACIÓN DE FRECUENCIAS 56
FIGURA 3. 17: ESQUEMA EN ISIS PROTEUS SONIDOS CON LIBRERÍA PILCHES.H.. 60

'
FIGURA 3.18: ESQUEMA Físico SONIDOS CON LIBRERÍA PITCHES.H 61 CAPITULO I
FIGURA 3. 19: ESQUEMA LM 35 62
FIGURA 3. 20: ESQUEMA CONEXIÓN ISIS PROTEUS SENSOR Programando Arduino
TEMPERATURA 65
FIGURA 3. 21: ESQUEMA CONEXIÓN FÍSICA SENSOR TEMPERATURA 65
I . I Entorno del IDE de Arduino
FIGURA 3. 22: ESQUEMA CONEXIÓN LDR 66
FIGURA 3. 23: ESQUEMA ISIS PROTEUS SENSOR DE Luz 68
lil Entorno de Programación Integrado (IDE) de Arduino, es un
FIGURA 3. 24: ESQUEMA FÍSICO SENSOR DE LUZ 68
11)1 i multiplaforma, disponible para descargar directamente para
FIGURA 3. 25: DIAGRAMA DE CONEXIÓN CIL293D 69
Windows, Linux y Mac OS. Es una aplicación gratuita desarrollada
FIGURA 3. 26: ESQUEMA ISIS PROTEUS SENSOR DE Luz 70
FIGURA 3. 27: ESQUEMA FÍSICO SENSOR DE LUZ 71
en Java y deriva del IDE de Processing y Wiring, sencilla de
FIGURA 3. 28: ESQUEMA TECLADO 72 instalar y a la vez muy fácil de utilizar.
FIGURA 3. 29: INSERTAR LIBRERÍA KEYPAD . H 73
I la sido diseñado teniendo en mente que sus usuarios no son
FIGURA 3. 30: ESQUEMA ISIS PROTEUS CONTROL POR TECLADO.... 77
expertos desarrolladores y sean capaces de familiarizarse con él
FIGURA 3. 31: ESQUEMA DE CONEXIÓN FÍSICA CONTROL TECLADO 77
FIGURA 3. 32: VIRTUAL SERIAL PORT DRIVER 78 de una manera intuitiva.
FIGURA 3.33: ESQUEMA DE CONEXIÓN PUERTO SERIE ISIS PROTEUS 79
Incluye un editor de código que resalta la sintaxis, esto es
FIGURA 3. 34: SALIDA DEL PUERTO COM2 80
resaltando las palabras claves y funciones de otro color, además
FIGURA 3. 35: ESQUEMA FÍSICO DE CONEXIÓN PUERTO SERIE 80
FIGURAS. 36: ESQUEMA CONEXIÓN DEL SENSOR CON ARDUINO 83
permite ver si están bien emparejadas las llaves de las funciones
FIGURAS. 37: ESQUEMA DE CONEXIÓN FÍSICA DEL SENSOR Y ARDUINO 83
de condición y ciclos de repetición.
FIGURAS. 38: ESQUEMA CONEXIÓN ICTC74 84
Además el entorno incluye todo lo necesario para compilar gracias
FIGURA 3. 39: ESQUEMA CONEXIÓN EN ISIS PROTEUS 89
FIGURA 3. 40: ESQUEMA DE CONEXIÓN FÍSICA DE ARDUINO Y
;il compilador (avr-gcc), que trasforma el código legible por el
TC74A05 89 ser humano a instrucciones legibles para la máquina (llamados
lleneros objeto), el proceso de compilación es transparente para
el usuario. Todo lo que tiene que hacer es pulsar un botón. Si
existen errores en el código de programación, el compilador
mostrará un mensaje de error en la parte inferior del IDE y
resaltará la línea de código que parece tener el problema.

10 11
El código que se desarrolla es C/C++, aunque las funciones que Kciil
gobiernan el programa son setupQ y loop().
Copy for Discourse : Copia el código con un
Los archivos se guardan con la extensión .ino. formato para incluirlo en foro.

El IDE de arduino consta de cinco menús: File, Edit, Sketch, Copy as HTML: Copia el código con un
formato HTML para incrustarlo en una página
Tools, Help y una barra de herramientas que permite verificar el
Web.
proceso de carga, creación, apertura y guardado de programas,
además de la monitorización serie (ver Figura 1.1). Sketch

< i >« 1.!•-•« 1


Verify/Compile: Comprueba errores en el
código.

Import Library: Inserta una librería al


programa, incluyendo la sentencia #include en
el código.

Show Sketch Folder: Muestra la carpeta en


donde se almacenan los programas
Add File...: Inserta un archivo fuente al
programa.
Tools
Auto Format: ordena en código.

Board: Selecciona la versión de arduino que


Figura 1.1: //líe/faz IDE Arduino se está usando.

Serial Port: En este menú se presentan los


1.- Barra de Menús: Son cinco menús: File, Edit, Sketch, Tools, puertos serie real o virtual.
Help. Los menús se activan cuando existe una tarea que se pueda
realizar en este.
12 13
• Burn Bootloader: Graba un gestor de
arranque en el arduino. Done compl

2. Barra de Herramientas: Con este menú se permite C;\Uaers\Sanciago\ílppData\Locil\l«ip\bttild3i38BlíJ21441lifli?l.^


\lncende r_Led.cpp,h«
verificar, cargar y controlar el funcionamiento del
programa. Binary sketch size: 1,632 fof a byte Miiací)

Comprueba los errores del código.

Compila el código y lo vuelca en la placa E/S de


Arduino.

Crea un nuevo archivo.

Muestra todos los programas que se encuentran


en el "Sketchbook" Figura 1. 2 Ventana de Compilación.

Guarda el programa.

Permite comprobar el funcionamiento del código 1.2 Introducción a la programación


por medio del puerto de Serie.
I ,a estructura básica del lenguaje de programación de Arduino se
3. Editor de código: En este espacio se escribe el código. compone de dos partes. Estas dos funciones son vitales para el
liincionamiento del programa.
4. Área de mensajes: Espacio en donde se indica si la
compilación del programa fue exitosa o indica la línea en void setupQ
donde puede existir un error.
5. Consola: Área en donde se presenta el lugar en el que se
guardó el programa compilado. En el caso de existir sentencias;
errores en el código del programa muestra las posibles
causas de éste (ver Figura 1.2).
14 15
void loopQ " MI hjullUJl! Arruino
rtib Ül-Qi

sentencias;

Curación
En donde setupQ es la parte encargada de recoger la configu..^*^*
y loopQ es la que contienen el programa que se ejecutará
cíclicamente.

Ambas funciones son necesarias para que el programa trabaje.

La función de configuración setup() debe contener la declaración


de las variables, establecer el estado de los pins, inicializar librerías,
etc. Es la primera función a ejecutar en el programa, se ejecuta
sólo una vez, y se utiliza para la configuración de la comunicación
de entrada/salida y serie entre otras.

La función bucle (loop) contiene el código que se ejecutará


continuamente (lectura de entradas, activación de salidas, etc)
Esta función es el núcleo de todos los programas de Arduino y la
que realiza la mayor parte del trabajo. Figura 1. 3: IDEarduino

Para realizar la programación se abre el IDE de Arduino, que


I'nra compilar el programa pulsar en el botón , sino existe
por defecto abre un archivo en blanco (ver figura 1.3)
errores deberá presentar en la parte inferior un mensaje de
Done Compiling.

I ín la consola indica la dirección en la cual se guardó el archivo


compilado con la extensión .hex y el tamaño del fichero. Copie
16 17
este archivo en una carpeta en donde se tenga el proyecto a 1.2.2 Hinques
desarrollar; en el caso de que no se visualice esta dirección dirijase
I'ai a agrupar un conjunto líneas se utiliza los símbolos
a File->Preferences y activar la opción compilation.

En este capítulo se describirán los elementos más básicos y


esenciales para comenzar a programar.
1.2.3 Tipos de datos

1.2.1 Comentarios I ín la programación de arduino existen diferentes tipos de datos:

Los comentarios no son considerados como líneas de código en • Hyte. Almacena 8 bits.
el programa, sirve para documentar ciertos aspectos importantes.
• Int. Almacena 16 bits.
Existen 2 tipos de comentarios:
• I ,ong. Almacena 32 bits.
El comentario de bloque, abarca todas las líneas contenidas entre
• Float. Almacenado 32 bits.
los símbolos /* y */, Ejemplo:
• Arrays Alamecena varios valores de un mismo tipo, el
/* Hola aquí se comenta acerca del programa,
primer valor se encuentra en índice O
y del proceso que realiza cada línea.
1.2.4 Constantes
*/
Línea de comentario: con los símbolos // se comenta una línea. Son variables a las que no se puede modificar el valor. Ejemplos:
Ejemplo: true/false
// Comentario para una línea. HIGH/LOW

INPUT/OUTPUT

18 19
1.2.5 Variables Ejemplos:

Es una porción de memoria que almacena valores de acuerdo al


tipo de declaración y que es conocido en el programa por un
I, .I/?; W :.-'--. ,„••••• ' . ,
determinado identificador y por lo tanto puede variar en el
recorrido del programa. i- h%3;

Una variable puede tomar una infinidad de valores pero en un


1.2.7 Operadores
momento particular tendrá uno solo.
• Operadores Booleanos: && (Y), || ( O ), ! (NO)
Ejemplo:
• Operadores de acceso a punteros: *, & acceso a
int p; // variable p disponible para todo el programa
memoria.
void setup() {
• Operadores de bits: &, |, A, ~, «, »

• Operadores compuestos:
void loop() {
• incremento/decremento de variables: ++; -- incremento/
for (int i=0; i<20;) // variable i puede utilizarse solo en el bucle decremento el valor de la variable. ,

• Asignación y operación: +=, -=, *=, /=, &=, |=


float f; //variable f puede utilizarse únicamente en la función
loop() 1.2.8 Funciones
I Ina función es un bloque de código identificado por un nombre
y que es ejecutado cuando la función es llamada. La declaración
1.2.6 Operadores aritméticos de una función incluye en primer lugar el tipo de datos que
devuelve la función. Después del tipo de datos se especifica el
Se puede realizar las operaciones +, -, *, /, % (módulo, el resto
nombre de la función y los parámetros de la misma Ejemplo
de la división entre los valores)
(ver Figura 1.4):
20 21
: e de ¡d ruñe ion
P.,' ,s,'r,*4r« 25» ... ívivr.'.ik:
ilie

inf (Int Ont y){


// código si no se cumple
retum pt,s' U fjrsc.ctr.

Figura 1. 4: Formato de una función Sentencia switch



I >( -| >ci id icndo del valor de una variable ej ecutará un código distinto
1.2.9 Estructuras de control
:¡\h (var) {
Son aquellas estructuras que permiten modificar el flujo de
ejecución del programa, es decir, el orden en el que se ejecutan
las sentencias.
//I ij ce uta si var es 1

1.2.9.1 Sentencias condicionales break;

Sentencia if case 2:

Ejecuta un código si se cumple la condición y otro distinto si no // Ejecuta si var es 2


se cumple
break;
if (condición)
default:

// si nada concuerda, default


// código si se cumple
// default es opcional

22 23
1.2.9.2 Bucle o Estructuras de repetición ) l . i « ondu-ión vu el ve a ser comprobada de nuevo. Si la condición
i". l.il;;:i, el bucle termina.
Una estructura de repetición indica que se va a realizar varias
veces un mismo proceso existiendo varias maneras de representar l'"i i lemplo:
una estructura de repetición dependiendo mucho de 3 parámetros
l»i ( M I ! i ();i<20;i++) {
principales como son: el iniciar un contador, tener un número
tope de repeticiones de proceso, parámetro modificador de uno lentencias:
de los parámetros anteriores los mismos que deberán actuar como
elementos para comparación o condición.

Existen 3 tipos de bucles: Kt ali/;irá 20 veces

Ilude wliile
Bucle for

La declaración for es usada para repetir un bloque encerrado I I l u u - l r while ejecutará las sentencias de su bloque mientras
entre llaves. Un incremento de un contador, es usado • pie l.i condición inicial se cumpla.
normalmente para aumentar y terminar con el bucle. La estructura \I ii k-( condición ){
for es muy útil para la mayoría de las operaciones repetitivas, y
habitualmente se usa para operaciones con vectores, para operar // sentencias;
sobre conjuntos de datos/pines.

El bucle for tiene tres partes o argumentos en su inicialización:


Si l;i condición no se cumple inicialmente no se realizará ninguna
for (inicialización ; condición ; incremento) { Iteración.

//sentencias; Huele do

I ; n osle bucle la comprobación se hace después de la iteración,


por lo que se garantiza que al menos se ejecutará una vez la
La inicialización, se produce sólo la primera vez. Cada vez que Iteración.
se va a repetir el bucle, se revisa la condición: si es cierta, el
bloque de funciones (y el incremento del contador) se ejecutan,

24 25
1 . 2 . 1 O Siring o cadenas de caracteres
do
l'nni l a r i l i l a r e l trabajo concadenas de caracteres, existe laclase
{
Sli ni) 1 ,. Tiene los siguientes métodos
//sentencias

} while (condición); Función Detalle


compárelo]) Compara dos cadenas
1.2.9.3 Saliendo de los bucles concat() Concatena
rnilsWilhO Comprueba si termina por...
Se puede salir de un ciclo usando las siguientes instrucciones:
cijiialsf) Comprueba si son iguales
•break // sale del bucle t'(|ii;ils]¡',ii0rcCase() Comprueba igualdad ignorando mayúsculas y
minúsculas
•continué // salta el paso actual del bucle

•return // sale de la función niihOÍO Devuelve la primera posición del carácter que
se pasa como argumento
•gotolabel //salta a la etiqueta label lastlndexOfO Devuelve la última posición del carácter que le
pasamos
for(inti=0;i<10;i++)
IcnglhO Longitud de la cadena
{ i'cplacc() Reemplaza
slartsWilhO Comprueba si empieza por
if(bsalto>0)
siibslringO Devuelve un fragmento de la cadena original
continué; // Se salta el código del resto de la iteración ltiLowcrCase() Convierte a minúsculas
!ollppcrCase() Convierte a mayúsculas
else !iiin() Elimina los espacios iniciales y finales
break; //sale del bucle

27
Funciones de tiempo y matemáticas
1.2.11 Entradas y salidas digitales y analógicas ni») Permite realiza una pausa en el programa,
especificando en tiempo en milisegundo.
Existe un error en esta función, ya que cuando
se ejecuta esta instancia produce que el
Fundón Detalle programa se detenga (excepto las
pinMode(pin, mode) Configurar un pin para comportarse como interrupciones) con lo cual no lee sensores, ni
entrada (INPUT) o salida(OUTPUT). !?/£>' •.•'ii'> v'j- realiza cálculos en el tiempo especificado.
Esta función se utiliza dentro de setup(), por Para tiempos mayores a decenas de
defecto en arduino todos los pines están como milisegundos no se recomienda esta función.
salidas. mlllliO0 Retorna un valor en milisegundos que Arduino
se encuentra ejecutando el programa.
Ejemplo Retorna el mínimo y el máximo entre sus
i.y), max(x,y)
pinMode(pin, OUTPUT); parámetros.
digitalRead(pin) Devuelve un valor en alto (HIGH) o en bajo
(LOW), de un ping digital determinado.
Ejemplo:
= digitalRead(Pin); Funciones de generación aleatoria
nl(jirrd) Determina un valor de inicio como el punto de
digitalWrite(pin, valué) Introduce un nivel alto (HIGH) o bajo (LOW) partida para la función randomQ.
en el pin digital especificado. u» ), i:iiidom(min, max) Entrega un valor aleatorio entre el rango
Ejemplo: indicado.
digitalWrite(pin,HIGH);
analogRead(pin) Devuelve un valor desde el pin analógic
señalado con una resolución de 10 bits. Esta
función solo funciona en los pines analógicos Puerto serie
El valor resultante es un entero de O a 1023 nl.bi'H¡n(rate) Permite el uso del puerto serie y determina la
Los pines analógicos, a diferencia de los velocidad de transmisión.
digitales no necesitan declararse previamente iil.println(data) Permite enviar datos al puerto serie
como INPUT o OUTPUT. ul.readQ Lee los datos del puerto serie.
Ejemplo:
= digitalRead(Pin); iil.availableO Devuelve el número de caracteres presentes en
Ésta función solo puede ser usada en pines el puerto serie.
analogWrite(pin, valué)
analógico. Escribe un dato pseudo-analógico
utilizando PWM, el dato está en el rango O - l.:i Librerías
255, el O genera O V y el 255 genera 5 V en la
salida del pin especificado. I 1 1 1 , 1 1 1 hrcría no es más que un conjunto de códigos empaquetados
Ejemplo:
analogWrite(pin, v); v .1 los c|iie podemos llamar desde nuestro programa, facilitando
t i desarrollo del programa, puesto que aprovecha un código ya
ixiltente.
29
28
Para usar se tiene que importar a nuestro código con la palabra I I I Olías Librerías
reservada niiiiiiciilion (nctworking and protocols):
#include <,...> engcr Procesa mensajes de texto provenientes del
PC.
Si se requiere instalar una librería hay que descargarla y copiarla SoflScriil Versión mejorada de SoftwareSerial.
en la carpeta "libraries" del directorio, donde se guardan nuestros IVIre Permite la comunicación con dispositivos de
sketches de arduino. Dallas (fabricante de dispositivos electrónicos)
que usan este protocolo.
Librerías básicas
vcyboiird Lee caracteres desde un teclado PS2.
Librerías Detalles
EEPROM Permite leer y escribir en almacenamiento ilc lyicssiigc System Enviar mensajes entre arduino y el PC.
permanente llIJMobllc Envía mensajes de texto y email desde el
Ethernet Permite conectar a internet. móvil (vía comandos AT).
Firmata Comunicaciones usando un protocolo iliilim Servidor web para usar con arduino Ethernet.
concreto. MI) Envía señales del protocolo XI 0 usando los
LiquidCrystal Permite el manejo de LCD. cables eléctricos domésticos.
SD Lectura y escritura en tarjetas SD. XHrr Comunicaciones XBees en modo API.
Servo Control de Servos. K'iinlrol Control remoto de otros Arduinos por medio
de comunicaciones serie
SPI Comunicaciones con dispositivos usando SPI.
SoftwareSerial Permite comunicaciones serie por otros pines.
Control de motores paso a paso. Srimlng:
Stepper
comunicaciones I2C ( ii|iucilivc Sensing Permite usar dos entradas como sensors
Wire
capacitivos.
Dvbouncc Permite usar anti-rebote en entradas
l'uiilullíis \s
Impnrn-tl LCD library Mejora la librería LCD library

(!LCD Permite manejar LCDs gráficas basadas en el


chip KS0108 o equivalente.
30 31
LedControl Maneja matrices de leds con chips MAX7221 CAPITULO II
oMAX7219.
Controla pantallas basadas en HCMS-29xx PROTEOS
LedDisplay con scroll.
.'.I Introducción

l ' i o i r u s es un software para el diseño de circuitos eléctricos y


Motores y PWM: • • Irr i milicos con los cuales se puede realizar proyectos completos
TLC5940 Permite el uso del chip TLC594016 canales
un sle ámbito. Proteus es desarrollado por Labcenter Electronics
con PWM de 12 bit PWM.
i | i n - ronsta de los dos programas principales: Ares e Isis.
Manejo del tiempo:
•\' I ' S (Advanced Routing and Editing Software) es la herramienta
di rumiado, ubicación y edición de componentes, se utiliza para
ln I , i l n icación de placas de circuito impreso.
DateTime Ayuda con el trabajar con fechas y horas.
Meto Ayuda a medir intervalos temporales fijos I ' . I' i (1111 c 11 i gent Schematic Input System) permite diseñar el plano
MsTimerl Permite ejecutar tareas cada N milisegundos
• l< • 11 iro del circuito que se desea realizar con componentes muy
(usa2temporizadores).
v (iii,idos.

I u.i de las prestaciones de Proteus, integrada con ISIS, es VSM


i Vn 11 uil System Modeling), con la cual se puede simular en tiempo
Librería Servo i r a l lóelas las características de varias familias de
Permite controlar hasta 12 servos en un arduino UNO y 48 en un arduino Mega mu u n oniroladores, así como la simulación de arduino.
attach(pin) Conecta el objeto servo con el pin dado.
write(angulo) Establece la posición del servo.
/ . 1 I nIonio Gráfico ISIS
readO Devuelve la posición del servo.
attachedO Comprueba si está conectado. I u i ',1.1 herramienta se pueden crear diseños de circuitos
detachO Desconecta el pin del servo. • li i i i o i i i i os y se puede probar su funcionamiento gracias a la
• • m m l i u ion.

33
32
En este libro se explicará de manera rápida sobre la utilización I,- VKINTANA DE VISTA PREVIA: vista previa del circuito o
de esta herramienta, así como la colocación de componentes en • li los elementos del diseño.
la hoja de trabajo. i, SULKCTOR DE OBJETOS: en esta ventana aparecerán
Para comenzar se debe abrir el programa Proteus desde el icono l« >:; componentes y otros elementos disponibles, dependiendo
ISIS, presentándose una ventana con un entorno de trabajo como < l e | modo seleccionado, y desde allí podremos elegirlos para
el que se indica en figura 2.1, conformado por varias barras de colocarlos en el diseño.
herramientas. 1. lt( >KI)E DE HOJA: la línea de color azul determina el límite
de la hoja de trabajo; debemos colocar el circuito dentro de

I VENTANADE EDICIÓN: es la ventana donde dibujaremos


lo:, circuitos electrónicos colocando los componentes,
11 iin conectándolos, y agregando también otros instrumentos
v herramientas.

J 11A K RA DE ESTADO: aquí aparece información útil de lo


i|iic tengamos seleccionado o del elemento sobre el cual se
encuentre el cursor del mouse en ese momento.

i . ItAKRA DE COORDENADAS: en esta barra podemos ver


l.is coordenadas donde se encuentra el cursor en todo
i noinento, mientras lo desplazamos por la ventana de edición.

/ SIMULACIÓN: aquí podemos encontrar los controles de


simulación

Figura 2.1: IDE DE PROTEUS

34 35
2.3 Manejo Arduino en Proteus
p.[» f t _
líirtft, t „ -fe»* i^^Mt
Para la simulación abrimos el ISIS de Proteus, el cual muestra s«i».(feu« ««'¿i,;?
una pantalla como la que se indica en la figura 2.2

1 ::J : i.

Figura 2.3: Interfaz Arduino MEGA 2560

I >< I.' misma forma como se añadió el arduino, se tiene que


Idlcionar los diferentes dispositivos a utilizar en el circuito, como
II indica la figura 2. 4.

"

i UJUJU.1..1

Figura 2.2: Interfaz de ISIS Proteus

En la paleta de dispositivos, agregar el microprocesador a utilizar,


en este caso es el arduino MEGA2560, como indica en lafigura|
2.3
Figura 2.4: Conexión de dispositivos con Arduino MEGA2560
36 37
Cargue el programa en el micro, haciendo doble click sobre el CAPÍTULO lll
micro de arduino y seleccionar el archivo.
Proyectos
I, I l'roycctos con Leds

M I Encender un Led

I I ptoycclo enciende un led durante un tiempo de 5 segundos


\) se apaga un tiempo de 3 segundos.

l'.n.i qm.1 cumpla con el proyecto enunciado anteriormente, se


( u n dr ic L ;ilizar los siguientes pasos:
Figura 2.5: Cargar Código al Arduino
1 Declarar una variable de tipo entero y asignarle
Para comprobar el funcionamiento del programa pulsar play
un número de puerto para que sea la salida que
>¡?!í encienda el led.

intpinled=13;

2 Declarar la función void Setup( ), y dentro de


esta la función pinMode, que sirve para indicar
el puerto como salida

pmMode(pinled,OUTPUT);

3 Declarar la función loop( ), para que el programa


se repita en un bucle infinito y dentro de esta
utilice la función digitalWrite, para indicar si la
QXEQIDD ; • " • • • • • • i .;«»<*«» salida será un 1 lógico o un O lógico, para establecer
Figura 2.6: Simulación de Programa en ISIS Proteus
39
una pausa en este estado se utiliza la función delay
la cual espera la cantidad de milisegundos indicado.
I 1 ' ' "iliieimi de conexión del circuito en ISIS Proteus se muestra
ngura 3.2 y la conexión física se nuestra en la figura 3.3
delay(5000);

El programa completo deberá quedar como se indica en la


Figura 3.1

í C; f£i ,L«i t feíih-,a 1 " -S

»•>, *«4íi« Wi
<• Í

t
1
/•/«•«/i 3. 2: Esquema de conexión ISIS Proteus encender un Led
1
'I
J
„' , =,{33603;
i

Figura 3.1: Programa enciende un Led


Figura 3. 3 Esquema conexión física para encender el led
40 41
Tcjíf^J.;-: "r^?"»-
3.1.2 Encendido Progresivo y Apagado de Led
El programa va encendiendo progresivamente un led y luego lo
va apagando poco a poco.

El código del programa queda de esta manera:

intledPin=9;

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

} l£O..I3_i •>• ""»:-«' ",L»J.«•*»»(

Figura 3.4: Esquema de conexión ISIS Proteus encender un Led


voidloopQI

for(inti=0;i<255;i++){

analogWrite(ledPin,i);

delay(lOO);

}
for(inti=255;i>0;i—){

analogWrite(ledPin,i);
i

delay(lOO);


Figura 3,5: Esquema conexión física para encender el led

43
3.1.3 Secuencia de Leds con un pulsador dlgltalWrlte (leds[n], HIGH);
El programa enciende los leds de manera secuencial, como si 1 ' i m i - ( i i ;illo el l'ucrto en la posición n
se tratara de las luces del auto fantástico, siempre que se
• I. l , i \ ( i i u n p o ) ; //tiempo de pausa
presione el pulsador.

El código para su funcionamiento es el siguiente: dlgll«IWr¡te(leds[n],LOW);

l ' n i i i - m bajo el Puerto en la posición n


int leds[]={5,6,7,8}; // Vector de puertos de salida
• !• I , i v ( l i n i i p o ) ;
intpulsador=9;

inttiempo-20;

int n=0;
ni I . n • ();n — ) {
void setupQ {//comienza la configuración
i He (lcds[n], HIGH);
for (n=0;n<4;n++) {// Determina el vector como salida.

pinMode (leds[n], OUTPUT);


.lii'H.ilWiilc(lcds[n],LOW);
}
Ji L i s ( l i r i n p o ) ;
pinMode (pulsador, INPUT); //Determina el Puerto 9 como Salida

} . I

void loopQ { >

if(digitalRead (pulsador) == HIGH ) { //Espera que presione el


pulsador

for (n=0;n<4;n++) {

44 45
I I < Hice de Semáforos

l pioi'.raina controla los semáforos para el cruce en una


iel sección.

Figura 3.6: Esquema de conexión de la Secuencia de leds


con un pulsador ~\ 3.7: Esquema de conexión física Secuencia de leds

Figura 3.8: Cruce en una intersección

I I i-ócligo para su funcionamiento es el siguiente:

MU x 1 1 ={2,3,4,5,6,7};

mi !irmpo=3000;

mi ln.'inpol=500;
\ t i i d setup(){

l»>r(intn=0;n<6;n++)

pinMode(x[n],OUTPUT);

con un pulsador
46 47
I ii « - I pioicus insertamos las librerías de arduino mega2560 y el
void loop() ( M i l u - hj'JUs.

{
digitalWrite(x[0],HIGH);
digitalWrite(x[3] ,HIGH);
delay(tiempo);
digitalWrite(x[3],LOW);
digitalWrite(x[4],HIGH);
delay(tiempol);
digitalWrite(x[4],LOW); I luura 3.9: Esquema de conexión en ISIS Proteus Cruce de Semáfores

digitalWrite(x[5],HIGH);
digitalWrite(x[0],LOW);
digitalWrite(x[2],HIGH);
delay(tiempo);
digitalWrite(x[2],LOW);
digitalWrite(x[l],HIGH);
delay(tiempol);
digitalWrite(x[l],LOW);
digitalWrite(x[5],LOW);

Figura 3.10: Esquema conexión física Cruce Semáforos


48 49
3.1.5 Contador de O a 99 con dos display de 7 segmentos
El programa cuenta del O al 99 utilizado dos displays de 7 I..i uní x l 0; xl < 7;xl++) {
segmentos. |.inM«Klc(displ[xl], OUTPUT);
El código para su funcionamiento es el siguiente: '->

int disp[] = {2, 3,4, 5, 6,7,8};


int displ[] = {22,23,24,25,26,27,28};
m i l lonpQ {
bytedigits[10][8]= {
l ' H i m l 11 0;jl<10;jl++){
//abcdefg.
luí ( m i decenas = 0; decenas < 7; decenas++) {
{ 1, 1, 1, 1, 1, 1, O, 0}, // O
1111 • 11; 11 Write(disp 1 [decenas] ,digits[j 1 ] [decenas]);
{ O, 1, 1, O, O, O, O, 0}, // 1
{ 1, 1,0, 1, 1,0, l , 0 } , / / 2
{ 1, 1, 1, 1,0,0, 1, 0 } , / / 3
luí ( i n t unidades=0; unidades < 7; unidades++)
{ O, 1, 1, 0,0, 1, 1, O},// 4
{ 1, O, 1, 1, O, 1, 1, O},// 5
<ligitalWrite(disp[unidades],digits[j][unidades]);
{ 1,0, 1, 1, 1, 1, 1, 0 } , / / 6
{1,1, 1, O, O, O, O, 0}, // 7
{ 1, 1, 1, 1, 1, 1, 1, 0 } , / / 8 delay(300);

{ 1, 1, 1, 1,0, 1, 1, 0} II 9

void setupQ { delay(300);


for(intx = 0;x<7;x++) {
pinMode(disp[x], OUTPUT);
50 51
» ' Proyecto con Frecuencias

\,l.\r

I I pioj'.iíima consiste en generar un tono, como una señal de


i INO.

! n i-;;U- programa se utiliza la función tone ( ), en la cual se


> i il ilrcc el pin de salida, la frecuencia y la duración de esta.

ij'.o para su funcionamiento es el siguiente:

M'lil
Figura 3.11: Esquema de conexión Contador del O al 99

("Km! i ();i<200;i++){

IIM I i

...... >(<>, (.60, 100);

• I. \,\\( /.S);

Figura 3.12 Esquema de conexión física Contador O al 99


52 53
i .'.'¿ Variación de Frecuencias
I u .1 un Bucle de Reproducción de sonidos, en el que la
l u í iii-ncia sea cada vez menor y aumente la longitud, es decir:
I1 -11. • ( I ' i n, I recuencia_baj a,longitud_aumenta)
|| üi ><li;;o para su funcionamiento es el siguiente:

n i l 1'mSonido =11;
> i i i d :,ckip() {

I ni iMode(PinSonido,OUTPUT);
!
\| loopQ {
Figura 3.13: Esquema en ISIS Proteos Zumbador mi liccuencia = 4978;
mi longitud = 30;
\ \ l n l e (frecuencia > 31)
!
lone(PinSonido, frecuencia, longitud);
dclay(longitud);
liccuencia = frecuencia - 95;
longitud = longitud +10;
!
hoTonc(PinSonido);

diluy(2000);
Figura 3.14: Esquema Físico Zumbador

54 55
t M Sonidos
ARDÍ
'
i n .u'ion de sonidos con nota musicales por medio de la librería
( l i l i Ill'K.ll

i 1 1 1 n l i j ' o para su funcionamiento es el siguiente:


'huí l u i k - "pitches.h"
n i - i . - : ; in the melody:
mi m.-lt)dy[]= {
NOTE_DO, NOTE RE, NOTE_MI, NOTE_FA,
N< > I l < SOL, NÓTENLA, NOTli SI};
nolc durations: 4 = quartcr nolc, 8 = eighth note, etc.
luí nolcDurations[] = {4,8 };

en ISIS Proteus Variación de Frecuencias M i u l setupQ


Figura 3.15: Esquema
I
mi pausa_entre_notas (1000/8) * 1.30;
|)inMode(10, O U T Í M I I ) ;
pinMode(ll, O U T I H I I );
(ligitalWrite(10,HI(ill);
lbr(inti=l;i<4; ü i )
i
luiie(ll,NOTEJvVS);
ilclay(pausa_entrc noiiis);
lone(ll,NOTE_l)0,X),
Figura 3.16: Esquema Físico Variación de Frecuencias
57
56
i ..... ( I I . N ( ) l l ; I ( 'A,S);
delay(pausa_entre_notas);
i l . l , i , i |i.ni.'.,i mire notas);
tone(ll,NOTE_FA,8);
lililí i I I .NOTIÍ M I , 8);
delay(pausa_entre_notas);
• I' l.r, (p.nisii cnlrcjiotas);
tone(ll,NOTE_SOL,8);
i ..... i I I.N()Tlí_RE,8);
delay(pausa_entre_notas);
• I. l . i \ ( | ) ; u i s a cntre_notas);
tone(ll,NOTE_LA,8);
Illliol I I.NOTE_DO,8);
delay(pausa_entre_notas);
d> lny(pausa_entre_notas);
tone(ll,NOTE_LA,8);
I . . M . ( I I,N()TE_SOL,8);
delay(p ausa_entr e_notas);
ikl,n ( pausa_entre_notas);
tone(ll,NOTE_SOL,8);
..... .-(II,NOTE_SOL,8);
delay(pausa_entre_notas);
i l « !iislpausa_entre__notas);
tone(ll,NOTE_SI,8);
lMiif(ll,NOTE_DO,8);
delay(pausa_entre_notas);
i|clnv(pausa_entre_notas);
tone(ll,NOTE_LA,8);
| M I I , ( I1,NOTE_DO,8);
delay(pausa_entre_notas);
1 1 r I a v ( pausa_entre_notas) ;
tone(ll,NOTE_SOL,8);
ii.n.-(ll,NOTE_RE,8);
delay(pausa_entre_notas);
id luy(pausa_entre_notas);
tone(ll,NOTE_FA,8);
delay(pausa_entr e_notas);
< Ir lny( pausa_entre_notas);
tone(ll,NOTE_FA,8);
inii l -(ll,NOTE_FA,8);
delay(pausa_entre_notas);

59
delay(pausa_entre_notas);
tone(ll,NOTE_FA,8);
delay(pausa_entre_notas);

}
noTone(ll);
digitalWrite(10,LOW);

}
void loop() {
// Loop significa el bucle a repetir, siempre

ARÜt
Figura 3.18: Esquema Físico Sonidos con librería pitches.h

\, \s Entradas y Salidas

V \, I . < 'ontrol de Temperatura

! I | u o)-.rama consiste en tomar la temperatura del sensor LM35


\ IM sentar este dato en un LCD.

I I I M í5 es un sensor de temperatura con una precisión calibrada


i!' I " < ' . Su rango de medición abarca desde -55°C hasta 150°C.
I ,i '.alida es lineal y cada grado centígrado equivale a lOmV, por
l i > I,mío:

IM)"C = ISOOmV
Figura 3.17: Esquema en ISIS Proteos Sonidos
con librería pitches.h 40°C = -400mV
60 61
TO-220 \r analógico de tensión.
Plástic Pacfcage*
\ i, i Id)', icad = lectura analógica de tensión.

O I un 1 1 Resolución de lectura en microsegundos.

LM:
I "• l o 210, valor binario de 10 dígitos binarios.
i 561

I n* módulos LCD se encuentran en diferentes presentaciones,


I ..... n inplo 2x16 (2 líneas de 16 caracteres), 2x20, 4x20, 4x40,

a continuación describe en detalle los pines del módulo


S U U
GN0
U %y< 1D
l'IN SÍMBOLO Nombre y función
Figura 3.19: Esquema LM 35 B"BHfc

vss b:;£ ( ríe ira ?v)


VDD Al imer.t ac i . n -r T-V
Arduino proporciona varias patillas con capacidad para leer valores vo Ar.:.-'te del : _ r - i t - i -
,J -" RSff Gi-le- :i>-n DATO ^IITF "L
analógicos. Cuando se lee un valor se tiene una resolución de 10 1
too»

RW» I- ~' la o eocii*~ r-i -i L"'D


bits, lo que quiere decir que podremos obtener valores entre O y 1 E r. -,' il-tací r.
1023. /
DL D rit ner. c. ' i ' . f i r s r i v
Di D«
Para leer estos valores se utiliza la función:
1 D2 D2
analogRead(pin);
111 D3 D3
i1 D4 D4
Para calibrar el valor leído del sensor se utiliza el siguienti 1 't'"* D5 D5
li D6 D6
algoritmo:
14 D7 D7 bit más sigificativo
sensorValue = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0; 1'» Ánodo de LED backlight
LED+
1 1') Cátodo de LED backlight
IED~
En donde: Ñuta; # significa negado.
62 63
El código para el funcionamiento del programa quedaría de la
siguiente manera:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int sensorPin = AO;

int sensorValue = 0;

void setup() {

lcd.begin(16,2);
/ i\inia 3.20: Esquema conexión ISIS Proteus Sensor Temperatura
}
void loop() {
sensorValue = ( 5.0 * analogRead(sensorPin) * 100.0) /
1024.0;
lcd.println(sensorValue);

delay(3000);

Figura 3.21: Esquema conexión física Sensor Temperatura

64 65
I iste sensor está configurado para funcionar cuando no exista la
3.3.2 Control de luz con AC presencia de luz, el cual envía una señal al micro y este prende
una lámpara de HOv.
El programa consiste en utilizar un sensor LDR para controlar
l ; ,l sensor está conectado a la entrada analógica Al de arduino.
un foco de HOv.
I ,;i salida se produce en el ping 13, salida digital, con la ayuda de
El LDR es un componente electrónico cuya resistencia disminuye un transistor para amplificar la señal y disparar un relay que
con el aumento de intensidad de luz incidente. funciona a 5v, el cual activa el paso de la corriente ac para
encender la lámpara.
Al utilizar el LDR como resistencia inferior del divisor de tensión, nil sensorPin = Al;
se obtiene la tensión máxima cuando se tenga el LDR en plena
oscuridad, ya que opondrá el máximo de su resistencia al paso int sensorValue = 0;
de la corriente derivándose esta por Vout. Si se utiliza como int Foco=13;
resistencia superior, el resultado será el inverso, la tensión será void setup() {
máxima cuando esté completamente iluminado, ya que se
pinMode(Foco,OUTPUT);
comportará prácticamente como un cortocircuito, con una
resistencia de 50Q o 100 Q
void loopQ {
inferior
sensorValue = ( 5.0 * analogRead(sensorPin) * 100.0) /1024.0;
/* Valores leídos Max=499 en ausencia de luz
Min=166 iluminado completamente
Vout */
11 "(sensorValué >= 495)
(1i gitalWrite(Foco,HIGH);
dse
il¡gitalWrite(Foco,LOW);

Figura 3.22: Esquema conexión LDR


67
66
3.3.3 Control de Motores DC
I ín este proyecto se controlará el giro de un motor de comente
directa (DC).

Para realizar el control de giro se utiliza el circuito integrado


1,293D, el cual posee un Puente H para cumplir con su cometido.

fea

Figura 3.23: Esquema ISIS Proteos Sensor de Luz

vea

Figura 3.25: Diagrama de conexión CIL293D

13.24: Esquema físico Sensor de luz


69
68
intDerecha-2;
intlzquierda=3;
voidsetupOÍ

voidloopOl
lUalWnte(Derecha,LOW),
dlg

Figura 3.27: Esquema físico Sensor de luz

¡SIS Proteus Sensor de Luz 71


Figura 3.26: Esquema
70
3.3.4 Teclado Archivo tdter Ssíícn Hciramientas Ayuda
En este proyecto se utilizará un teclado 3 X 4, de 12 teclas (0- •Verificar/ Compilar Ctri*R
9,*,#) para el control de acceso por clave. El esquema del teclado
Mostrar la Carpeta de Sketch Ctri*K
se indica a continuación:
Aoriíid? A,'ch;vo,,,
importarLíbrtoa...

3. 28: Esquema Teclado


Figura

Figura 3.29: Insertar Librería Keypad.h


Para realizar este programa se utilizará la librería <Keypad.h >,
la cual permite leer los datos de un teclado matricial. Esta librería
hay que descargar desde el sitio http://playground.arduino.cc y
guardarla en la carpeta libraries del IDE de arduino. El código para el funcionamiento de la aplicación es el siguiente:

Reiniciar el IDE del arduino y la barra de menú insertar esta #include <Keypad.h>
librería al programa, como se indica en la figura 3.29. #include <LiquidCrystal.h>
73
72
// initialize the library with me numbers of the interface pins
Serial.begin(9600);
LiquidCrystal lcd(12, 11, 25, 24, 23, 22);
// Establece el número de filas y columnas en el LCD:
const byte numFilas = 4;
lcd.begin(16,2);
const byte numColumnas = 3;
//Matriz que contiene los números del teclado for (int fila = 0; fila < numFilas; fila++)

const char teclas [numFilas] [numColumnas] = { {


pinMode(filaPins[fila],INPUT); ;
{'!', '2', '3' } ,
digitalWrite(fílaPins[fila],HIGH);
{'4', '5', '6' } ,
}
{'7', '8', '9' } ,
for (int column = 0; column < numColumnas; column++)
{ '*', 'O', '#' }
{
pinMode(columnaPins[column],OUTPUT);

//Fines de entrada para la Filas y columnas digitalWrite(columnaPins[column],HIGH);

byte filaPins [numFilas] = { 2, 3, 4, 5 }; } .:-.-

byte columnaPins [numColumnas] = { 6 , 7 , 8 } ; lcd.setCursor(0,0); 1'^


lcd.println("Ingrese la Clave"); :
i

lcd.setCursor(0, 1); ;
//Crear el teclado
Keypad keypad = Keypad(makeKeymap (teclas), filaPins, lcd.príntln("+*"); :
columnaPins, numFilas, numColumnas);

Stringingreso="";
} . v ' • ' • ' •••••• • ' ' . '
void loop(){
void setupQ

74 75
char key = keypad.getKeyQ;

icd.clear();
. Serial.println(key);
lcd.println(key);
í).íSí|
ingreso += key; 9

if(key = '*'){
if(ingreso=="1234*"){
Icd.clearQ;
lcd.println("Puerta Abierta");
Figura 3.30: Esquema ISIS Proteus Contro p
ingreso=""; <or Teclado

}
else{
Icd.clearQ;
lcd.println("Clave Incorrecta");
ingreso="";

Figura 3.31: Esquema de conexión física Contro, Teclado


76
77
3.4 Transmisión serie, Protocolo de Comunicación I2C
y Almacenamiento en la memoria EEPROM
3.4.1 Leer Datos desde Puerto Serie void setup()
La velocidad de comunicación a través del puerto serie son: 300, {
1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 o
115200. Siendo la velocidad estándar para la transmisión de 9600. Serial.begin(9600); /*Inicializa la librería
Arduino Mega2560 dispone de 4 puertos serie a una velocidad de 9600*/
}
Serial.begin(speed);
inti=0;
Serial 1 .begin(speed);
voidloop(){
Serial2.begin(speed);
S eria!3 .begin(speed); Serial.Print("Pmeba del puerto serie "); // imprime un texto
Senal.println(i); /* imprime el valor de i
En el caso de no tener ningún puerto serie disponible en la pe se
puede simular uno con el programa Virtual Serial Porl Driver. y salta a la siguiente línea*/

VTÍI¿ Serta! »o:í Drwer 6.9 by Elttma Softvwrir

Pod acc*íi tiit Cuitoin piirioyl


5$ Virtual Serial Port DH«er
VSPObjr Efeft**c*i resíí .«tual aerial port» wdd .i^y nmnei AXJ likf
Jdl Physícal ports soyoi* 9f&fK5í^T*se"31^ ~Of-U name1) of>t>' Hüvievw., plicfl^*; nrake
tó Virtual pocts $&&& £^-a! ÍKIS^^TS «i-Vjrg wíh íhese porte 8njp(>Grt cudüom oo't riar^ie
' íü COMÍ
Rnt¡»it: COM3
* <Q COKC MtJ paír
^ Other virtual poíts COM4

j-, ít*' ,
nata »urs di pon» ae doiod

F/gura 3.32: Virtual Serial Port Dríver


F/gi/ra 3.33: Esquema de conexión puerto serie ISIS Proteus
78
79
3.4.2 Protocolo de Comunicación I2C
COM2
El protocolo de comunicación I2C consta de las siguientes
características:
¡o serie Bus de comunicaciones en serie.
puerco serie
jswsrt» serie
Velocidad de lOOKbits por segundo en el modo estándar.
pBeziSQ aerie
poertx Dos líneas de comunicación bidireccionales
13O
írto serie
SDA(SignalData)
feotei»
Rwtsstea ptierto ís*ri*
stelwsl&a puerto a«.rie SCL (Signal Clock)
PxKudba pu»rtx> «trie
PxtMdMk poerto sfeZ-le Comunicación Master— Slave.
ppKaseilB* s««rto s«ri* 137
| gjAutoswe* ^ÉlS^SfeS..^^ :9?OÍ> librería Wire permite comunicar con dispositivos I2C y
Figuro 3.34: So/ido del Puerto comZ Arduino.
Para la lectura de datos desde el sensor al arduino se presenta
el siguiente programa:

#include <Wire.h>
int dirección = 0; //dirección: la localización en donde escribir,
desde O a 511 (int)
int pinlectura=l 3;
int direccion_sensor=77;

int temperatura=0;

byte envio=0;
Figura 3.35: Esquema físico de conexión Puerto serie
81
80
SWR
jj.'¿SSÜÍÍÍ!Í!

void setupQ {
Wire.begin();//Inicializa la librería Wire

}
void loopQ {
//sensor de temperatura
Wire.beginTransmission(direccion_sensor);/*Comienzala
transmisión al dispositivo I2C esclavo con la Q:¡;|';.;^^:ij!l¡||.^|
A.SK.

dirección */ ípe :«
fl:t:F--ií'+

envio=0;
Wire.write(envio);/*Escribe datos desde un dispositivo esclavo
en respuesta a una solicitud de un Figura 3.36: Esquema conexión del sensor con arduino

Maestro*/
Wire.endTransmission();//Finaliza una transmisión a un esclavo
Wire.requestFrom(direccion_sensor,l);/*Solicitabytes de otro
dispositivo, se pone 1 para
pedir al sensor de temperatura que envíe
los datos*/
while(Wire.available()==0); //Devuelve el número de bytes
disponibles para recuperar
temperatura=Wire.read(); //Lee los byte que fueron
transmitidos
D friuras.»!.

Figura 3.37: Esquema de conexión física del sensor y arduino

83
82
En las líneas de comunicación se conectan resistencias con una
3.4.3 Transmisión serie del valor de temperatura configuración pull-up de 10KÚ , con lo que provoca que en el
utilizando el Protocolo de Comunicación I2C y momentos que no exista comunicación con los dispositivos de la
Almacenamiento en la memoria EEPROM red se mantenga la línea de comunicación con una tensión de 5
voltios.
En el proyecto se utiliza un sensor de temperatura que permite la
comunicación con Arduino por medio del protocolo I2C. Para el En proteus se hizo la simulación del puerto serial com 3 por
medio del programa Configure Virtual Serial Port Driver, el cual
almacenamiento de los datos adquiridos se utiliza la memoria permite la simulación de un puerto serie en el caso que la
EEPROM de Arduino y además se realiza la transmisión de los computadora no disponga de éste.
datos por medio del puerto serial. Para control del almacenamiento de los datos se usa un switch el
El sensor de temperatura I2C utilizado es el TC74A5 que tiene cual cuando está desactivado guarda los datos en la memoria
EEPROM, mostrando la temperatura en el LCD y enviando los
una dirección por defecto de 77 en decimal, ésta dirección permite datos al puerto serial com3.
conectarse por medio del protocolo I2C que posee Arduino mega
(Ver figura 3.38) Cuando está activado lee los datos de la memoria EEPROM de
arduino, mostrando en el LCD y enviando los datos al puerto
serial com3.

TO-220 El código para el funcionamiento de la aplicación es el


siguiente:
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <Wire.h>
// la dirección actual en la EEPROM // (p.e. cual es el
siguiente byte a escribir)
int dirección = 0; //dirección: la localización en donde
escribir, desde O a 511 (int)
int pinlectura= 13;
Figura 3.38: Esquema conexión IC TC74 int direccion_sensor=77;

84 85
Wire.requestFrom(direccion_sensor,l);/*Solicita bytes de
int temperatura=0; otro dispositivo, se pone 1 para pedir al sensor de
byte envio=0; temperatura que envíe los datos*/

while(Wire . available()=0) ;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
/*Devuelve el numero de bytes disponibles para recuperar*/
void setupQ { temperatura=Wire.read();
lcd.begin(16, 2); //Lee los byte que fueron transmitidos
Serial.begin(9600);//Establece la velocidad de transmisión
S erial.print(temperatura) ;
Wire.begin();//Inicializa la librería Wire
Serial.println("C");
Serial.println("Inicio del programa");
delay(SOO);
\d loopQ {
dirección = dirección + 1 ;
if (dirección == 512) dirección = 0; delay(lOO);
//sensor de temperatura EEPROM.write(direccion, temperatura);
Wire.beginTransmission(direccion_sensor);
//Guarda los datos leídos
/* Comienza la transmisión al dispositivo I2C esclavo con
if(digitalRead(pinlectura)!= HIGH ) {
la dirección*/
//Comprueba el estado del switch
envio=0;
Wire. write(envio); Icd.clearQ;
/^Escribe datos desde un dispositivo esclavo en respuesta lcd.println(temperatura,DEC) ;
a una solicitud de un maestro*/
lcd.print("C");
Wire. endTransmissionQ;

//Finaliza una transmisión a un esclavo


87
86
else{
Icd.clearQ;
lcd.println("Lectura de Datos");

delay(SOO);

lcd.clear();
int valor = EEPROM.read(direccion);

lcd.print(direccion);

lcd.print("\t");
lcd.print(valor, DEC);
Figura 3.39: Esquema conexión en ISIS Prote>>us
Icd.printlnQ;
dirección = dirección + 1;
//incrementa la dirección de memoria

if (dirección = 512)

dirección = 0;
delay(SOO);

}
Icd.displayQ;

delay(SOO);

> Esquema de conexión física de Arduino y TC74A05


88
Bibliografía

> http://arduino.cc/es/Guide

> http://fritzing.org

> García Breijo Eduardo. (2008). COMPILADOR C CCS Y


SIMULADOR PROTEUS PARA MICROCONTROLADORES PIC.
MÉXICO. ALFAOMEGA.

> Grupo Sabika. (2010). EJERCICIOS DE ARDUINO RESUELTOS,


[en línea].

90

También podría gustarte