¿Qué es Arduino?
Plataforma Electrónica
Software/Lenguaje de Programación
Sistema Open Source
USO FÁCIL E INTUITIVO
www.arduino.cc
Seminario Arduino
¿Cómo surge Arduino?
2005 ->Instituto de Diseño Interactivo Ivrea (Italia)
David Cuartielles y Massimo Banzi
Problemas existentes
Limitación tecnológica
Usuario no experto
Plataformas existentes ->complejas, especializadas o cerradas
Limitación económica
Solución
Plataforma OpenSource
¡¡¡La comunidad Arduino tiene más de 120 mil
usuarios!!!!
Seminario Arduino
¿Por qué usar Arduino?
Sencilla Programación
Rápido Prototipado
Grabación mediante USB
Gran extensibilidad todo tipo de sensórica y
comunicaciones. “SHIELDS”
SHIELD: Módulo extra para añadir funciones:
Ethernet, Wifi, Zigbee, GPRS,…
Seminario Arduino
Placas: Arduino Fio y Nano
Fio
Orientado a aplicaciones inalámbricas
Atmega328P a 8MHz
14 Entradas/Salidas digitales
6 PWM
Pines de alimentación de 3.3V
Conector para baterías
Conector para módulos xbee
Nano
Idénticas características que Duemilanove
Alimentación a través de mini-USB
Pensado para aplicaciones embebidas
Seminario Arduino
Características entorno Arduino
Basado en C/C++
Librerías-> programación
por objetos (C++)
Serial.begin(9600);
Servo servo1;
Librerías familia AVR
Entorno propio de desarrollo
Seminario Arduino
Arduino IDE: configuración
Descargar la última publicación de la página web ->
www.arduino.cc
Descomprimir fichero
Conectar Arduino mediante USB
Si los drivers no se instalan automáticamente, instalar
manualmente en …/arduino/drivers
Ejecutar aplicación
Seleccionar el puerto serie
Seleccionar la placa Arduino en uso
Seminario Arduino
Programación
Estructura:
setup( )
Al inicio de un programa
Inicia variables, configura los pins, librerías, ...
loop()
Función principal del programa
Bucle infinito
Estructuras de control, operadores, tipos de datos…
C/C++
Constantes propias
HIGH/LOW
INPUT/OUTPUT
Seminario Arduino
Funciones E/S
Funciones E/S digitales:
pinMode(pin, modo); Inicialización
digitalWrite(pin, estado); Activación de una salida
Val=digitalRead(pin); Lectura de una entrada
Funciones E/S analógicas y PWM:
analogWrite(pin, valor); Salida en PWM
Val=analogRead(pin); Entrada
Val= map(Val,init,fin,init2,fin2) Mapear valor
Función espera:
delay(ms) Retraso en milisegundos
Seminario Arduino
UART
Arduino Uno
Serial: Pines 0 (Rx) y 1 (Tx) -> compartido con USB
Arduino Mega
Serial: Pines 0 (Rx) y 1 (Tx) -> compartido con USB
Serial1: Pines 19 (Rx) y 18 (Tx)
Serial2: Pines 17 (Rx) y 16 (Tx)
Serial3: Pines 15 (Rx) y 14 (Tx)
Funciones
byte=Serial.read(); Recepción serie
Serial.print(a)/Serial.println(a); Imprimir en pantalla
Serial.write(a); Envío de un dato
Serial.begin(baudios); Inicialización serie
num=Serial.available(); Comprobar si hay datos
Serial.end();
Seminario Arduino
Interrupciones
Externas
Arduino Uno
0 (pin digital 2)
1 (pin digital 3)
Arduino Mega
0 (pin digital 2)
1 (pin digital 3)
2 (pin digital 21)
3 (pin digital 20)
4 (pin digital 19)
5 (pin digital 18)
Seminario Arduino
Interrupciones
Externas
attachInterrupt(interrupción, función, modo)
interrupción-> número interrupción
0 o 1 -> Arduino Uno
0 a 5 -> Arduino Mega
función-> función a la que se salta cuando ocurre
modo-> cuándo ocurre
LOW-> pin está a valor bajo (LOW)
CHANGE-> pin cambia de valor
RISING-> pin pasa de valor bajo (LOW) a alto (HIGH)
FALLING-> pin cambie de valor alto (HIGH) a bajo (LOW)
Seminario Arduino
Timers
Librerías
Timer1 -> http://www.arduino.cc/playground/Code/Timer1
Descargar y copiar librería al directorio „/arduino-
1.0/libraries/‟
Incluirla en la clase principal (.ino)
#include <TimerOne.h>
Uso básico
Timer1.initialize(periodo);//iniciar timer con tiempo en ms
Timer1.attachInterrupt(función,periodo);//llamada a interrupción
al desbordarse el timer (periodo opcional)
Precisión
Timer1->16 bits (65536) y el preescaler /256 (16MHz/256)
=65536/62500 = 1.048576s
Seminario Arduino
PROGMEM
Utilizar memoria flash para almacenar y leer
variables
No se pueden grabar datos durante ejecución, sólo
lectura
Incluir en cabecera
#include <avr/pgmspace.h>
Guardar datos en memoria
char array[] PROGMEM={“hola”};
Leer (byte a byte en un bucle)
char=pgm_read_byte(&array[pos]);
Seminario Arduino
EEPROM
Escribir/leer en memoria EEPROM
Arduino Uno-> 1kB
Arduino Mega-> 4kB
#include <EEPROM.h>
EEPROM.write(dirección, valor);//valor de 0 a 255
Dirección de 0-1023: Arduino Uno
Dirección de 0-4095: Arduino Mega
EEPROM.read(dirección);//lee un byte de una
posición
100.000 ciclos lectura/escritura
Permite uso durante ejecución
Seminario Arduino
SPI
Arduino como maestro
Arduino Uno
10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK)
Arduino Mega
50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS)
Funciones
#include <SPI.h>
SPI.begin();//Iniciar librería SPI
SPI.transfer(byte);//Envía/recibe un byte vía SPI
SPI.setClockDivider(divisor);//Divisor de reloj relativo al reloj del
sistema
Seminario Arduino
SPI
SPI.setDataMode(modo);//polaridad y fase
Modo Polaridad Fase reloj
reloj
SPI_MODE 0 0
0
SPI_MODE 0 1
1
SPI_MODE 1 0
2
SPI_MODE 1 1
SPI.setBitOrder(orden);//orden bits
3
LSBFIRST
MSBFIRST
SPI.end();
Seminario Arduino
Wire
Comunicación I2C
Arduino Uno
A4 (SDA) y A5 (SCL)
Arduino Mega
20 (SDA) and 21 (SCL)
Funciones
Wire.begin(dirección);//unirse bus I2C->dirección esclavo
7 bits opcional, si no se especifica es maestro
Wire.beginTransmission(dirección);//empezar a
comunicarse con esclavo
Wire.write(val);//datos a enviar
Seminario Arduino
Wire
Wire.endTransmission();//fin
Retorno Significado
0 Éxito
1 Datos no entran en búfer de tx
2 NACK en tx. de la dirección
3 NACK en tx. de los datos
4 Otro
Wire.requestFrom(dirección,cantidad);//pedir datos al
esclavo
Wire.available();//cantidad de datos
Wire.read();//leer un byte
Interrupciones de servicio
Seminario Arduino
Shield desarrollada
Conexiones
LDR: pin A0
Led rojo: pin 3
Led amarillo: pin 5
Led verde: pin 6
Pulsador 1: pin 4
Pulsador 2: pin 7
RFID: pin RX
Jumper desconectado para grabación
Jumper conectado para ejecución
No conectar el jumper
en los pines superiores
Seminario Arduino
Ejercicios
Desarrollar una aplicación que obtenga datos de un
sensor de luz (LDR) y active un led
proporcionalmente al reducir la iluminación.
Desarrollar una aplicación que lea 2 tarjetas
RFID, de forma que al pasar una de ellas encienda
los leds, y al pasar la otra los apague.
Seminario Arduino