Curso de Arduino

Enlaces de interés

Herramientas para niños

  • Snap: programación visual.
  • Snap4Arduino: modificación de Snap para usarlo con Arduino usando Firmata.
  • ArduBlock: extensión de programación visual para Arduino.
  • Tinkercad: diseño 3D online para impresión.

Contenido

  • Los microcontroladores
  • Instalación de Arduino
  • Características del Arduino
  • Usos del Arduino
  • Historia del Arduino
  • LEDs
  • Electricidad
  • Electrónica
  • Programación
  • Entradas digitales y analógicas
  • Botones
  • Comunicación serie
  • PWM (Pulse Width Modulation)
  • Sensores y actuadores
  • Memoria EEPROM
  • Alimentación
  • Introducción a Tinkercad Circuits
  • Relés
  • Motores
  • Engranajes
  • Teclado matricial
  • Registro de desplazamiento
  • Sonido (librería Mozzi)
  • Altavoces piezoeléctricos
  • MIDI
  • Sistemas numéricos
  • Tipos de Arduino
  • Processing
  • Comunicación WiFi
  • Conexión a una API
  • Otros métodos de comunicación
  • Raspberry Pi y otros
  • Haciendo la compra
  • Proyecto final

1. Introducción

Instalación del IDE

2 opciones

Web Editor (Create)

siempre actualizado, nuestros programas en la nube, más lento

Arduino software

el de toda la vida, instalado o como archivo portátil

Controlando el parpadeo de un LED

void setup() {
  // Esto sólo se ejecutará una vez
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  // Todo lo que esté dentro de loop se repetirá indefinidamente
  
  int sensorValue = analogRead(A0);
  delay(1);
  
  digitalWrite(LED_BUILTIN, HIGH);   // enciende el LED (5v)
  delay(sensorValue);                // espera
  
  digitalWrite(LED_BUILTIN, LOW);    // apaga el LED (0v)
  delay(sensorValue);
}

Ejemplos de proyectos realizados con Arduino (o similares)

Impresoras 3D

Instalaciones interactivas

Controladores

MIDI

Sintetizadores

Robots

Domótica

Wearables, IoT, biosensing, prototipado, drones...

2. Primeros Pasos

Los LED apenas tienen resistencia interna y por tanto es necesario añadir una resistencia en serie que en este caso es de 330 ohmios. Más adelante veremos cómo se hace el cálculo.

Electricidad

+

-

La diferencia de potencial (Voltios) equivale a la diferencia de altura.

 

La Intensidad de corriente (Amperios) equivale al caudal.

 

La Resistencia (Ohmios, Ω) equivale al ancho del tubo.

Arduino Uno trabaja a 5V

Sus salidas proporcionan hasta 40mA cada una (recomendado 20mA)

Ley de Ohm

V = IR
V=IRV = IR

Cortocircuito: cuando la resistencia es nula, la corriente se dispara

I=\frac{V}{R}
I=VRI=\frac{V}{R}

Potencia (Watios)

P=I\times{V}
P=I×VP=I\times{V}

Leyes de Kirchhof

  • La suma de todas las corrientes que pasan por el nodo es igual a cero.
  • La suma algebraica de las diferencias de potencial eléctrico en un lazo es igual a cero.
i2+i3-i1-i4=0
i2+i3i1i4=0i2+i3-i1-i4=0
v1+v2+v3+v4=0
v1+v2+v3+v4=0v1+v2+v3+v4=0
\frac{1}{R_T}=\frac{1}{R_1}+\frac{1}{R_2}+\frac{1}{R_3}...
1RT=1R1+1R2+1R3...\frac{1}{R_T}=\frac{1}{R_1}+\frac{1}{R_2}+\frac{1}{R_3}...
R_T=R_1+R_2+R_3...
RT=R1+R2+R3...R_T=R_1+R_2+R_3...

Resistencias en serie y en paralelo

Para dos resistencias en paralelo:

R_T=\frac{R_1{R_2}}{R_1+R_2}
RT=R1R2R1+R2R_T=\frac{R_1{R_2}}{R_1+R_2}

Cálculo de la resistencia para un LED

Código de colores de las resistencias

Semáforo

Resistencias Pull-Up y Pull-Down

  • Los pines digitales configurados como entrada (por defecto) están en un estado de alta impedancia lo que provoca que sin entrada su valor fluctúa.
  • La solución es usar una resistencia para ponerlo a 5v (pull-up) o 0v (pull-down). 10kΩ es un buen valor.
  • O usar la resistencia pull-up integrada configurando el pin como INPUT_PULLUP

Display de 7 segmentos

El display del kit es un 5611AS de cátodo común o un 5611BS-8 de ánodo común.

