0% encontró este documento útil (0 votos)
183 vistas80 páginas

Arduino IoT

Este documento introduce Arduino y la Internet de las Cosas. Explica los objetivos del taller sobre Arduino, qué es Arduino, los orígenes y componentes básicos de Arduino como la placa, el microcontrolador y el bootloader. También cubre cómo montar un Arduino en un breadboard, el IDE de Arduino y conceptos básicos de programación como los pines digitales y analógicos.

Cargado por

jose angel
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
183 vistas80 páginas

Arduino IoT

Este documento introduce Arduino y la Internet de las Cosas. Explica los objetivos del taller sobre Arduino, qué es Arduino, los orígenes y componentes básicos de Arduino como la placa, el microcontrolador y el bootloader. También cubre cómo montar un Arduino en un breadboard, el IDE de Arduino y conceptos básicos de programación como los pines digitales y analógicos.

Cargado por

jose angel
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Introducción a

Internet de las cosas (IoT)


con Arduino

CRIF Las Acacias


Abril 2015
Juan Félix Mateos
juanfelixmateos@[Link]
Objetivos del taller
● Bondades del sistema Arduino para introducir a los
alumnos en el campo de la informática física.
● Características del “ecosistema” Arduino
(software/hardware/documentación).
● Montar un Arduino en un breadboard.
● Aprender los conceptos básicos para programar sketchs.
● Realizar varios ejercicios prácticos de programación de
Arduino.
● Introducción a IoT con ESP8266
● Analizar qué materiales y costes requiere un taller de
Arduino como éste.
¿Qué es Arduino?
● Es un sistema de prototipado electrónico con las siguientes
características:
● Compuesto de hardware, software (Windows/Linux/MacOS)
y documentación
● Licencia libre (esquemas y código fuente)
● Una comunidad muy activa y comprometida con el hardware
libre
● Multidisciplinar (no sólo para informáticos, sino también para
artistas, investigadores...)
● Gran diversidad de librerías (EEPROM, Servos, Ethernet,
USB Host, GLCD KS0108...)
● Ampliable mediante shields compatibles (GSM, Ethernet,
WiFi, Nixie...)
● Sencillo y ágil
“Partieron de la premisa de que no
sabías electrónica ni programación,
ni querías configurar una máquina
completa para programar un simple
chip – sólo tenías que conectar la
placa al ordenador, pulsar Upload y
ya estaba funcionando.”
Tom Igoe
Hace 50 años, para escribir
software necesitabas a gente con
mandiles blancos que conocieran
hasta el más mínimo detalle de las
válvulas de vacío. Hoy, incluso mi
madre puede programar.
Massimo Banzi
Orígenes de Arduino
● 2002: Massimo Banzi es contratado por el
Interaction Desing Institute Ivrea para enseñar
Informática física y decide encontrar una
alternativa a los BasicStamp porque:
● Son caros
● Su baja potencia no permite hacer realidad los
proyectos de algunos alumnos
● Su sistema de desarrollo no funciona en MacOS.
● 2005: Se distribuye la primera placa Arduino y
se decide hacerla Open Source porque la
escuela estaba a punto de cerrar.
El equipo Arduino

● Izq. A dcha.: David Cuartielles, Gianluca


