Mis Proyectos Con Arduino
Mis Proyectos Con Arduino
1
No hay una forma mejor de aprender electrónica que utilizando una placa de Arduino y
programarla para desarrollar infinidad de circuitos y aplicaciones electrónica.
2
A mi hijo Jaime y su madre Charo,
por todo lo que hacen por mi
y tenerme siempre feliz.
3
Índice de contenido
1. INTRODUCCIÓN ………………………………………………………………………….………………(6)
1.1 Sistemas microprogramables
1.2 Iniciación a un proyecto con microcontrolador
2. CONOCIENDO ARDUINO………………………………………………………………….……………(9)
2.1 Placa Hardware PCB
2.2 Software de Desarrollo
2.3 Elementos de la Placa Arduino
4
Índice de contenido
19. CONTROL DE LAS LUCES DEL JARDIN MEDIANTE SENSOR LDR……………….... (115)
5
1.Introducción
Con la aparición de las placas de Arduino, los usuarios expertos y no tan expertos, han visto
una oportunidad para explotar su creatividad y realizar proyectos que antes no podían
afrontar de una forma tan sencilla, pues se necesitaban de muchos recursos que solamente
se lo podían permitir los fabricantes de equipos Hardware en sus departamentos de I+D y
Producción.
Arduino se ha proclamado como una de las plataformas escogidas para llevar a cabo
proyectos tecnológicos. Esto es así debido a su versatilidad como instrumento para este
cometido, por la gran cantidad de sensores que puede incorporar y por los precios que se
están alcanzando, o que permite hoy en día a los usuarios tenerlo al alcance de la mano y
del bolsillo, destacando también, la facilidad con la que se puede programar e interactuar
con el medio que nos rodea.
En el mercado podemos encontrar una gran variedad de placas de Arduino; todas ellas
ofrecen características diferentes unas de otras. Estas características se pueden apreciar
visualmente, es decir, encontramos diferencias de tamaños y formas, pero también se
diferencian por potencia eléctrica, de cálculo o soluciones software como, por ejemplo,
diferencias en la resolución de lecturas analógicas o número de interrupciones.
Pero las diferencias vienen por parte del micronotrolador en concreto, más que por el
diseño de la placa en sí. Ya que el hardware de Arduino es un elemento que incorpora los
componentes necesarios que nos permiten trabajar con un determinado microcontrolador
e incorporarlo a nuestros proyectos. Puesto que también, es idóneo para minimizar el
número de componentes y, que a su vez pueda ser modificable su funcionamiento por
software en futuras versiones.
Pues bien, en este caso nos vamos a centrar en el empleo y desarrollo de la placa de
Arduino Duemilanove y especialmente en el microcontrolador Atmega328P-PU. Podemos
acceder al siguiente enlace para obtener más información sobre la estructura y
características del microcontrolador. ATMEL-ATMEGA-328P
6
1. Introducción
Desde el primer momento en que se desea crear proyectos en los que se pretende que la
solución a un problema sea algo automatizado y controlado electrónicamente estamos
haciendo referencia a lo que se denomina sistemas microprogramables.
Introduciéndonos un poco sobre los inicio de un proyecto, hay que añadir que, lo primero
que debemos tener en cuenta a la hora de hacer un proyecto con un microcontrolador es de
recopilar toda la información que podamos conseguir y anotándola con esquemas,
organigramas, croquis, etc., para que se nos sea más fácil en el transcurso y desarrollo del
proyecto.
Es primordial saber algunos aspectos de lo que queremos hacer, es decir, tener claro de qué
información y datos necesitamos y cual disponemos, dónde la podemos conseguir, etc.
Al principio, estos puntos nos serán útiles para tener una base con la información general
de nuestro proyecto. Por ejemplo, tenemos que recopilar datos de los componentes
electrónicos que vayamos a utilizar en nuestro proyecto, entre ellos, sus características
técnicas: alimentación, corriente de consumo, compatibilidad TTL/CMOS, polarización, etc.
7
1. Introducción
1. Qué componentes nos hace falta… un relé, una fotocélula, un display, una
lámpara, un potenciómetro, un optoacoplador, un A.O., etc.
2. Obtener información de los componentes electrónicos que vamos a utilizar
mediante sus hojas de datos, por ejemplo, en https://www.alldatasheet.es
3. Diferenciar los elementos de entrada digital/analógica con los de salida
digital/analógica.
4. Dar nombres a cada uno de los elementos de E/S digital y analógica: LDR_01, L_01,
PO_01…
5. Dar nombre a las diferentes variables… var01, var02, value…
6. Especificar por escrito la relación de pines utilizados por Software y Hardware.
7. Hacer un borrador con los datos recopilados para tenerlos presentes en el
transcurso del proyecto.
8. Hacer un esquema u ordinograma que nos pueda servir de guía.
9. Etc…
Según los datos que estemos manejando y los sensores o componentes que proporcionan
dichos datos, deberemos saber cuándo utilizar una entrada analógica y cuándo utilizar una
entrada digital. Por ejemplo, para controlar un pequeño motor, nuestras entradas y salidas
deberán ser analógicas; en cambio, para controlar el encendido y apagado de un diodo led,
deberemos utilizar las E/S digitales, y las E/S PWM para controlar la intensidad luminosa
de un diodo led.
8
2. Conociendo Arduino
Cuando hablamos de la placa hardware nos estamos refiriendo en concreto a una PCB (del
inglés Printed Circuit Board, o sea, placa de circuito impreso). Las PCBs son superficies
fabricadas de un material no conductor (normalmente resinas de fibra de vidrio
reforzada, cerámica o plástico) sobre las cuales aparecen laminadas (“pegadas”) pistas
de material conductor (normalmente cobre). Las PCBs se utilizan para conectar
eléctricamente, a través de pistas conductoras, diferentes componentes electrónicos
soldados a ella. Una PCB es la forma más compacta y estable de construir un circuito
electrónico (en contraposición a una breadboard, perfboard o similar) pero, al
contrario que estas, una vez fabricada, su diseño es bastante difícil de modificar. Así
pues, la placa Arduino no es más que una PCB que implementa un determinado diseño
de circuitería interna.
9
2. Conociendo Arduino
De todas formas, aunque puedan ser modelos específicos diferentes, tal como
acabamos de comentar, los microcontroladores incorporados en las diferentes placas
Arduino pertenecen todos a la misma “familia tecnológica”, por lo que su funcionamiento
en realidad es bastante parecido entre sí. En concreto, todos los microcontroladores son
de tipo AVR, una arquitectura de microcontroladores desarrollada y fabricada por la
marca Atmel: https://www.microchip.com/
10
2. Conociendo Arduino
En el segundo caso, la placa debe estar conectada de alguna forma permanente (por
cable USB, por cable de red Ethernet, etc.) a un ordenador ejecutando algún software
específico que permita la comunicación entre este y la placa y el intercambio de datos
entre ambos dispositivos. Este software específico lo deberemos programar generalmente
nosotros mismos mediante algún lenguaje de programación estándar como Python,
C, Java, Php, etc., y será independiente completamente del entorno de desarrollo
Arduino, el cual no se necesitará más, una vez que la placa ya haya sido programada y esté
en funcionamiento.
11
2. Conociendo Arduino
Que el software Arduino se parezca tanto a Processing no es casualidad, ya que este está
especializado en facilitar la generación de imágenes en tiempo real, de animaciones y
de interacciones visuales, por lo que muchos profesores del Instituto de Diseño de
Ivrea lo utilizaban en sus clases. Como fue en ese centro donde precisamente se
inventó Arduino es natural que ambos entornos y lenguajes guarden bastante similitud.
No obstante, hay que aclarar que el lenguaje Processing está construido internamente
con código escrito en lenguaje Java, mientras que el lenguaje Arduino se basa
internamente en código C/C++
La placa hardware de Arduino integra unas series de elementos específicos que la hace
exclusiva y que a continuación se describen:
Puerto USB: A través de este puerto podremos conectar el ordenador con la placa
Arduino. Necesitaremos para ello un cable USB tipo AB (el de las impresoras) y a
través de éste, podremos cargar en la placa los programas diseñados y también
proporcionar alimentación eléctrica al dispositivo.
Chip integrador: Actúa como puente y comunica el ordenador y el
microcontrolador que veremos más adelante.
Power: Podemos conectar una fuente de alimentación para que Arduino trabaje de
manera autónoma sin necesidad de que esta placa esté conectada al ordenador
mediante USB.
Chip - Cristal de cuarzo: Actuaría como un reloj interno de Arduino. Da las
pulsaciones de frecuencia necesarias para que la placa actúe de manera
sincronizada y repetitiva. Cada vez que reiniciamos arduino, su contador comienza
desde cero y esto puede ser útil en ciertos programas.
Leds: Hay tres: El “L” está vinculado al puerto 13 de Arduino y nos va a permitir
hacer pruebas de funcionamiento de arduino sin necesidad de conectar otros
dispositivos u otros LEDs. Los otros dos Leds son los que indican Tx y Rx y éstos
nos permiten conocer el estado de comunicación entre el ordenador y la placa.
Conexiones digitales: Son pines de conexión rápida que funcionan como entrada y
salida de datos digitales. Con ellos podremos remitir información del entorno a la
placa (con el empleo de un sensor por ejemplo) o bien extraer respuestas desde la
propia placa hacia otros periféricos conectados a Arduino (como luces LEDs, etc.).
LED ON: Es un diodo LED de color verde que nos permite conocer cuándo nuestro
Arduino está conectado a la corriente (a través de baterías o a través del cable USB)
y por lo tanto está encendido y en funcionamiento.
12
2. Conociendo Arduino
Con Arduino se pueden realizar multitud de proyectos de rango muy variado: desde
robótica hasta domótica, pasando por monitorización de sensores ambientales, sistemas
de navegación, telemática, etc. Realmente, las posibilidades de esta plataforma para el
desarrollo de productos electrónicos son ejerciciomente infinitas y tan solo están limitadas
por nuestra imaginación.
https://myelectronic.ueuo.com/arduino.html
13
3. Características de la placa Arduino Duemilanove
https://www.arduino.cc/en/software
Esta placa Arduino Duemilanove es una placa de desarrollo que trabaja con el
microcontrolador Atmega328P-PU de 8 bits; esto quiere decir que el microcontrolador
puede gestionar instrucciones de una longitud de 8 bits, o lo que es lo mismo, de 1 byte.
Todos estos pines están conectados a una regleta de pines, para la conexión de los
componentes y circuitos prototipos.
14
3. Características de la placa Arduino Duemilanove
La placa de Arduino Duemilanove posee unos pines para conexiones externas para
conectar hilos rígidos de 0,5 mm de diámetro de diversos colores para que nuestro montaje
sea fácilmente identificado con los componentes y circuitos exteriores: digital pins,
analogpins y powerpins:
Pines digitales (digital pins). Son terminales que se emplean para comunicar la placa
Arduino con el exterior, conectando sensores que proporcionan información digital (5 V
o 0 V, 1 o 0). Se podrán configurar como entrada o salida. Arduino Duemilanove
dispone de 14 pines de este tipo, de los cuales seis pines poseen salida analógica PWM.
Pines analógicos (analogpins). Son terminales que se emplean para comunicar la placa
Arduino con el exterior, conectando sensores que les proporcionan información
analógica. Posee 6 pines de entradas analógicos de la AN0 a AN5 (ANALOG IN).
Pines de alimentación (powerpins). Estos terminales contiene los pines de salida de
alimentación que permite dar servicio de tensión a nuestros circuitos y componentes
conectados exteriormente. Posee cinco pines:
1. RESET. Este pin tiene la misma función que el botón reset. Aquí lo encontramos
en formato pin para poder resetear la placa mediante un pulsador externo y una
resistencia de 10K a 5V.
2. 3,3 V. Este pin proporciona 3,3 voltios. Es posible que algún sensor o
componente requiera de esa tensión para poder funcionar correctamente.
3. 5 V. Este pin proporciona 5 voltios para alimentar los dispositivos, sensores y/o
componentes electrónicos conectados a Arduino.
4. GND. Aquí se conectarán los terminales de masa de los componentes
electrónicos que se hayan podido conectar al terminal de 5 o 3,3 voltios de
Arduino.
5. Vin. Este terminal permite alimentar a Arduino de la misma forma en que se
realiza en el caso del conector de alimentación mediante un conector Jack de
9mm. Esta tensión debe estar comprendida entre 7 y 12 voltios máximo.
15
3. Características de la placa Arduino Duemilanove
NOTA: Es muy importante conocer la diferencia entre las señales analógicas y digitales.
La señal analógica es aquella que presenta una variación continua con el tiempo, es decir, la
información o la señal, para pasar desde un valor a otro pasa necesariamente por todos los
valores intermedios. Es continua y puede tomar infinitos valores. Estas señales
predominan en nuestro entorno (variaciones de temperatura, presión, velocidad, distancia,
sonido etc.) y éstas pueden ser transformadas en señales eléctricas mediante un dispositivo
denominado transductor. La señal digital es aquella que presenta una variación
discontinua con el tiempo y sólo puede tomar ciertos valores discretos. Es decir, va a saltos
entre uno y otro valor. La utilización de señales digitales para transmitir información
puede ser de dos modos: En función del número de estados distintos que pueda tener:
Binario, ternario… Y en función de su naturaleza eléctrica. Una señal binaria se puede
representar como la variación de una amplitud respecto al tiempo.
16
3. Características de la placa Arduino Duemilanove
Indicador TX/RX
Son dos diodos leds que indican que Arduino se está comunicando vía serie con el PC.
Cuando esto ocurre, los indicadores parpadean, alertando de la transmisión y recepción de
la información transmitida entre Arduino y el ordenador.
Los pines 2 y 3, D0 (Rx) y D1 (Tx). Se encargan de recibir y transmitir los datos que le
llegan desde el PC mediante el puerto serie USB señalizando las transmisiones mediante
dos diodos leds. Estos pines se encuentran disponibles en el conector digital pins con la
idea de utilizarlo en la programación de un microcontrolador que se encuentra montado en
otra placa.
Conector ICSP
Se utilizan cuando se desea programar Arduino desde un entorno diferente del IDE y de la
conexión típica por USB. Para realizar esta operación se requiere de un programador
externo que irá conectado a los conectores mencionados. Si se desea programar Arduino de
este modo, se deberá hacer en lenguaje Ensamblador o en lenguaje de alto nivel C.
Indicador de encendido
Mediante un pequeño diodo led verde indica que Arduino está alimentado correctamente y
listo para programar. Cuando conectamos nuestra placa Arduino al puerto USB de nuestro
ordenador, inmediatamente se enciende el Power Led, de color verde, que nos indica que
la placa está conectada a la alimentación y es correcta. Al mismo tiempo el ordenador
detecta un nuevo dispositivo y lo instala.
17
3. Características de la placa Arduino Duemilanove
Características principales:
Microcontrolador ATmega328P-PU
Voltaje de operación 5V
Tensión de entrada(recomendada) 7-12 V
Tensión de entrada (límite) 6-20 V
Pines Digitales de E/S 14 (0-13, de los cuales 6 con salidas PWM)
Pines de entrada analógicos 6 (0-5)
Corriente DC por pin E/S 40 mA.
Corriente DC para pin 3,3V 50 mA.
Memoria Flash 32 KB (de los cuales 2 KB usados para bootloader)
SRAM 2 KB
EEPROM 1 KB
Frecuencia de reloj 16 MHz.
18
3. Características de la placa Arduino Duemilanove
Botón de reset
Permite realizar un reinicio a la placa. Una vez reseteada la placa, ésta vuelve a ejecutar el
programa que tiene cargado.
Indicador de carga
Este indicador L es un diodo led de color naranja, situado en el pin D13, parpadea cuando
se carga un programa en la placa de Arduino.
19
3. Características de la placa Arduino Duemilanove
3.2. Alimentación
1. Mediante el conector USB. Cuando Arduino está conectado al PC, la placa está
alimentada para poder programarla. El puerto USB proporciona 5 voltios, tensión
suficiente para activar la placa y que empiece a funcionar. Esta alimentación está
limitada para funcionar con demasiada carga de corriente. El circuito que utiliza de
puente entre el PC y la placa Arduino es el Circuito integrado FTDIFT232RL que nos
provee de alimentación 3,3 V y 5 voltios. Se puede alimentar con un cargador de
móviles si no se utiliza el puerto de comunicaciones del PC o el monitor serie.
2. Mediante un Jack. De 2,1 mm del tipo rop de entrada. La tensión deberá ser de 7 a 12
voltios en continua, siendo lo normal una tensión de 9 voltios, como una pila de petaca.
Para ello se dispone de un regulador de tensión de 5 voltios instalado en la propia placa
Arduino. Si es suministrada con menos de 7 V, puede suministrar menos de 5 voltios y
la placa podría ser inestable. Si usas más de 12 voltios, el regulador de tensión puede
sobrecalentarse y dañar la placa. El rango recomendado es de 7 a 12 voltios en
continua. Cuando entra la alimentación por Jack superior a 7 voltios y menor de 12 V, se
corta la alimentación del USB y entra la alimentación del regulador, pero la
comunicación del puerto serie con el PC no se corta.
3. Mediante el pin de entrada Vin. Tiene la misma función que el conector Jack de 2,1
mm, sólo que aquí se puede prescindir de este conector y alimentar la placa mediante
una tensión continua entre 7 a 12 voltios y GND.
20
3. Características de la placa Arduino Duemilanove
Vin. Este pin permite alimentar a la placa Arduino de la misma forma en que se
realiza en el caso del conector de alimentación mediante un conector Jack de 2,1mm.
5V. Este pin proporciona 5 voltios para alimentar los dispositivos, sensores y/o
componentes electrónicos conectados a Arduino. Este puede venir o desde Vin a
través de un regulador en la placa, o ser suministrado por USB u otro suministro
regulador de 5 voltios.
3V3. Este pin proporciona 3,3 voltios. Es posible que algún sensor o componentes
electrónicos requiera de esta tensión para poder funcionar correctamente. Es
generado por el chip FTDI (FT232RL) en el pin 17 de la placa. La corriente máxima
es de 50 mA.
GND. Aquí se conectarán los terminales de masa de los componentes electrónicos
que se hayan podido conectar al terminal de Vin, 5 o 3,3 voltios de Arduino.
El Arduino Duemilanove tiene un fusible reseteable que protege los puertos USB del
ordenador de cortes y sobrecargas. Aunque la mayoría de los ordenadores proporcionan su
propia protección interna, el fusible proporciona una capa de protección extra. Si más de
500 mA se aplican al puerto USB, el fusible automáticamente romperá la conexión hasta
que el corte o la sobrecarga sean eliminados.
3.4. Memoria
El Atmega328P tiene 32KB de memoria Flash para almacenar códigos (de los cuales 2 KB
se usa para el “bootloader”) y, vienen precargado con el gestor de arranque bootloader.
Tiene 2 K de SRAM y 1 KB de EEPROM (que puede ser leída y escrita con la librería
EEPROM).
Los tipos de memorias que están integrado en el microcontrolador Atmega 328P son:
21
3. Características de la placa Arduino Duemilanove
Cada uno de los 14 pines digitales del Arduino Duemilanove puede ser usado como entrada
o salida, usando funciones pinMode(),digitalWrite() y digitalRead(). Opera a 5 voltios.
Cada pin puede proporcionar o recibir un máximo de 40 mA y tiene una resistencia interna
“pull-up” (desconectada por defecto) de 20 – 50K Ω.
Serial: 0 (Rx) y 1 (Tx). Usados para recibir (Rx) y transmitir (Tx) datos TTL, en
serie. Estos pines están conectados a los pines correspondientes del chip FTDI USB-
a-TTL Serie.
Interruptores externos: Los pines D2 y D3, 0 y 1, pueden ser configurados para
disparar un interruptor en un valor bajo, un margen creciente o decreciente, o un
cambio de valor. Su función es attachInterrupt().
PWM: 3, 5, 6, 9, 10 y 11. Proporcionan salida PWM de 8 bits con la función
analogWrite()
LED: 13. Hay un diodo led instalado en la placa Arduino conectado al pin D13.
Cuando el pin 13 está a valor HIGH, el led está encendido, cuando el pin está a LOW,
está apagado.
Reset. Pone esta línea a LOW para resetear el microcontrolador. Típicamente usada
para añadir un botón de reset a dispositivo que bloquean a la placa principal.
Entradas analógicas. Arduino Duemilanove tiene 6 entradas analógicas AN0 a
AN5 (analogpins).
3.6. Comunicación
El UART TTL (5V), un FTDI FT232RL, soldado en la placa de Arduino, canaliza esta
comunicación serie al USB y los drivers FTDI (incluidos con el software Arduino)
proporcionan un puerto de comunicación virtual al software del ordenador.
22
3. Características de la placa Arduino Duemilanove
Una librería Software Serial permite comunicación serie en cualquiera de los pines
digitales del Duemilanove.
3.7. Programación
https://www.arduino.cc/en/Main/Software
https://www.arduino.cc/en/Tutorial/Bootloader
23
3. Características de la placa Arduino Duemilanove
En la placa Arduino posee un botón de reset que nos permite en cualquier momento, que se
esté ejecutando el programa, de detenerlo y comenzar de nuevo la ejecución del programa.
Esto es así, porque estamos aplicando, cuando pulsamos el botón de reset, una señal
negativa GND a la patilla 1 del microcontrolador Atmega328P. El microcontrolador
inmediatamente detiene el programa y comienza desde el principio, quedando la patilla 1
del microcontrolador a nivel alto mediante una resistencia de 10K a VCC.
En lugar de requerir una pulsación física del botón de reset antes de una subida, el Arduino
Duemilanove está diseñado de forma que permite ser reseteado por software en ejecución
en un ordenador conectado.
Una de las líneas de control de flujo de hardware (DTR) del FT232RL está conectada a la
línea de reset del ATmega328P a través de un condensador de 100 nF. Cuando esta línea
toma el valor LOW, la línea reset se mantiene el tiempo suficiente para resetear el chip. La
versión 0009 del software Arduino usa esta capacidad para permitir cargar código
simplemente presionando el botón de upLoad (Cargar) en el entorno Arduino. Esto
significa que el bootloader (gestor de arranque) puede tener un tiempo de espera más
corto, mientras la bajada del DTR puede ser coordinada correctamente con el comienzo de
la subida.
Para resetear por software desde el mismo programa que está ejecutando el
microcontrolador de Arduino se puede utilizar la siguiente función:
Con las siguientes instrucciones lo que hace es saltar por software otra vez a dicha
dirección, pero no pasa por el estado en que todas las entradas I/O del micro pasan por
estado inicial del micro.
unsignedinttstart;
voidsetup() {
Serial.begin(9600);
Serial.println("EMPEZANDO....");
tstart=millis();
}
24
4. Grabar el Gestor de Arranque (Bootloader)
Duemilanove
El bootloader de Arduino es un software alojado en la memoria flash del ATmega 328P
que nos permite reprogramar Arduino a través del puerto serie sin necesidad de usar un
programador externo.
El bootloader de Arduino es una de las partes esenciales en las que reside la comodidad y
sencillez de uso de Arduino. En general lo normal es que no necesitemos lidiar con él. Sin
embargo, hay varias circunstancias en las que necesitaremos ser capaces de modificar el
bootloader de Arduino.
Por ejemplo:
Este proceso consiste en la grabación del gestor de arranque, para ello, vamos a construir
una estructura de programación en paralelo con una placa Arduino Duemilanove
Atmega328P-PU que funcione correctamente y nos sirve como Master y, una placa de
prototipo protoboard con un microcontrolador Atmega328P-PU, sin gestor de arranque o
con problemas de ellos, será la que está configurado comoSlave.
Para grabar el gestor de arranque, usando una placa de Arduino, hay que seguir estos pasos
para el Arduino programador (Master):
25
4. Grabar el Gestor de Arranque (Bootloader)
Duemilanove
Una vez cargado el programa en la placa Arduino Master y sin errores, debe
observarse que la placa Arduino no hace nada, no lucen ningún diodo led ni
tampoco parpadean, esta situación es la correcta.
Arduino Master
Placa Slave
26
4. Grabar el Gestor de Arranque (Bootloader)
Duemilanove
Componentes necesarios:
NOTA: La placa prototipo o protoboard se trata de una placa con conexiones internas en la
que podemos pinchar nuestros componentes para realizar nuestros prototipos, sin tener
que realizar un solo punto de soldadura de estaño, tantas veces como queramos. Debemos
tener en cuenta como se distribuyen las conexiones internas de nuestra placa protoboard.
4. Conectar la placa Arduino Master al PC, si todo ha ido bien, al alimentar con USB en
la placa de prueba protoboard Slave el diodo led verde comenzará a “latir”
5. Seleccionar en el menú Herramientas/Placa/Arduino Duemilanove or
Diecimila
27
4. Grabar el Gestor de Arranque (Bootloader)
Duemilanove
6. Seleccionar Herramientas/Procesador/ATmega328
28
4. Grabar el Gestor de Arranque (Bootloader)
Duemilanove
El proceso encenderá los diodos leds de la placa Arduino, Lamp, Tx y Rx y los diodos leds
de la placa protoboard durante aproximadamente unos 15 segundos. Si todo va bien, se
encenderá el diodo led amarillo de la placa Arduino y al cabo de un minuto tendremos
nuestro Atmega328P listo para ser programado.
29
5. Trabajar directamente con la placa Protoboard
Para ello, hay que hacer unas pequeñas modificaciones. Primeramente debemos quitar el
microcontrolador que viene en la placa de Arduino e insertarlo en la placa prototipo
protoboard para que el chip de FTDI pueda comunicarse con el microcontrolador desde la
placa Arduino.
La imagen de abajo nos muestra cómo conectar las líneas Reset, alimentación y Rx/Tx de
la placa Arduino a la placa de prototipo protoboard. Para programar el microcontrolador,
seleccione en el menú: Herramientas/Placa Arduino Duemilanove/ ATmega328. A
continuación, sube un programa y trabaja sobre la placa protoboard.
https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard
30
5. Trabajar directamente con la placa Protoboard
Cuando se carga una programación veremos que los diodos leds L, Tx y Rx de la placa de
Arduino comienza a encenderse, esto es buena señal, lo mismo ocurre cuando trabajamos
con el monitor serie y se transmite y recibe los datos al PC. Como prueba inicial podemos
cargar el programa Blink que nos indicará si todo ha ido correctamente.
A partir de ahora podemos ir trabajando con todos los componentes sobre la misma placa
de prueba protoboard que contiene el microcontrolador.
NOTA: En esta fase es muy importante conocer y manejar el patillaje del microcontrolador
ATMega328P para las conexiones de componentes para los diferentes proyectos. También
es recomendable tener cuidado en la manipulación del microcontrolador: en su desmontaje
y montaje ya que se pueden doblar fácilmente algunas patillas.
31
6. Componentes Hardware para conectar en Arduino
En los proyectos electrónicos intervienen unas series de componentes electrónicos que nos
sirven para polarizar, señalizar, amplificar, adaptar, detectar, ajustar o medir cualquier
magnitud que necesitemos: velocidad, temperatura, movimiento, etc., para tratarla como
datos para nuestro sistema de control.
Tanto los datos de entrada original como los de realimentación (los datos de salida) de los
sistemas de control, son captados y se introducen en ellos mediante unos dispositivos que
se denominan sensores. Los sensores serán dispositivos capaces de detectar las
condiciones del entorno (temperatura, luz, humedad, movimiento…) y traducir esta
información que le llega del exterior en un impulso eléctrico, normalmente digital (pasa o
no pasa corriente), que puede ser analizado y procesado por la unidad de control del
sistema.
Los sensores son componentes importantes para poder dotar a nuestros sistemas de
sentidos.
Estos sensores son los encargados de captar la realidad que nos rodea en nuestro medio
ambiente. Por ejemplo, sensores que nos los encontramos en las farolas de nuestras calles
cuando se encienden de noche, detectores en las puertas automáticas cuando entramos en
un supermercado, sensores que detectan la temperatura y hacen activar los ventiladores,
detectores que detectan la humedad, detectores de aparcamiento del vehículo, etc…
El bumper es un microinterruptor que posee una lámina de metal u otro material que está
en contacto con un pequeño interruptor. Así, cuando la lámina impacta con un objeto, ésta
acciona el interruptor y se genera el cambio de posición en el microinterruptor. Por
ejemplo: saber cuándo una puerta o una ventana que se abren automáticamente están ya
completamente abiertas y por lo tanto el motor que las acciona debe pararse.
Los principales son los llamados fines de carrera. Se trata de un interruptor que consta de
una pequeña pieza móvil y de una pieza fija que se llama NA, normalmente abierto, o NC,
normalmente cerrado.
32
6. Componentes Hardware para conectar en Arduino
Este sensor de infrarrojos detecta obstáculos a una distancia de 2 a 30 cm. Con un ángulo
de detección de 35º. Está constituido por un diodo emisor de infrarrojos y un fotodiodo
receptor de infrarrojos que en el caso de detectar un objeto envía una señal, pudiendo
activar un relé.
SENSOR MAGNÉTICO
Detecta los campos magnéticos que provocan los imanes o las propias corrientes eléctricas.
Consiste en un par de láminas metálicas de materiales ferromagnéticos metidas en el
interior de una cápsula que se atraen en presencia de un campo magnético (imán),
cerrando con ello el circuito. El principal es el llamado interruptor Reed. Éste puede
sustituir a los finales de carrera para detectar la posición final de un elemento móvil con la
ventaja de que no necesita ser empujado físicamente por dicho elemento sino que puede
detectar la proximidad sin contacto directo.
33
6. Componentes Hardware para conectar en Arduino
Un sensor detector de movimientos por infrarrojos PIR, es un dispositivo pasivo que está
formado por dos infrarrojos y una lente de tipo fresnel que es una capsula de espejos que
amplia como un abanico los haces de infrarrojos que se propagan al exterior, adaptándose
a la temperatura de los cuerpos y objetos que hay en el recinto. Estos sensores mide
constantemente la diferencia de calor que puede haber entre un cuerpo y la estancia en la
que está ubicado. Cuando un cuerpo pasa por su campo de acción, una de las partes detecta
el calor del cuerpo y detecta una diferencia entre el calor que tenía como referencia y el
detectado en ese mismo instante. La detección pueden activar un relé, una lámpara, un
timbre, una electroválvula, etc.
34
6. Componentes Hardware para conectar en Arduino
Las siglas LDR provienen del inglés Light Dependent Resistor (resistencia que depende de la
luz). El valor que nos proporciona una LDR variará dependiendo de la cantidad de luz que
incida sobre ella. El valor de la resistencia será bajo cuando la luz incida sobre ella, y será
alto cuando no incida luz sobre ésta. Los valores de una LDR pueden ir de unos 50 Ohmios
a varios Mega Ohmios.
A todo esto, podemos comprender el funcionamiento de una LDR como parte de un divisor
de tensión resistivo. Observemos el siguiente esquema:
Como se ha explicado anteriormente, tal como está configurado este divisor, la tensión
resultante o de salida será la R2 entre la suma de la LDR y la resistencia R2, y todo
multiplicado por la tensión de entrada Vin.
Estas condiciones se pueden cambiar de una forma bien simple. Si, por ejemplo, deseamos
que la LDR actúe al revés de como se ha explicado anteriormente, solo debemos
intercambiar la LDR (R1) con la R2, quedando de esta manera, la LDR abajo y la R2 arriba,
con lo que cuando la luz incide sobre la LDR, la tensión es baja, y cuando la luz no incide en
la LDR, la tensión es alta.
35
6. Componentes Hardware para conectar en Arduino
Por lo tanto, estos sensores térmicos dependen de la temperatura y de que estos sensores
permitan o no el paso de la corriente por el circuito del sistema de control.
El sensor de temperatura LM35 entrega 10mV por cada grado centígrado de temperatura.
36
6. Componentes Hardware para conectar en Arduino
Se basan en la propiedad del agua como elemento que posee conductividad eléctrica (a
diferencia del aire). Por lo tanto, un par de cables eléctricos desnudos (sin cinta aislante o
plástico recubriéndolos) van a conducir una pequeña cantidad de corriente si el ambiente
es suficientemente húmedo. Si colocamos un transistor que amplifique esta corriente
tendremos un detector de humedad.
Los DHT11 o DHT22 son dispositivos sensores que permitirá tomar lecturas de la
humedad y la temperatura. Su precisión no es muy alta pero nos puede servir para un gran
número de propósitos en los que no nos encontremos en condiciones extremas.
Receptor
Transmisor
El transmisor y receptor por RF se utiliza para el control remoto del envio y la recepción
de datos y señales de control, las aplicaciones más comunes son: para puertas de garaje,
persianas, cerraduras, iluminación, telemetría, control industrial, alarmas, etc
37
6. Componentes Hardware para conectar en Arduino
El EL0418 es un sensor de carga cuyo peso máximo permitible es de 20Kg que trabaja de
3 a 12 voltios en corriente continua. Este sensor detecta los diferentes valores de peso
señalizándolo al sistema de control.
38
6. Componentes Hardware para conectar en Arduino
SENSORES ACELERÓMETROS
Sensores acelerómetros
SENSORES MICRÓFONOS
Estos sensores captan los sonidos (variaciones de presión del aire) y los transforman en
señales electrónicas basándose en el efecto piezoeléctrico. Necesitan un filtrado y una
amplificación para una determinada detección y obtener una señal adecuada.
Este sensor está ideado para la detección de velocidad y contador de pulsos. Está
constituido por el LM393 que es un doble comparador A.O. Un optoacoplador óptico
formado por un diodo led y un fotodiodo, enfrentados, y esto nos permite detectar cuando
se coloca un objeto en medio, se produce una señal que nos puede servir como contador de
pulsos, en el control de velocidad de las impresoras, por ejemplo.
39
6. Componentes Hardware para conectar en Arduino
ACTUADORES LED
Diodo emisor de luz. Podemos encontrarlos de múltiples colores. Los electrones que lo
atraviesan producen una liberación de energía en forma de radiación lumínica. Para lograr
que luzca, debemos hacer que por él circule una potencia superior a la tensión umbral del
led (el mínimo que necesita para lucir), pero inferior a la máxima que puede soportar, o se
quemará, por lo que es importante interponer resistencias.
El diodo LED tiene polaridad. La pata más larga debe conectarse al ánodo (+). El lado
achatado de la capsula corresponde al cátodo del diodo LED (-).
Diodo laser concentra toda la luz en un punto Diodo laser para Arduino
Por tanto, el diodo LED LASER nos aportan ventajas, como fiabilidad, eficacia,
manejabilidad en cuanto al peso, distancias largas del haz, pero como inconveniente, es su
capacidad para alinear un punto de luz del láser a mucha distancia sobre un elemento
receptor, por ejemplo, una LDR.
FOTODIODO
40
6. Componentes Hardware para conectar en Arduino
Pantalla de cristal líquido formada por píxeles. Para iluminar alguno de ellos lo que se hace
es aplicar un campo eléctrico en la zona deseada, con lo que el cristal líquido se polariza y
lo percibimos de otro color.
ACTUADORES ZUMBADORES
Estos dispositivos producen una vibración cuando se ve sometido a una corriente eléctrica
basándose en el efecto piezoeléctrico. Esta vibración genera un sonido y puede emplearse
como sistema de aviso.
PULSADORES
NC
41
6. Componentes Hardware para conectar en Arduino
INTERRUPTORES
MOTORES DE CC
Los motores de corriente continua tienen polaridad (+VCC y GND) por lo que pueden tener
dos sentidos de rotación, según cambiemos la polaridad de la tensión en sus bornes de
conexión, el sentido puede girar a la derecha o a la izquierda. Estos motores necesitan de
un regulador de velocidad con Arduino para poder ser utilizados en proyectos como robot,
seguidores de línea o robots.
SERVOMOTORES
42
6. Componentes Hardware para conectar en Arduino
ACTUADORES DE RELES
POTENCIÓMETROS
Un potenciómetro es una resistencia variable con el que podremos elegir el valor que éste
puede tomar. Es una resistencia en la que se puede ajustar su valor girando una ruedecita o
manecilla de derecha a izquierda o viceversa, aumentando la resistencia o disminuyéndola
a nuestro gusto. De esta forma, controlamos la intensidad de corriente que fluye por un
circuito si éste está conectado en paralelo, así como la diferencia de potencial si está
conectado en serie.
La resistencia máxima que ofrece el potenciómetro entre sus dos extremos (que es
constante) no es más que la suma de las resistencias entre los dos extremos y la patilla
central.
El potenciómetro posee tres terminales o patillas, el que está en medio se utiliza para
ajustar el valor de la resistencia a un determinado valor, por ejemplo, si la resistencia entre
sus dos extremos tiene un valor de 10K, si colocamos el cursor en medio, tendremos un
valor de 5K. A la misma vez que vayamos girando el terminal central hacia un extremo u
otro del potenciómetros se observa que en un extremo la resistencia es mayor y en el otro
extremo la resistencia es menor y viceversa.
43
6. Componentes Hardware para conectar en Arduino
RESISTENCIAS
Los resistores o resistencias fijas, son unos componentes utilizados para añadir una
resistencia eléctrica entre dos puntos de un circuito de manera que nos permite distribuir
adecuadamente tensiones y corrientes a lo largo de nuestro circuito, polarizando circuitos,
divisores de tensión, cargas, protección, etc.
CONDENSADORES
OPTOACOPLADORES
44
6. Componentes Hardware para conectar en Arduino
TRANSISTORES
Los hay del tipo NPN y PNP. Algunos transistores aún son construidos en encapsulados
individuales, pero la mayoría son construidos como parte de circuitos integrados.
FOTOTRANSISTORES
45
7. Entorno de desarrollo de Arduino
Hemos visto que para poder trabajar con Arduino necesitamos un hardware, un software y
un programa. Ya conocemos al detalle el hardware, que es la propia placa Arduino y todos
los componentes que podemos conectar a ella. Ahora nos adentraremos en la instalación
del software. Puesto que Arduino, a diferencia del ordenador que usas normalmente, no
tiene pantalla ni teclado, se necesita un programa externo ejecutado en otro ordenador
para poder escribir programas para la placa Arduino. Éste software es lo que llamamos
Arduino IDE. IDE significa “Integrated Development Environment” (Entorno de Desarrollo
Integrado).
La interfaz del entorno de desarrollo de Arduino cuenta con un entorno nativo creado en
JAVA, por lo que es multiplataforma y el lenguaje que utiliza es propio de Arduino y está
basado en el lenguaje C/C++.
De todas formas si necesitamos instalar o reinstalar los drivers para el chip FTDI de la
placa. Estos pueden encontrarse en el directorio drivers /FTDI USB Drivers de la
distribuidora Arduino: http://www.ftdichip.com/Drivers/VCP.htm
46
7. Entorno de desarrollo de Arduino
Una vez que ejecutamos el entorno de Arduino nos aparece la ventana de inicio de la
aplicación.
Como se puede ver en la imagen anterior aparece un entorno de trabajo de Arduino donde
podemos escribir nuestros códigos e instrucciones y el propio entorno nos va ayudando
señalizando si el código introducido está bien, así como las llaves, paréntesis, valores, etc.
El entorno de desarrollo integrado IDE de Arduino es el área de edición del código donde
se escribirá el código del software que se requiere. Aquí se crea el sketch, el programa
escrito en código fuente. En éste área de trabajo es sencilla visualmente y tiene ciertas
características que hace diferenciar las instrucciones cuando se está escribiendo. Esto es,
que las instrucciones aparecen con diferentes colores del texto: variables, funciones,
entradas y salidas, controles de flujo, etc., siempre que la instrucción, código o función
estén correctamente escrita, de lo contrario si se encuentra apagada, sin color, producirá
error de compilación.
47
7. Entorno de desarrollo de Arduino
La barra de botones rápidos, son las funciones más importantes que solemos utilizar con
más frecuencia para poder empezar y trabajar con el programa en el entorno de Arduino.
Botón Verificar
Después de escribir un programa es conveniente revisar los posibles errores sintéticos que
se hayan podido cometer, por eso es aconsejable clicar el botón de verificación para que el
compilador determine si todo el código que se ha escrito está libre de errores sintácticos.
Botón Cargar
Botón Nuevo
Genera un nuevo sketch. Al clicar sobre él se abre una nueva ventana, y un nuevo sketch
está listo para ser programado.
Botón Abrir
Abre una ventana de diálogo, mostrando la carpeta por defecto donde el programa guarda
los sketchs. Clicando en este botón podemos recuperar los sketchs de proyectos
anteriores.
Botón Guardar
Como su nombre indica, permite guardar el sketch actual en el directorio que el usuario
escoja. Por defecto, guardará el sketch en el directorio Mis documentos/arduino.
Abre una ventana en la que podemos observar el valor que va adquiriendo las variables o
para interaccionar con Arduino. Para poder realizar cualquiera de estas dos acciones, se
deben introducir las órdenes necesarias en el programa.
48
7. Entorno de desarrollo de Arduino
Este menú permite gestionar los archivos Arduino con extensión *.ino. Se podrá abrir,
cerrar, cargar, guardar, imprimir, etc. En la opción Sketchbook nos aparece nuestros
archivos abierto recientemente. Algunas preferencias pueden ser ajustadas en la opción
Preferencias.
Este menú permite realizar la gestión del contenido de los archivos de Arduino: copiar,
cortar, pegar, seleccionar, etc. En Copiar para el Foro, nos permite copiar el código de
nuestra rutina al portapapeles de forma conveniente para postear en un foro.
49
7. Entorno de desarrollo de Arduino
Este menú permite Verificar/Compilar, comprobando las rutinas para errores. Mostrar la
carpeta de Sketch, mostrando la carpeta de rutina en el escritorio, Agregar Archivo fuente a
la rutina e Importar Librería.
Las librerías son un conjunto de funciones e instrucciones que hacen que un dispositivo se
pueda vincular a Arduino de una forma más sencilla, como por ejemplo, el número de
sensores, con lo que en ocasiones será de gran ayuda introducir las librerías para poder
manipular de manera más sencilla el sensor en el código del proyecto.
Tenemos dos tipos de librerías: las que incluye el IDE de Arduino y las que son de
contribución. Estas últimas son librerías desarrolladas por usuarios de Arduino, que las
comparten con los demás usuarios para facilitar la programación.
Las librerías que incorpora por defecto Arduino y que se deben invocar o cargar
manualmente se pueden observar si hacemos clic en Sketch / Importar Librería… en el
IDE de Arduino.
Podemos ver algunos, como SD, EEPROM, GSM, Servo, etc. Si seguimos mirando la lista,
llegamos a un punto donde nos aparece la palabra contribución, a partir de ahí, las
librerías que encontremos son externas, lo que quiere decir que tenemos que descargarla e
instalarla nosotros mismo.
50
7. Entorno de desarrollo de Arduino
Este menú permite utilizar diversas opciones para mejorar la usabilidad de las
instrucciones y códigos de nuestro programa.
La opción del Monitor Serial nos permite a través de una ventana, enviar y recibir datos a
nuestro programa que se está ejecutando. Se conecta por medio del puerto serie que es la
forma principal de comunicar una placa Arduino con un ordenador.
El monitor de puerto serie es una pequeña utilidad integrada dentro de IDE Standard que
nos permite enviar y recibir fácilmente información a través del puerto serie. Su uso es
muy sencillo, y dispone de dos zonas, una que muestra los datos recibidos, y otra para
enviarlos. Estas zonas se muestran en la siguiente imagen.
NOTA: Para realizar la conexión mediante puerto serie únicamente es necesario conectar
nuestra placa Arduino empleando el mismo puerto que empleamos para programarlo. A
continuación abrimos el IDE Standard de Arduino y hacemos click en el “Monitor Serial”.
51
7. Entorno de desarrollo de Arduino
La opción Tarjeta, nos permite seleccionar, entre todas ellas, la placa de Arduino que
corresponde con la que tenemos disponible. Por ejemplo, Arduino Duemilanove
w/ATmega328.
El Puerto Serial contiene todos los dispositivos series (reales o virtuales) de nuestro PC.
Antes de subir el programa, necesitamos seleccionar el elemento de este menú que
representa a nuestra placa Arduino. En el Mac, esto es probablemente algo como /dev/tty-
usbserial-1B1 (para la placa USB), o /dev/tty.USA19QW1b1P1.1 (para una placa serie
conectada con un adaptador USB-a-Serie Keyspan). En Windows, es probablemente COM1
y COM2 (para una placa serie) o COM4, COM5, COM7 o superior (para una placa USB).
52
7. Entorno de desarrollo de Arduino
53
8. Lenguaje de programación de Arduino
void setup()
{
Declaraciones;
}
void loop()
{
Declaraciones;
}
/* Ambas funciones son requeridas para que el programa funcione*/
void setup()
Constituye la preparación del programa. Contiene la declaración de cualquier variable al
comienzo del programa. Es la primera función, se ejecuta una vez y es usada para
asignarles los pines de entrada y salida pinMode() o inicializar las comunicaciones en
serie.
void setup()
{
pinMode(pin, OUTPUT; // ajusta “pin” como salida
}
void loop()
Contiene el código que se ejecuta continuamente y de forma cíclica leyendo entradas,
activando salidas de la placa, etc. Esta función es el núcleo de todos los programas Arduino
y hace la mayor parte de trabajo.
void loop()
{
digitalWrite(pin, HIGH); // Activa “pin”
delay(1000); // espera un segundo
digitalWrite (pin, LOW); // desactiva “pin”
delay(1000); // espera un segundo
}
Las llaves { }
Definen el comienzo y el final de bloques de función y bloques de declaraciones como
voidloop() y sentencias for o if. Las llaves deben estar balanceadas. Una llave de
apertura”{“ siempre debe ir seguida de una llave de cierre “}”. Las llaves no balanceadas
provocan errores de compilación.
void loop()
{
Declaraciones;
}
54
8. Lenguaje de programación de Arduino
El punto y coma ;
Debe usarse al final de cada declaración y separa los elementos del programa. También se
usa para separar los elementos en un bucle for.
Se usan para escribir comentarios multilinea o área de texto ignorados por el programa y
se usan para grandes descripciones de códigos o comentarios que ayudan a otros
programadores a entender partes del programa. Empieza con /* y termina con */ y puede
abarcar múltiples líneas, e incluso nos pueden servir para localizar errores de
programación troceando partes del programa y dejarlo en comentarios, para de esta forma
detectar donde se produce los errores de compilación y resolver el problema.
Sirve para escribir un comentario en la misma línea y termina con la siguiente línea de
código. Se utiliza para proporcionar información acerca de lo que hace esa línea de
instrucción o para recordarla más adelante y para otros programadores. No olvides que
son dos barras //, si dejas una sola te da error de compilación.
{
declaración; // Esto es un comentario de línea
}
8.2. Funciones
Una función es un bloque de código que tiene un nombre y un grupo de declaraciones que
se ejecutan cuando se llama a la función. Podemos hacer uso de funciones integradas como
void setup() y void loop() o escribir nuevas.
55
8. Lenguaje de programación de Arduino
En primer lugar se declara el tipo de la función, que será el valor retornado por la función
(int, void…). A continuación del tipo, se declara el nombre de la función y, entre paréntesis,
los parámetros que se pasan a la función.
La siguiente función int delayVal(), asigna un valor de retardo en un programa por lectura
del valor de un potenciómetro.
int delayVal() {
int = v; // crea una variable temporal “v”
v = analogRead(pot); // lee el valor del potenciómetro
v /=4; // convierte 0 -1023 a 0 – 255
return v; //devuelve el valor final de v
}
8.3. Variables
Una variable es un pequeño contenedor de memoria que se emplea para almacenar datos,
ya sean letras, números o una combinación de ambos. Es una forma de llamar y almacenar
un valor alfanumérico para usarse después por el programa. Como su nombre indica, las
variables son valores que pueden cambiarse continuamente, al contrario que las
constantes, cuyo valor nunca cambia. Una variable necesita ser declarada y, opcionalmente,
asignada al valor que necesita para ser almacenada.
Una vez que una variable ha sido asignada, o reasignada puedes testear su valor para ver si
cumple ciertas condiciones o puedes usarlo directamente.
Declaración de variables
Todas las variables tienen que ser declaradas antes de que puedan ser usadas por el
programa y opcionalmente le podemos asignar un valor inicial. Si no la declaramos el
programa nos dará un error. Declarar una variable significa definir su tipo de valor, como
int, long, float, etc., definir un nombre específico y, opcionalmente, asignar un valor inicial.
Esto sólo necesita hacerse una vez en un programa pero el valor puede cambiarse en
cualquier momento usando aritmética y varias asignaciones.
56
8. Lenguaje de programación de Arduino
int inputVariable = 0;
Una variable puede ser declarada en un número de posiciones en todo el programa y donde
esta definición tiene lugar determina que partes del programa pueden usar la variable.
La variable puede ser declarada al comienzo del programa antes de void setup(),
localmente dentro de funciones, y algunas veces en un bloque de declaraciones, por
ejemplo, bucles for. Donde la variable es declarada determina el ámbito de la variable, o la
habilidad de ciertas partes de un programa de hacer uso de la variable.
Una variable local es una que se define dentro de una función o como parte de un bucle
for. Sólo es visible y sólo puede ser usada dentro de la función en la cual fue declarada.
Además, es posible tener dos o más variables del mismo nombre en diferentes partes del
programa que contienen diferentes valores.
void loop() {
for (int i=0; i<20) {// “i” es solo visible dentro del bucle for
i++;
}
float f; // ”f” es solo visible dentro de loop
}
8.4. Constantes
TRUE/FALSE (Cierto/Falso)
Estas son constantes booleanas que definen los niveles HIGH (alto) y LOW (bajo) cuando
estos se refieren al estado de las salidas digitales. FALSE se asocia con 0 (cero) mientras
TRUE se asocia con 1 (uno). Pero TRUE también puede ser cualquier otra cosa excepto
cero. Por lo tanto en sentido booleano -1, 2 y -200 son todos también y se define como
TRUE (esto es importante tenerlo en cuenta).
57
8. Lenguaje de programación de Arduino
HIGH/LOW (Alto/Bajo)
Estas constantes definen los niveles de los pines con HIGH o LOW y son empleados cuando
se leen o escriben en las entradas o salidas digitales. HIGH se define como el nivel lógico 1
(ON) o 5 V. LOW es el nivel lógico 0, OFF, o 0V.
INPUT/OUTPUT (Entrada/salida)
Estas constantes son empleadas para definir al comienzo del programa, el modo de
funcionamiento de los pines mediante la instrucción pinMode() de tal manera que el pin
puede ser una entrada INPUT o una salida OUTPUT. Se definen en el void setup().
byte
NOTA: Bit es el acrónimo de Binary Digit (Dígito Binario). Como ya hemos mencionado, en
un sistema binario únicamente se usan dos dígitos (0,1) para representar un número y en
digital suele asociarse a dos estados, encendido y apagado.
Cuando decimos que una entrada de Arduino es de 8 o 10 bits a lo que nos estamos
refiriendo es al número de dígitos de los que disponemos para representar un determinado
valor. Es decir, por ejemplo, 10 bits serían 10 posibles dígitos: Y Y Y Y Y Y Y Y Y Y en
binario, cada uno de estos dígitos puede tener dos posibles valores o estados (0,1).
int
Almacena un valor entero de 16 bits sin decimales con un rango comprendido entre 32,767
a -32,768.
int unaVariable = 1500;
long
Valor entero almacenado en 32 bits sin decimales que se encuentra dentro del rango -
2147483648 a 2147483647.
58
8. Lenguaje de programación de Arduino
float
El formato de dato del tipo coma flotante “float” se aplica a los números con decimales.
Los números con coma flotante tienen una mayor resolución almacenado en 32 bits con un
rango de 3.4028235E+38 a 3.40282235+38.
NOTA: Los números con coma flotante no son exactos y pueden producir resultados
extraños en las comparaciones. Los cálculos matemáticos de coma flotante son también
mucho más lentos que los del tipo de números enteros, por lo que debe evitarse su uso si es
posible.
Array
Se trata de un conjunto de valores a los que se accede con un número índice (el primer
valor del índice es 0). Cualquier valor puede ser recogido haciendo uso del nombre de la
matriz y el número de índice. El primer valor de la matriz es el que está indicado con el
índice 0, es decir, el primer valor del conjunto es el de la posición 0. Un array tiene que ser
declarado y opcionalmente asignados valores a cada posición antes de ser utilizado.
Del mismo modo es posible declarar una matriz indicando el tipo de datos y el tamaño y
posteriormente, asignar valores a una posición específica.
Las matrices se utilizan a menudo para instrucciones de tipo bucle, en los que la variable de
incremento del contador del bucle se utiliza como índice o puntero del array. El siguiente
ejemplo usa una matriz para el parpadeo de un diodo LED.
Utilizando un bucle tipo for, el contador comienza en cero 0 y escribe el valor que figura en
la posición de índice 0 en la serie que hemos escrito dentro del array parpadeo() en este
caso 180, que se envía a la salida analógica tipo PWM configurada en el PIN10, se hace una
pausa de 200 ms y a continuación se pasa al siguiente valor que asigna el índice “i”.
59
8. Lenguaje de programación de Arduino
Ya hemos visto que la plataforma Arduino posee una serie de entradas y salidas para
comunicarse con el exterior bien de forma analógica o bien de forma digital. Antes de
comenzar a describir nuestro programa, es necesario configurar estos pines en la manera
en la que vayan a ser usados, ya que ningún pin puede usarse al mismo tiempo como
entrada y salida. En el ATmega328P de Arduino posee 14 pines digitales de entradas y
salidas: D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12 y D13. Para llevar a cabo la
configuración usamos la instrucción pinMode(), señalando a continuación el número de
pin seguido de cómo queremos que éste actúe: entrada (INPUT) o salida (OUTPUT) y lo
haríamos en el apartado void setup().
Estos pines trabajarán de forma binaria a través de dos estados: HIGH (alto) cuando toma
un valor de 5 voltios, o LOW (bajo), asociado al valor de voltaje 0 voltios. Con la sentencia
digitalRead() leeremos el estado de un pin almacenado como HIGH o como LOW. Con la
sentencia digitalWrite() ponemos un pin de salida en HIGH o en LOW.
Función pinMode(pin,mode)
En las funciones de void setup() se configuran los pines específicos para la programación,
estos pines se pueden configurar en el modo de entrada INPUT o como de salida OUTPUT.
Los pines configurados como OUTPUT se dicen que están en un estado de baja impedancia
y pueden proporcionar 40 mA a otros dispositivos o circuitos para la activación y
polarización de estos.
Los pines digitales de Arduino están ajustados a INPUT por defecto, por lo que no se
necesitan ser declarados explícitamente como entradas con pinMode(). Los pines
configurados como INPUT se dice que están en un estado de alta impedancia.
NOTA: Los cortocircuitos en los pines del microcontrolador o corriente excesiva pueden
dañar o destruir el pin de salida e incluso dañar el chip ATmega328P. A menudo es buena
idea conectar un pin OUTPUT a un dispositivo externo en serie con una resistencia de 470
Ohmios.
Función digitalRead(pin)
Lee el valor desde un pin digital especificado con el resultado HIGH o LOW. El pin puede
ser especificado o como una variable o como una constante (0 – 13).
60
8. Lenguaje de programación de Arduino
Introduce un nivel lógico alto HIGH o bajo LOW (activa o desactiva) en el pin digital
especificado. El pin puede ser especificado como una variable o constante (0 -13).
/* ejemplo de programa */
A veces no es suficiente con captar o no una señal para poder activar o desactivar las cosas,
sino que necesitamos cuantificar magnitudes reales para que Arduino responda en
proporción. Esto nos lo facilitarán las entradas y salidas analógicas. En el microcontrolador
Arduino Duemilanove ATmega328P, se disponen de 6 pines de entradas y salidas
analógicas, estas son: AN0, AN1, AN2, AN3, AN4 y AN5.
Por defecto, todos los pines analógicos son de entrada INPUT y no necesitan ser declarados
como tales. La lectura con la función analogRead() leeremos un determinado pin
analógico almacenando un valor de 10 bits. Es decir, vamos a tener un rango de 1024
valores distintos en los que se van a poder obtener lecturas analógicas.
Función analogRead(pin)
Lee el valor desde el pin analógico especificado con una resolución de 10 bits. Esta función
solo funciona en los pines analógicos (AN0-AN1-AN2-AN3-AN4-AN5). El valor resultante
es un entero de 0 a 1023. Los pines analógicos, a diferencia de los digitales no necesitan
declararse previamente como INPUT o OUTPUT.
61
8. Lenguaje de programación de Arduino
Escribe un valor pseudo analógico, usando modulación por ancho de pulso (“PWM”) a un
pin de salida marcado como PWM. En los Arduinos más nuevos con el chip Atmega328P,
esta función trabaja en los pines D3, D5, D6, D9, D10 y D11. Los Arduinos más antiguos con
un ATmega8 sólo soportan los pines D9, D10 y D11. El valor puede ser especificado como
una variable o constante con un valor de 0 a 255.
AnalogReference()
AnalogReference(EXTERNAL)
Es necesario llamar esta función antes que se lean los valores de voltaje utilizando
analogReference() ya que de lo contrario podrías dañar la placa Arduino.
Para capturar la medida analógica, el Arduino posee seis entradas analógicas donde cada
una está conectada a un canal del conversor. Así, se podría utilizar un pin de entrada
analógica del Arduino para leer el voltaje que proporciona el sensor de temperatura LM35.
Las salidas analógicas están asociadas a los pines PWM. En realidad son pines digitales y no
se hace entrega de una señal analógica pura, sino que se entrega un determinado valor de
tensión a través de complicados procesos de modulación que no vamos a entrar en
describir. Las salidas digitales trabajan con 8 bits, es decir, 256 valores diferentes (del 0 al
255). Por ello hay que tener en cuenta que la lectura puede realizarse en 10 bits, pero la
escritura va a tener que traducirse a 8 bits.
Para leer este voltaje se utiliza una función que hemos visto anteriormente analogRead()
que proporciona un rango de valores comprendidos entre 0 y 1023. Como ya sabemos, este
rango proviene de la resolución de bits en el conversor del microcontrolador. Pero estos
valores están tomados en referencia a 5 volts.
Podemos encontrarnos que, en ocasiones, deseemos acotar los valores analógicos que
leemos de un sensor analógico que comprende de 0 a 1.023, por ejemplo, quizás nos
interesa que el valor máximo en vez de ser 1.023 fuese 500, y que el valor mínimo en vez
de ser 0 fuese 100.
Arduino cuenta entre sus instrucciones de programación con la función map(), que
permite mapear valores y adecuarlos a nuestras necesidades.
62
8. Lenguaje de programación de Arduino
La función map() permite adecuar los valores que proporcionan algunos sensores a otro
rango de valores más apropiados para nuestros intereses. Por ejemplo, si diseñamos un
circuito con una fotorresistencia LDR y deseamos observar los valores que obtenemos en
función de la luz que capta, comprobaremos que estos valores están situados entre un
rango de 0 a 1.023, al ser un sensor analógico.
Por el contrario, deseamos que estos valores, por motivo que sea, estén en un rango
comprendido entre 0 y 255, que son los valores que obtenemos para valores digitales de 8
bits. Esto es posible con la función map(). La sintaxis de esta función es la siguiente:
Estas son:
dónde:
Por ejemplo:
63
8. Lenguaje de programación de Arduino
Arduino tiene un reloj interno que va a ir contando los milisegundos desde que la placa se
conecte a la corriente eléctrica y el programa se inicie. Arduino puede contar hasta casi 50
días, cuando el tiempo volvería a contar desde cero. Es decir, devuelve la cantidad de
milisegundos que lleva la placa Arduino ejecutando el programa actual como un valor long
unsigned. Después de las 9 horas el contador vuelve a cero.
Ejemplo:
Para que la función micros() devuelva el tiempo contabilizado y los almacene en una
variable, ésta también debe ser del tipo unsigned long.
El ejemplo anterior para la función millis() también es aplicable para la función micros().
Funciones de matemáticas
MIN / MAX Son funciones que comparan dos valores devolviendo el menor o el mayor de
ellos:
64
8. Lenguaje de programación de Arduino
valor = min(valor, 100); //asigna a valor el más pequeño de los dos números
Si valor es menor que 100 valor recogerá su propio valor, si valor es mayor de 100 valor
pasara a valer 100.
De esta manera nos aseguramos de que valor será como mínimo 100.
El lenguaje de Arduino permite realizar sentencias condicionales: if, if… else, for, while,
do… while. Su utilización es similar a las funciones correspondientes en el lenguaje C.
Sirven para guiar el programa en una u otra dirección en función de si se cumple o no una
serie de condiciones que establecemos en el programa, están las condicionales, los bucles
y control de flujo.
if… : Si se cumple se ejecutan las sentencias del bloque que se encentra entre llaves.
Si no se cumple el programa salta este bloque sin ejecutar instrucción alguna.
if…else: Funciona ejerciciomente igual que la anterior, pero si no se cumple la
condición, no se salta el bloque, sino que ejecuta las instrucciones del bloque “else”.
Los bucles son elementos que hacen que el programa entre en un ciclo de repetición
mientras se cumplan una serie de condiciones:
for: repite un bloque de sentencias mientras se cumpla una condición.
while: repite las instrucciones entre llaves mientras se esté cumpliendo la
expresión incluida en el bucle.
do…while: funciona igual que “while” pero ejecuta las instrucciones al menos
una vez, ya que comprueba si se cumplen las condiciones al final.
NOTA: Goto y Return no se suelen utilizar mucho en la programación de Arduino. Para ello,
se puede utilizar creando un bloque de instrucciones y llamarla desde cualquier parte del
programa.
65
8. Lenguaje de programación de Arduino
Cuando se llama a una función ésta se ejecuta y una vez que termina la función vuelve el
flujo del programa a donde se llamó a la función. Ver el apartado 7.10 “Crear nuestras
propias funciones”.
if (si condicional)
En el ejemplo anterior se compara una variable con un valor, el cual puede ser una variable
o constante. Si la comparación, o la condición entre paréntesis se cumple (es cierta), las
declaraciones dentro de las llaves se ejecutan. Si no es así, el programa salta sobre ellas y
sigue.
NOTA: Tenga en cuenta el uso especial del símbolo “=”, poner dentro de if (x=10), podría
parecer que es válido pero sin embargo no lo es, ya que esa expresión asigna el valor 10 a la
variable x, por eso dentro de la estructura if se utilizaría X==10 que en este caso lo que hace
el programa es comprobar si el valor de x es 10. Ambas cosas son distintas por lo tanto
dentro de las estructuras if, cuando se pregunte por un valor se debe poner el signo doble
de igual “==”.
Viene a ser una estructura que se ejecuta en respuesta a la idea “si esto no se cumple haz
esto otro”. Por ejemplo, si se desea probar una entrada digital, y hacer una cosa si la
entrada fue alta o hacer otra cosa si la entrada es baja, se escribirá de la siguiente forma:
66
8. Lenguaje de programación de Arduino
else puede ir precedido de otra condición de manera que se pueden establecer varias
estructuras condicionales de tipo unas dentro de las otras (anidamiento) de forma que
sean mutuamente excluyentes pudiéndose ejecutar a la vez. Es incluso posible tener un
número ilimitado de estos condicionales. Recuerde sin embargo qué solo un conjunto de
declaraciones se llevará a cabo dependiendo de la condición probada.
Ejemplo:
NOTA: Una declaración del tipo if prueba simplemente si la condición dentro del paréntesis
es verdadera o falsa. Esta declaración puede ser cualquier declaración válida. En el anterior
ejemplo, si cambiamos y ponemos (inputPin == HIGH). En este caso, la declaración if solo
chequearía si la entrada especificado está en nivel alto (HIGH), o +5V.
for
La declaración for se usa para repetir un bloque de sentencias encerradas entre llaves un
número determinado de veces. Cada vez que se ejecutan las instrucciones del bucle se
vuelve a testear la condición. La declaración for tiene tres partes separadas por (;).
La inicialización de una variable local se produce una sola vez y la condición se testea cada
vez que se termina la ejecución de las instrucciones dentro del bucle. Si la condición sigue
cumpliéndose, las instrucciones del bucle se vuelven a ejecutar. Cuando la condición no se
cumple, el bucle termina.
for (int a=0; a<20; a++)//declara “a” si es menor que 20, incrementa “a” +1
{
digitalWrite(13, HIGH); // enciende el pin 13
delay(250); // espera un cuarto de segundo
digitalWrite(13, LOW); // apaga el pin 13
delay(250); // espera un cuarto de segundo
67
8. Lenguaje de programación de Arduino
NOTA: El bucle en el lenguaje C es mucho más flexible que otros bucles encontrados en
algunos otros lenguajes de programación, incluyendo BASIC. Cualquiera de los tres
elementos de cabecera puede omitirse, aunque el punto y coma es obligatorio. También las
declaraciones de inicialización, condición y expresión puede ser cualquier declaración
válida en lenguaje C sin relación con las variables declaradas. Estos tipos de estados son
raros pero permiten disponer de soluciones a algunos problemas de programación raras.
while
Un bucle del tipo while es un bucle de ejecución continua mientras se cumpla la expresión
colocada entre paréntesis en la cabecera del bucle. La variable de prueba tendrá que
cambiar para salir del bucle. La situación podrá cambiar a expensas de una expresión
dentro del código del bucle o también por el cambio de un valor en una entrada de un
sensor.
do … while
El bucle dowhile funciona de la misma manera que el bucle while, con la salvedad de que
la condición se prueba al final del bucle, por lo que el bucle siempre se ejecutará al menos
una vez.
do {
Instrucciones; //ejecuta las instruciones
}
While (unaVariable ? valor); //mientras unaVariable sea ¿? valor
68
8. Lenguaje de programación de Arduino
do {
x=leeSensor(); //guarda en x el valor leido de leeSensor
delay(50); //espera 50 milisegundos
}
while (x<100); //mientras x sea menor de 100
switch/case y break
Compara el valor de una variable con el valor específico en las sentencias cuyo valor
coincide con dicha variable, el código de esa sentencia se ejecuta.
switch(variable){
Case 1:
Código usado “variable” es igual 1
break;
Case 2:
Código cuando variable es igual 2
break;
default;
Código ejecutado cuando ninguno de la sentencias se cumple}
break
Esta instrucción es usada para salir de los bucles de for o while, pasando por alto la
condición normal del bucle. Es usado también para salir de una estructura de control
switch, como hemos visto en el anterior apartado.
while (a>b){
Código;
if(a==5){
break
}
}
69
8. Lenguaje de programación de Arduino
Para realizar esto podemos crear nuestras propias funciones, que serán llamadas por el
programa principal en el mismo sketch, pero que nos dará una visión más limpia del
código, más clarificadora y apta para futuras modificaciones. Veamos cómo implementarlo.
Para crear una función en un sketch de Arduino escribimos:
void nombre_de_la_funcion(){
Instrucciones; //ejecutamos instrucciones para esta funcion
}
Para invocar la función simplemente escribimos, allí donde deseamos que se ejecute ese
bloque de código:
void setup(){
Serial.begin(9600); //establece visualizacion por puerto serial
}
void monitoriza(){//Creacion de la funcion monitoriza para configurar valor
dia/noche
Serial.print("El valor es:"); // texto indicativo de linea serial
Serial.println(medida); // pone en linea el valor de medida
delay(1000); // para evitar saturar el puerto
}
void loop(){
monitoriza(); //llama y ejecuta el bloque de instrucciones monitoriza
medida=analogRead(ldr); // tomamos lectura de la ldr
if (medida<nivel){ // condiciona que si la medida es menor que 300
digitalWrite(led,HIGH);
}
}
Este es un fragmento del código que realiza la medición del nivel de luz de una fotocélula
LDR y se visualiza por medio del Monitor Serial.
En este fragmento podemos ver las invocaciones de las diferentes instrucciones de Serial
llamado por la función creada monitoriza().
70
8. Lenguaje de programación de Arduino
Hay que recordar que la invocación de la función se puede realizar dentro del void loop(),
con lo que repetirá dicha invocación dentro del loop o dentro del void setup(), la cual se
invocará una sola vez, es decir, cuando se lean las instrucciones del bloque setup.
Las funciones se pueden situar al final del programa, después del claudator que cierra el
voidloop().
En resumen las llamadas a las funciones las podemos ubicar tanto en el setup (sólo se las
llamará una vez) como en el loop que serán llamadas repetidamente.
Los operadores aritméticos que se incluyen en el entorno de programación son suma, resta,
multiplicación y división. Estos devuelven la suma, diferencia, producto, o cociente
(respectivamente) de dos operandos.
y = y +3; x= x -7; i= j * 6; r= r / 5;
La operación se efectúa teniendo en cuenta el tipo de datos que hemos definido para los
operandos (int, dbl, float, etc...) por lo que, por ejemplo, si definimos 9 y 4 como enteros
“int”, 9/4 devuelve de resultado 2 en lugar de 2,25 ya que el 9 y 4 son valores de tipo
entero “int” (enteros) y no se reconocen los decimales con este tipo de datos.
Si los operandos son de diferentes tipos, para el cálculo se utilizará el tipo más grande de
los operandos en juego. Por ejemplo, si uno de los números (operandos) es del tipo float y
otra de tipo integer, para el cálculo se utilizará el método de float es decir el método de
coma flotante.
Escoja el tamaño de las variables de tal forma que sea lo suficientemente grande como para
que los resultados sean los precisos que se desea conseguir. Para las operaciones que
requieran decimales utilice variables tipo float, pero tenga en cuenta de que las
operaciones con este tipo de variables son más lentas a la hora de realizarse el computo.
NOTA: Utilice el operador “int” para convertir un tipo de variable a otra sobre la
marcha. Por ejemplo, i=(int) 3,6 establecerá i igual a 3.
Asignaciones compuestas
71
8. Lenguaje de programación de Arduino
Las asignaciones compuestas combinan una operación aritmética con una variable
asignada. Estas son comúnmente utilizadas en los bucles.
Por ejemplo, x *= 3 hace que x se convierta en el triple del antiguo valor x… y por lo tanto x
es reasignada a nuevo valor.
Operadores de comparación
x==y // x es igual a y.
x!=y //x no es igual a y.
x<y // x es menor que y
x>y, // x es mayor que y
x<=y // x es menor o igual que y
x>=y // x es mayor o igual que y
Las comparaciones de una variable o constante con otra se utilizan con frecuencia en las
estructuras condicionales del tipo if para testear si una condición es verdadera.
Operadores lógicos
En ocasiones es necesaria que se cumpla más de una condición para lograr determinados
resultados. Es aquí donde entran en juego los Operadores Lógicos.
Los operadores lógicos son usualmente una forma de comparar dos expresiones y devolver
un VERDADER o FALSO dependiendo del operador. Existen tres operadores lógicos:
1. AND (&&),
2. OR (||) y
3. NOT (|),
72
8. Lenguaje de programación de Arduino
Lógica AND
Este operador permite validar 2 o más condiciones, las cuales se deben cumplir todas a la
misma vez para que se ejecute el código que se escribe dentro de las llaves.
if (x > 0 && x < 5){...} //cierto solo si las dos expresiones son ciertas
Lógica OR
Este operador permite que cuando cualquiera de las condiciones establecidas se cumpla,
entonces se ejecuta el código entre las llaves. Solamente se necesita que al menos 1 sea
verdadera para que se devuelva un valor true y se ejecute las instrucciones establecidas.
Lógica NAND
Este operador permite no validar cuando todas las condiciones establecidas se cumpla.
Supongamos que hay 5 personas en una casa. Si se les pregunta si poseen un Arduino y
NINGUNO de ellos tiene, entonces se ha cumplido una condición y el NAND devolverá un
valor true.
Lógica NOR
De la misma forma como el NAND se deriva del operador AND, el NOR se deriva del OR y
posee dos casos en los que puede decir que se utiliza. Se cumplirá cuando en algunas de las
condiciones se devuelva un valor false.
Lógica NOT
73
8. Lenguaje de programación de Arduino
Función randomSeed(seed)
Esta función nos permite inicializar, a partir de una variable o de otra función, una semilla
para generar números aleatorios y como punto de partida para la función random().
Por ejemplo:
Recordemos que esta función devuelve en milisegundos el tiempo desde que Arduino está
ejecutando el programa actual.
74
8. Lenguaje de programación de Arduino
El siguiente ejemplo genera un valor aleatorio entre 0–255 y lo envía a una salida analógica
PWM:
Una interrupción la podemos definir como una llamada al microcontrolador, el cual, deja lo
que está ejecutando y atiende dicha llamada. Esta llamada o interrupción, normalmente
lleva al microcontrolador a otra parte del código que debe ejecutarse con mayor prioridad.
Una vez ejecutado ese bloque de código, el microcontrolador vuelve al punto anterior, es
decir, a la línea de la instrucción donde lo había dejado antes de recibir la interrupción.
Este tipo de interrupciones también las podemos llamar interrupciones hardware, porque
es mediante componentes exteriores quienes ejecuta esta interrupción.
Las interrupciones son similares a una función; la diferencia estriba en que las funciones
que hemos programado tenían que ser “llamadas” desde una parte del programa. Una
interrupción no es más que una función que se ejecutará, no por ser “llamada”, sino porque
se configura para que, ante un evento se ejecute.
Como se ha comentado, las interrupciones son funciones que se ejecutan por haber sido
previamente configuradas; por lo tanto, es por donde tenemos que empezar.
Este tipo de interrupciones necesitan configurar tres parámetros:
75
8. Lenguaje de programación de Arduino
Antes de continuar, hay que revisar ciertas peculiaridades de este tipo de interrupciones:
1. No se pueden atender eventos en todos los pines de Arduino. Arduino posee dos
pines para crear interrupciones. En este caso serán interrupciones externas, ya que
las vamos a generar nosotros desde fuera del microcontrolador. Estas
interrupciones son INT0, INT1, las cuales están vinculadas con los pines D2 y D3
respectivamente.
2. El nombre de la función que programamos tiene que respetar las mismas reglas que
cualquier otra función. Como lo que, al fin y al cabo, lo que se va a ejecutar es una
función, será necesario indicar el nombre de la función que se ha de ejecutar.
3. Tenemos una serie de palabras reservadas para indicar el tipo de interrupción:
El último parámetro es del tipo de evento, cuando recibimos una señal tenemos que saber
que comportamiento de esta nos indica que hay que atender a un evento: señal a nivel alto,
a nivel bajo, flanco de subidas, etc.
Por ejemplo, un evento crítico puede ser una parada de emergencia. Para que se ejecute
una interrupción por evento externo, tenemos que tener una señal que nos indique que ha
ocurrido algo, esa señal se ha de conectar a uno de los pines del Arduino, con lo que
tenemos que indicar por programación en qué pin está conectada esa señal.
Esta interrupción se puede utilizar, por ejemplo, cuando hemos utilizado un delay(),
durante el cual el microcontrolador queda exclusivamente ejecutando el tiempo sin
atender ninguna otra orden programada. Con la interrupción rompería esa rutina, pues
tiene prioridad.
Para desarrollar la interrupción con Arduino, tenemos una función que genera la
interrupción deseada, la instrucción “attachInterrupy(,,)”,que permite programar
interrupciones por evento externo; necesita los tres parámetros que se han mencionado
anteriormente, siguiendo el mismo orden y tiene la siguiente sintaxis:
76
8. Lenguaje de programación de Arduino
Lo que tenemos que tener presente es que, si se ejecuta una interrupción, el programa
saltará desde la línea de código en donde se encuentre, ejecutará las líneas de código que
haya dentro de la función de la interrupción y volverá a la línea de programa desde donde
ha saltado y continuará con la ejecución normal del programa.
Veamos el siguiente ejemplo de dos led que se encienden alternativamente sin detenerse, y
aplicamos una interrupción hardware mediante un pulsador exterior para saltar a una
línea de desconexión de los diodos leds (apagados) durante un determinado tiempo.
/* interrupciones en Arduino */
77
8. Lenguaje de programación de Arduino
Lo bueno de trabajar con una biblioteca que no necesitamos saber cómo funciona el código
que contiene, utilizamos herramientas listas para usar proporcionadas por el desarrollador
de la biblioteca. Muy a menudo hay descripciones / documentación y ejemplos de uso de
bibliotecas.
Asistente de bibliotecas
Esto es para iniciarse, porque esta lista no incluye todas las bibliotecas existentes y el
administrador no proporciona una descripción normal. Para instalar una biblioteca del
repositorio oficial de Arduino, vaya a Programa/Incluir librería … Se abrirá el
administrador de la biblioteca, en el que puede encontrar e instalar una biblioteca de la
lista con un solo clic.
Dentro de la Biblioteca
78
8. Lenguaje de programación de Arduino
El<nombre de biblioteca>.h: es un archivo de encabezado, el archivo de biblioteca más
importante. Es tan importante que la biblioteca solo puede estar formada por él. Por lo
general, se encuentra en la raíz de la biblioteca o en la carpeta src, source (fuente). Este
archivo generalmente enumera todas las clases / métodos / funciones / tipos de datos,
contiene información sobre la biblioteca, a menudo hay una descripción extendida para
cada método o función. Muy a menudo, el archivo de encabezado principal es la mini
documentación de la biblioteca.
Una biblioteca puede tener una estructura de varios archivos con una gran cantidad de
archivos de encabezado, pero el archivo de encabezado principal siempre es uno, tiene el
mismo nombre que la carpeta con la biblioteca.
Archivo library.properties: archivo que contiene información sobre la biblioteca para los
desarrolladores y el administrador de la biblioteca (nombre, versión, autor, categoría, etc.).
Carpeta Src: esta carpeta puede contener los archivos de la biblioteca principal ( .h , .cpp , .c
).
Hay ocasiones en las que deseamos que Arduino no sólo lea o devuelva un valor
determinado, sino que además queremos que nos lo muestre en pantalla para saber si la
plataforma está aportando valores coherentes. Porejemplo: Si estamos leyendo la
temperatura de la clase y nos devuelve 80ºC… Es que algo está fallando, ¿No? Para ello
usamos el denominado Puerto Serie.
79
8. Lenguaje de programación de Arduino
A través de esta ventana se puede enviar o recibir información utilizando el puerto serie.
Nótese que para poder abrir esta ventana es necesario que tengamos nuestra placa
Arduino conectada a nuestro ordenador mediante el puerto USB.
Para iniciar la comunicación serial con Arduino utilizando el Monitor Serial debemos
establecer algunos comandos en el Arduino IDE y luego subirlos al microcontrolador. Son
muchos los comandos dedicados a la comunicación serial, aquí veremos los más utilizados.
void setup(){
Serial.begin(9600);//establece la configuracion del monitor serie a 9600
}
void loop(){
Serial.println('1'); //visualiza por el monitor serie pulsacion del 1
delay(1000);
}
El 9600 indica el rango en baudios, o la cantidad de baudios que manejará el puerto serie.
Se define baudio como una unidad de medida, usada en telecomunicaciones, que
representa el número de símbolos por segundo en un medio de transmisión ya sea
analógico o digital. Para nuestros propósitos utilizaremos comúnmente una velocidad de
símbolo de 9600.
Siempre que vayamos a comunicarnos con Arduino vía puerto serie se necesita invocar la
sentencia Serial.begin(9600);
80
8. Lenguaje de programación de Arduino
Serial.begin(rate)
Esta instrucción abre el puerto serie y fija la velocidad en baudios para la transmisión de
datos en serie. Para ver los valores que van apareciendo en el programa tenemos que abrir
el Monitor Serial, en el entorno de Arduino.
El valor típico de velocidad para comunicarse con el ordenador es de 9600, aunque otras
velocidades pueden ser soportadas.
void setup() {
Serial.begin(9600); //abre el puerto serie configurando la velocidad en
9600bps }
NOTA: Cuando se utiliza la comunicación serie los pins digital 0 (Rx) y el 1 (Tx) no pueden
utilizarse al mismo tiempo.
Serial.printin(data)
Imprime los datos en el puerto serie, seguido por un retorno de carro automático y salto de
línea. Este comando toma la misma forma que Serial.print(), pero es más fácil para la
lectura de los datos en el Monitor del Software.
El siguiente ejemplo toma de una lectura analógica pin0 y envía estos datos al ordenador
cada 1 segundo.
void setup() {
Serial.begin(9600); //configura el puerto serie a 9600 bps
}
void loop() {
Serial.printin(analogRead(0)); // envía valor analógico
delay(1000); // espera 1 segundo
}
81
8. Lenguaje de programación de Arduino
Vuelca o envía un número o una cadena de caracteres, al Puerto serie. Dicho comando
puedetomar diferentes formas, dependiendo de los parámetros que utilizamos para definir
el formato de volcado de los números.
Parámetros:
data: el número o la cadena de caracteres a volcar o enviar.
data type: determina el formato de salida de los valores numéricos (decimal, octal,
binafrio, etc.) DEC, OCT, BIN, HEX, BYTE, si no se pone nada vuelva ASCII.
Ejemplo:
Serial.available()
Devuelve un entero con el número de bytes disponibles para leer desde el buffer serie, o 0
si no hay ninguno. Si hay algún dato disponible, Serial.available() será mayor que cero. El
buffer serie puede almacenar como máximo 64 bytes.
Ejemplo:
82
8. Lenguaje de programación de Arduino
Serial.Read()
Lee o captura un byte (un carácter) desde el puerto serie. Devuelve el siguiente byte
(carácter) desde el puerto serie o – 1 si no hay ninguno.
Ejemplo:
Nos centraremos en este ejemplo en encender un diodo led con las teclas de nuestro
ordenador, utilizando el Monitor Serial para la comunicación con la placa de Arduino. Para
ello introducimos en la línea de Enviar un 1 y clic en enviar, el diodo led se enciende.
Cualquier otra tecla o numeración que no esté el 1 se apagará el diodo led.
83
9. Comenzar a trabajar con Arduino
Lo primero que tenemos que hacer para empezar a trabajar con Arduino es instalar el
entorno de desarrollo de Arduino IDE y configurar las comunicaciones entre la placa
Arduino y el PC. Para ello deberemos conectar nuestro cable USB a la placa de Arduino y a
un puerto USB del PC. Se encenderá un diodo led verde “Power Led” que nos indicará que
la placa está alimentada.
Según el sistema operativo que dispongamos en nuestro PC, detectará o no, nuestra placa
Arduino, en Windows 7, por ejemplo, detectará automáticamente la placa Arduino e
instalará los drivers automáticamente para que se dé de alta en el sistema, de lo contrario
tendremos que instalarlo manualmente.
La siguiente opción deberemos seleccionar el Puerto Serial al que está conectada nuestra
placa. En Windows si desconocemos el puerto al que está conectado nuestra placa
podemos descubrirlo a través del administrador de dispositivos (Puertos COM&LPT/USB
Serial Port). En este caso nos configura el puerto serie COM3 (Arduino UNO).
84
9. Comenzar a trabajar con Arduino
El siguiente paso es comprobar que nuestra placa está correctamente configurada y para
ello accedemos a la opción de “Obtén información de la placa”
El siguiente paso es comprobar que todo lo que hemos hecho hasta ahora está bien y
familiarizarnos con el interfaz de desarrollo, es abrir uno de los ejemplos. Se recomienda
abrir el ejemplo “Blink”. Para ello debemos acceder a través del menú
Archivo/Ejemplos/01.Basics/Blink. El ejemplo “Blink” lo único que hace es parpadear un
diodo LED naranja L que está instalado en la misma placa de Arduino y que corresponde
con el pin número D13 de la placa.
Vamos a ver qué hay que hacer para subir el programa a la placa Arduino:
Durante la carga del programa, en la placa de Arduino, se encenderán los diodos leds de
color naranja de comunicación Tx/Rx que nos indican que se está produciendo
transmisión y recepción de datos por el Puerto Serial.
NOTA: Para mayor rapidez, se puede obviar la verificación y pulsar directamente “cargar”,
puesto que también el programa antes de cargarlo en la memoria flash lo verifica.
85
9. Comenzar a trabajar con Arduino
Cada una de las opciones posee varios ejemplos de Sketch, por ejemplo, en la opción Basic,
tenemos:
86
9. Comenzar a trabajar con Arduino
Este programita nos sirve de prueba para comprobar que nuestro Arduino funciona
correctamente, haciendo la siguiente secuencia: carga el programa Blink en el entorno de
programación de Arduino, lo verifica y lo compila, y si no hay fallos de compilación lo carga
en la memoria flash del microcontrolador y lo ejecuta.
En este ejemplo el diodo led está conectado en el pin 13, salida digital, y se enciende y
apaga cada segundo. La resistencia que se debe colocar en serie con el diodo led es de 220-
330 Ohmios.
Si nos fijamos en la programación el inicio comienza declarando el pin D13 (int led=13)
donde corresponde al pin 19 de Arduino. Seguidamente en void setup() se declara pin led
como de salida (OUTPUT). En void loop() se introducen valores de alto y bajo para que el
diodo led se apague y encienda a intervalo de 1 segundo entre apagado y encendido. La
secuencia continuaría así indefinidamente.
NOTA: Este ejemplo está sacado del entorno de desarrollo de Arduino desde
Archivo/Ejemplos/01Basics/Blink y es de dominio público como todos los que aparecen
en esta opción de ejemplos. En las líneas de comentarios se especifica en que consiste el
Sketch. La programación de Blink lo único que hace es parpadear indefinidamente un
diodo LED que está colocado en el pin número 13 de la placa cada un segundo.
/* Blink Turns on an led on for one second, then off for one second,
repeatedly. This example code is in the public domain. */
int led= 13; // Pin 13 has an led connected on most Arduino boards
void setup() { // the setup routine runs once when you press reset
pinMode(led, OUTPUT); // initialize the digital pin as an output
}
void loop() { // the loop routine runs over and over again forever
digitalWrite(led, HIGH); // turn the led on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the led off by making the voltage LOW
delay(1000); // wait for a second
}
87
9. Comenzar a trabajar con Arduino
88
9. Comenzar a trabajar con Arduino
Microcontrolador ATMega328P-PU. Pines y componentes base.
Si la señal con la que estamos trabajando está dentro del rango que puede soportar el
microcontrolador ATmega, no vamos a tener ningún problema a cualquier tipo de señal, ya
sea digital o analógica.
Pero no todos los casos son favorables y lo podemos desconocer, para ello se recomienda,
en los casos desconocidos, utilizar y aislar mediante circuitos optoacopladores las señales y
tensión de los circuitos exteriores para una protección del microcontrolador.
89
9. Comenzar a trabajar con Arduino
El reseteo del hardware se puede hacer por software o de forma manual, el poder
hacerlo por software nos resultará más cómodo ya que no tenemos que
preocuparnos de eso, puesto que el sistema lo hace automáticamente. El reseteo por
hardware está formado por la conexión del pin 1 del microcontrolador conectado a
una resistencia de 10 K y ésta a +5V y de un botón pulsador, Normalmente Abierto,
conectado a GND, puesto que la entrada de RESET al microcontrolador se activa a
nivel bajo (0).
En los capítulos posteriores se describen las diferentes programaciones con sus circuitos
de conexión de la placa Arduino a la placa Protoboard con los componentes auxiliares.
90
10. Salida y entrada digital
Salida digital
Simplemente lo que hace este sketch es encender y apagar un diodo led. En este ejemplo el
diodo led está conectado en el pin 13 y se enciende y apaga “parpadeando” cada segundo.
La resistencia que se debe colocar en serie con el diodo led en este caso puede omitirse ya
que el pin 13 de la placa Arduino ya incluye en la tarjeta esta resistencia.
En el caso de que deseemos montarlo en nuestra placa protoboard, observaremos que los
dos diodos leds, el de la placa Arduino y la placa de protoboard, se encienden y parpadean
a la vez.
91
10. Salida y entrada digital
ENTRADA DIGITAL
Esta es la forma más sencilla de entrada con solo dos posibles estados encendido o
apagado. En este ejemplo se lee un simple switch o pulsador conectado a pin2. Cuando el
interruptor está cerrado el pin de entrada se lee ALTO y encenderá un diodo led colocado
en el pin 13. Cuando el interruptor se abra el diodo led se apagará a los dos segundos.
92
11. Entrada analógica
Esta vez, se trata de configurar un canal de entrada analógico pin 5 y enviar el valor leído al
PC para visualizarlo mediante el Monitor Serial.
/* Entrada Analógica */
int potPin=5; // asigna el pin de entrada para colocar el potenciómetro
int val=0; //variable para almacenar el valor leído por la entrada analógica
int LED=13; //asigna el pin 13 para LED
void setup(){
pinMode(LED, OUTPUT); //configuramos el pin LED de salida
Serial.begin(9600); // pone a 9600 la velocidad de transmisión al PC
}
void loop(){
val=analogRead(potPin); // lee el valor del canal de entrada analógica
Serial.println(val); // imprime valor analógico leído por pantalla PC
Serial.print(10); // indice 10
delay(1000); // intervalo de respuesta
if (val==1023){ // si val es igual 1023
digitalWrite(LED, HIGH); // enciende el LED
}
else { // de lo contrario
digitalWrite(LED, LOW); // apaga el LED
}
}
NOTA: Cuando se termina la compilación de un Sketch sin ningún error, esto no quiere
decir que nuestro diseño hardware vaya a funcionar correctamente, pues si no se enciende
un dido LED que se debería encender según lo programado, es que ha habido algo que se
nos ha escapado a la vista en las instrucciones del programa, para ello, revisamos los
códigos de la programación y ya puesto comprobamos que el diodo LED está bien
polarizado y no está fundido…por si acaso.
93
11. Entrada analógica
94
12. Salida analógica del tipo PWM
La modulación por ancho de pulsos (también conocida como PWM, siglas en inglés de
pulse-width modulation) de una señal o fuente de energía es una técnica en la que se
modifica el ciclo de trabajo de una señal periódica (una senoidal o una cuadrada, por
ejemplo), ya sea para transmitir información a través de un canal de comunicaciones o para
controlar la cantidad de energía que se envía a una carga.
Arduino Duemilanove tiene entradas analógicas que gracias a los conversores analógico
digital puede entender ese valor el microcontrolador, pero no tiene salidas analógicas
puras y para solucionar esto, usa la técnica de PWM.
Las Salidas PWM (Pulse Width Modulation) permiten generar salidas analógicas desde
pines digitales desde el microcontrolador Atmega328P-PU son D3, D5, D6, D9, D10 y D11.
95
12. Salida analógica del tipo PWM
96
13. Entrada analógica con potenciómetro
Uno de los dispositivos que requieren un tratamiento analógico son los llamados
potenciómetros o resistencias variables.
Los potenciómetros están perfectamente diseñados para maniobrar con ellos a través de su
eje que permite, cuando se actúa manualmente sobre ello, de variar el valor de la
resistencia a diferentes rangos, del valor de la resistencia más bajo al má alto.
Posee tres terminales. El valor de la resistencia en los terminales extremos es fija, por
ejemplo 10K, en el terminal central será el que permita, moviendo el eje de derecha a
izquierda, variar y obtener un valor de resistencia desde 0 Ω a 10000Ω, aumentando o
disminuyendo la resistencia a nuestro gusto.
Cuando esto ocurre, si tenemos un led conectado a éste, la luminosidad de este diodo led se
verá afectada con más o menos intensidad. Esto es debido a que creamos un divisor de
tensión y se puede calcular mediante la siguiente formula:
R2
Vout = ----------------- . Vin
R1 + R2
La Vout será la tensión de salida que obtendremos, dependiendo del valor de las
resistencias R1 y R2 y la tensión de entrada de nuestro circuito Vin.
97
13. Entrada analógica con potenciómetro
Si hacemos girar el eje del potenciómetro, hacia el potencial negativo o GND, la tensión en
el diodo LED será muy pequeña y, en consecuencia, el LED no recibirá tensión y no se
encenderá, ya que éste no recibirá los 1,7 voltios que necesita para lucir.
Pero en cambio, si giramos el eje hacia el lado contrario, potencial positivo o +5V, la
tensión será aproximadamente la tensión de entrada Vin y tendremos una tensión máxima,
con la que nuestro diodo LED lucirá completamente sin miedo a que se funda por tener una
resistencia de protección de 220Ω.
La placa Arduino dispone de 6 pines de entradas analógicos (ANALOG IN) desde la AN0 a
AN5. El uso de un potenciómetro y uno de los pines de entrada analógica-digital de
Arduino (ADC) permite leer valores analógicos que se convertirán en valores dentro del
rango de 0-1024.
98
13. Entrada analógica con potenciómetro
Se programa tres rangos de valores para el encendido y apagado del diodo LED1, cuyos
rangos se especifican en la programación mediante condicionales.
99
14. Aumentar y disminuir la luminosidad de un Led
En teoría los diodos LEDs son diodos que polarizados directamente son capaces de emitir
luz, es decir, se iluminan, de ahí sus sigla LED (Light Emitter Diode) o lo que es lo mismo,
Diodo Emisor de Luz.
Se encuentra diseñado para que la luz generada por la unión semiconductora pueda ser
dirigida en una sola dirección de ahí que en una parte del encapsulado exista una forma de
lente con el objetivo de potenciar este efecto.
El tamaño y encapsulado del diodo LED suele ser variado, pudiendo encontrarse diodos
LEDs redondos de diferentes diámetros, cuadrados, triangulares, rectangulares, bicolores.
Los colores de emisión más habituales que se pueden encontrar son rojo, verde, ámbar, e
incluso, azul infrarrojos.
Su caída de tensión suele variar según el tipo de color del diodo LED, pudiendo ser del
orden de 1 a 3 voltios, aunque la tensión más habitual cuando el diodo se encuentra
polarizado directamente ronda entorno a los 2 voltios.
Normalmente, un diodo LED se usa siempre con una resistencia en serie la cual limita el
valor de la corriente que circula a través de él para protegerlo y no se dañe. Para calcular la
resitencia recurrimos a la siguiente formaula:
100
14. Aumentar y disminuir la luminosidad de un Led
Podemos utilizar este ejercicio como iluminación autónoma del día y la noche de un Belén,
modificando el valor de delay, para propagar la duración del tiempo de día a la noche y
viceversa. int luminosidad=0;
101
15. Aumentar la luminosidad de un Ledcon pulsador
Mientras el pulsador SW1 está pulsado, va aumenta la luminosidad del diodo LED hasta
llegar a su valor máximo (255) una vez que llegue a este umbral comienza a disminuir
hasta su valor (0). Si el pulsador se deja de pulsar, sé mantendrá la intensidad luminosidad
en ese punto, hasta que se vuelva a pulsar y el valor de luminosidad llegue a su máximo
(255) y pulsando más veces la luminosidad llegará a un valor nulo (0).
void setup(){
pinMode(led,OUTPUT); // configuramos led de salida
pinMode(pulsador,INPUT); // configuramos pulsador de entrada
}
void loop(){
while (digitalRead(pulsador)==LOW);{
analogWrite(led,luminosidad); // cambia ledal valor de la luminosidad
luminosidad = luminosidad + cantidadfundido; // sube la luminosidad
if (luminosidad == 0 || luminosidad == 255){ // condiciona igualdad 0 y 255
cantidadfundido = -cantidadfundido; // baja la luminosidad
}
delay(250); // retardo de 250 milisegundos para ver el efecto
}
}
102
16. Secuencias de 4 leds
En este otro ejercicio veremos como se enciende y apagan 4 diodos leds secuencialmente,
es decir, se visualiza el desplazamiento de un solo led, mientras que los otros tres están
apagados.
Los leds deben estar conectados a los pines D5, D6, D7 y D8, y se deben encender y
posteriormente apagar los leds desde el pin D5 al D8, con un tiempo de duración de
encendido y apagado de 100 milisegundos. Si subimos el tiempo será más lento la
secuencia y si bajamos el tiempo será más rápido.
Con este ejercicio se consigue aprender a declarar variables tipo lista de valores, declarar
una función y llamarla cuando sea necesario.
103
16. Secuencias de 4 leds
Segunda forma y observar que se reduce el código y se hace por medio de un bucle for
104
16. Secuencias de 4 leds
Esquema de conexionado de la placa Arduino a la placa de prototipo con los cuatro diodos
leds conectados del D5 al D8.
En el siguiente ejercicio, que es similar al del anterior, en este caso se le añade un pulsador
que establece la secuencia de leds. Se trata, pues de, encender y apagar 4 diodos leds
secuencialmente al accionar un pulsador. El pulsador debe estar conectado al pin D4 y los
leds a los pines D5, D6, D7 y D8.
Se deben encender y posteriormente apagar los leds desde el pin D5 al D8, con un tiempo
de duración de encendido y apagado de 200 milisegundos.
En este caso nos vamos a familiarizar aprendiendo a conectar una entrada digital a arduino
(pulsador), a declarar variables tipo lista de valores y declarar función y llamarla cuando
sea necesario.
105
16. Secuencias de 4 leds
pinMode(pulsador,INPUT); //declaramos pulsador de entrada
void flash() { //bloque de secuencias flash
for (n=0; n<4; n++) {
digitalWrite(cadenaleds[n],HIGH); //pone a nivel alto el valor n de la cadena
delay(tiempo); // pausa 200 milisegundos
digitalWrite(cadenaleds[n],LOW); //pone a nivel bajo el valor n de la cadena
delay(tiempo); // pausa 200 milisegundos
}
}
void loop() {
if(digitalRead (pulsador)==HIGH) { //condicional si pulsador igual alto
flash(); //ejecuta el bloque flash
}
}
En esta otra forma se puede ver mediante el panel del Monitor Serial el valor del pulsador
(pulsado 1) (sin pulsar 0) y cuando sea uno se activa la secuencia de los diodos leds y lo
indica en el panel.
106
16. Secuencias de 4 leds
Esquema de conexionado de la placa Arduino a la placa de prototipo con los cuatro diodos
leds conectados en D5, D6, D7 y D8 y el pulsador conectado al pin D4 correspondiente al
patillaje 6 del Atmega 328P-PU.
107
17. Luminosidad de leds en función de la luz exterior
En esta primera versión se trata de un dispositivo que haga lucir un diodo led más o menos
en función de la luz externa.
Para ello conectaremos una LDR a la entrada analógica AN0 y un Ledal pin D9. Cuando la
luz se encuentre entre los valores 0 y 512 el led debe colocarse en el nivel de potencia
máxima (255), si la luz se encuentra entre valores 512 y 1024 el diodo led debe lucir al
nivel de potencia 64. Además se deberá visionar el valor de voltaje en la entrada analógica
(valor entre 0 y 1024) en el Monitor Serie del IDE de Arduino en la consola del PC.
108
17. Luminosidad de leds en función de la luz exterior
Volcado en pantalla del monitor serie de los diferentes valores de luz que incide en la LDR:
109
17. Luminosidad de leds en función de la luz exterior
En ésta otra versión, que es similar a la anterior, pero en este caso consiste en lucir tres
diodos leds más o menos en función de la luz externa. Para ello conectamos una resistencia
dependiente de la luz LDR a la entrada analógica AN0 y los tres diodos leds a los pines D9,
D10 y D11.
Cuando la luz se encuentre entre los valores 768 y 1023 los leds deben colocarse en el nivel
de potencia 64, si la luz se encuentra entre valores de 512 y entre 768 y 1023 los leds
deben lucir al nivel de potencia 127, si la luz se encuentra entre valores 9 y 255 los leds
deben lucir al nivel de potencia 255. Además se deberá visionar el valor de voltaje en la
entrada analógica (valor entre 0 y 1024) en la consola del PC a través del Monitor Serial.
En este ejercicio recordaremos las entradas analógicas para la fotoresistencia LDR. Las
salidas analógicas a través de los pines PWM D9, D10 y D11. Las ordenes analogWrite().
Los datos de consola a través del puerto serie y las ordenes Serial.begin, Serial.print y las
ordenes de control de flujo If, else.
110
17. Luminosidad de leds en función de la luz exterior
}
if (luz<=255 && luz>=0){
for (n=0;n<=3;n++) {
analogWrite(leds[n],255);
delay(tiempo); // pausa de 300 milisegundos
}
}
}
111
18. Control de luminosidad mediante fotocélula LDR
El microcontrolador Arduino es una herramienta con un gran potencial y una gama de usos
increíble. Entre estas se encuentra la capacidad que posee de obtener mediciones
analógicas de elementos resistivos.
Las resistencias variables como los sensores de luz LCD, los termistores, sensores de
esfuerzo, fotocélulas, etc., se conectan a las entradas analógicas para recoger valores de
parámetros físicos.
Este ejemplo hace uso de una función para leer el valor analógico de una LDR y establecer
el encendido y apagado de un diodo led según la cantidad de luz que le llegue al recinto
mediante la fotocélula.
Una LDR puede determinar cuándo accionar un determinado dispositivo, por ejemplo un
servomotor, una bombilla, un buzzer o un aspersor, en el momento que detecte cierta
cantidad de luz.
El valor que nos proporciona una LDR variará dependiendo de la cantidad de luz que
incida sobre ella. Este valor de la resistencia será bajo cuando la luz incida sobre ella y será
alto cuando no incida ninguna luz.
En el siguiente esquema la LDR está polarizada por una resistencia ajustable Rv que nos
permite ajustar el punto que deseamos se active el Pin y con ello encienda una bombilla,
por ejemplo, si está oscureciendo y en el interior del local se encuentra oscuro, retocamos
la resistencia ajustable para activar la fotocélula y encender las luces, quedándose en esa
posición de ajuste.
112
18. Control de luminosidad mediante fotocélula LDR
113
18. Control de luminosidad mediante fotocélula LDR
Los valores que aparecen en la imagen del monitor serie, captados mediante la fotocélula
LDR están comprendidos entre 0 a 1.023. Estos son los valores que pueden tomar los
sensores con Arduino.
void setup(){
Serial.begin(9600); //Habilitamos el monitor serie
pinMode(led, OUTPUT); //configuramos el led de salida
pinMode(LDR, INPUT); //configuramos LDR como entrada
}
void loop() {
valor=analogRead(LDR); //guardamos el valor leido de la LDR en valor
Serial.println(valor); //visualizamos por el monitor serie los valores de LDR
delay(1000); //esperamos un segundo para ver los datos
Este código obtendrá una medición cada 1 segundos correspondientes a las fracciones del
voltaje de aplicación que hay en el punto de medición.
114
19. Control de las luces del jardín mediante LDR
Cuando en el jardín la luz sea la adecuada (de día), las luces del jardín permanecerán
apagadas. Si la luz ambiente decae (tarde-noche), las luces deben encenderse para iluminar
nuestro jardín.
void setup() {
Serial.begin(9600);
pinMode(led01, OUTPUT); // declaramos led01 de salida
pinMode(led02, OUTPUT); // declaramos led02 de salida
pinMode(led03, OUTPUT); // declaramos led03 de salida
pinMode (ldr, INPUT); // declaramos ldr de entrada
}
void loop(){
El valor de la sensibilidad que aparece en el código del ejercicio tiene sólo carácter
orientativo, ya que habrá que ajustar el valor de dicha variable según la luz ambiente de
que se disponga en el momento de realizar el ejercicio.
115
19. Control de las luces del jardín mediante LDR
En las siguientes imágenes del Monitor Serial podemos observar los valores obtenidos
mediante el monitor serie con una LDR y la diferencia de valores que se obtiene al variar
la cantidad de luz y con la resistencia R6 de 4K7 para polarizar la LDR.
NOTA: Para obtener un ajuste más preciso del crespúsculo (oscuridad) se puede utilizar un
potenciómetro o resistencia ajustable para obtener el punto de conexión de la LDR.
116
20. Encendido aleatorio de un led
En este primer ejercicio se creará un circuito en el que un diodo led bipolar emule la luz de
una vela, es decir, deberá cambiar su intensidad luminosa de forma aleatoria.
Para ello se utiliza un diodo led bipolar que consiste en dos diodos leds de color verde y
rojo integrados en una misma capsula con tres terminales: un cátodo unido en común y los
dos ánodos. Se establece la siguiente rutina que produce el encendido aleatorio de los dos
leds. El efecto se asemeja a una vela artificial o el fuego en un belén.
117
20. Encendido aleatorio de un led
Estas dos funciones van de la mano. Randomseed (millis) genera números aleatorios a
partir del valor de la función millis, que devuelve en milisegundos el tiempo desde que
Arduino está ejecutando el programa actual y Random () genera números aleatorios en un
rango de 0 a un máximo, preestablecido por el usuario con las variables max y min:
Random (max) o Random (min. max).
Pues bien con todo ello nos ponemos manos a la obra y para la programación escogemos
un puerto de salida de Arduino y elegimos el puerto digital D5 para conectar la salida de
nuestro diodo led blanco y el circuito que activará nuestra estrella de navidad.
void setup() {
pinMode(led, OUTPUT); // configuramos el led pin digital 5 como salida
}
void loop() {
randomSeed(millis()); //genera numeros aleatorios a partir de milisegundos
aleatorio=random(maximo); //guarda el valor obtenido de random en aleatorio
delay(100); //espera 100 milisegundos
if (aleatorio==0){ //si aleatorio es 0, ve a la función efecto1()
efecto1();
}
if (aleatorio==1){ //si aleatorio es 1, ve a la función efecto2()
efecto2();
}
if (aleatorio==2){ //si aleatorio es 2, ve a la función efecto3()
efecto3();
}
if (aleatorio==3){ //si aleatorio es 3, ve a la función efecto4()
efecto4();
}
}
void efecto1(){
for(int w=0; w<3; w++){ //temporiza durante menos de 3 ciclos
digitalWrite(led, HIGH); //encendiendo el led
delay(300); //espera 300 milisegundos
}
}
118
20. Encendido aleatorio de un led
void efecto2(){
for(int a=0; a<5; a++){ //temporiza durante menos de 5 ciclos
digitalWrite(led, LOW); //apaga el led
delay(100); //espera 100 milisegundos
digitalWrite(led, HIGH); //enciende el led
delay(100); //espera 100 milisegundos
}
}
void efecto3(){
for(int b=0; b<5; b++){ //temporiza durante menos de 5 ciclos
digitalWrite(led, HIGH); //enciende el led
delay(200); //espera 200 milisegundos
digitalWrite(led, LOW); //apaga el led
delay(100); //espera 100 milisegundos
}
}
void efecto4(){
for(int c=0; c<5; c++){ //temporiza durante menos de 5 ciclos
digitalWrite(led, HIGH); //enciende el led
delay(90); //espera 90 milisegundos
digitalWrite(led, LOW); //apaga el led
delay(60); //espera 60 milisegndos
}
}
119
21. Termostato con control de velocidad de motor
Los sensores de temperatura son unos dispositivos muy útiles que se utilizan en sistemas
diseñados para medir temperaturas en lugares accesibles o no accesibles por el ser
humano.
Un ejemplo muy fácilmente de entender es donde nos encontramos uno de estos sensores
en los equipos electrónicos que requieren, por su potencia, de un control de la temperatura
mediante la activación de ventiladores.
En este primer ejercicio se trata de un dispositivo que haga funcionar un motor y un diodo
led cuando la temperatura supera cierto valor umbral. Para ello conectaremos una
resistencia dependiente de la temperatura NTC a la entrada analógica AN0, un diodo led al
pin digital D5 y un motor de corriente continúa al pin D10. Cuando la temperatura llegue a
cierto umbral de voltaje (entre 0 y 1024) que nosotros decidamos, se encenderá el diodo
led y a la vez el motor se pondrá en marcha y con el movimiento de sus aspas de ventilador
en su eje para enfriar la NTC. Además se deberá visionar el valor de voltaje en la entrada
analógica (valor entre 0 y 1024) en el Monitor Serial de la consola del PC.
Repasaremos las conexiones de entrada analógicas AN0 para el sensor NTC. Utilizaremos
órdenes como analogRead(). Visualizaremos datos de la consola del PC a través del puerto
serie y el Monitor Serial utilizando las ordenes Serial.begin, Serial.print y por último
veremos ordenes de control if, else.
120
21. Termostato con control de velocidad de motor
}
void monitoriza(){ //procedimiento que envía al puerto serie, para ser leído
en el monitor
Serial.print("La medida es ..."); //muestra por monitor serie el texto
Serial.println(medida); // muestra por el monitor serie valor medida
delay(1000); //para evitar saturar el puerto serie
}
void loop() {
medida=analogRead(ntc); //guardamos en medida los datos de ntc
monitoriza(); //ve a monitoriza
if(medida>nivel) { //si la señal del sensor supera el nivel marcado
digitalWrite(led,HIGH); //se enciende un aviso luminoso
digitalWrite(motor,HIGH); //arranca el motor
}
else { // si la señal está por debajo del nivel marcado
digitalWrite(led,LOW);
digitalWrite(motor,LOW); // el motor se para
}
}
121
21. Termostato con control de velocidad de motor
En este otro ejercicio muy semejante a la anterior trata de hacer lucir un diodo led y
funcionar el motor de un ventilador cuando la temperatura llegue a cierto valor umbral
(entre 0 y 1024). Para ello conectamos una NTC a la entrada analógica AN0, el diodo led al
pin D13 y el motor en el pin D9. El motor debe funcionar a cierto nivel de potencia a elegir
entre 0 y 255. Además se deberá visionar el valor de voltaje en la entrada analógica (valor
entre 0 y 1024) en una consola en el PC.
Se repasa las conexiones de entrada analógicas para entradas con señales variables (NTC),
salidas analógicas a través de pines digitales PWM, las ordenes analogWrite(),
visualización de datos a través de la consola del PC mediante el monitor serial y por último
veremos las ordenes condicionales de If, else.
122
21. Termostato con control de velocidad de motor
123
21. Termostato con control de velocidad de motor
Nota: Hay que tener en cuenta que juega un papel muy impotante la utilización del Monitor
Serie del IDE de Arduino para visualizar los datos que van apareciendo con los sensores
que tenemos instalados, para ello, escogemos el valor que más nos interesa y lo incluimos
en nuestra programación.
124
22. Medidor y control de temperatura mediante NTC
void setup(){
pinMode (temp, INPUT); //configuramos el pin temp de entrada
pinMode (piezo,OUTPUT); //configuramos el pin piezo de salida
pinMode (led2, OUTPUT); //configuramos el pin led2 de salida
pinMode (led3, OUTPUT); //configuramos el pin led3 de salida
pinMode (led4, OUTPUT); //configuramos el pin led4 de salida
pinMode (led5, OUTPUT); //configuramos el pin led5 de salida
pinMode (led6, OUTPUT); //configuramos el pin led6 de salida
125
22. Medidor y control de temperatura mediante NTC
pinMode (led7, OUTPUT); //configuramos el pin led7 de salida
}
void loop() {
valor=analogRead(temp); //se guarda en valor la lectura de temp
126
22. Medidor y control de temperatura mediante NTC
Por otro lado se ha previsto añadir en ésta ejercicio, relacionada con la resistencia térmica
NTC, de solamente una salida D5 que permita controlar un ventilador que se activa cuando
la temperatura supera los 25 grados, y se desactiva cuando la temperatura baja por debajo
del nivel de los 25 grados.
En el siguiente esquema eléctrico se muestra una salida del pin digital D5 del
microcontrolador ATmega328P que va a señalizar un diodo ledrojo LED1 que se
encenderá cuando la temperatura exceda de los 25 grados y a la misma vez activará un
optoacoplador OPTO SIM3023 que pondrá en marcha el circuito interruptor de 230V de
corriente alterna formado por el Triac BT138 que pondrá en funcionamiento el ventilador.
127
22. Medidor y control de temperatura mediante NTC
if (valor>845){
digitalWrite(led5, HIGH); //enciende el led5 si se encuentra dentro del
margen
}
else {
digitalWrite(led5, LOW); //de lo contrario apaga el led5
}
delay(3000); //espera 3 segundos para actualizar la lectura de temperatura
}
128
23. Detector de alarma mediante ultrasonidos HC-SR04
Uno de los sensores más utilizados por sus aplicaciones y utilidad es el sensor de
ultrasonidos.
Un sensor de ultrasonidos puede servir para medir distancias a objetos, utilizarlo como
“sonar” en lugares poco accesibles y como detector de obstáculos para robots móviles y de
personas, cuando se mueven por su campo de acción. Para este último caso, se ha pensado
programar un sensor de ultrasonidos que nos pueda servir para una sencilla alarma que
nos detecte la presencia de una persona o animal en un determinado lugar de una
habitación o recinto.
Los ultrasonidos son aquellos sonidos que se generan a partir del rango de los 20KHz hasta
los 400KHz y no son percibidos por las personas.
Este dispositivo, que es uno de los sensores más utilizados en robótica, nos permite medir
distancias o detectar objetos. Tanto su conexión como su programación son de fácil
implementación.
129
23. Detector de alarma mediante ultrasonidos HC-SR04
La conexión con Arduino es bastante sencilla: basta con asignar un pin al emisor(trigger) y
un pin para el receptor (Echo), y habilitar el monitor serie para ver los valores que van
apareciendo según la distancia a la que el objeto u obstáculo está fijo y cuando se produce
un cambio de distancia o movimiento del objeto.
En la programación se ha añadido tres diodos leds que nos van indicando en todo momento
la distancia de tres zonas de detección: distancia alta (led verde), distancia media (led
naranja) y distancia corta (led rojo). Tendremos que habilitar el monitor serie para ir
viendo por la pantalla del PC el valor desde el 0 al 1024 de las distancias en centímetros
que van apareciendo en las diferentes zonas conforme nos movemos por las zonas. Como
una opción para avisar de la alarma se puede utilizar la salida del pin D4, donde se
encuentra el led rojo y conectarle en paralelo un optoacoplador para activar un relé.
En el monitor serie nos aparece la distancia en centímetros de los objetos u obstáculos que
pongamos frente al dispositivo de ultrasonidos. La distancia de detección de este tipo de
ultrasonido no es grande, aproximadamente de unos 200 cm. Para ubicarlo en un pasillo,
un recinto pequeño, etc.
130
23. Detector de alarma mediante ultrasonidos HC-SR04
131
23. Detector de alarma mediante ultrasonidos HC-SR04
void setup(){
Serial.begin(9600); //configuramos la comunicación por el monitor serie
pinMode (disparo, OUTPUT);//configuramos pin de disparo ultrasonido de salida
pinMode (eco, INPUT); //configuramos pin de eco ultrasonido de entrada
pinMode (led2, OUTPUT); //configuramos el pin led2 de salida
pinMode (led3, OUTPUT); //configuramos el pin led3 de salida
pinMode (led4, OUTPUT); //configuramos el pin led4 de salida
}
void loop() {
digitalWrite (disparo, LOW); //desactivamos el disparo
delayMicroseconds(2); //esperamos 2 microsegundos antes de activar el disparo
digitalWrite(disparo, HIGH); //activamos el disparo
delayMicroseconds(10); //esperamos 10 microsegundos antes de desactivar el
disparo
digitalWrite (disparo, LOW); //desactivamos el disparo
tiempo=pulseIn(eco, HIGH); //guardamos en la variable tiempo la duracion
disparo-eco
distancia=tiempo/58;//divide el tiempo entre 29µs+29µs tiempo ida y vuelta
Serial.print(distancia); //visualizamos la distancia por el monitor serie
Serial.println("cm"); // en centimetros
delay(1000); //esperamos 1 segundo
if (distancia>140) {
digitalWrite(led2, HIGH); //enciende el led2 VERDE si se encuentra dentro
del margen
}
else {
digitalWrite(led2, LOW); //de lo contrario apaga el led2 VERDE
}
if (distancia>110 && distancia<140){
digitalWrite(led3, HIGH); //enciende el led3 AMARILLO si se encuentra
dentro del margen
}
else {
digitalWrite(led3, LOW); //de lo contrario apaga el led3 AMARILLO
}
if (distancia>2 && distancia<110){
digitalWrite(led4, HIGH); //enciende el led4 ROJO si se encuentra dentro
del margen
}
else {
digitalWrite(led4, LOW); //de lo contrario apaga el led4 ROJO
}
delay(500); //espera medio segundo para actualizar la lectura de temperatura
}
132
24. Aviso acústico para aparcamiento con el HC-SR04
Los zumbadores o buzzer están compuestos de una placa interior que, al igual que la
membrana de un altavoz, vibra y transforma la señal en sonido. Su tensión de trabajo
varian desde los 5 voltios a los 12 voltios de continua.
Zumbadores o buzzer
133
24. Aviso acústico para aparcamiento con el HC-SR04
void setup(){
Serial.begin(9600); //configuramos la comunicación por el monitor serie
pinMode (disparo, OUTPUT);//configuramos pin de disparo ultrasonido de salida
pinMode (eco, INPUT); //configuramos pin de eco ultrasonido de entrada
pinMode (zumbador, OUTPUT); //configuramos el zumbador de salida
}
void loop() {
digitalWrite (disparo, LOW); //desactivamos el disparo
delayMicroseconds(2); //esperamos 2 microsegundos antes de activar el disparo
digitalWrite(disparo, HIGH); //activamos el disparo
delayMicroseconds(10); //esperamos 10 microsegundos antes de desactivar el
disparo
digitalWrite (disparo, LOW); //desactivamos el disparo
tiempo=pulseIn(eco, HIGH); //guardamos en la variable tiempo la duracion
disparo-eco
distancia=tiempo/58; //divide el tiempo entre 29µs+29µs tiempo ida y vuelta
if (distancia<50) {
tone(zumbador,320,100); //suena tonos dentro del margen establecido
delay(50); //intervalo de tiempo rapido para tonos
}
else {
noTone(zumbador); //de lo contrario no suena tonos
}
if (distancia>60 && distancia<150) {
tone (zumbador,300,100); //suena tonos dentro del margen establecido
delay(300); //intervalo de tiempo lento para tonos
}
else {
noTone(zumbador); //de lo contrario no suena tonos
}
}
134
25. Control de aforo a un local
En este otro ejercicio consiste en controlar el número de personas para entrar en un local
de fiesta. Pues, rebasar el número de asistentes establecido para ese local podría ser
motivo de una espléndida multa.
En este caso se va a utilizar dos Fotoresistencia LDR y dos diodos Laser para detectar la
entrada y salida del local.
La palabra Láser viene del inglés Light Amplification by Stimulated Emission of Radiation, o
amplificación de luz por emisión estimulada de radiación.
La luz que emitimos por un diodo LED, o una bombilla convencional, por ejemplo, es una
luz dispersa, mientras que la luz que emitimos con un diodo laser es una luz concentrada
en un punto.
Por lo tanto si nos fijamos en el dibujo siguiente observaremos que si enfrentamos una
Fotoresistencia LDR y un diodo Láser debemos de apuntarlo perfectamente para que
coincida el haz del Láser con la superficie de detección de la Fotoresistencia LDR. De lo
contrario nos daría problemas a la hora de recibir la señal de la Fotoresistencia LDR.
Para realizar un sistema de este tipo, de forma mucho más profesional y apropiada, se
debería utilizar un emisor y receptor de infrarrojos activos, de solo un haz, creando una
barrera de detección, pero como económico y práctico se ha optado por utilizar la
fotocélula LDR y el diodo láser.
135
25. Control de aforo a un local
Las resistencias RV1 y RV2 de 10K son ajustables para obtener un mejor control de la
sensibilidad de las LDR.
136
25. Control de aforo a un local
void setup() {
Serial.begin (9600); //configuramos monitor serie a 9600 bps
pinMode (ldr1, INPUT); //configuramos pin ldr1 de entrada
pinMode (ldr2, INPUT); //configuramos pin ldr2 de entrada
}
void loop() {
137
25. Control de aforo a un local
46
45
50
66
68
67
85
132
159
176
175
189
¡ATENCION !: AFORO COMPLETO
¡ATENCION !: AFORO COMPLETO
A través del Monitor Serie del IDE de Arduino podemos ver el número de asistentes que
están dentro del local y cuando llega a la ocupación del número establecido nos aparece el
texto de AFORO COMPLETO, que desaparecerá cuando un asistente salga del local.
Tambien se puede utilizar un diodo LED verde y otro rojo, para indicarnos en todo
momento con el encendido del diodo led rojo cuando el aforo se ha completado y el diodo
led verde que todavía pueden entrar asistentes.
138
26. Control de Servomotores
Para programar un servomotor en Arduino podemos utilizar una librería especial para los
servomotores, esta librería se denomina Servo.h y viene por defecto en el IDE de Arduino.
Las instrucciones más usuales que podemos introducir en un programa para controlar al
servomotor son:
139
26. Control de Servomotores
Para programar un servomotor utilizaremos una librería especial para los servomotores.
Esta librería se denomina Servo.h y viene por defecto en el IDE de Arduino.
Los servos de modelismo tienen un motor y unos engranajes cuya salida se puede mover en
un arco de 180º y contienen la electrónica necesaria para ello. Todo lo que se necesita es un
pulso enviado cada 20 ms. Este ejemplo utiliza la función servoPulse para mover el servo
de 10º a 170º.
140
26. Control de Servomotores
En este otro ejercicio gobernaremos un servomotor mediante una LDR, emulando un toldo
o persiana automatizada que reacciona a la cantidad de luz.
Cuando la luz que incide por la ventana sea mayor a un umbral determinado, la persiana
deberá bajar para atenuar la luz.
Todo lo contrario deberá suceder cuando la luz que incide en la ventana sea escasa. En este
caso, la cortina deberá replegarse para dejar pasar la máxima luz del exterior.
141
26. Control de Servomotores
void setup() {
Serial.begin(9600); //configuramso el monitor serie
pinMode (ldr, INPUT); //configuramos el pin como entrada para la LDR
motor_persiana.attach (7); //indicamos a Arduino de controlar nuestro servo
por el pin 7
}
void loop() {
142
26. Control de Servomotores
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
val = analogRead(potpin); // reads the value of the potentiometer
(value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo
(value
between 0 and 180)
myservo.write(val); // sets the servo position according to
the
scaledvalue
delay(15); // waits for the servo to get there
}
143
27. Salida de alta corriente de consumo
A veces es necesario controlar cargas de más de los 40 mA que es el límite que suministra
el microcontrolador Arduino. En este caso se hace uso de un transistor MOSFET que puede
alimentar cargas de mayor consumo de corriente. En el siguiente ejemplo se muestra como
un transistor MOSFET conmuta un motor 5 veces cada segundo.
Pin introduce una oscilación que mueve el motor girandolo en un sentido y parandose
144
27. Salida de alta corriente de consumo
IRF510
145
28. Programación de un contador
/* Programa Contador */
int LED=13; //asignamos el pin 13 digital a LED
int boton=7; //asignamos el pin 7 digital a boton
int valor=0; //asignamos la variable valor a 0
int contador=0; //asignamos la variable contador a 0
int estadoboton=0; //asignamos la variable estadoboton a 0
void setup() {
Serial.begin(9600); // configure velocidad de transmisión a 9600 b
pinMode(LED, OUTPUT); // pone de salida digital el LED verde el pin 13
pinMode(boton, INPUT); // pone de entrada digital el botón pin 7
}
void loop() {
valor=digitalRead(boton); // lee el valor de la entrada digital pin 7
digitalWrite(LED, valor); // enciende el LED si el nivel es alto
if (valor!=estadoboton){ // condiciona igualdad estado variable valor
if(valor==1){ // condiciona y compara con el valor 1
contador++; // suma 1 a contador
Serial.println(contador); // lanza el valor de contador al pulsar boton
Serial.print(10); // lanza al monitor serial 10
Serial.print(13); // lanza al monitor serial 13
}
}
estadoboton=valor; //almacena valor en estado boton
}
146
28. Programación de un contador
147
29. Cruce regulado por semáforos
Todo proyecto conlleva unas series de pasos antes y durante su desarrollo. Según las
dimensiones del proyecto se necesitarán más recursos o menos, es decir, en el caso de este
proyecto que se plantea el diseño de la regulación de un cruce con semáforos, los recursos
son pocos, en el caso de una ampliación con más calles perpendiculares y el control del
paso de peatones el diseño se complica aún más y los recursos aumentan
considerablemente. Lo mismo ocurre, cuando diseñamos un proyecto de un sistema de
alarma para una vivienda que controla únicamente dos zonas de protección que otro
proyecto de seguridad donde se protege un museo donde tiene que haber, por ejemplo,
muchísima más zonas de protección.
Pues bien, según el proyecto que se quiera realizar será más o menos complejo. En la
programación será un tanto compleja contra más elementos exteriores necesitemos de
controlar: un botón de paso de peatón, indicadores de salidas, ciclos de temporizaciones,
etc.
Primeramente y, es bien conocido por todos nosotros, que un cruce son dos calles o
avenidas que se cruzan, con diferentes sentidos de circulación, y el objetivo es que puedan
circular los vehículos de una de las calle y los vehículos de la otra estén detenidos, para
posteriormente se produzca una conmutación en viceversa, es decir, la que estaba
circulando se detienen y la que estaban parados comience a circular… hasta aquí, todo
claro, OK? Omitimos en este proyecto el control del paso de personas (peatones), por
existir pasos subterráneos.
148
29. Cruce regulado por semáforos
/* Semaforo
Secuencia de 6 diodos leds encendiendose por medio de una temporización
delay diferentes y conmutadas */
149
29. Cruce regulado por semáforos
150
30. Semáforo para paso de peatones
Este proyecto contempla el control del paso de peatones de dos semáforos para cada una
de las direcciones de una vía de doble sentido y se ejecuta mediante un pulsador peatonal.
void setup(){
pinMode(led1, OUTPUT); // Configuramos el led1 de salida
pinMode(led2, OUTPUT); // Configuramos el led2 de salida
pinMode (led3,OUTPUT); // Configuramos el led3 de salida
pinMode (led4, OUTPUT); // Configuramos el led4 de salida
pinMode (led5, OUTPUT); // Configiramos el led5 de salida
pinMode (pulsador, INPUT); //Configuramos el pulsador de entrada
}
void loop() {
151
30. Semáforo para paso de peatones
152
30. Semáforo para paso de peatones
El Atmega328P de 28DIP se le conecta para la señal de reloj, en los pines 9 y 10, un cristal
de cuarzo de 16 MHz para sincronizar la señal de reloj y el funcionamiento de todos los
elementos conectados al microcontrolador. Los pines de salida de D02 a D06 se aplican
una resistencia de 470 Ohmios en serie para polarizar el diodo led del optoacoplador.
Al ser de dos direcciones de doble sentido de circulación tenemos que conectar en paralelo
los dos semáforos y los dos señalizadores de peatones. Lo mismo ocurre con el pulsador de
paso que también irá en paralelo.
153
30. Semáforo para paso de peatones
Al tener doble sentido de circulación se tendra que disponer de dos semaforos y dos
controles peatonal. Esto se realiza poniendo los semaforos en paralelo lo mismo que los
controles peatonal.
Sin haber pulsado el pulsador para el paso de peatones, el led5 rojo se encuentra encendido
y los leds1 y 2 color naranja comienzan a parpadear alternativamente. Cuando pulsamos el
pulsador para pasar, se apaga el led1 y el led2 se queda un breve tiempo encendido para
dar paso al led3 rojo, que se queda encendido durante un determinado tiempo, el led5 rojo
se apaga y se enciende el led4 verde que indica que podemos pasar, al cabo de un tiempo se
pone a parpadear indicando que va a cambiar, apagandose y encendiendose el led5 y los
leds1 y 2 parpadean.
154
31. Dado electrónico
En esta programación se van a utilizar dos funciones esenciales para producir valores
aleatorios, estas son: random(seed) y random(max, min):
Función randomSeed(seed)
Esta función nos permite inicializar, a partir de una variable o de otra función, una semilla
para generar números aleatorios y como punto de partida para la función random().
Por ejemplo:
Recordemos que esta función devuelve en milisegundos el tiempo desde que Arduino está
ejecutando el programa actual.
155
31. Dado electrónico
SN74LS47
156
31. Dado electrónico
void setup() {
pinMode (A, OUTPUT); //configuramos A como salida
pinMode (B, OUTPUT); //configuramos B como salida
pinMode (C, OUTPUT); //configuramos C como salida
pinMode (boton, INPUT); //configuramos boton como entrada
}
void loop() {
estadopulsador=digitalRead(boton); //lee el estado del pulsador
if (estadopulsador==HIGH){ // si estadopulsador esta en alto
for (int w=0; w<5; w++) { // bucle repetitivo hasta 5
dado1(); //ve a la función dado1
delay(100); //espera 100 milisegundos
dado2(); //ve a la función dado2
delay(100); //espera 100 milisegundos
dado3(); //ve a la función dado3
delay(100); //espera 100 milisegundos
dado4(); //ve a la función dado4
delay(100); //espera 100 milisegundos
dado5(); //ve a la función dado5
delay(100); //espera 100 milisegundos
dado6(); //ve a la función dado6
}
randomSeed(millis()); //se genera numeros aleatorios
randomNumber=random(maximo); //guarda el valor obtenido de random en
ramdomNumber
if (randomNumber==1){ //si es igual a 1
dado1(); //ve a la función dado1
}
if (randomNumber==2){ //si es igual a 2
dado2(); //ve a la función dado2
}
if (randomNumber==3){ //si es igual a 3
dado3(); //ve a la función dado3
}
if (randomNumber==4){ //si es igual a 4
dado4(); //ve a la función dado4
}
if (randomNumber==5){ //si es igual a 5
dado5(); //ve a la función dado5
}
if (randomNumber==6){ //si es igual a 6
dado6(); //ve a la función dado6
}
157
31. Dado electrónico
}
}
void dado1(){ // funcion dado1
digitalWrite (A, HIGH); // pon a nivel alto el pin A
digitalWrite (B, LOW); // pon a nivel bajo el pin B
digitalWrite (C, LOW); // pon a nivel bajo el pin C
}
void dado2(){ // funcion dado2
digitalWrite (A, LOW); // pon a nivel bajo el pin A
digitalWrite (B, HIGH); // pon a nivel alto el pin B
digitalWrite (C, LOW); // pon a nivel bajo el pin C
}
void dado3(){ // funcion dado3
digitalWrite (A, HIGH); // pon a nivel alto el pin A
digitalWrite (B, HIGH); // pon a nivel alto el pin B
digitalWrite (C, LOW); // pon a nivel bajo el pin C
}
void dado4(){ // funcion dado4
digitalWrite (A, LOW); // pon a nivel bajo el pin A
digitalWrite (B, LOW); // pon a nivel bajo el pin B
digitalWrite (C, HIGH); // pon a nivel alto el pin C
}
void dado5(){ // funcion dado5
digitalWrite (A, HIGH); // pon a nivel alto el pin A
digitalWrite (B, LOW); // pon a nivel bajo el pin B
digitalWrite (C, HIGH); // pon a nivel alto el pin C
}
void dado6(){ // funcion dado6
digitalWrite (A, LOW); // pon a nivel bajo el pin A
digitalWrite (B, HIGH); // pon a nivel alto el pin B
digitalWrite (C, HIGH); // pon a nivel alto el pin C
}
158
32. Detector de movimiento con activación de luz
Este modelo de proyecto se suele utilizar en los lugares públicos: servicios, entradas a
edificios, pasillos, etc. Consiste en detectar la persona y encenderse la luz del lugar durante
un determinado tiempo y apagándose cuando no se ha detectado ningún movimiento.
Para señalizar esto, cuando se produce movimiento, se utiliza el pin digital de salida D7
que activa un diodo led rojo y la conexión a un optoacoplador MOC3023 y un Triac BT138
para encender una bombilla de 230 voltios que estará aproximadamente encendida un
minuto y 38 segundos, según el valor que le demos al bucle repetitivo.
159
32. Detector de movimiento con activación de luz
160
33. Interruptor por control remoto de infrarrojos
Un diodo emisor de infrarrojo envia una señal y es captada por un transistor de infrarrojo
que actua sobre un circuito que hace activar un motor, una bombilla, un canal de TV, etc.
161
33. Interruptor por control remoto de infrarrojos
void setup() {
pinMode (sensor, INPUT); // configuramos sensor de entrada
pinMode (led, OUTPUT); //configuramos led de salida
pinMode (rea, INPUT); //configuramos el pin rea como entrada
}
void loop(){
valor=analogRead(sensor); // alamcena el valor del sensor analogico en valor
valor2=digitalRead(rea);// alamcena el valor de rea digital en valor2
if (valor<100 && valor2==LOW){ //condicionante si valor menor de 100 y
valor2 bajo
digitalWrite(led, HIGH); //encendemos led
delay(500);//espera medio segundo
}
if (valor<100 && valor2==HIGH){//condicionante si valor menor de 100 y
valor2 alto
digitalWrite (led, LOW); // apagamos led
delay(500); //espera medio segundo
}
}
162
34. Interruptor por control remoto de radiofrecuencias
Receptor
Transmisor
El módulo receptor por RF se utiliza para la recepción de datos y señales de control, las
aplicaciones más comunes son: para puertas de garaje, persianas, cerraduras, iluminación,
telemetría, control industrial, alarmas, etc
Es recomendable utilizar una antena, tanto para la transmisión como para la recepción, de
1/4 de la longitud de onda, La antena tiene una gran influencia en la recepción del módulo.
Al instalar la antena, esta debe extenderse al máximo, alejarse de zonas de alta presión e
interferencias.
Receptor:
Modelo del producto: MX-05V
Voltaje de funcionamiento: DC 5V
Corriente en reposo: 4mA
Frecuencia de recepción: 315MHz
Sensibilidad del receptor: -105 dB
Dimensiones: 30x14x7 mm
Antena externa: los 32 cm solo hilo central enrollado en una espiral
Pin de salida de izquierda a derecha: (VCC, DATA, DATA, GND)
Transmisor:
Modelo del producto: MX-RM-05+
Rango: 20 a 200 metros (diferentes tensiones pueden dar diferentes resultados)
Tensión de trabajo: 3,5V a 12V
Dimensiones: 19x19 mm
Modo de funcionamiento: AM
Velocidad de transferencia: 4kB/s
163
34. Interruptor por control remoto de radiofrecuencias
Potencia de transmisión: 10mW
Frecuencia de transmisión: 315 MHz
Una antena externa: 25 cm línea de núcleos múltiples o de un solo núcleo
Pin de salida de izquierda a derecha: (DATA, VCC, GND).
Una antena externa: 25cm línea de núcleos múltiples o de un solo núcleo ordinaria
La utilización de dos inversores 74LS04 en serie permite amplificar la señal captada del
circuito receptor y la adapta a un nivel óptimo para la entrada al microcontrolador.
Es importante saber que si utilizamos el puerto USB del PC para activar el Monitor Serie
para ver los valores que se presenta por pantalla, se puede producir alteraciones en el
proceso que es debido a la alimentación de +5Vcc del PC que es captada por el receptor de
RF y produce alteraciones en el funcionamiento del proceso. Para evitar esto y una vez
programado el microcontrolador, debemos prescindir de tener conectado la placa de
Arduino al puerto USB del PC y conectarla a un alimentador de +5Vcc, del tipo de cargador
de móviles.
164
34. Interruptor por control remoto de radiofrecuencias
165
34. Interruptor por control remoto de radiofrecuencias
SN74LS04
void setup() {
166
34. Interruptor por control remoto de radiofrecuencias
167
34. Interruptor por control remoto de radiofrecuencias
Lo mismo podemos colocar en paralelo con el diodo Led1 un circuito optoacoplador con
relé. Para activar elementos de potencia, tanto de corriente alterna como de continua.
168
35. Programación de una centralita de alarma de 4 zonas
Hoy en dia se suelen utilizar sofisticados sistemas de alarma contra robo, urto, vigilancia,
etc., utilizando también para ello cámaras de video vigilancia que avisa de un movimiento
en su zona de cobertura a la misma vez que está grabando.
Principalmente, contiene siete diodos LEDs que nos señalizará y visualizará en cada
momento del proceso de funcionamiento de la centralita, así como de unos tonos mediante
un zumbador que nos va avisando en determinadas circunstancias de funcionamiento y el
control de conexión y desconexión de la centralita mediante una cerradura eléctrica con
llave tubular.
Finalmente este proyecto de centralita de alarma sirve de ejercicio donde se aplica los
circuitos hardware y la programación software en Arduino.
Una vez finalizado y comprobado tanto los circuitos hardware como la programación del
microcontrolador en la tarjeta de Arduino, que funcionen correctamente, podemos
desmontar el microcontrolador y lo instalamos en una placa de circuito impreso con todos
los componentes adicionales que comprende el proyecto, observando que el
funcionamiento debe ser el mismo que con la tarjeta de Arduino. Con ello, se puede
conseguir utilizarlo individualmente como un equipo completo.
Primeramente hay que tener en cuenta todos los elementos que intervienen en el diseño de
la centralita pensando en los componentes que hay que utilizar para que su funcionamiento
sea óptimo y no se cometan posteriormente errores por algún que otro componente mal
empleado.
169
35. Programación de una centralita de alarma de 4 zonas
La tirada de cable que se instala para cada zona deberá estar provisto de los dos lazos
NC/NA, aunque necesitemos solamente el lazo NC, esto nos servirá para proteger la red de
cableado y la instalación de cualquier manipulación indebida que se haga al cableado,
cortando o cortocircuitando el cable, que hará saltar el sistema estando conectado o
señalizandolo estando deconectada la centralita.
El diseñar una centralita de 4 zonas permite distribuir todos los elementos detectores del
recinto a proteger por zonas, es decir, nos ayuda a identificar más facilmente en que zona
se encuentra si alguno de los dispositivos detectores esté dando problemas o que puedan
estar fallando y, en el caso más generalizado, la zona por donde se ha producido la
intrusión.
Todas estas consideraciones la tenemos que tener en cuenta para la programación del
microcontrolador en la tarjeta de Arduino que se describe al final de este proyecto.
170
35. Programación de una centralita de alarma de 4 zonas
Los dispostivos detectores de entrada deben de estar preparados para trabajar con
circuitos Normalmente Cerrados NC o con circuitos Normalmente Abiertos NA.
Los circuitos NC van en serie formando un lazo cerrado, estando cerrados no producirán
alarma, de lo contrario cuando se abren inmediatamente se produce la activación de la
alarma. Los dispostivos que trabajan con circuitos NA irán en paralelo y con el circuito
abierto, éstos producirán la alarma cuando se cierra el circuito, al contrario que los NC. La
centralita de alarma al detectar cualquier lazo que se abra o se cierre en los dispositivos de
entrada hará conectar los dispositivos de salida para avisarnos de la instrucción, en
algunos casos tendremos un tiempo para llegar a la centralita y desconectarla.
Los dispositivos que utilicemos para la detección con circuito Normalmente Cerrados
tanto magnéticos, sensores de vibración o volumétricos deberán abrirse sus contactos
cuando se produzca una alarma y señalizarla, lo mismo ocurre cuando la detección sea
mediante circuito Normalmente Abierto sus contactos se deben unir para señalizar la
alarma.
171
35. Programación de una centralita de alarma de 4 zonas
Las cuatro zonas, conexión ON-OFF, sistema OK, Sistema Alarmado poseen unos diodos
LEDs. Éstos diodos LEDs nos indican en cualquier momento y en las 24 horas, del estado de
las cuatro zonas, el led encendido indica que la zona está activa y apagado cuando la zona
está sin alarma. Este proceso se lleva a cabo tanto esté conectada como si no está conectada
la centralita. Los demás diodos leds se enciende cuando: Sistema Alarmado, Conectado ON
y Sistema OK y cuando esten apagados: Sistema No Alarmado, Desconectado OFF y Sistema
NO OK.
El circuito del módulo de control realiza todas las funciones y operaciones programadas de
la centralita y se componen principalmente de los siguientes elementos:
172
35. Programación de una centralita de alarma de 4 zonas
Un circuito que nos permite escuchar los tonos a través de un zumbador
piezoeléctrico.
Una cerradura eléctrica con doble interruptor y llave tubular que permite conectar
los SW1 y SW2, para la conexión de la centralita y el circuito de aviso de alarma.
Un circuito de salida de alarma que lo componen un optoacoplador, OPTO1, un
transistor Q1 y un relé RL1 de doble circuito conmutado de salida.
Un circuito de RESET para inicializar la centralita en caso de bloqueo.
El IC1 se trata del microcontrolador ATMega 328P, DIP-28, el principal eslabon de toda la
centralita, puesto que contiene la programación para ejecutar todas las operaciones de
control de la centralita de alarma de 4 zonas.
De la memoria flash se puede decir que es ahí donde se almacenan los programas que se
cargan mediante el IDE de Arduino. Esta memoria está compartida con un gestor de
arranque, que incorpora las instrucciones necesarias para que el microcontrolador esté
listo para poder trabajar con él.
Por último, la memoria EEPROM es de solo lectura. En ella van grabadas las librerías
necesarias para interpretar los programs de Arduino.
173
35. Programación de una centralita de alarma de 4 zonas
En este diseño se ha tenido en cuenta de incluir el circuito de RESET que está formado por
una resistencia R1 de10K conectada a +5Vcc y un micropulsador P1 a GND unidos al pin 1
de IC1, que permite reinicializar el sistema sin tener que quitar la alimentación de la
centralita.
Las entradas al microcontrolador IC1 por los puertos digitales son cinco: las cuatro zonas
Z1, Z2, Z3 y Z4 que entran en los puertos digitales PD2, PD3, PD4 y PD5, con las
caracteristicas que sin alarma las entradas están a nivel bajo y cuando se produce una
alarma la entrada se pone a nivel alto. Y por último la entrada digital por el puerto digital
PB5 D13 que corresponde al interruptor de conexión de la centralita ON-OFF del SW1.
Cada zona está formada por una puerta OR para las dos entradas Normalmente Abierta
(NA) y Normalmente Cerrada (NC) y una puerta NOT para el circuito NC (Normalmente
Cerrado), que al estar cerrado el nivel de salida de la puerta NOT es de un nivel bajo (0),
pero si abrimos el circuito pasa del nivel bajo(0) a nivel alto (1) aplicando a la entrada de
la puerta OR un nivel alto (1) y a su salida se obtiene un nivel alto (1) que se aplica a la
entrada del puerto digital del microcontrolador IC1 y realizar la tarea que tiene
programada. Si no se utiliza una zona que sea Normalmente Cerrada NC se deberá colocar
una resistencia con valor máximo de 2K2.
Para las entradas Normalmente Abierta (NA) tienen una resistencia a masa que deja la
entrada de la puerta OR a nivel bajo (0), cuando cerramos el circuito, unimos +5Vcc y la
entrada de la puerta OR se obtiene un nivel alto (1) que también sale de la puerta OR con
un valor alto y se aplica a la entrada del puerto digital del microcontrolador IC1 que realiza
la tarea que tienen programada.
174
35. Programación de una centralita de alarma de 4 zonas
Las salidas del microcontrador IC1 son siete puertos digitales y uno analógico: seis de ellos
son salidas de diodos leds para la señalización de la centralita, LED1, LED2, LED3, LED4,
LED5 y LED6 que salen de los puertos digitales D6, D7, D8, D9, D10 y D11, respectivamente
y poseen una resistencia de poralización R12, R13, R14, R15, R16 y R17 de 680Ω.
Puede existir el caso que si antes de conectar la centralita estuviera alguna zona activada
tendremos un led rojo encendido que no se apaga, para ello, es necesario buscar la causa
que lo provoca pues la centralita nos lo avisaría con unos tonos antes de activarse el
circuito de aviso “sistema alarmado”.
175
35. Programación de una centralita de alarma de 4 zonas
Los diodos LEDs de color rojo exclusivamente para la señalización de las cuatro zonas:
Zona 1, Zona 2, Zona 3 y Zona 4, se encenderán cuando se produzca un cambio en los
circuitos de entradas: lazo Normalmente Abiertos NA se producirá una unión en sus
contactos o el lazo Normalmente Cerrados NC se producirá cuando sus contactos se
abrán.
El diodo led de color rojo de ALARMA se enciende cuando se activa los dispostivos de
avisos: sirenas, luces, grabación de video, llamadas a teléfonos fijos y móviles, etc.
Por último el diodo led de color verde nos indicará en todo momento cuando se enciende
que el sistema está OK, es decir, las zonas estan todas sin alarma, leds apagados, pero si se
encuentra apagado el sistema indica que algo falla, alguna zona se encuentra alarmada o la
alimentación está fallando y no es conveniente conectar la centralita sin antes localizar el
problema.
Este zumbador ZB1 hace zonar unos tonos durante la salida, después de haber conectado la
centralita y hasta finalizar el tiempo programadode y lo mismo ocurre a la entrada cuando
es detectado por un sensor. Este zumbador está polarizado en serie con una resistencia R6
de 220Ω y ¼ de vatio y conectada al puerto analógico AN0.
La centralita va provista de dos interruptores SW1 y SW2 que se integra en una cerradura
eléctrica con llave tubular para conectar y desconectar la centralita y el circuito de aviso.
176
35. Programación de una centralita de alarma de 4 zonas
El SW1 se polariza de la alimentación de +5Vcc hacia el puerto digital D13 de IC1 mediante
una resistencia R7 de 470Ω y el SW2 de la tensión de +12Vcc hacia el circuito que polariza
la salida de alarma que activa el circuito de relé RL1. En la siguiente figura se muestra una
cerradura eléctrica con llave tubular provista de doble circuito interruptor.
En este diseño no va a faltar el circuito de salida de aviso de alarma que se activa cuando
cualquier zona de la centralita, estando conectada, se ha activado.
Este circuito se compone de un optoacoplador OPTO1 que está conectado a la salida del
puerto digital D12 mediante una resistencia R9 de 1K y va a controlar a su salida la
conexión y desconexión de un relé de doble circuito de conmutación que trabaja con
alimentación de 12 voltios y se conmuta a través del transistor Q1 NPN. En este relé se
podrán conectar cualquier circuito de sirena, luces del tipo flash, conexión telefónica de
llamadas automáticas, etc., pero no debe sobrepasar el consumo de más de 5A.
El circuito de aviso de alarma posee un diodo led rojo LED7 polarizado con la resistencia
R18 de 1K que nos permite indicarnos, cuando está encendido, que el sistema se encuentra
alarmado.
177
35. Programación de una centralita de alarma de 4 zonas
178
35. Programación de una centralita de alarma de 4 zonas
R1, R2, R4, R5, R10, R11, R19, R20, R21 y R22 = Resistencias de ¼ W de 4K7Ω
R3 = Resistencia de ¼ W de 10K
R6 = Resistencia de ¼ W de 220Ω
R7 y R8 = Resistencia de ¼ W de 470Ω
R12, R13, R14, R15, R16 y R17 = Resistencias de ¼ W de 680Ω
R9 y R18 = Resistencias de ¼ W de 1K
C1 y C2 = Condensadores cerámicos de disco de 22pF.
XTL1 = Cristal de cuarzo de 16MHz.
D1 = Diodo semiconductor 1N4001
Led1, Led2, Led3, Led4 y Led7 = Diodos LEDs de 5mm color rojo
Led5 = Diodo LED de 5mm color azul
Led6 = Diodo LED de 5mm color verde
Q1 = Transistor NPN BC547B
IC1 = Microcontrolador ATMega 328P-PU, DIP-28.
IC2 = 6 puertas NOT SN74LS04, DIP-14.
IC3 = 4 puertas OR SN74LS32N, DIP-14.
OPTO1 = Optoacoplador SFH617A DIP-4.
ZB1 = Zumbador piezoeléctrico 5V.
RL1 = Relé 12 voltios, 220Ω, 5A, doble circuito conmutado.
SW1 y SW2= Terminal bloque para Cerradura eléctrica de dos posiciones con doble
interruptor.
SW3 = Micropulsador Normalmente Abierto NA.
PCI = Placa de circuito impreso tamaño 15x10 cm.
TB1 y TB2 = Terminales bloque de tres contactos para salida de relé RL1 NA/C/NC.
POWE1 = Terminal bloque de tres contactos para conexión voltajes de +12V, GND y +5V.
ZONA1 , ZONA2, ZONA3 y ZONA4 = Terminales bloques de tres contactos: NA/+5V/NC.
0,5 m de hilo conductor de cobre rígido de 0,4 para puentes de la PCI.
179
35. Programación de una centralita de alarma de 4 zonas
La placa de circuito impreso del módulo de control contiene todos los componentes que se
muestran en el esquema eléctrico.
En el diseño de la placa de circuito impreso a ser de solo una cara de cobre tendremos que
utilizar algunos puentes que se identifican con P1, P2, P3…hasta P13. Estos puentes son
hilos de cobre rigidos de unos 0,4 de sección que se montan por la zona de componentes y
se sueldan por la cara de cobre.
180
35. Programación de una centralita de alarma de 4 zonas
181
35. Programación de una centralita de alarma de 4 zonas
Estos circuitos integrados IC1 e IC2 están encapsulados con el formato TO-220 y no le
vendria nada mal ponerle un pequeño disipador al IC1 puesto
que es el que más soporta las cargas.
La batería utilizada es del tipo plomo-acido sellada de litio Ion de 12 voltios de4 a 6
amperios. Máxima corriente de carga de 2,10 Amperios. La capacidad de la batería puede
estar limitada según el número de dispositivos detectores y de dispositivos de aviso que se
conecten a la alimentación de 12 voltios.
182
35. Programación de una centralita de alarma de 4 zonas
Listado de componentes
183
35. Programación de una centralita de alarma de 4 zonas
184
35. Programación de una centralita de alarma de 4 zonas
185
35. Programación de una centralita de alarma de 4 zonas
En esta programación se han utilizados las siguientes variables para determinar los
diferentes tiempos en cada circunstancia, pudiendose cambiar antes del void setup() en el
inicio de la programación y a la necesidad y gusto del usuario, estos son:
conecta, cuando hemos activado el sw1 y se pone la entrada PD13 a nivel alto (1).
desconecta, cuando el sw1 está desconectado y la entrada PD13 está a nivel bajo
(0).
186
35. Programación de una centralita de alarma de 4 zonas
187
35. Programación de una centralita de alarma de 4 zonas
int salida=20; //retardo para la conexion y salida
int entrada=20; //retardo para tiempo de entrada zona 1
int comunica=10; //retardo y aviso de zona activada
int var001=0; //declaracion de variable
int var002=0; //declaracion de variable
int var003=0; //declaracion de variable
int var004=0; //declaracion de variable
int var005=0; //declaracion de variable
int w=0; //variable contador
int y=0; //variable contador
void setup() {
pinMode (z1,INPUT); //establecemos la zona 1 de entrada
pinMode (z2, INPUT); //establecemos la zona 2 de entrada
pinMode (z3, INPUT); //establecemos la zona 3 de entrada
pinMode (z4, INPUT); //establecemos la zona 4 de entrada
pinMode (tonos,OUTPUT);//establecemos tonos de salida
pinMode (led1, OUTPUT); //establecemos el led1 de salida
pinMode (led2, OUTPUT); //establecemos el led2 de salida
pinMode (led3, OUTPUT); //establecemos el led3 de salida
pinMode (led4, OUTPUT); //establecemos el led4 de salida
pinMode (led5, OUTPUT); //establecemos el led5 de salida
pinMode (led6, OUTPUT); //establecemos el led6 de salida
pinMode (aviso, OUTPUT); //establecemos sistema alarmado de salida
pinMode (sw1, INPUT); //establecemos ON-OFF de entrada
}
void loop() {
var001=digitalRead(sw1); //lee el estado del interruptor ON/OFF
if (var001==HIGH){ //si valor es alto
conecta(); //ve a la funcion conecta ON
}
else{
desconecta(); //ve a la funcion desconecta OFF
}
}
void conecta(){ //funcion conecta ON
var002=digitalRead(z1); //leemos el estado de la zona 1
var003=digitalRead(z2); //leemos el estado de la zona 2
var004=digitalRead(z3); //leemos el estado de la zona 3
var005=digitalRead(z4); //leemos el estado de la zona 4
188
35. Programación de una centralita de alarma de 4 zonas
digitalWrite (led1, HIGH); //enciende led1 zona 1
delay(500);
tone (tonos, 200, 200); //suena tonos
digitalWrite (led1, LOW); //apaga led1 zona 1
delay(500);
digitalWrite (led1, HIGH); //enciende led1 zona 1
noTone(tonos); //apaga tonos
y=y+1; //inclementa y
}
var001=digitalRead(sw1); //lee estado sw1
if (var001==LOW){ //estado nivel bajo
desconecta(); //ve a la funcion desconecta OFF
}
digitalWrite (led1, HIGH); //enciende led1 alarma zona 1
digitalWrite (led6, LOW); //apaga led6 de sistema OK
delay(1000);
digitalWrite (aviso, HIGH); //activa sistema de aviso alarmado
delay(alarma); //tiempo de duracion de aviso alarma
digitalWrite (aviso, LOW); //desconecta sistema de aviso alarmado
delay(alarma); //duracion aviso apagado
}
y=0;
if (var003==HIGH){ //zona 2 activada
while (y<comunica){ //retardo para su desconexion
digitalWrite (led2, HIGH); //enciende led2 zona 2
delay(500);
tone (tonos, 200, 200); //suena tonos
digitalWrite (led2, LOW); //apaga led2 zona 2
delay(500);
digitalWrite (led2, HIGH); //enciende led2 zona 2
noTone(tonos);
y=y+1; //inclementa y
}
var001=digitalRead(sw1); //lee estado sw1
if (var001=LOW){ //nivel bajo
desconecta(); //ve a la funcion desconecta OFF
}
digitalWrite (led6, LOW); //apaga led6 sistema OK
delay(1000);
digitalWrite (aviso, HIGH); //sistema activado de aviso de alarma
delay(alarma); //tiempo de duracion de avisos alarma
digitalWrite (aviso, LOW); //sistema desactivado de aviso de alarma
delay(alarma); //duracion aviso apagado
}
if (var004==HIGH){ //zona 3 activada
while (y<comunica){ //retardo y aviso para su desconexion
digitalWrite (led3, HIGH); //enciende led3 zona 3
delay(500);
tone (tonos, 200, 200); //suena tonos
digitalWrite (led3, LOW); //apaga led3 zona 3
delay(500);
digitalWrite (led3, HIGH); //enciende led3 zona 3
noTone(tonos); //apaga tonos
y=y+1; //inclementa y
}
var001=digitalRead(sw1); //lee el estado del sw1
if (var001=LOW){ //nivel bajo
189
35. Programación de una centralita de alarma de 4 zonas
desconecta(); //ve a la funcion desconecta OFF
}
digitalWrite (led6, LOW); //apaga el led6 de sistema OK
delay(1000);//esperamos 1 segundo
digitalWrite (aviso, HIGH); //activa sistema de aviso
delay(alarma); //duracion de aviso
digitalWrite (aviso, LOW); //desactiva sistema de aviso
delay(alarma); //duracion aviso apagado
}
if (var005==HIGH){ //activa zona 4
while (y<comunica){ //retardo y aviso a la desconexión
digitalWrite (led4, HIGH); //enciende led4 zona 4
delay(500);
tone (tonos, 200, 200); //suena tonos
digitalWrite (led4, LOW); //apaga led4 zona 4
delay(500);
digitalWrite (led4, HIGH); //enciende led4 zona 4
noTone(tonos); //apaga sonido tonos
y=y+1; //inclementa y
}
var001=digitalRead(sw1); //lee el estado del sw1
if (var001=LOW){ //nivel bajo
desconecta(); //ve a la funcion desconecta OFF
}
digitalWrite (led6, LOW); //apaga el led6 de sistema OK
delay(1000);
digitalWrite (aviso, HIGH); //activa sistema de aviso
delay(alarma); //duracion de aviso alarma
digitalWrite (aviso, LOW); //desactiva sistema de aviso alarma
delay(alarma); //duracion aviso apagado
}
}
void desconecta(){ /*sistema desconectado, se señaliza las zonas,
encendiendose y apagandose los led,conforme se van activando o desactivando*/
w=0; //pone a cero variable w
y=0; //pone a cero variable y
digitalWrite (led5, LOW); //apaga el led5 ON-OFF
var002=digitalRead(z1); //lee el valor de z1
var003=digitalRead(z2); //lee el valor de z2
var004=digitalRead(z3); //lee el valor de z3
var005=digitalRead(z4); //lee el valor de z4
190
35. Programación de una centralita de alarma de 4 zonas
}
else {
digitalWrite (led2, LOW); //apaga led2 zona 2
}
if (var004==HIGH) { //zona 3 a nivel alto
digitalWrite (led3, HIGH); //enciende led3 zona 3
}
else {
digitalWrite (led3, LOW); //apaga led3 zona 3
}
if (var005==HIGH) { //zona 4 a nivel alto
digitalWrite (led4, HIGH); //enciende led4 zona 4
}
else {
digitalWrite (led4, LOW); //apaga led4 zona 4
}
}
191
36.Programación y control de un ascensor de 4 plantas
Cuando nos referimos a diseñar, en este caso el circuito eléctrico y la programación del
proyecto, habrá que disponer de los recursos necesarios: materiales, herramientas
adecuadas, instrumentación, databook, etc. que nos sea de ayuda para desarrollar el
proyecto.
Comenzando el diseño
En este primer apartado vamos a introducirnos en describir las partes de que consta el
diseño con todos los elementos que se necesitan y constituye el control de un ascensor.
El número de plantas del edificio son cuatro: planta baja, planta primera, planta segunda y
planta tercera. En cada planta posee un botón ó pulsador de pasillo que se ilumina cuando
llamamos el ascenso a la misma vez que también se ilumina un diodo led dentro del
ascensor en la consola de control que permite visualizar el número de planta mediante un
display: que vsualiza el 0, 1, 2 o 3 y cuatro pulsadores o botones que corresponde a cada
una de las plantas: 0, 1, 2 y 3, que al pulsar cualquiera de ellos se ilumina un diodo led
correspondiente a la planta destino.
Para la subida y bajada del ascensor se dispondrá del control de dos señales: motor1 de
bajada y motor2 de subida, mediante la señalización de dos diodos led.
192
36.Programación y control de un ascensor de 4 plantas
193
36.Programación y control de un ascensor de 4 plantas
194
36. Control y programación de un ascensor de 4 plantas
6. El Microcontrolador. El microcontrolador utilizado en este proyecto es el
ATMega328P-Pu de 8 bits que se programa mediante la tarjeta de programación de
Arduino UNO. En nuestro proyecto este microcontrolador es el centro y control de
todas las operaciones de entradas y salidas, temporizaciones, etc. de nuestro diseño.
Para ello, utilizaremos 6 puertos de datos de entrada y 4 de salidas y dos puertos
analógicos de salida.
7. La alimentación. Todo el diseño de nuestro circuito eléctrico trabaja con una
tensión de 5 voltios en continua y estabilizada.
Esta parte del diseño es una de la más importante, ya que aquí se determina la información
de la posición del ascensor para poder señalizar y visualizar en que planta se encuentra y a
la misma vez indicar al microcontrolador en que planta estamos.
Para que el display se encienda solamente los números 0, 1, 2 y 3 el circuito integrado IC1
es un decodificador TTL 74LS47N con entradas en BCD, para ello, nos hace falta utilizar
solamente las dos entradas A y B de menor peso, poniendo éstas y las otras dos entradas C
y D mediante las resistencias R8, R9, R10 y R11 de 4K7 a masa GND.
Por lo tanto utilizamos la siguiente tabla para identificar los valores de las entradas A y B y
la relación del dígito del display que se enciende:
B A SE ENCIENDE
0 0 0
0 1 1
1 0 2
1 1 3
Para activar estas numeraciones necesariamente tenemos que tener unos sensores de
contacto o bumper, normalmente abierto, que se instalen en el lugar adecuado para
detectar el paso y por lo tanto la posición de la cabina del ascensor. Estos sensores
utilizados en nuestro diseño son pequeños micro pulsadores normalmente abiertos que
para nuestro caso es más que suficiente.
El número de sensores utilizados son cuatro: S0, S1, S2 y S3, uno por planta. Para el control
del display necesitamos solamente dos entradas, para ello, tenemos que utilizar un
codificador 4 a 2 cuyas salidas la llamaremos sensor1 y sensor2.
195
36. Control y programación de un ascensor de 4 plantas
S0 * S1 + S3 = Sensor2
S2 + S3 = Sensor1
Las posibilidades de que se cuele la activación de cualquier otro sensor estando uno de
ellos activado, son muy remotas, puesto que el paso de la cabina del ascensor por los
sensores debe estar perfectamente bien colocado y sincronizado, evitando rebotes de los
mismos. Las dos resistencias de 470 Ω se conectan a los sensores S2 y S3 a masa y dos
resistencias de 1K para los sensores S0 y S1 que se conectan a masa GND, éstas nos sirven
para definir el nivel lógico bajo o 0 voltios para cuando se cierre el sensor de contactos,
normalmente abierto, se produzca una buena conmutación de 5 voltios suficiente para
obtener un nivel alto y no se produzcan fluctuaciones.
Estas mismas salidas del sensor1 y sensor2 que se conectan a las entradas del
decodificador IC1 A y B, también se conectan a las entradas de datos del puerto PD2 y PD4
del microcontrolador IC2 para utilizarla como niveles de datos condicionantes para la
programación (ver esquema elétrico).
196
36. Control y programación de un ascensor de 4 plantas
Los pulsadores de consola son los que se encuentran dentro de la cabina del ascensor para
el control y visualización del número de planta. Estos son PC0 Planta 0, PC1 Planta
primera, PC2 Planta segunda y PC3 Planta tercera. Van conectados mediante puertas
lógicas OR a los puertos de entrada de datos PD3, PD5, PD6 y PD11 del microcontrolador
IC2. Tienen cada pulsador una resistencia de 1K conectada a masa GND que establece el
nivel lógico bajo o 0 voltios para cuando pulsamos aplicamos un nivel alto o 5 voltios.
Por ejemplo, estamos dentro del ascensor en la planta tercera, el visualizador de consola
indica el número 3 y, queremos bajar a la planta baja (Planta0), pulsamos el botón 0 (PC0)
y se enciende el LED3 de consola y el LED4 de pasillo, seguidamente se activa el motor1 de
bajada, cuando llega a la planta baja el visualizador de planta indica 0, el LED3 y LED4 se
apagan y el motor1 de bajada se desactiva. Si estamos en la planta baja, se visualiza en el
display 0, y pulsamos el botón 2 PC2 para ir a la planta segunda, se enciende el LED7 de
consola y el LED8 de pasillo y se activa el motor2 de subida, cuando llega a la planta
segunda el visualizador de planta indica 2 y se apaga el LED7 y LED8 y se detiene el motor2
de subida.
Los pulsadores de pasillo de planta: PP0, PP1, PP2 y PP3 tienen la misma conexión que los
pulsadores de consola PC0, PC1, PC2 y PC3 para el control interno del ascensor. Los
pulsadores de pasillo se encuentran instalados exteriormente cerca de la puerta del
ascensor cuya función es llamar el ascensor esté en cualquier planta del edificio. Por
ejemplo, si nos encontramos en la planta segunda y pulsamos el pulsador de pasillo PP2 se
encenderá el LED8 de pasillo y el LED7 de la consola del ascensor. Al encontrarse el
ascensor en la planta 3, se activa el motor1 de bajada y el ascensor bajará a la planta 2 y
cuando el sensor detecte la posición S2 desactiva el motor1 y apagará los LED7 y LED8,
197
36.Programación y control de un ascensor de 4 plantas
Para este proyecto es necesario aplicar una tensión de 5 voltios en continua que esté muy
bien filtrada y estabilizada para alimentar todos los dispositivos, sensores, display,
circuitos integrados y puertas lógicas que forman el circuito eléctrico de este proyecto. (Ver
esquema eléctrico, pág. 20).
Para este caso se utiliza un regulador de 5 voltios L7805 con encapsulado TO220 con una
tensión continua a la entrada a partir de unos 8 voltios hasta 12 voltios bien filtrada.
Este tipo de circuito integrado de tres patas es un regulador de voltaje positivo que posee
como característica principal que puede ofrecer a la salida un máximo de 1,5 amperios, si la
fuente de entrada lo proporciona, está preparado para proteger de una sobrecarga por
sobre temperatura y protección por cortocircuito a la salida.
198
36.Programación y control de un ascensor de 4 plantas
Programación en Arduino
A partir de aquí se puede ir dando forma a la programación con los datos expuestos, como
ejemplo indico algunas secuencias en la programación.
Otra secuencia sería que estamos en la planta primera y queremos ir a la planta tercera,
llamamos al ascensor que se encuentra en la planta baja (Planta0) y pulsamos el pulsador
de pasillo PP1 pulsador1, y se enciende el LED6 y el LED5 de la consola del ascensor,
cuando llega el ascensor los niveles de los sensores toman los valores siguientes:
sensor1=0 y sensor2= 1, en la consola se visualiza el número 1, pulsamos seguidamente el
botón 3, pulsador3, y se enciende el LED9 y LED10 del pulsador de pasillo y se pone en
marcha el motor2 de subida cuando llega a la planta tercera se apaga el LED9 y el LED10 y
se detiene el motor2 de subida y los estados de los sensores toman los valores siguientes:
sensor1 = 1 y sensor2 =1 y se visualiza en el display de la consola el número 3.
199
36. Programación y control de un ascensor de 4 plantas
En la siguiente tabla se muestra los estados digitales que adquieren los sensores sensor1 y
sensor2 que se conectan al decodificador IC1 y a los puertos digitales PD2 y PD4 de IC2.
En esta otra tabla se muestra todas las secuencias del movimiento del ascensor:
motor2
sensor1 sensor1 Pulsadores LED
Planta Planta subida
sensor2 sensor2 pasillo y pasillo y
origen destino motor1
origen destino consola consola
bajada
Planta0 Planta1 0-0 0-1 pulsador1 led1 motor2
Planta0 Planta2 0-0 1-0 pulsador2 led2 motor2
Planta0 Planta3 0-0 1-1 pulsador3 led3 motor2
Planta1 Planta0 0-1 0-0 pulsador0 led0 motor1
Planta1 Planta2 0-1 1-0 pulsador2 led2 motor2
Planta1 Planta3 0-1 1-1 pulsador3 led3 motor2
Planta2 Planta0 1-0 0-0 pulsador0 led0 motor1
Planta2 Planta1 1-0 0-1 pulsador1 led1 motor1
Planta2 Planta3 1-0 1-1 pulsador3 led3 motor2
Planta3 Planta0 1-1 0-0 pulsador0 led0 motor1
Planta3 Planta1 1-1 0-1 pulsador1 led1 motor1
Planta3 Planta2 1-1 1-0 pulsador2 led2 motor1
200
36. Programación y control de un ascensor de 4 plantas
int valorpulsador1; // se declara variable pulsador 1
int valorpulsador2; // se declara variable pulsador 2
int valorpulsador0; // se declara variable pulsador 0
int valorpulsador3; // se declara variable pulsador 3
void setup() {
201
36. Programación y control de un ascensor de 4 plantas
digitalWrite(led2,LOW); //apaga el led de señalizacion planta 2
delay(100);
digitalWrite(motor2,LOW); //desactiva el motor 2 de subida
delay(100);}
202
36. Programación y control de un ascensor de 4 plantas
// estoy en la planta 2 y pulso el boton 0 para ir a la planta 0
203
36. Programación y control de un ascensor de 4 plantas
delay(10000);}
if (valorsensor1==LOW && valorsensor2==HIGH){
digitalWrite(led1,LOW); //apaga el led de señalizacion planta 1
delay(100);
digitalWrite(motor1,LOW); //desactiva el motor 1 de bajada
delay(100);}
204
36. Programación y control de un ascensor de 4 plantas
4. Circuito de diodos LEDs para señalización de pasillo y consola. Este circuito lo
forman un grupo de 8 diodos LEDs: LED3, LED4, LED5, LED6, LED7, LED8, LED9 y
LED10 que se iluminan cuando pulsamos un botón de uno de los pasillos de planta o
de la consola. El circuito consta de 4 grupos de 2 diodos LEDs en paralelo uno para
el pulsador de consola y otro para el pulsador de pasillo para cada planta. Se
conectan a cuatro inversore IC3 7404 que viene del microcontrolador y para
proteger y limitar la corriente se le colocan en serie una resistencia de 470Ω.
5. Circuitos indicadores para motor de subida y bajada. Estos indicadores son dos
diodos leds: LED1 y LED2 que identifica y señalizan cuando se activa el motor de
subida y el motor de bajada mediante la salida en la programación del
microcontrolador IC2, A0 y A1. Se incluye en la PCI1 un terminal bloque de dos
contactos TB6 para añadir, opcionalmente, un circuito que permita activar un
dispositivo de mayor potencia.
6. Circuito Microcontrolador. El microcontrolador IC2 ATMega328P-Pu realiza todas
las funciones de control de los dispositivos de entrada y salidas: sensores,
pulsadores y señalizadores. Está programado en la placa de Arduino UNO. Se
utilizan 6 puertos de entradas PD2, PD3, PD4, PD5, PD6 y PD11, y 6 de salida, PD7,
PD8, PD9, PD10, A0 y A1. La frecuencia de reloj lo proporciona XT1 un cristal de
cuarzo de 16MHz.
7. Circuito de alimentación. Para una correcta regulación de la tensión de
alimentación para todo el circuito y dispositivos se utiliza el IC7 L7805 que es un
regulador positivo de 5 voltios con encapsulado TO220 y los condensadores de
filtro C4 y C5. Únicamente se precisará de añadir exteriormente de un
transformador de 230VCA con salida de 9 voltios alterna de 1 amperio, un puente
rectificador y un buen filtro a condensador para obtener una tensión continua de 8 a
12 voltios, que se aplica a la entrada de alimentación TB1.
8. Circuito de RESET. En el caso de que se produzca un bloqueo de la tarjeta por
cualquier motivo, o su funcionamiento no sea el correcto, se ha añadido un pulsador
de reset, formado por el SW5 al pin 1 de IC2 y la resistencia R34 de 10K a +Vcc, que
inicializa el microcontrolador sin tener que cortar la alimentación.
205
36. Programación y control de un ascensor de 4 plantas
206
36. Programación y control de un ascensor de 4 plantas
207
36. Programación y control de un ascensor de 4 plantas
La placa de circuito impreso principal PCI1 contiene todos los elementos de control donde
se establecen las señales de salidas y entradas y las conexiones exteriores que van a las
placas del pasillo a través de los terminales de bloque y a los sensores de contactos de
posicionamiento.
En la placa principal PCI1 se encuentran los terminales de bloque TB3 y TB5 que irán
conectados a los terminales de bloque TB7, TB8, TB9 y TB10 que se encuentran en las
placas del circuito impreso del pasillo, PCI2, PCI3, PCI4 y PCI5. La siguiente tabla muestra la
siguiente correspondencia:
De esta forma a cada una de las placas de circuitos impresos del pasillo le llegan tres hilos
de conexión de la placa principal: uno correspondiente a la tensión de +5 voltios, otro de la
conexión del diodo LED y un tercero de la conexión del micropulsador PP.
En la página 25 se muestra las cuatro placas de circuitos impresos de pasillo con sus
correpondientes micropulsadores y diodos leds y su ubicación.
Por otro lado la conexión de los sensores de posicionamiento salen de la placa principal
PCI1 a través de los terminales de bloque TB1 y TB2; S1, S0, S3 y S2 a las posiciones donde
se establezca y corresponda con la posición adecuada en la planta para cuando pase y sea
detectado el ascensor. En cada posición de planta se instalarán, por ejemplo, un final de
carrera que hará perfectamente la función de detectar cuando la cabina pasa por su
posición y cerrará los contactos, Normalmente Abiertos, y hará señalizar polarizando con
un nivel alto +5 voltios hacia el circuito codificador. Por lo tanto en este caso solamente
irán dos hilos de cables: uno con la tensión de +5 voltios y otro será una de las entradas al
codificador S0, S1, S2 o S3.
El diseño de la placa de circuito impreso principal PCI1 solamente es de una sola cara de
cobre, por lo tanto se debe utilizar 37 puentes, P1 a…P37, formados por hilo rígido de 0,4
desnudo. Por lo que se recomienda comenzar con la colocación de los puentes.
208
36. Programación y control de un ascensor de 4 plantas
209
36. Programación y control de un ascensor de 4 plantas
210
36. Programación y control de un ascensor de 4 plantas
211
36. Programación y control de un ascensor de 4 plantas
212
37. Programación y control de una lavadora
En este proyecto se utilizará 6 relés de doble circuito conmutado, RL1, RL2, RL3, RL4, RL5
y RL6.
213
37. Programación y control de una lavadora
El relé RL2 activará un pequeño motor de corriente continua que trabajando a +5 voltios
girará lentamente en sentido derecha, RL3 activará cambiando la polaridad de
alimentación de +5 voltios el motor girará lentamente en sentido contrario hacia la
izquierda y, RL1 aplicando la tensión de +12 voltios, moverá el motor girando rápidamente
para producir el efecto centrifugado. RL4 activará la electroválvula que abre y cierra el
paso de agua, en este caso la cantidad de agua dependerá del tiempo programado para
llenar el tambor. El relé RL5, activará un motor para el vaciado del agua del tambor y el
relé RL6 se encargará de activar la resistencia termoeléctrica para calentar el agua.
Estos seis relés irán controlados mediante seis optoacopladores que aíslan los puertos
digitales de E/S del microcontrolador ATMega328P, que trabajan con señales de +5 voltios
y los relés que trabajan a +12 voltios.
Otros de los elementos que utilizaremos son tres micropulsadores, normalmente abiertos,
que son del tipo botones para poder seleccionar el programa de lavado: lavado corto SW1,
o lavado largo SW2 y si queremos lavar en frio o caliente SW3.
Es importante para este proyecto señalizar ópticamente las secuencias de trabajo que van
ejecutando los dispositivos, mediante el encendido de seis diodos leds de color rojo, para
indicarnos en cada momento en el proceso que se encentra activo: LED1 centrifugado,
LED2 entrando agua, LED3 vaciado, LED4 lavado corto, LED5 lavado largo y
LED6Frio/60º.
En la siguiente figura se muestra todos los elementos que intervienen en el proyecto con
sus respectivas nomenclaturas.
214
37. Programación y control de una lavadora
Sepamos ampliamente cada uno de los elementos que intervienen en este proyecto.
LOS RELÉS
Se utilizan 6 relés de 12 voltios, de doble circuito conmutado: RL1, RL2 y RL3 actuarán
para mover el MOTOR1 en el giro lento, invertido y rápido, RL4 para activar la
electroválvula de paso de agua, RL5 activará el MOTOR2 para el vaciado del agua y RL6
para activar el elemento termoeléctrico para FRIO/60º.
El relé está compuesto de una bobina con unos terminales para conectar a una corriente.
Cuando la bobina se activa produce un campo electromagnético que hace que el contacto
del relé que está normalmente abierto se cierre y permita el paso de la corriente por un
circuito para, por ejemplo, encender una lámpara o arrancar un motor de potencia. Cuando
dejamos de suministrar corriente a la bobina, el campo electromagnético desaparece y el
contacto del relé se vuelve a abrir, dejando sin corriente el circuito eléctrico que iba a esa
lámpara o motor. Podemos encontrarlos en dos formatos: con doble circuito conmutado o
con un solo circuito conmutado:
Genéricamente los relés sirven para activar un circuito que tiene un consumo
considerable de electricidad mediante un circuito de pequeña potencia de 12 o 24 voltios
que imanta la bobina. Al imantarse la bobina se cerrará el circuito eléctrico que alimenta un
motor que sirve para abrir la puerta del garaje, sistemas de alumbrados, máquinas, etc.Por
ejemplo, en nuestro caso queremos activar el motor de vaciado del agua de la lavadora,
este motor trabaja con corriente alterna de 230 voltios y 5 Amperios, por lo tanto
necesitamos que los contactos de nuestro relé de salida estén preparados para que
aguanten estas potencias, de lo contrario se quemarían los contactos, para ello, debemos
adquirir en el comercio un relé cuyo contactos soporten una tensión y corriente de unos 10
Amperios, sus contactos estén muy bien aislados y separados y su resistencia del bobinado
sea alta .
215
37. Programación y control de una lavadora
OPTOACOPLADORES
Tensión Tensión
de de
entrada salida
Si la tensión de entrada varía, la cantidad de luz también lo hará, lo que significa que la
tensión de salida cambia de acuerdo con la tensión de entrada. De este modo el
dispositivo puede acoplar una señal de entrada con el circuito de salida, aunque hay que
tener en cuenta que las curvas tensión/luz del led no son lineales, por lo que la señal puede
distorsionarse. Se venden optoacopladores especiales para este propósito, diseñados de
forma que tengan un rango en el que la señal de salida sea casi idéntica a la de entrada.
216
37. Programación y control de una lavadora
DIODOS LED
Los diodos Ledson necesarios para indicarnos y señalizar el proceso de lavado en cada
momento. Para ello se han utilizados 6 diodos Led: LED1 para el Centrifugado, LED2
cuando se introduce el agua, LED3 cuando se vacía el agua, LED4 cuando activamos el
programa corto, LED5 cuando activamos el programa largo y LED6 cuando activamos el
modo de agua caliente, Frio/60º. Todos ellos de 5mm y de color rojo.
Como ya se conoce el diodo LED es un componente óptico que permite el paso de corriente
en un solo sentido y que al ser polarizado emite un haz de luz. Trabaja como un diodo
normal pero al recibir corriente eléctrica emite luz. Los diodos LEDs trabajan
aproximadamente con tensiones entre 1,5 a 2,5 V, según el color del diodo led, y su
consumo es de apenas unos 25 mA.
Según la energía que liberen se emite de un color u otro dependiendo del material usado en
su construcción. Se suelen usar aparte de silicio otros materiales como el Galio, Arsenio,
fósforo, aluminio, indio, cada uno de los cuales trabaja con un valor de tensión diferente.
Se les dota de un encapsulado con forma focal para favorecer la emisión de luz focalizada
en un punto.
Normalmente en casi todas las lavadoras actuales cuando actúa este sensor de contacto,
el control y programación del circuito electrónico de la lavadora activa un pestillo que evita
que la puerta la abran durante el funcionamiento de la lavadora, en nuestro caso no.
217
37. Programación y control de una lavadora
En el proceso de selección utilizamos tres micropulsadores del tipo botón. SW1 botón para
el lavado corto, SW2 botón para el lavado largo y SW3 botón para el agua caliente.
Estos tres botones sus contactos son Normalmente Abiertos (NA), es decir, cuando se
pulsa se cierra el contacto y deja pasar una tensión de aproximadamente de 5 voltios, nivel
alto, hacia la entradas del microcontrolador IC1, PD7, PD8 y PD9.
No hay que confundir un interruptor con un pulsador eléctrico. Estos lo que tienen en
común que tanto el interruptor como el pulsador tienen contactos que permiten cerrar o
abrir el circuito eléctrico, o sea, que dejan pasar corriente cuando están cerrados y cuando
están abiertos no la dejan pasar. Cuando se acciona un interruptor sus contactos se
quedan unidos permanentemente y así se quedan hasta que nuevamente le volvamos a
accionar y sus contactos se abran. El pulsador en cambio sus contactos estarán cerrados o
abiertos, durante el tiempo que estemos presionando el pulsador y una vez lo soltemos se
abrirán o se cerrarán, según el tipo de pulsador: Normalmente Abierto (NA) o
Normalmente Cerrado (NC).
El símbolo es idéntico al del conmutador pero con un botón que indica que al pulsarlo
cambia de posición, pero que al soltarlo recupera la posición en que está dibujado. Los
botones sus contactos los hay NA (Normalmente Abierto) y NC (Normalmente Cerrado).
Pulsador NC
(normalmente cerrado)
218
37. Programación y control de una lavadora
Como muchos conocerán Arduino es una placa de circuito impreso con la que, junto con
unos componentes electrónicos, un microcontrolador y una serie de pines de entrada y
salida, podemos crear proyectos basados en sistema electrónicos; esto incluye materias
como la robótica, la domótica u otros proyectos de carácter electrónico en los que podemos
pensar.
Posee 6 pines analógicos: AN0, AN1, AN2, AN3, AN4 y AN5. Aquí se pueden conectar
sensores que proporcionan información analógica, configurándose como entradas y
salidas.
Posee 14 pines digitales: PD0, PD1, PD2, PD3, PD4, PD5, PD6, PD7, PB0, PB1, PB2, PB3,
PB4 y PB5. Estos pines se emplean para comunicarse exteriormente, conectar sensores
que proporcionan información digital (5V o 0V, 1 o 0). Se podrá configurar como entrada o
salida.
Posee dos entradas TX-RX para comunicarse vía serie con el PC. PD0 (Rx) y PD1 (Tx).
219
37. Programación y control de una lavadora
Lo más interesante a la hora de programar en Arduino son los recursos que posee la
tarjeta, que se programa a través del PC mediante el puerto USB y el software utilizado
para ello, la alimentación por USB o exterior a partir de 7 voltios, el número de puertos de
entradas y salidas, tanto analógicas como digitales, por donde introduciremos datos para
ser procesados, y así obtener un resultado que se manifestará por las salidas.
MOTORES M1 y M2
Como se podrán imaginar los motores son un punto importante en este proyecto, pues son
los que realizan la función del lavado controlados por la programación de IC1.
En este proyecto se han utilizado dos motores pequeños, M1 y M2, que funcionan con
corriente continua de 12 voltios: M1 es el motor que hace girar el tambor y el M2 desaloja
y vacía el agua que hay en el interior del tambor:
Los motores de las lavadoras comerciales están fabricados para realizar las diferentes fases
con tensiones alterna y condensadores de alta capacidad. Su conector permite a través de
relés ejecutar los diferentes ciclos de lavado. Veamos algunas conexiones:
220
37. Programación y control de una lavadora
La fuente de alimentación es una parte importante a tener en cuenta para que funcione
correctamente nuestro proyecto. Especialmente que pueda suministrar las tensiones y
corrientes lo suficientemente generosa para el buen funcionamiento de los circuitos.
La fuente de alimentación es del tipo lineal y suministra una tensión de salida de +12
voltios y +5 voltios, con una corriente de hasta 1 amperios con disipador de calor.
Como se verá en el siguiente esquema eléctrico está regulada por dos circuitos integrados
IC2 e IC3, L7812 y L7805, que proporcionan una tensión de salida fija de +12 voltios y +5
voltios.
Hay que tener en cuenta que estas tensiones y corriente de salida es más que suficiente
para nuestro proyecto, para activar los relés y mover los pequeños motores de corriente
continua de +12 voltios.
Las operaciones y componentes que se deberán utilizar para la fuente de nuestro proyecto
son las siguientes:
A ésta se le añade dos funciones más con las que puede llegar a obtenerse una tensión y
corriente continua regulada y estabilizada mucho mejor y más perfecta:
1. Dos circuitos integrados reguladores de tensión fija: IC2 L7812 para obtener +12
voltios e IC3 L7805 para obtener +5 voltios, ambos con encapsulado TO-220 con un
pequeño disipador. Estos permiten estabilizar la tensión y autoprotección de
sobretensiones o cortocircuitos.
2. Filtrado adicional en las entradas y salidas de cada regulador: C2 y C4 de 0,33µF 63
V, C3 de 220µF/25V y C5 de 0,1µF/63 V.
TRF1 = Transformador con entrada primaria de corriente alterna de 230 Vca y secundario
de salida de 15 Voltios de alterna y 1 Amperio.
C1 = Condensador electrolítico de 2200µF/25V
C2 y C4 = Condensadores poliéster de 330nF/63V
C3 = Condensador electrolítico de 220µF/25 V
C5 = Condensador poliéster de 100nF/63V
PR1 = Puente rectificador de 1 Amperio.
IC2 = Circuito integrado regulador fijo de +12 voltios TO-220. L7812
IC3 = Circuito integrado regulador fijo de +5 voltios TO-220. L7805.
221
37. Programación y control de una lavadora
222
37. Programación y control de una lavadora
IC
2
IC
3
Vista de componentes
IC
2
IC
3
Serigrafía de componentes
223
37. Programación y control de una lavadora
Circuito eléctrico
El circuito eléctrico que se ha diseñado para este proyecto comprende todos los elementos
que se han comentado anteriormente, excepto la fuente de alimentación.
A estas E/S se colocan los 4 pulsadores de entrada al IC1:SW1, SW2, SW3 y SW4 y 6
optoacopladores de salida OPTO1, OPTO2, OPTO3, OPTO4, OPTO5 y OPTO6 que activan
los relés RL1, RL2, RL3, RL4, RL5 y RL6.
En la siguiente imagen se muestran todos los elementos de E/S utilizados partiendo del
microcontrolador IC1.
Tal como se observa en la figura la activación de los circuitos de relés se realizan mediante
los optoacopladores con una señal de nivel alto que viene del microcontrolador IC1y hace
activar el relé. Los diodos Leds LED1, LED2, LED3 y LED6 se conectan directamente y en
paralelo con la entrada de la bobina del relé. Ver el esquema eléctrico en la página 224.
224
37. Programación y control de una lavadora
El montaje de todos los componentes de este proyecto, así como de sustituciones, cambios
de valores, comprobaciones, pruebas de funcionamiento, etc., se han realizados mediante
módulos de Proto-board.10 y un módulo de alimentación de +5Vcc, GND, +12Vcc.
R1, R3, R5, R7, R9, R18, R19 y R21 = Resistencias de ¼ W de 470Ω
R2, R4, R6, R8, R10 y R22 = Resistencias de ¼ W de 3K3Ω
R11, R12, R13 y R20 = Resistencias de ¼ W de 1K
R15, R16 y R17 = Resistencias de ¼ W 47K
R14, R23, R24 y R25 = Resistencias de ¼ W de 10K
C1 y C2 = Condensadores cerámicos de disco de 22pF.
C3 = Condensador poliéster de 470nF/63V
C4, C5 y C6 = Condensadores electrolítico de 2,2µF/63V
C7 = Condensador poliéster de 100nF/63V.
RL1, RL2, RL3, RL4, RL5 y RL6 = Relés de 12 voltios de 280Ω con doble circuito conmutado.
XTL1 = Cristal de cuarzo de 16MHz.
D1, D2, D3, D4, D5 y D6 = Diodos semiconductores 1N4007.
Q1, Q2, Q3, Q4, Q5 y Q6 = Transistores PNP BC557
Q7, Q8 y Q9 = Transistores NPN BC547
LED1, LED2, LED3, LED4, LED5, y LED6 = Diodos LEDs rojo de 5mm.
OPTO1, OPTO2, OPTO3, OPTO4, OPTO5 y OPTO6 = Circuitos optoacoplador DIP4 EL817.
IC1 = Microcontrolador ATMega 328P-PU DIP28.
225
37. Programación y control de una lavadora
226
37. Programación y control de una lavadora
En este proyecto el diseño de la tarjeta PCI (Placa de Circuito Impreso) es solo orientativa y
de forma práctica, puesto que su tamaño no valdría para ser montada en una lavadora
puesto que se ha tenido en cuenta de integrar todos los componentes en una misma placa
excepto la de la fuente de alimentación.
Como se podrá observar en la siguiente imagen la placa de circuito impreso tiene una
forma cuadrada e integra todos los componentes que se representa en el circuito del
esquema eléctrico anterior.
Al ser el diseño en una placa de una sola cara de cobre se tienen que conectar, por el lado
de los componentes, 19 puentes, P1 a P19, que consiste en un hilo conductor rígido de 0,4
para la unión de dos nodos.
Existen 6 bloques terminales de salida TB1, TB2, TB3, TB4, TB5 y TB6 de cada uno de los 6
relés RL1, RL2, RL3, RL4, RL5 y RL6.Que se podrán conectar cualquier tipo de carga
teniendo en cuenta los contactos de salida de cada relé.
La alimentación entra por el bloque terminal PW1 donde tenemos la conexión +12V GND
+5V. El bloque terminal SW4 se conectará el sensor de contacto NA o microinterruptor
para la puerta del tambor.
227
37. Programación y control de una lavadora
228
37. Programación y control de una lavadora
229
37. Programación y control de una lavadora
El tiempo de duración en cada ciclo se establece mediante las variables tiempo para el
programa corto y la variable tiempo2 para el programa largo. Estos tiempos pueden ser
ajustados según convengan en el inicio de la programación. Los tiempos establecidos, en
esta programación, son de duración pequeña para ver que los procesos del lavado corto o
el lavado largo se cumplan cada vez que reprogramemos el IC1.
El CICLO DE LAVADO completo es igual tanto para el programa corto como para el
programa largo, lo único que cambia es el número de ciclos que se repiten, dos en el
programa corto y tres en el programa largo y el tiempo de duración también varian,
tiempo y tiempo2.
Cuando finaliza cualquiera de las dos funciones de lavado, se vuelve al inicio void loop(), y
se podrá seleccionar nuevamente cualquier programa de lavado siempre que el SW4 esté a
nivel alto, puerta cerrada, de lo contrario no actúa nada.
230
37. Programación y control de una lavadora
int ledlargo=11; // se declara la señalización del lavado largo led5
int termo=12; // se declara el termocalentador de agua de 60º
int puerta=13; // se declara pin de entrada del sensor de contacto de la
puerta del tambor
int valorbotoncorto; // variable para la entrada boton programa corto
int valorbotonlargo; // variable para la entrada boton programa largo
int valorboton60; // variable para la entrada boton de termocalentador de
agua
int valorpuerta; // variable para definir el valor de entrada de puerta
int tiempo=10000; // tiempo para el programa del lavador corto
int tiempo2= 15000; // tiempo para el programa del lavado largo
voidsetup() {
// estableciendo las entradas y salidas de las variables
pinMode (centrifugado, OUTPUT); // establece el pin de salida centrifugado
pinMode (motor, OUTPUT); // establece el pin de salida motor lento
pinMode (motorinvertido, OUTPUT); // establece el pin de salida motor lento
invertido
pinMode (agua, OUTPUT); // establece el pin de salida electrovalvula de agua
pinMode (vaciado, OUTPUT); // establece el pin de salida motor vaciado
pinMode (botoncorto, INPUT); // establece el pin de entrada para el boton del
lavado corto
pinMode (botonlargo, INPUT); // establece el pin de entrada para el boton del
lavado largo
pinMode (boton60, INPUT); // establece el pin de entrada para el boton del
termocalentador
pinMode (ledcorto, OUTPUT); // establece el pin de salida para el led4
programa corto
pinMode (ledlargo, OUTPUT); // establece el pin de salida para el led5
programa largo
pinMode (termo, OUTPUT); // establece el pin de salida para el
termocalentador
pinMode (puerta, INPUT); // establece el pin de entrada de la puerta del
tambor
}
voidloop() {
// estableciendo la programacion conforme a los elementos establecidos
valorpuerta=digitalRead (puerta); // se inicia primeramente detectando si la
puerta del tambor esta abierta o cerrada
if (valorpuerta==HIGH){//si la puerta esta cerrada, nivel alto, pasa a las
siguientes condiciones
valorbotoncorto= digitalRead (botoncorto); // se lee el valor boton lavado
corto
valorbotonlargo= digitalRead (botonlargo); // se lee el valor boton lavado
largo
valorboton60= digitalRead (boton60); // se lee el valor boton 60º
termocalentador
if (valorboton60==HIGH){ // primeramente, hay que seleccionar si queremos el
agua fria o caliente
digitalWrite (termo, HIGH); // con nivel alto, pulsado, se conecta el
termocalentador de agua y se enciende el led6}
delay(1000);
if (valorbotoncorto==HIGH){ // si pulsamos el boton del programa corto
lavadocorto(); // ejecutamos el programa del lavado corto}
delay(1000);
if (valorbotonlargo==HIGH){ // si pulsamos el boton de lavado largo
lavadolargo(); //ejecutamos el programa del lavado largo}
delay(1000);
231
37. Programación y control de una lavadora
if (valorboton60==LOW){ // si no se ha pulsado ningún boton de lavado corto o
largo
delay(3000);
digitalWrite (termo, LOW);//desconecta el termocalentador y apaga el led6
}
}
}
voidlavadocorto(){ // ejecutamos el programa corto
digitalWrite (ledcorto, HIGH); //enciende el led4 del programa corto
delay(1000);
digitalWrite (agua, HIGH); //se inicia el llenado del tambor enciende el led2
delay (5000);//damos un breve tiempo antes de conectarse el motor lento
digitalWrite (motor, HIGH); //se ejecuta el motor lento sentido derecha
delay(tiempo); // le damos tiempo para que continue llenando de agua la
lavadora
digitalWrite (agua, LOW); //se detiene la electrovalvula de agua y se apaga
el led2
delay(tiempo); // damos tiempo para que sigagirando el motor lento sentido
derecha
digitalWrite (motor, LOW); //se detiene el motor lento sentido derecha
delay(2000);
digitalWrite (motorinvertido, HIGH); //se pone en marcha el motor lento en
sentido contrario
delay(tiempo); // damos tiempo para que gire el motor lento invertido
digitalWrite (motorinvertido, LOW); //se detiene el motor lento en sentido
contario
delay(2000);
digitalWrite (vaciado, HIGH); // se pone en marcha el motor de vaciadodel
agua y se enciende el led3
delay(tiempo); // damos tiempo para el vaciado del agua del tambor
digitalWrite (centrifugado, HIGH); // se ejecuta el motor rapido centrifugado
y se enciende el led1
delay(tiempo); // damos tiempo al motor rápido para el centrifugado
digitalWrite (vaciado, LOW); // se detiene el motor de vaciado y se apaga el
led3
delay(2000);
digitalWrite (centrifugado, LOW); // se detiene el motor rapido de
centrifugado y se apaga el led1
delay(5000); //damos un breve tiempo para el cambio de ciclo
// se comienza un segundo ciclo de lavado corto
digitalWrite (agua, HIGH); // se activa la electrovalvula de paso de agua y
se enciende el led2
delay(5000); // damos un breve tiempo antes de conectarse el motor lento
digitalWrite (motor, HIGH); // se ejecuta el motor lento sentido derecha
delay(tiempo); // le damos tiempo para seguir llenando de agua el tambor
digitalWrite (agua, LOW); // se detiene la electrovalvula y se apaga el led2
delay(tiempo); // damos tiempo para el giro del motor lento derecha
digitalWrite (motor, LOW); // se detiene el motor lento sentido derecha
delay(2000);
digitalWrite (motorinvertido, HIGH); // se pone en marcha el motor lento en
sentido contrario
delay(tiempo); // damos tiempo para la duración del motor lento invertido
digitalWrite (motorinvertido, LOW); //se detiene el motor lento en sentido
contario
delay(2000);
digitalWrite (termo, LOW); //se apaga el termocalentador de agua y se apaga
el led6 si se encuentran activados
232
37. Programación y control de una lavadora
digitalWrite (vaciado, HIGH); //se vacia el agua y se enciende el led3
delay(tiempo);
digitalWrite (centrifugado, HIGH); //se ejecuta el centrifugado y se enciende
el led1
delay(tiempo); // damos tiempo para el motor rápido de centrifugado
digitalWrite (vaciado, LOW); // se detiene el motor de vaciado y se apaga el
led3
delay(2000);
digitalWrite (centrifugado, LOW); //se detiene el centrifugado y se apaga el
led1
delay(5000); // damos un breve tiempo para finalizar el programa
digitalWrite (ledcorto, LOW); // se apaga el led4 del programa corto y
finaliza el lavado corto}
voidlavadolargo(){ // ejecutamos el programa de lavado largo
digitalWrite (ledlargo, HIGH); // se enciende el led5 del lavado largo
delay(1000);
digitalWrite (agua, HIGH); //se pone en marcha la electrovalvula y se
enciende el led2
delay(5000); //damos un tiempo de 5 sg antes de conectarse el motor lento
digitalWrite (motor, HIGH); // se ejecuta el motor lento sentido derecha
delay(tiempo2); // le damos tiempo para seguir llenando de agua la lavadora
digitalWrite (agua, LOW); // se detiene la electrovalvula y se apaga el led2
delay(tiempo2); // damos tiempo para que gire el motor hacia la derecha
digitalWrite (motor, LOW); // se detiene el motor lento
delay(2000);
digitalWrite (motorinvertido, HIGH); //se pone en marcha el motor lento
invertido
delay(tiempo2);
digitalWrite (motorinvertido, LOW); // se detiene el motor lento invertido
delay(2000);
digitalWrite (vaciado, HIGH); //se vacia el agua del tambor y se enciende el
led3
delay(tiempo2); //damos tiempo para el motor de vaciado del agua
digitalWrite (centrifugado, HIGH); // se activa el motor rapido centrifugado
y se enciende el led1
delay(tiempo2); // damos tiempo para centrifugar
digitalWrite (vaciado, LOW); // se detiene el motor de vaciado y se apaga el
led3
delay(2000);
digitalWrite (centrifugado, LOW); // se detiene el motor rapido centrifugado
y se apaga el led1
delay(5000); //damos un breve tiempo para el siguiente ciclo
// se inicia el segundo ciclo del lavado largo
digitalWrite (agua, HIGH); // se pone en marcha la electrovalvula y se
enciende el led2
delay(5000); //damos un breve tiempo antes de conectarse el motor lento
digitalWrite (motor, HIGH); // se ejecuta el motor lento sentido derecha
delay(tiempo2); // le damos tiempo para seguir llenando de agua la lavadora
digitalWrite (agua, LOW); // se detiene la electrovalvula y se apaga el led2
delay(tiempo2); // damos tiempo al motor lento derecha
digitalWrite (motor, LOW); // se detiene el motor lento
delay(2000);
digitalWrite (motorinvertido, HIGH); // se pone en marcha el motor invertido
delay(tiempo2); //damos tiempo de lavado al motor invertido
digitalWrite (motorinvertido, LOW); // se detiene el motor invertido
delay(2000);
233
37. Programación y control de una lavadora
digitalWrite (vaciado, HIGH); // se activa el vaciado del agua y se enciende
el led3
delay(tiempo2); //damos tiempo para vaciar el agua del tambor
digitalWrite (centrifugado, HIGH); // se activa el motor rapido de
centrifugado y se enciende el led1
delay(tiempo2); //damos tiempo para el motor rápido pueda centrifugar
digitalWrite (vaciado, LOW); // se detiene el motor de vaciado y se apaga el
led3
delay(2000);
digitalWrite (centrifugado, LOW); // se detiene el motor rapido de
centrifugado y se apaga el led1
delay(5000); //damos un breve tiempo para el siguiente ciclo
// se inicia el tercer ciclo de lavado largo
digitalWrite (agua, HIGH); // se pone en marcha la electrovalvula y se
enciende el led2
delay(5000); //damos un breve tiempo antes de conectarse el motor lento
digitalWrite (motor, HIGH); // se pone en marcha el motor lento sentido
derecha
delay(tiempo2); // le damos tiempo para seguir llenando de agua la lavadora
digitalWrite (agua, LOW); // se detiene la electrovalvula y se apaga el led2
delay(tiempo2); //damos tiempo a que gire el motor lento
digitalWrite (motor, LOW); // se detiene el motor lento
delay(2000);
digitalWrite(motorinvertido, HIGH); // se pone en marcha el motor lento
invertido
delay(tiempo2); //damos tiempo al motor lento invertido
digitalWrite (motorinvertido, LOW); // se detiene el motor lento invertido
delay(2000);
digitalWrite (termo, LOW); // se apaga el termocalentador de agua y se apaga
el led6
digitalWrite (vaciado, HIGH); // se pone en marcha el motor de vaciado del
agua y se enciende el led3
delay(tiempo2); //damos tiempo para el vaciado del agua del tambor
digitalWrite (centrifugado, HIGH); // se pone en marcha el motor rapido de
centrifugado y se enciende el led1
delay(tiempo2); //damos tiempo al motor rapido para centrifugar
digitalWrite (vaciado, LOW); // se detiene el motor de vaciado y se apaga el
led3
delay(2000);
digitalWrite (centrifugado, LOW); // se detiene el motor rapido de
centrifugado y se apaga el led1
delay(5000); // damos un breve tiempo para finalizar el programa
digitalWrite (ledlargo, LOW); // se apaga el led5 y finaliza el lavado largo
}
234
Registro de desplazamiento 74HC164
Para entender este tipo de circuitos integrados probaremos con el 74HC164, que es un tipo
SIPO de 8 registros. Podemos entender este registro como un dispositivo con 8 salidas las
cuales podemos controlar.
235
Registro de desplazamiento 74HC164
GND GND
VCC 5V
D1 pin 5
D2 5V
RESET pin 4
CLK pin 5
Los datos se ingresan en serie a través de una de dos entradas (A o B), cualquiera de estas
entradas se puede utilizar como activo alto permitir una entrada por la otra entrada.
Una entrada no utilizada debe ser alta, o ambas entradas deben ser conectadas entre sí.
Cada transición de bajo a alto en el la entrada del reloj cambia los datos un lugar a la
derecha y entra en QA, la lógica NAND de las dos entradas de datos (A ⋅ B), los datos que
existían antes del reloj de salida borde. Un nivel de alto en la entrada borrada anula todo
otras entradas y borra los registros de forma sincrónica, forzando todas las salidas Q a
velocidad lenta.
Todas las entradas están equipadas con circuitos de protección contra descargas estáticas y
exceso de voltaje transitorio.
236
Registro de desplazamiento 74HC164
Con el integrado conectado en el siguiente ejemplo haremos un caso práctico para ver
cómo es la programación y entender el funcionamiento.
237
Registro de desplazamiento 74HC164
void setup() {
pinMode(s_clock, OUTPUT); //configuramos pines de salida
pinMode(s_reset, OUTPUT); //configuramos pines de salida
pinMode(s_datos, OUTPUT); //configuramos pines de salida
void loop() {
238
Registro de desplazamiento 74HC164
239
Dual 1 de 4 Decodificador/Demultiplexor 74LS139
Cada Arduino tiene un número limitador de entradas y salidas ya bien sean analógicas o
digitales, en el momento de que el número de pines no sean suficientes tenemos la opción
de ampliarlos mediante Multiplexores/Demultiplexores o Codificadores/Decodificadores.
Los multiplexores o demultiplexores son circuitos combinacionales muy útiles para este
tipo de aplicación.
Salidas
240
Dual 1 de 4 Decodificador/Demultiplexor 74LS139
241
Dual 1 de 4 Decodificador/Demultiplexor 74LS139
Con las tres entradas que posee el circuito podemos realizar 4 combinaciones diferentes en
binario, de 00 a 11 que nos activaran una de las salidas Yn.
Este circuito integrado una de las utilidades que tiene en la práctica es para seleccionar
memorias y periféricos en el espacio de memoria de los sistemas con microprocesadores.
ESPECIFICACIONES TECNICAS:
Familia lógica: LS
Número de líneas de entrada: 2 Input
Número de líneas de salida: 4 Output
Tiempo de retardo de propagación: 33 ns
Voltaje de alimentación - Máx.: 5.25 V
Voltaje de alimentación - Mín.: 4.75 V
Temperatura de trabajo máxima: + 70 C
Estilo de montaje: Through Hole
Paquete / Cubierta: PDIP-16
Empaquetado: Tube
Función: Decoder/Demultiplexer
Altura: 4.57 mm
Corriente de salida de nivel alto: - 0.4 mA
Longitud: 19.3 mm
Tipo lógico: Decoders/Demultiplexers
Corriente de salida de nivel bajo: 8 mA
Frecuencia de reloj máxima: 35 MHz
Temperatura de trabajo mínima: 0 C
Número de circuitos: Dual
Voltaje de alimentación operativo: 5 V
Rango de temperatura de trabajo: 0 C to + 70 C
Dp - Disipación de potencia : 200 mW
Cantidad de empaque de fábrica: 25
Corriente de suministro - Máx.: 6.8 mA
242
Dual 1 de 4 Decodificador/Demultiplexor 74LS139
void setup() {
for (byte i=1; i<15; i++) { //configuramos bloque repititivo para secuencia
encendido de leds
pinMode (i, OUTPUT); //configuramos i de salida
}
}
void loop() {
for (byte canal=0; canal<5; canal++) { //establece un bucle repetitivo
digitalWrite(2, decodificadorA[canal][0]); //activa entrada A1 de
decodificador A
digitalWrite(3, decodificadorA[canal][1]); //activa entrada A0 de
decodificador A
digitalWrite(4, decodificadorB[canal][0]); //activa entrada A1 de
decodificador B
digitalWrite(5, decodificadorB[canal][1]); //activa entrada A0 de
decodificador B
delay(500); //pausa para ver el encendido de los leds
}
}
243
Dual 1 de 4 Decodificador/Demultiplexor 74LS139
244
Decodificadores BCD a 7 segmentos SN74LS47/LS48
El 74LS47 acepta cuatro líneas de entrada de datos BCD (8421), que genera internamente
sus complementos y los decodifica los datos con siete puertas AND/OR que tienen colector
abierto de salidas para controlar los segmentos indicadores directamente de un display en
ánodo común. Cada segmento se garantiza que la salida absorberá 24 mA en el estado
ENCENDIDO (BAJO) y soportar 15 V en el estado APAGADO (ALTO) con un máximo de
corriente de fuga mínima de 250 µA. Entradas auxiliares proporcionan función de
supresión de ceros en cascada, prueba de lámparas y funciones.
Características
Salidas de colector abierto con tensión negativa
Conducir segmentos indicadores directamente
Capacidad de supresión cero en cascada
Entrada de prueba de lámpara
245
Decodificadores BCD a 7 segmentos SN74LS47/LS48
En este caso del 74LS47 la salida se activan con señal negativa, para ello, el display debe
ser en ánodo común.
246
Decodificadores BCD a 7 segmentos SN74LS47/LS48
El circuito LS48 incorpora borde de ataque y/o salida automático. Control de supresión de
ceros (RBI y RBO). La prueba de lámpara (LT) se puede activar en cualquier momento en el
que el nodo BI/RBO está ALTO. Ambos dispositivos contienen una anulación de entrada de
supresión (BI) que se puede utilizar para controlar la intensidad de la lámpara variando la
frecuencia y el ciclo de trabajo de la señal de entrada BI o para inhibir las salidas.
El decodificador SN74LS48 trabaja con display de 7 segmentos que debe ser de cátodo
común, en el caso de que tengamos el display en ánodo común se podrá utililizar 7
inversores utilizando dos integrados SN74LS04.
247
Decodificadores BCD a 7 segmentos SN74LS47/LS48
248
Decodificadores BCD a 7 segmentos SN74LS47/LS48
void setup() {
for (byte i=0; i<15; i++) { //configuramos bloque repititivo para secuencia
encendido display
pinMode (i, OUTPUT); //configuramos i de salida
}
}
void loop() {
delay(500);
}
}
249
Decodificadores BCD a 7 segmentos SN74LS47/LS48
250
Sensor de temperatura interna del ATmega328P
Por lo tanto, este sensor se utilizará para saber la temperatura interna dl integrado, que es
una información importante para poder detectar posibles problemas de funcionamiento o
mantener la temperatura del integrado dentro de un rango, controlando actuadores, como
pueden ser pequeños ventiladores.
Para ajustar la medida interna del termómetro con la temperatura ambiente, aparte de
mantener apagado el Arduino durante un periodo, desde Arduino han desarrollado un
programa que permite calibrar el sensor.
Para calibrar el sensor, se deben tomar varias mediciones, dejando 30 minutos el sensor
apagado, a continuación, se comparan las mediciones con un sensor calibrado y se ajustan
los valores 324.31 y 1.22.
void setup() {
Serial.begin(9600);
Delay(5000);
}
void loop() {
ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
ADSRA |= _BV(ADEN);
delay(50);
ADSRA |= _BV(ADSC);
while (bit_is_set(ADSRA, ADSC));
Serial.print(“Temperatura interna del µC: “);
Serial.print((ADCW – 324.31) / 1.22);
Serial.println(“ °C”);
delay(1000);
}
251