Los pines 3 y 8 son del cátodo o ánodo común. Basta con conectar uno de ellos a tierra (cátodo) o a 5v (ánodo).

Es recomendable usar una resistencia en serie con cada pin no común para proteger los LEDs de sobrecargas.

  • El resto de pines los conectamos a los pines digitales del Arduino con una resistencia de 330Ohmios en serie. Es mejor evitar los pines 0 y 1 ya que se comparten con el puerto serie.
  • Usaremos la librería SevenSeg accesible desde el gestor de librerías (Programa -> Incluir Librería -> Gestionar Librerías)

3. Percibiendo el entorno

Sensor de luz (LDR)

Usaremos un divisor de tensión en el que una de las resistencias es el sensor

V_{out}=\frac{R_2}{R_1+R_2}\times{V_{in}}
Vout=R2R1+R2×VinV_{out}=\frac{R_2}{R_1+R_2}\times{V_{in}}

Conversión AD/DA

Es común añadir un pequeño retardo después de hacer una lectura con analogRead() para esperar a la conversión (<1ms)

PWM

analogWrite(pin, dutyCycle);

dutyCycle es un valor entre 0 y 255

pin es uno de los pins PWM: 3, 5, 6, 9, 10 o 11

Tamaños de variables

LED RGB

El componente que viene en el kit tiene resistencias incluidas así que no hace falta añadírselas.

Arduino y los microcontroladores

  • Arduino es una placa que incluye el microcontrolador ATmega328P y otros componentes.
  • ¿Qué es un microcontrolador o MCU? 

Es un circuito integrado programable, capaz de ejecutar las órdenes grabadas en su memoria. Está compuesto de varios bloques funcionales, los cuales cumplen una tarea específica. Incluye en su interior las tres principales unidades funcionales de una computadora: unidad central de procesamiento, memoria y periféricos de entrada/salida.

  • Pines I/O Digitales: 14 (6 con PWM)
  • Pines de Entrada Analógicos: 6
  • Memoria Flash: 32 KB de los cuales 0.5 KB son usados por el bootloader
  • SRAM: 2 KB
  • EEPROM: 1 KB
  • Velocidad del reloj: 16 MHz
  • Largo: 68.6 mm
  • Ancho: 53.4 mm
  • Peso: 25 g
  • Recomendado alimentación: 7~12V
  • Absoluto alimentación: 6~20V
  • Pines de Entrada/Salida (I/O): -0.5V~5.5V

Límites de voltaje

El Arduino trabaja a 5V y la corriente que se recomienda usar en los pines es de 20mA

  • Alimentado via USB: puede proporcionar hasta 500mA

  • Con fuente externa: hasta 1A

  • Cada pin de I/O: 40mA

  • Suma de todos los I/O combinados (corriente suministrada y absorbida): 200mA

  • Pin de 3.3v: 50mA

Límites de corriente

Especificaciones eléctricas

Correspondencia entre pines del ATmega328 y pines del Arduino

Pines especiales

  • Serie: 0 (RX) and 1 (TX)
  • Interrupciones externas: 2 y 3.
  • PWM: 3, 5, 6, 9, 10, and 11. Proporcionan PWM de 8-bit.
  • SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK).
  • LED incorporado: 13.
  • TWI: A4 o SDA y A5 o SCL pin.
  • AREF: Voltaje de referencia para las entradas analógicas
  • Reset: Poniéndolo a LOW resetea la placa
  • IOREF: Voltaje de referencia de la placa

Un proyecto abierto

Un pasado oscuro

  • Wiring, el orígen de todo. Tésis de Hernando Barragán desarrollada en 2004.
  • En 2005 ya era un éxito a nivel global
  • En 2005, Massimo Banzi, David Mellis y David Cuartielles, añadieron a Wiring soporte para ATmega8, un microcontrolador más barato.
  • Y después copiaron el código y lo publicaron bajo el nombre Arduino.
  • También empezaron a sacar sus prototipos de placas.
  • Más adelante, tras discusiones internas, Arduino se ha dividido en dos empresas, arduino.cc y arduino.org y por poseer una de ellas el trademark "Arduino" en Europa, ahora se vende como Genuino.

Almacenando datos

  • La placa dispone de un poco de memoria (1Kb en el caso de UNO) que puede usarse para guardar datos de forma permanente y recuperarlos más tarde.
  • Podemos acceder a esa memoria mediante la librería EEPROM. 

Opciones de alimentación

4. Motores y Control

Transistores

  • Los transistores varían su resistencia en función del voltaje que se les aplique, similar a un potenciómetro.
  • Se pueden usar para manipular corrientes y cargas superiores a los de la señal usada para su control.
  • También tienen otros usos como amplificadores, osciladores o rectificadores.