Martino, Tom Igoe, David Mellis y Massimo
Banzi.
Principales placas Arduino
● Arduino Serial
● Arduino Diecimila: ATmega168, reseteable por
software
● Arduino Duemilanove: Atmega168/ATmega328p
● Arduino LilyPad: Resistente al agua, sin
oscilador externo, y cosible
● Arduino Leonardo: ATmega32U4 con transceptor
USB integrado
● Arduino UNO: ATmega328+ATmega16U2.
● Arduino DUE: Atmel SAM3X8E ARM Cortex-M3
(32 bits - 84MHz)
● Arduino TRE: 1-GHz Sitara AM335x
● Arduino ZERO: SAMD21Cortex-M0 (con
depurador integrado)
Componentes de una placa Arduino
● Microcontrolador
● Bootloader
● Oscilador
● Alimentación
● Comunicación con el PC (conversor
serie/RS232 a USB)
● Drivers
Componentes en Arduino UNO
Características del ATMEGA328P
● Flash (Kbytes):32 Kbytes ● Analog Comparators:1
● Pin Count:32 ● Temp. Sensor:Yes
● Max. Operating Freq. ● SRAM (Kbytes):2
(MHz):20 MHz ● EEPROM (Bytes):1024
● CPU:8-bit AVR ● Self Program Memory:YES
● # of Touch Channels:16 ● picoPower:Yes
● Max I/O Pins:23 ● Temp. Range (deg C):-40 to 85
● Ext Interrupts:24 ● Operating Voltage (Vcc):1.8 to
● USB Interface:No 5.5
● SPI:2 ● Timers:3
● TWI (I2C):1 ● Output Compare channels:6
● UART:1 ● Input Capture Channels:1
● Graphic LCD:No ● PWM Channels:6
● ADC channels:8 ● 32kHz RTC:Yes
● ADC Resolution (bits):10 ● Calibrated RC Oscillator:Yes
● ADC Speed (ksps):15 ● Watchdog:Yes
Bootloader
● Existen varias alternativas para disponer del bootloader de Arduino en el
microcontrolador que vamos a usar para montar nuestro propia placa Arduino:
● Comprar un ATmega328p-pu con el bootloader ya instalado (es más caro que
comprar ATmega328p-pu sin bootloader). Esta opción es la ideal si sólo
necesitamos una placa.
● Comprar el ATmega328p-pu sin bootloader y un programador (como el AVR ISP
o el USBasp). Dependiendo del número de placas que necesitemos montar, esta
opción puede ser más económica o más cara que la anterior. Para pocas placas
merece más la anterior; y para muchas placas seguramente sea más económica
la siguiente.
● La opción más económica para más de 2 placas es comprar sólo un
ATmega328p-pu con el bootloader y el resto sin él. En el ATmega328p-pu con
bootloader cargamos el sketch Arduino ISP (disponible en los ejemplos) y lo
utilizamos para cargar el bootloader en el resto de las placas (eligiendo
Herramientas>Programador>Arduino as ISP y Herramientas>Grabar secuencia
de inicio). En este taller utilizaremos este método.
Bootloader
“Los Arduino se reproducen”
● Una vez cargado el sketch Arduino ISP en la
placa con bootloader, realizamos las siguientes
conexiones:
Placa con bootloader Placa sin bootloader
Roja Azul
VCC VCC
GND GND
11 11
12 12
13 13
10 1
Montar un Arduino en un protoboard
Conociendo el SYB-120
● Railes laterales 3-4-3
Montar un Arduino en un protoboard
Componentes principales
● Microcontrolador
● Botón Reset
● Conversor USB-Serial (PL2303)
Montar un Arduino en un protoboard
Alimentación y cristal
● Usamos el rail de la izquierda
para masa: pines 8 y 22 del
atmega
● Usamos el rail de la derecha
para la tensión positiva (5V):
pines 7 y 20 del atmega
● Cristal cuarzo 16MHz en
pines 9 y 10
● Puentes para extender los railes
de alimentación
● Dos condensadores de 22p
entre las patillas del cristal
y masa
Montar un Arduino en un protoboard
Reset
● Pin 1 del atmega a un pull-up
de 10k, y a un extremo del
botón
● El otro extremo del botón a
masa
Montar un Arduino en un protoboard
Comunicación serie
● Pin TXD del PL2303 al pin 2 del
atmega (RXD) a través de una
resistencia de 10k
● Pin RXD del PL2303 al pin 3 del
atmega (TXD)
Montar un Arduino en un protoboard
LED y condensador de filtrado
● Anodo del LED en
el pin 19 del
atmega (salida
digital 13) y
cátodo a masa a
través de
resistencia de
aproximadamente
470R
● Condensador de
100nF entre +5V
y GND
El IDE de Arduino
El IDE de Arduino
Configurar la placa y el puerto
Estructura básica de un
sketch/programa
Los pines de Arduino
● Pines digitales [0..13]
● Pueden suministrar/engullir hasta 40mA
● Algunos de ellos [3, 5, 6, 9, 10, 11]
pueden generar señales PWM
● Disponen de resistencias pull-up internas
que podemos activar/desactivar por
software
● Pueden configurarse en modo INPUT u
OUTPUT; por defecto se encuentran en
modo INPUT
● Pines analógicos [A0..A5]
● Utilizan un conversor A/D de 10 bits
● La referencia máxima puede elegirse
entre:
– DEFAULT: 5V
– INTERNAL: 1.1V
– EXTERNAL: pin 21
Sintáxis del lenguaje Arduino
● Similar a C
● Todas las instrucciones deben terminar con ;
● Los comentarios pueden ser
● de una sola línea //
● de varias líneas /* ..... */
● Distingue entre mayúsculas y minúsculas
● Los nombres de las funciones predefinidas
usan camelCase
Parpadear un LED
Datos de interés
● Un segundo está compuesto por 1000 milisegundos
● Nuestros LED poseen las siguientes características:
● Rojo: If=20mA --- Vf=2V
● Verde: If=20mA --- Vf=2.1V
● Amarillo: If=20mA --- Vf=2.1V
● Nuestras resistencias son capaces de disipar 1/4W
● Ley de ohm: V = I x R

