Curso de Arduino
Roman Ljubimov, 2017
Enlaces de interés
- Referencia de Arduino en castellano
- Tinkercad Circuits: Creación de esquemas en protoboard, simulación, programación Arduino y diseño de PCBs online. GRATIS
- Fritzing: Creación en protoboard y diseño de PCBs. GRATIS
- EveryCircuit: Creación y simulación de circuitos. DEMO o 15$
- Gear Generator: Generador de engranajes online. GRATIS
- Fusion360: Herramienta de diseño CAD/CAM/CAE 3D online. Para impresión 3D, corte láser, CNC... GRATIS para estudiantes, formadores y startups.
- 3D Hubs: Impresión 3D bajo demanda.
- hackster.io: Tutoriales
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
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
Cortocircuito: cuando la resistencia es nula, la corriente se dispara
Potencia (Watios)
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.



Resistencias en serie y en paralelo
Para dos resistencias en paralelo:
Cálculo de la resistencia para un LED
- Buscamos en las especificaciones el Forward Voltage (Vf) y la corriente máxima recomendada (IR)
- Usamos un calculador online
- O usamos las fórmulas anteriores sabiendo que Vf es la bajada de tensión que produce el LED. Guía
- Buscamos una resistencia estándar cercana o calculamos una combinación serie/paralelo de las que tenemos
- No debemos olvidarnos de la potencia que debe disipar la resistencia.

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
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
- Cualquiera puede montar su propio Arduino en un protobard.
- O soldar su propia placa.
- Código abierto en GitHub. Si algo no te gusta o quieres mejorar el software puedes hacer las modificaciones que quieras.
- Un montón de librerías contribuidas por los usuarios.
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
- Puerto USB
- Adaptador de corriente
- Cargador de móvil USB
- Batería portátil de móvil
- Fuentes de alimentación de PCs (ATX)
- Pilas de 9v
- Pilas estándar y de botón en serie
- Fuentes conmutadas Step Down
- Fuentes conmutadas Step Up



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
- Array de chars con un carácter nulo al final (\0): ocupa menos memoria.
- 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