Controlando un motor DC

Cuidado con el dibujo del transistor que engaña

Relés

  • Un relé es un interruptor que podemos activar mediante una señal eléctrica.
  • Aísla completamente el circuito de control del de carga, que puede ser muy grande.
  • Es más lento que un transistor.

El componente incluye todo esto y un diodo para evitar sobrecargas

Servos

  • Los servos son motores que mantienen una posición en función de una entrada.
  • Suelen ser de 180º pero los hay de hasta 360º de giro.
  • Mantiene siempre la misma posición para la misma señal de entrada.
  • La velocidad de giro es proporcional a la distancia a recorrer.
  • Son muy poderosos para su tamaño (mucho torque).
  • Consumen poco y son bastante precisos.

Steppers (paso a paso)

  • Los motores permiten un control preciso del movimiento que hacen.
  • Se puede sincronizar su movimiento velocidad y aceleración, con gran facilidad.
  • Máximo par motor a bajas velocidades.
  • Consumen energía cuando están parados.
  • No se puede saber en qué posición están al arrancar sin un mecanismo externo.
  • El par o torque indica la capacidad del motor para mover objetos.
  • Tensión de alimentación y resistencia de las bobinas. Indica la intensidad de la corriente que absorbe en carga.
  • Cuantos más pasos por vuelta mayor precisión

Stepper 28BYJ-48

  • Unipolar de 5 hilos.
  • Tensión nominal: 5V - 12 V.
  • Fases: 4
  • Resistencia: 50 Ω.
  • Par motor de 34 Newton/m o 0,34 Kg/cm.
  • Consumo: unos 55 mA.
  • Recomendado usar secuencia de 8 medio pasos
  • Reductora de 1 / 64.
  • Ángulo de paso de 5.625°

Para dar una vuelta completa  haría falta dar 360/5.625 x 64 = 4096 pasos

PASO BOBINA 1 BOBINA 2 BOBINA 3 BOBINA 4
1 1 1 0 0
2 0 1 1 0
3 0 0 1 1
4 1 0 0 1

Formas de girar el stepper

Normal

Wave

Half

Se puede usar el motor 28BYJ-48 como bipolar simplemente no usando el cable rojo.

BIPOLAR UNIPOLAR
Mayor torque
Mayor anclaje debido a los embobinados
Más pequeño
Más barato
Un control más complicado, el cual requiere de una tarjeta que incluya etapas de control de giro y potencia
Menor torque
Menor anclaje
Tiene un mayor volumen
Más caro
Un control más sencillo al requerir solamente completar un circuito de alimentación

Usaremos el doble H-Bridge L293D para gobernar las dos bobinas del motor 

Interrupciones

El Arduino UNO puede definir dos interrupciones hardware llamadas 0 y 1, conectadas a los pines 2 y 3

  • LOW: la interrupción se dispara cuando el pin es LOW.

  • CHANGE: cuando pase de HIGH a LOW o viceversa.

  • RISING: flanco de subida (Cuando pasa de LOW a HIGH).

  • FALLING: flanco de bajada (Cuando pasa de HIGH a LOW).

attachInterrupt(interrupt, ISR, mode);

Permiten interrumpir el programa para atender un evento lo más rápido posible.

  • Las ISR (Interrupt Service Routine) o funciones callback no pueden devolver ningún valor.
  • Deben hacer algo rápido y salir para permitir que el programa continúe.
  • Hay que tener cuidado con las funciones que dependan de las interrupciones: Serial, delay(), millis()...
  • Es recomendable indicar al compilador que las variables que pueden ser cambiadas tanto por el programa principal como por la callback son "volatile" para evitar conflictos.

Mando a distancia de infrarrojos

AX-1838HS

Usaremos la librería IRLremote de Nico Hood disponible desde el gestor de librerías.

Los comandos recibidos están en hexadecimal y tendrán que ser mapeados a acciones.

Sistemas numéricos

Decimal Hexadecimal Binario
base 10 base 16 base 2
0,1,2,3,4,5,6,7,8,9 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F (o minúsculas) 0,1
255 0xFF B11111111
0 0x00 B00000000
127 0x0F B00001111
16 0x10 B00010000

5. Texto y Sonido

LCD controlado por I2C

  • I2C es un protocolo de control que usa 2 hilos, uno para transmitir los datos (SDA), y otro para indicar cuándo leer los datos (SCL).
  • Cada dispositivo conectado al bus I2C tiene su dirección de 7 bits (en teoría, podemos conectar 128 dispositivos).
  • Uno de los componentes debe actuar como master, controlando el reloj asíncrono (SCL).
  • También llamado IIC o TWI (Two Wire Interface).
  • Hay que saber si hay que añadir los pullups o vienen en el componente.