Ley de la potencia: P = I x V = I2 x R
Parpadear un LED
Cálculo de la resistencia limitadora para un LED
● V = I x R


P = I2 x R
● Un LED rojo
● V=IxR
– 5 – 2 = 0.02 x R
– R = 150 ohm

P = I2 x R
– P = 0.022 x 150
– P = 0,06 W < 1/4 W
Parpadear un LED
Instrucciones de interés
● pinMode(pin,modo)
● pin: número del pin
● modo
– INPUT
– OUTPUT
– INPUT_PULLUP
● digitalWrite(pin,valor)
● pin: número del pin
● valor
– HIGH
– LOW
● delay(milisegundos)
● milisegundos: número de milisegundos de la pausa
– Este valor es un unsigned int [0..[Link]]
Parpadear un LED
Código fuente
Parpadear un LED
Programar nuestro Arduino
● Pulsar y mantener
pulsado el botón
Reset del Arduino.
● Pulsar el botón Subir
del IDE de Arduino.
● Cuando en el área de
notificaciones
aparezca “Subiendo”,
soltar el botón Reset
del Arduino.
Variables – Tipos de datos
● boolean: true o false – ocupa un byte
● byte (8 bits): 0..255
● char (8bits): -128..127 Caracteres ASCII
● short (16 bits): -32.768 .. 32,767
● word (16 bits): 0..65.535
● long (32 bits): -[Link] .. [Link]
● unsigned long (32 bits): 0 .. [Link]
● int (16 o 32 bits):
● Uno: -32.768 .. 32,767
● Due: -[Link] .. [Link]
● float (32 bits):
● -3.4028235E+38 .. 3.4028235E+38
● Sólo 7 cifras de precisión
● Lento
Variables - Alcance
● Las variables son reconocidas dentro de la
función en la que son definidas (locales), y son
destruidas al finalizar la ejecución de la función.
● Si la declaración de una variable va precedida de
static, no se destruirá al finalizar la ejecución de la
función.
● Para que una variable sea reconocida en todas
las funciones (global) tendremos que
declararla fuera de cualquier función.
Control de flujo
● if(condición){...}else{...}
● for(inicialización;comprobación;incremento){...}
● break
● continue
Operadores
= Asignación != ¿No igual?
== ¿Igual? < ¿Menor?
+ Suma > ¿Mayor?
- Resta <= ¿Menor o igual?
* Multiplicación >= ¿Mayor o igual?
/ División && Y lógico
% Módulo || O lógico
Las operaciones aritméticas se
realizan en el tipo de datos de los
! Negación lógica
operandos. Ej 7 / 2 = 3, pero 7.0 /
2 = 3.5
Entrada analógica
● analogRead(pin)
● Pin: nº del pin analógico que queremos leer [0..5]
● 10bit ADC: Devuelve un valor entre 0 y 1023
● Cada medida requiere aprox. 100uS
● analogReference(referencia)
● referencia
– DEFAULT: 5V
– INTERNAL: 1.1V
– EXTERNAL: A Ref (pin 21) ¡Importante <5V!
● ¡Ojo! Al cambiar la referencia las primeras medidas
pueden ser poco precisas (dejar estabilizar)
Entrada analógica
LM35DZ
● Sensor de temperatura lineal
● 10mV/ºC
● 0ºC..100ºC
● EJERCICIO: Se propone desarrollar un
termómetro de confort con los siguientes
rangos:
● <26ºC: Enciende LED pin12
● >26ºC: Enciende LED pin13
Entrada analógica
Termómetro con 2 LEDs
Entrada analógica
Termómetro con 2 LEDs
● Poner otro LED en el pin
12
● Conectar el LM35 a la
entrada analógica 0 (pin
23 del atmega)
Entrada analógica
Termómetro: mejorar la resolución
● El LM35 da 0.01V
por cada grado, por
lo que a 100º daría
1V
● Estamos
desaprovechando
nuestra “regla de
medir” si el fondo de
escala es 5V
● Ganaremos
resolución si
reducimos el fondo
de escala a 1.1V
Entrada analógica
Termómetro: mejorar la resolución
Comunicaciones serie
● Arduino UNO tiene un puerto serie en los pines
0 y 1, compartido además con el puerto USB.
● Este puerto opera a 5V ¡CUIDADO con
conectarlo a un ordenador que funciona a +/-
12V! Utilizar un MAX232
● Funciones de interés
● [Link](velocidad)
– Velocidad = 9600, 14400, ..., 115200
● [Link](cadena)
Entrada analógica
Termómetro: comunicación Serie
¿Qué es IoT?
● IoT es la conexión de dispositivos a Internet, de
tal forma que puedan compartir datos con
otros:
● Dispositivos (M2M): Al aparcar un automóvil se
comunica con el parquímetro automáticamente
para pagar la tasa correspondiente.
● Servicios: El collar de una mascota va
almacenando su trayectoria en Google Maps en
tiempo real. Un lavavajillas consulta la tarifa
eléctrica más económica para ponerse en marcha.
● Personas: Un sensor de fuego en un bosque activa
una alarma en un parque de bomberos
Thingspeak
● Crear una cuenta en [Link]
● Crear un canal privado llamado Taller iTIC 2015
● Configurar en ese canal una campo llamado
Temperatura
● Obtener el ID y la clave del canal (API KEY).
● Introducir un par de datos en el canal accediendo con
el navegador web a la dirección
● [Link]
KEY]&field1=[dato]
● Comprobar el resultado accediendo a la dirección
● [Link]
CANAL]/[Link]?key=[API KEY]
ESP8266
● Es un módulo con el que podemos conectar a
Internet mediante WiFi y que se controla
mediante un puerto serie utilizando comandos
AT.
● ¡CUIDADO FUNCIONA A 3V3! No a 5V
ESP8266
Conexión básica
● Usamos un LM1117 para conseguir 3v3
● Con una red resistencia+Zener3v3 limitamos la tensión en el pin RX
del EXP8266
● El pin CH_PD del ESP8266 debe conectarse a +3V3
ESP8266
Comando básicos
● [Link]
ule
● AT: Debe contestar OK
● AT+RST: Reset
● AT+GMR: Versión del firmware
● AT+CWMODE: Modo 1 station, 2 AP, 3 ambos
● AT+CWLAP: Listado de AP detectados
● AT+CWJAP: Unirse a un AP
● AT+CIFSR: Obtener la dirección IP
● AT+CIPSTAR: Configura una conexión TCP/UDP
● AT+CIPSEND: Envía datos
● AT+CIPCLOSE: Cierra la conexión TCP/UDP
ESP8266
Sesión con un programa Terminal
● CoolTerm, RealTerm, Putty...
● AT+GRM
● AT+CWMODE=3
● AT+CWLAP
● AT+CWJAP="SSID","PASSWORD"
● AT+CIFSR
● AT+CIPSTART="TCP","[Link]",80
● AT+CIPSEND=44 (Longitud de la cadena que vamos
a mandar + 2 (\r\n)
● GET /update?key=[API_KEY]&field1=[dato]
● AT+CIPCLOSE
ESP8266
y ahora con Arduino
ESP8266
y ahora con Arduino
● El ESP8266 consume tanto que
tenemos que alimentarlo con su
propio PL2303 a través de otro
puerto USB.
● Si utilizamos un hub usb
posiblemente no sea capaz de
suministrar la corriente que el
ESP8266 necesita.
Semáforo
Ejercicio
● Construir un semáforo con un LED rojo,
amarillo y verde que cambie de color cada
segundo.
Semáforo
Código fuente
Semáforo + Botón
● Hacer que el color del semáforo avance con
cada pulsación de un botón.
Semáforo + Botón
Código fuente
Semáforo + Botón
Antirrebote
● Demora típica antirrebote: 10-30ms
Pulse-Width Modulation (PWM)
● analogWrite(pin,cicloDetrabajo)
● cicloDeTrabajo: 0..255
● Pines PWM
● 3, 5, 6, 9, 10, 11
PWM + Botón
● LED: Pin 3
● Botón: Pin 4
● Inicialmente el LED con cicloDeTrabajo = 0
● Incrementar el cicloDeTrabajo en +64 con cada
pulsación del botón.
PWM + Botón
Código fuente
Arrays
● Declaración [y asignación]
● tipoDeDato nombre [tamaño];
● tipoDeDato nombre [tamaño] = {..., ..., ...};
● El índice del primer elemento es el 0
● Se pueden usar arrays de varias dimensiones
● byte[2][2]={{0,1},{2,3}};
PWM + Botón + Array
Ejercicio
● Modificar el ejemplo anterior para que el ciclo
de trabajo adopte uno de los valores {0, 64,
128, 192, 255} con cada pulsación.
PWM + Botón + Array
Código fuente
Entrada analógica
● analogRead(pin)
● 10bit ADC: Devuelve un valor entre 0 y 1023
● Cada medida requiere aprox. 100uS
● analogReference(referencia)
● referencia
– DEFAULT: 5V
– INTERNAL: 1.1V
– EXTERNAL: A Ref (pin 21)
Termistor
Datos de interés
● NTC MF52AT 3950 10Kohm
● Negative Temperature
Coefficient
● R0=10K (resistencia a T0=
25ºC = 298,15K)
● Constante beta B=3950
● T[K] = T [ºC] + 273,15
Termistor
Divisor de tensión
● La referencia de tensión 1.1V interna es más precisa
● Nuestro rango de interés es: -10ºC (44120) a 40ºC (5734)
● Si quiero aprovechar al máximo la resolución del ADC
tendré que conseguir que la resistencia máxima de interés
del termistor provoque una caída de tensión de 1.1V
● 1.1=44120 / (44120 + Rtop) * 5
● Rtop = 156425 ohm ~ 180000 ohm (serie E12)
Termistor
Ejercicio
● Se propone desarrollar un termómetro de
confort con los siguientes rangos:
● 22-26ºC: Enciende LED verde
● <22ºC: Enciende LED amarillo
● >26ºC: Enciende LED rojo
Entrada analógica
● analogRead(pin)
● Pin: nº del pin analógico que queremos leer [0..5]
● 10bit ADC: Devuelve un valor entre 0 y 1023
● Cada medida requiere aprox. 100uS
● analogReference(referencia)
● referencia
– DEFAULT: 5V
– INTERNAL: 1.1V
– EXTERNAL: A Ref (pin 21) ¡Importante <5V!
● ¡Ojo! Al cambiar la referencia las primeras medidas
pueden ser poco precisas (dejar estabilizar)
Entrada analógica
LM35DZ
● Sensor de temperatura lineal
● 10mV/ºC
● 0ºC..100ºC
● EJERCICIO: Se propone desarrollar un
termómetro de confort con los siguientes
rangos:
● 22-26ºC: Enciende LED amarillo
● <22ºC: Enciende LED azul
● >26ºC: Enciende LED rojo
Entrada analógica
Solución termómetro
Entrada analógica
¿Cómo mejorar la precisión del termómetro?
● Si el LM35DZ puede medir hasta 100ºC ¿cuál
será la tensión máxima?
● 1V
● ¿Qué tensión de referencia estamos usando?
● 5V
● ¿Qué implicaciones tiene esto?
● Estamos desaprovechando 4/5 de la resolución del
ADC
● ¿Podemos mejorarlo?
● Sí, utilizando la referencia interna de 1.1V
Entrada analógica
¿Cómo mejorar la precisión del termómetro?
Comunicaciones serie
● Arduino UNO tiene un puerto serie en los pines
0 y 1, compartido además con el puerto USB.
● Este puerto opera a 5V ¡CUIDADO con
conectarlo a un ordenador que funciona a +/-
12V! Utilizar un MAX232
● Funciones de interés
● [Link](velocidad)
– Velocidad = 9600, 14400, ..., 115200
● [Link](cadena)
Comunicaciones serie
● EJERCICIO
● Modificar el ejemplo del termómetro para que
además muestre la temperatura en el terminal serie
Comunicaciones serie
Comunicaciones serie
Envío de datos a Arduino
● Arduino tiene un buffer con capacidad para un
máximo de 64 bytes.
● Los datos que enviamos se van almacenando en ese
buffer hasta que los leemos y, si se llena, se van
perdiendo los datos más antiguos.
● Instrucciones de interés
● [Link](): Nos indica el número de bytes
pendientes de leer del buffer
● [Link](): Lee el primer byte del buffer (devuelve -1
si el buffer está vacío).
– Devuelve un int
– ¿Por qué no un byte? Porque entiende la tabla ASCII
extendida + el datos “-1” (buffer vacío)
Comunicaciones serie
Envío de datos a Arduino
● Ejercicio: Modificar el ejemplo anterior para que al enviar una “i” se
active la referencia analógica interna, al enviar una “d” se active la
referencia analógica predeterminada, y al recibir cualquier otro
carácter se conteste “No le he entendido\n”
Comunicaciones serie
Envío de datos a Arduino
● Solución del ejercicio
Comunicaciones serie
Envío de datos a Arduino
● Otros métodos interesantes del objeto Serial:
● [Link](): Escribe un valor binario (byte) por el puerto serie.
Por ejemplo, puede utilizarse para mostrar caracteres más allá de
la tabla ASCII. Por ejemplo, el valor 186 corresponde a º
● [Link](): Lee un número entero por la entrada serie.
– Si no se ha introducido un número durante un segundo,
devuelve 0.
– En cuanto encuentra algo que no forma parte de un entero, lo
ignora. Por ejemplo, si escribimos 8.5, devolverá 8 la primera
vez que lo ejecutemos, y 5 la segunda.
– Devuelve un int [-32,768 .. 32,767]
● [Link](): Lee un número de coma flotante
Internet de las cosas
● El módulo ESP8266
● ¡CUIDADO FUNCIONA A 3V3! No a 5V
Materiales y coste
para un taller como éste
● En este taller se han utilizado 30 placas, con un coste
por debajo de 6€ la unidad.
● En el archivo “BOM [Link]” dispone de los
precios y enlaces para adquirir los componentes.
● Algunos componentes (conversor serie-USB,
resistencias, cables, termistores, fotorresistores, ) se
adquirieron en tiendas como ebay o aliexpress; el
resto en Mouser.
● En el momento de desarrollar el taller estaba agotado
el ATmega328p-pu, que es el que usa originalmente
Arduino, por lo que se adquirió el ATmega328-pu
(véase la siguiente diapositiva).
Grabar bootloader
en ATmega328-PU
● El ATmega328-pu tiene una firma diferente a la del ATmega328p-pu,
por lo que para grabar el bootloader en él utilizando otro Arduino
como ISP es necesario seguir estos pasos:
● Grabar el sketch Arduino ISP en una placa Arduino que ya
disponga de bootloader,
● Cambiar la línea 9245 del archivo
Arduino\hardware\tools\avr\etc|\[Link] como se indica en la
figura.
● Grabar el bootloader como se explicó anteriormente en esta
presentación.
● Deshacer el cambio de la línea 9245. A partir de ese momento
nuesto ATmega328-pu se comportará a todos los efectos como
un ATmega328p-pu.
¿Y si no me gusta escribir
programas?
● Scratch for Arduino
● [Link]
● Minibloq
● [Link]

También podría gustarte