A4

A5

  • Necesitaremos saber cuál es la dirección de la pantalla para lo cual podemos usar el I2CScanner.
  • Para poder comunicar con la pantalla mediante I2C, hará falta instalar la librería LiquidCrystal I2C desde el gestor.
  • Las instrucciones que usaremos son de la librería LiquidCrystal.

Pantalla LCD por I2C

Texto

  1. Array de chars con un carácter nulo al final (\0): ocupa menos memoria.
  2. Instancia de la clase String: más versátil

LM35: Sensor de temperatura

Una de las librerías más potentes para generar sonidos o reproducir audio con Arduino

  • Para instalarla hace falta descargar un zip de su página que seleccionaremos en Programa -> Incluir Librería -> Añadir Librería .zip.
  • Viene con ejemplos bien documentados que combinan varios sensores con diferentes técnicas de síntesis y reproducción de sonido.
  • La librería  saca muestras por el pin 9 a una velocidad fija de 16384 Hz.
  • updateControl() y updateAudio() son obligatorias.
  • Es mejor no añadir nada a loop()

MIDI

  • El MIDI (Musical Instrument Digital Interface) es un protocolo utilizado universalmente para comunicar de una forma estandarizada instrumentos musicales digitales y otros dispositivos, independientemente del fabricante.
  • Las placas con el microcontrolador atmega32u4 disponen de conexión USB nativa y permiten usar la librería MIDIUSB. Lo mismo sucede con las placas ARM.
  • Para las demás está Arduino MIDI, disponible en el gestor como MIDI Library de Forty Seven Effects. (Y HIDUINO)
  • Para que el ordenador detecte al Arduino como un dispositivo MIDI necesitaremos un programa que convierta datos serie a MIDI. Hairless MIDI es una aplicación multiplataforma que cumple esta función.
  • Mientras el Serial Bridge esté encendido no podremos subir programas al Arduino.
  • Para comunicar con el ordenador es necesario cambiar los baudios de la comunicación serie a 115200.
  • Para probar el funcionamiento podemos usar un sintetizador online como el Viktor NV-1.
sudo modprobe snd-virmidi
  • Para crear un puerto virtual en el ordenador podemos usar LoopMIDI en el PC, Audio Midi Setup en Mac y el siguiente comando en Linux:

Arduino

Sensores

Hairless MIDI

Loop MIDI

Sintetizador VN-1

PC

V

Serie

MIDI

6. Processing y IoT

  • Herramienta de programación en la que se basaron Wiring y Arduino.
  • Simplifica la programación en Java para educación, diseño, arte...
  • Ha crecido mucho y se ha extendido a otros lenguajes y plataformas: JavaScript, Python, Android, ARM.

API (Application Programming Interface)

  • Es un conjunto de funciones y procedimientos mediante los cuales un software se puede comunicar con otro.
  • Existen muchas APIs online, muchas accesibles gratis y otras con tarifas dependiendo del uso que se les de.
  • Algunos ejemplos de servicios online con APIs públicas:

Ejemplo de URL que devuelve datos del tiempo:

http://api.openweathermap.org/data/2.5/weather?q=bilbao&appid=xxxxx

query

  • Las APIs devuelven información si se les envía una URL concreta con ciertos parámetros. Es similar a llamar una función en nuestro programa.
  • La información nos la dará normalmente en XML o JSON, siendo JSON (JavaScript Object Notation) el formato predominante hoy en día.

Respuesta del servidor (embellecida):

{
  "coord": {
    "lon": -2.93,
    "lat": 43.26
  },
  "weather": [
    {
      "id": 800,
      "main": "Clear",
      "description": "clear sky",
      "icon": "01d"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 26.46,
    "pressure": 1024,
    "humidity": 51,
    "temp_min": 26,
    "temp_max": 27
  },
  "visibility": 10000,
  "wind": {
    "speed": 0.78,
    "deg": 283.003
  },
  "clouds": {
    "all": 0
  },
  "dt": 1494932400,
  "sys": {
    "type": 1,
    "id": 5468,
    "message": 0.0329,
    "country": "ES",
    "sunrise": 1494909973,
    "sunset": 1494963037
  },
  "id": 3128026,
  "name": "Bilbao",
  "cod": 200
}

OpenWeatherMap API

Para usar cualquier API, hace falta crear un usuario con una clave de aplicación

También existen plataformas que simplifican el trabajo con las APIs, como por ejemplo Temboo.

Curso Arduino

By Roman Ljubimov

Curso Arduino

Curso de iniciación al Arduino y su programación.

  • 1,880