S00: Presentación
Objetivos
Durante este bloque vamos a aprender a construir sistemas físicos interactivos combinando sensores, código y actuadores mediante microcontroladores, a.k.a Physical Computing.
¿Qué es un microcontrolador?
Un microcontrolador permite que el código tenga efectos directos en el mundo físico.
Definición
-
Un microcontrolador es un pequeño ordenador de bajo consumo diseñado para ejecutar una tarea específica mediante un programa determinado.
-
Generalmente se encuentra integrado (embebido) dentro de un dispositivo, donde controla su comportamiento interactuando con diferentes componentes electrónicos.
LOS MICROCONTROLADORES ESTÁN EN TODAS PARTES
¿De qué va la asignatura?
1 · Programación de electrónica interactiva
Programar un microcontrolador para que perciba el entorno, tome decisiones y responda en tiempo real.
2 · Componentes electrónicos de baja potencia
Componentes diseñados para funcionar con muy poco consumo energético.
Funcionan especialmente bien para sistemas autónomos y portables.
3 · Herramientas básicas de prototipado
Construir de forma flexible y rápida un sistema para probar ideas, no para hacer un producto final.
4 · Sensores y actuadores (compatibles con Arduino)
Sensores Permiten percibir inputs del entorno.
Actuadores Permiten actuar sobre el mundo físico.
Sensores + código + actuadores = sistemas interactivos
5 · Plataformas Open-Source / Open-Hardware
El diseño y el código son públicos.
Cualquiera puede modificar y reutilizar.

Arduino
-
Microcontrolador de baja potencia al que se le envían instrucciones.
-
Programable de codigo abierto.
-
Capaz de leer entradas (sensor de luz, presión de un botón) y convertirlas en salidas (activar un motor, encender un led).
-
Hace a los objetos interactivos.
¿Por qué Arduino?
Familias Arduino
Proyectos con Arduino
El diseño puede aplicarse tanto a la construcción de productos funcionales, como a la reflexión crítica sobre la manera en la que nos relacionamos con los objetos.
HELIOS TOCH - James Vanderpant
Iluminación modular sensible al tacto
TIME SAVER – Adrián Pascual
¿Somos conscientes del tiempo que malgastamos consumiendo contenido vacío y de la cantidad de veces que el móvil interrumpe nuestro día a día?
Arduino como herramienta (creativa) para controlar otros dispositivos, materiales, procesos…
LO-FI WOODEN PIXELS DISPLAY
Bloques analógicos de madera que actúan como píxeles digitales.
CHRONOS & KAIROS - Axel Bluhme
BASURERO INTELIGENTE
Prototipo de basurero interactivo
Otros proyectos
Evaluación
BLOQUE II – 50 % de la nota final
¿Qué hay que hacer?
-
20 % — Experimentación con sistemas de sensores y microcontrolador (no recuperable)
-
Ejercicios semanales de conexión de Arduino y programación.
-
Puntualidad y participación activa en clase (se pasará lista al inicio).
-
Seguimiento continuo del proceso y del artefacto digital, incluyendo las entregas programadas.
-
-
30 % – Prototipado y programación de un artefacto digital/electrónico basado en Arduino (recuperable)
-
(.PDF) Conceptualización y propuesta de realización: originalidad, complejidad y aplicabilidad.
-
(.INO) Código fuente: estructura, legibilidad, documentación y eficiencia.
-
(----) Entrega física del prototipo + Material gráfico de soporte.
-
Ejercicios semanales
Se entregan cada semana…duh!
-
Código (50%)
-
Vídeo de la arduino ejecutando el código con las conexiones correctas (50%)
Patrón de nomenclatura:
-
eX_Y_gN.ino
-
eX_Y_gN.mp4
Ejemplo: e1_2_g5.ino (Ejercicio 1.2 del Grupo 5)
Consideraciones importantes
-
Solo con justificante válido se permitirá la entrega del ejercicio semanal al final del curso.
-
El uso de funciones, estructuras o fragmentos de código no vistos en clase se considerará equivalente a un trabajo no presentado. Esto incluye trabajos realizados total o parcialmente mediante Inteligencia Artificial Generativa.
-
Asistencia != puntualidad.
-
La asistencia se evaluará a partir de la participación en clase.
-
La no puntualidad o no asistencia a clase solo podrá justificarse mediante un justificante válido.
Artefacto Digital
Un demostrador tecnológico que ilustre, replique o implemente la funcionalidad de un objeto digital/electrónico, sin necesidad de reproducir la forma o materiales del mismo.
Objetivo del Artefacto Digital
-
Concebir un sistema digital, implementado a partir de módulos compatibles con Arduino vistos en clase.
-
Seleccionar e integrar tecnologías de sensores y actuadores en un prototipo de producto funcional.
-
Programar el código que implementa la función del artefacto.
Realización
-
Prototipado a nivel electrónico (componentes, módulos comerciales, cableado, sistema de alimentación, etc.)
-
Código fuente de Arduino.
-
Material gráfico de soporte visual.
Materiales
Puedes encontrar la lista de materiales AQUÍ
Calendario
Horarios
-
Del 9 de febrero al 9 de marzo:
-
Lunes 9:30h - 11h - Grupo 1
-
Lunes 11:30h - 13h - Grupo 2
-
-
Del 16 de marzo al 18 de mayo
-
Lunes 9:15 a 11:15h - Grupo 1
-
Lunes 12h a 13:30h - Grupo 2
-
Plan por semanas
| Semana | Fecha | Contenido | Entregas |
|---|---|---|---|
S01 |
02/feb |
Presentación |
— |
S02 |
09/feb |
Introducción a Arduino, programación y variables |
Ejercicios semanales |
S03 |
16/feb |
Festivo |
— |
S04 |
23/feb |
Fundamentos de electrónica y Hello World |
Ejercicios semanales |
S05 |
02/mar |
Estructuras de control y Botón |
Ejercicios semanales |
S06 |
09/mar |
Arrays |
Ejercicios semanales |
S07 |
16/mar |
Estructuras de control II y Buzzer |
Ejercicios semanales |
S08 |
23/mar |
Inputs analógicos: Potenciómetro |
Ejercicios semanales |
S09 |
06/abr |
Festivo |
|
S10 |
13/abr |
Inputs analógicos: LDR y outputs analógicos |
Ejercicios semanales y Propuesta de Artefacto Digital |
S11 |
20/abr |
Outputs analógicos |
Ejercicios semanales |
S12 |
27/abr |
Expandiendo Arduino (I) |
Ejercicios semanales |
S13 |
04/may |
Expandiendo Arduino (II) |
Ejercicios semanales |
S14 |
11/may |
Seguimiento de Artefacto |
— |
S15 |
18/may |
Seguimiento de Artefacto |
— |
S16 |
01/jun |
Evaluación |
Entrega de Artefacto Digital |
S01: Introducción a Arduino
Recordemos: Una arduino es un microcontrolador de baja potencia al que se le envían instrucciones, capaz de leer entradas y convertirlas en salidas.
Hardware
La manera de interactuar con sensores y actuadores es a través de señales eléctricas de voltaje.
-
Los puertos (o pines) de entrada leen un voltaje generado externamente.
-
Los puertos (o pines) de salida generan una señal de voltaje internamente.
Entradas y salidas digitales: sólo pueden tomar un valor binario.
-
0 volts = false = 0 = LOW
-
5 volts = true = 1 = HIGH
Entradas analógicas: Permiten leer valores continuos.
-
Arduino convierte un voltaje (normalmente entre 0 y 5 volts) en un número entero positivo.
-
0 volts = 0
-
5 volts = valor máximo (1023 en Arduino Uno)
-
Salidas analógicas: Permiten controlar valores graduales.
-
Arduino convierte un valor entre 0 y 255 en una señal de salida.
-
0 volts = 0
-
5 volts = 255
-
-
Estos puertos están etiquetados con el símbolo ~
Puertos de alimentación: Sirven para distribuir energía a los componentes conectados a Arduino.
-
0 volts = ground (GND)
-
5 volts = Máximo voltaje en Arduino
Software
¿Qué es un lenguaje de programación?
Arduino IDE
-
Escribir nuestro código
-
Comprobar sintaxis
-
Cargar programa en Arduino
-
Instalar/gestionar librerías
-
Depurar el programa.
Link de descarga aquí
Programa vacío de Arduino

void setup(){
// put your setup code here, to run once:
}
void loop(){
// put your main code here, to run repeatedly:
}
setup() y loop()` son funciones predeterminadas en Arduino.
Una función es parte de un programa computacional que ejecuta un comando específico
Sintaxis en Arduino I
El lenguaje de programación de Arduino está basado en el lenguaje de programación c++
Arduino empaqueta funciones que facilitan la interacción con los pines, sensores y actuadores.
Variables
-
Una variable es una región de la memoria, a la que le asignamos un nombre para guardar un valor.
-
Es un contenedor de información.
-
Cada variable tiene un tipo (int, float, bool, etc.) que define qué valores puede almacenar.
Creación y uso de variables
int mi_variable = 10;
int el_nombre_de_variable_que_quiera_pero_que_haga_sentido = 42;
int n = 2;
function setup(){
}
function loop(){
mi_variable = 20;
n = n + 1;
}
Notas sobre el código:
-
int mi_variable = 10;declara una variable de tipo entero -
mi_variable = 20;asigna un nuevo valor a la variable -
Podemos usar cualquier nombre de variable válido:
el_nombre_de_variable_que_quiera_pero_que_haga_sentido -
Pero los nombres de variables deben ser descriptivos para que el código sea más fácil de entender
-
El valor de la variable
nva aumentando por 1 cada vez que se ejecuta el bucleloop().
Tipos de variables
La memoria es finita: cada “contenedor” tiene un valor mínimo y máximo.
Números enteros:
-
int numero = 20; -
unsigned int numero_positivo = 10; -
long numero_muy_muy_grande = 2000000000;
Números con decimales:
-
float numero_con_decimal = 3.1416; -
double mas_grande_y_más_preciso = 5.12345678987;
Caracteres:
-
char una_letra = 'h'; -
String una_frase = 'hola'
| Tipo | Tamaño (bits) | Valor mínimo | Valor máximo |
|---|---|---|---|
int |
16 |
-32,768 |
32,767 |
char |
8 |
-128 |
127 |
float |
32 |
3.4e-38 (aprox) |
3.4e+38 (aprox) |
long |
32 |
-2,147,483,648 |
2,147,483,647 |
unsigned char |
8 |
0 |
255 |
unsigned int |
16 |
0 |
65,535 |
Comunicación por Texto (Serial)
Details
Mostrar mensajes de texto por el terminal serie con la clase Serial.
-
Primero configuramos la transmisión (sólo una vez, dentro de setup)
void setup{ Serial.begin(baudrate) }Los baud-rates (velocidad de bits) más comunes son: 9600 , 19200, 115200.
-
Luego, en nuestro loop, podemos escribir tantos mensajes como queramos:
int una_variable = 42; void loop(){ Serial.println("mensaje con final de línea"); Serial.print("mensaje sin final de línea"); Serial.println(una_variable); // Podemos agregar la función delay(ms) que hace que el loop se detenga por x cantidad de milisegundos: delay(1000) // el loop se detiene por 1 segundo. }
Ejercicio (e_1_1): Variables
En este ejercicio declararemos y actualizaremos variables de diferentes tipos en Arduino, e imprimiremos sus valores por el Serial Monitor de forma repetitiva, cada segundo.
Entrega
Sube a Teams, en la carpeta 'BLOQUE_II/e1_1_variables' un archivo comprimido .zip que contenga:
Código de Arduino (.ino)
Grabación de pantalla mostrando los valores impresos en el Serial Monitor (.mp4)
Nomenclatura de archivos:
-
Archivo comprimido:
e_1_1_N.zip-
Código:
e_1_1_N.ino -
Video:
e_1_1_N.mp4
-
Donde N es tu número de equipo.
Instrucciones
-
Instalar Arduino IDE
-
Abre Arduino IDE
-
Conecta la Arduino al ordenador
-
Selecciona "Arduino UNO" en el Board Manager:
-
Escribe un programa en el que haya las siguientes variables:
-
Edad persona 1: (un entero)
-
Altura persona 1: (con decimales)
-
Nombre persona 1: (una cadena de texto)
-
Edad persona 2: (un entero)
-
Altura persona 2: (con decimales)
-
Nombre persona 2: (una cadena de texto)
-
-
En el
loop, cada segundo representará un año:-
La edad aumentará en 1 año
-
La altura disminuirá ligeramente
-
El nombre permanecerá igual
-
-
El programa debe imprimir estos valores en el Serial Monitor con el siguiente formato de ejemplo:
Serial.print("Nombre: "); Serial.println(nombre1); Serial.print("Edad: "); Serial.println(edad1); Serial.print("Altura: "); Serial.println(altura1); Serial.print("Nombre: "); Serial.println(nombre2); Serial.print("Edad: "); Serial.println(edad2); Serial.print("Altura: "); Serial.println(altura2);
Pistas
/* Declarar variables antes de setup() */
int edadAna = 20;
float = ...
String = ....
void setup{
//Inicializar Serial
Serial.begin(9600);
}
void loop(){
// Actualizar las variables de forma lógica
edadAna = edadAna + 1;
// Mostrar los valores usando Serial.print() o Serial.println()
Serial.print("Edad:");
Serial.println(edadAna);
// Agregar un retardo entre iteraciones
delay(1000);
}
S02: Fundamentos de electrónica y Hello World
La energía eléctrica fluye a través de materiales conductivos, como los cables.
La energía eléctrica puede ser convertida en otras formas de energía: encender una luz o emitir un sonido por un altavoz.
Transductores
Los sensores convierten otras formas de energía en energía eléctrica.
Los actuadores convierten la energía eléctrica en otras formas de energía.
Circuito Eléctrico
Corriente (I)
Flujo de electrones a través de un material conductor.
Cuantos más electrones fluyan, más corriente.
La unidad de medida de la corriente es el Amperio (A).
Voltaje (V)
La diferencia de energía entre un punto del circuito y otro.
Los dispositivos de electrónica de consumo suelen trabajar a voltajes bajos (5V).
Resistencia ( R )
Capacidad de un dispositivo de oponerse al paso de la corriente.
Transforma la energía eléctrica en calor.
Permite controlar la corriente que circula en un circuito.
La unidad es el Ohm (Ω).
Ley de Ohm (I = V/R)
La corriente que circula en un circuito con una resistencia es directamente proporcional al voltaje e inversamente proporcional al valor de la resistencia.
Corto Circuito
…o circuito corto!
Ruta de baja resistencia para la corriente.
Esto sucede si conectamos el polo positivo y negativo, sin ningún componente entre los dos.
La energía eléctrica es convertida en calor y luz: explosión.
Circuito Abierto
Para que un circuito funcione se necesita un camino completo desde la fuente (alimentación, 5V), hasta el punto de menor energía (Ground).
SI el circuito pierde conexión entre sus materiales conductores, no fluye corriente: es un circuito abierto.
Componentes básicos
Protoboard
Una protoboard es una placa reutilizable que permite construir y probar circuitos electrónicos sin necesidad de soldar.
Permite:
-
Prototipar circuitos
-
Modificar conexiones fácilmente
Conexiones de la Protoboard
Para realizar las conexiones del circuito se utilizan jumper wires (cables puente) para llevar corriente de un punto a otro.
Resistencias
-
Limita la corriente en un circuito
-
Protege otros componentes
-
Convierte parte de la energía eléctrica en calor
-
Su valor se mide en ohmios (Ω).
Código de colores
LED (Light emitting diode)
Convierte la energía eléctrica en energía lumínica (Actuador).
Los LED son componentes polarizados: solo permiten que la corriente fluya en una única dirección.
-
La pata más larga (+) del LED se llama ánodo y se conecta a la alimentación (5V).
-
La pata más corta (-) se llama cátodo y se conecta a tierra (GND).

Sintaxis en Arduino II: Hello World
El Hello World en Arduino consiste en hacer parpadear un LED.
Blinking LED
Se utilizan los puertos (pins) digitales de salida.
En setup(), se configura un pin específico como salida:
void setup(){
pinMode(2, OUTPUT);
}
En este ejemplo, hemos configurado el pin 2 como salida.
Los pines digitales tienen dos estados posibles: HIGH y LOW
HIGH significa: “Hay voltaje en este pin", i.e. está a 5V respecto a GND.
LOW significa: “No hay voltaje en este pin”, i.e. está a 0V respecto a GND..
Cuando configuras un pin como OUTPUT y lo pones en HIGH usando digitalWrite(), estás encendiendo el pin.
void loop()){
digitalWrite(2, HIGH);
}
Cuando pones un pin configurado como OUTPUT en LOW, estás apagando el pin:
void loop()){
digitalWrite(2, LOW);
}
Si agregamos un delay entre un encendido y un apagado, podemos hacer un led que parpadee, a.k.a Hello World.
void setup(){
// Configuramos pin 2 como salida
pinMode(2, OUTPUT);
}
void loop()){
// Encendemos el pin 2
digitalWrite(2, HIGH);
// Detenemos el loop por 1 segundo
delay(1000);
// Apagamos el pin 2
digitalWrite(2, LOW);
// Detenemos el loop por 1 segundo
delay(1000);
}
Vamos a conectar el circuito en la Arduino Física:
Ejercicio (e_2_1): LED Runner
En este ejercicio practicaremos conectar un circuito con 5 LEDs y programaremos una secuencia en la que la luz avanza y retrocede, controlando el encendido y apagado de cada LED con una velocidad ajustable mediante una variable.
Entrega
Sube a Teams, en la carpeta 'BLOQUE_II/e2_1_LedRunner' un archivo comprimido .zip que contenga:
Código de Arduino (.ino)
Grabación de pantalla mostrando el funcionamiento físico del circuito conectado (.mp4)
Nomenclatura de archivos:
-
Archivo comprimido: e_2_1_N.zip
-
Código: e_2_1_N.ino
-
Video: e_2_1_N.mp4
-
Donde N es tu número de equipo.
Instrucciones
Conecta un circuito con 5 LEDs en la protoboard y la Arduino.
Cada LED debe estar conectado a un pin digital distinto de la Arduino con su resistencia, y el circuito debe quedar referenciado a GND:
Programa una secuencia en la que los cinco LEDs se enciendan uno a uno de izquierda a derecha, apagándose cada LED antes de que se encienda el siguiente. Al alcanzar el quinto LED, la secuencia debe invertirse y continuar en sentido contrario (de derecha a izquierda), manteniendo el mismo comportamiento.
La velocidad de la secuencia debe poder modificarse mediante una variable:
int speed = 200;
Recuerda inicializar en el setup los pines como salidas:
void setup(){
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
....
...
..
}
Y utilizar digitalWrite() y delay() para encender y apagar los LEDs:
void loop()){
digitalWrite(2, HIGH);
delay(speed);
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
....
...
..
.
}
Extra!
Modifica el código para crear el efecto del “coche fantástico”:
Criterios de Evaluación
| Puntos | Criterio de evaluación |
|---|---|
1 |
Formato de entrega correcto (.zip en la carpeta indicada, nomenclatura exacta de archivos) |
2 |
Montaje correcto del circuito (5 LEDs con resistencias y conexión adecuada a pines digitales y GND) |
3 |
Funcionamiento de la secuencia izquierda - derecha - izquierda. |
3 |
Uso correcto de variables y funciones vistas en clase. |
1 |
Código ordenado y comentado. NO hay código que no se utilice. |
1 |
Trabajo extra |
NOTA: El uso de funciones, estructuras o fragmentos de código no vistos en clase se considerará equivalente a un trabajo no presentado.
S03: Estructuras de control I y Botón
Sintaxis en Arduino III: Condicional if-else
Una expresión booleana es una condición que sólo puede ser:
-
true -
false
Ejemplos
¿Cuáles de estas expresiones son booleanas?
Traigo puesto un jersey
10 < 5
Hoy es Lunes
20 >= 20
Hace calor
Condicional if()
El condicional if() nos permite preguntar si una condición es true o false
Si la condición es true, entonces se ejecuta una acción
if(Hoy es lunes) {
//Instrucciones si la condición es verdadera:
Aplaude de emoción
}
Condicional else()
Si la condición de if() no se cumple, aka es false, entonces se ejecuta otra acción con el condicional else()
Las dos posibilidades son mutuamente excluyentes:
if(Está lloviendo){
Usar paraguas
} else {
Usar gafas de sol
}
O usas paraguas o gafas de sol. Nunca ambas a la vez.
Si no utilizaramos el else(), la segunda acción dejaría de ser la alternativa a la primera y se volvería una acción independiente.
Usar gafas de sol
if(Está lloviendo){
Usar paraguas
}
En este caso, siempre llevas gafas de sol.
Si además llueve, también usas paraguas.
Operadores
Se utilizan para construir expresiones condicionales que se evalúan como verdaderas o falsas.
Tipos
| Operador | Definición |
|---|---|
> |
Verdadero si el valor de la izquierda es mayor que el de la derecha. |
< |
Verdadero si el valor de la izquierda es menor que el de la derecha. |
>= |
Verdadero si el valor de la izquierda es mayor o igual que el de la derecha. |
⇐ |
Verdadero si el valor de la izquierda es menor o igual que el de la derecha. |
== |
Igual que. Verdadero si ambos valores son iguales. |
!= |
. Verdadero si los valores son diferentes. |
Operadores lógicos
Se utilizan para combinar o modificar expresiones condicionales.
Tipos
| Operador | Definición |
|---|---|
AND (&&) |
Devuelve verdadero si todas las condiciones que conecta son verdaderas. |
OR (||) |
Devuelve verdadero si al menos una de las condiciones que conecta es verdadera. |
NOT (!) |
Invierte el valor de verdad de una condición. |
Componentes básicos II: Botón
Un botón es un componente que permite cerrar un circuito eléctrico cuando se acciona.
Hay de muchas formas y dimensiones, pero todos operan igual: cierran el circuito mecánicamente
Leer el estado de un botón
Se utilizan los puertos (pins) digitales de entrada
En setup(), se configura un pin específico como entrada:
void setup(){
pinMode(2, INPUT);
}
Los pines digitales tienen dos estados posibles: HIGH y LOW
-
HIGH: Está a 5V respecto a GND.
-
LOW: Está a 0V respecto a GND.
Cuando configuramos un pin como INPUT y leemos la entrada del pin, podemos saber si está o no presionado el botón.
Para leer el estado del botón utilizamos la función digitalRead().
void loop(){
//Nos dirá HIGH o LOW
digitalRead(2);
}
Más documentación sobre digitalRead() aquí.
Conectar un botón
Necesitamos una configuración que permita tanto alimentar el circuito como leer el estado eléctrico con un pin de entrada digital.
Circuito:
-
El pin de 5V de Arduino se usa como fuente de alimentación para el circuito del botón.
-
El pin 2 se configura como pin de entrada digital, por lo solo lee el voltaje presente en ese punto del circuito: 5V (HIGH) o 0V (LOW).
Ejercicio (e_3_1): Un botón y un LED
En este ejercicio conectaremos un circuito con un botón y un LED, y programaremos un código para que al presionar el botón, se encienda el LED.
Entrega
Sube a Teams, en la carpeta BLOQUE_II/e_3_1_BotonLed, un archivo comprimido .zip que contenga:
-
Código de Arduino (.ino)
-
Grabación del circuito funcionando (.mp4)
Nomenclatura de archivos:
-
Archivo comprimido: e_3_1_N.zip
-
Código: e_3_1_N.ino
-
Video: e_3_1_N.mp4
-
Donde N es tu número de equipo.
Este ejercicio cuenta como PARTICIPACIÓN en clase.
Instrucciones
Conecta un circuito con:
-
1 botón conectado al pin digital de entrada 2, a la alimentación con (5V) y a GND.
-
1 LED conectado al pin digital de salida 3 y a GND
-
Programa un código que encienda el LED mientras el botón esté presionado y lo mantenga apagado cuando el botón no esté presionado. Utiliza el condicional
if()para implementar esta lógica. -
Declara una variable
int boton_valuepara almacenar el valor leído desde el botón. -
Imprime en el
Serial Monitor"El LED está encendido" cuando se presiona el botón.
// Declaramos una variable para leer la entrada del botón
int boton_value;
void setup(){
// Configuramos pin 2 como salida para el botón
pinMode(2, INPUT);
// Configuramos pin 3 como entrada para el led
pinMode(3, OUTPUT);
}
void loop() {
// Leemos el estado del pin 2, y lo almacenamos en la variable boton_value
boton_value = digitalRead(2);
//El led está apagado en condiciones normales
digitalWrite(3, LOW);
// Implementamos el condicional if()
if(boton_value == HIGH){ // Si el botón está presionado
digitalWrite(3, HIGH); // enciende el led
Serial.println("El led está encendido");
}
}
Ejercicio (e_3_2): Dos botones y tres LED
En este ejercicio se conectarán tres LEDs y se controlará su comportamiento lumínicon dos botones.
Entrega
Sube al CAMPUS VIRTUAL un archivo comprimido .zip que contenga:
-
Código de Arduino (.ino)
Grabación del circuito funcionando, mostrando todas las funcionalidades (.mp4)
Nomenclatura de archivos:
-
Archivo comprimido: e_3_2_N.zip
-
Código: e_3_2_N.ino
-
Video: e_3_2_N.mp4
-
Donde N es tu número de equipo.
Instrucciones
-
2 botones conectados a los pines digitales de entrada 2 y 3, a la alimentación con 5V y a GND.
-
3 LED conectados a los pines digitales de salida 4,5,y 6.
-
Cada circuito debe quedar referenciado a GND:
Escribe un programa que controle dos botones y tres LEDs utilizando la estructura condicional if-else.
Primero declara las variables necesarias al inicio del código:
-
Variables para almacenar el estado de los botones (tipo
int). Estas variables guardarán el resultado de leer cada botón. -
Variables para controlar la velocidad de parpadeo de los LEDs (tipo
int). Usar una variable para definir el tiempo de encendido y apagado del parpadeo normal y otra para el parpadeo más rápido.
Programa el código con las siguientes condiciones:
-
Si se presiona solo el primer botón, el primer LED debe parpadear. Los otros dos LEDs deben mantenerse apagados.
-
Si se presiona solo el segundo botón, el segundo LED debe encenderse de forma fija, sin parpadeo. El primer y tercer LED deben mantenerse apagados.
-
Si se presionan los dos botones al mismo tiempo, el tercer LED debe encenderse con un parpadeo más rápido. Para este caso, utiliza el operador lógico
AND.
if(state_boton1 == HIGH && state_boton2 == HIGH){
// Instrucciones para que el tercer LED parpadee rápidamente.
}
-
Si no se presiona ningún botón, los LEDs se mantienen apagados.
Criterios de Evaluación
| Puntos | Criterio de evaluación |
|---|---|
1 |
Formato de entrega correcto (.zip en la carpeta indicada, nomenclatura exacta de archivos) |
2 |
Montaje correcto del circuito. |
3 |
Funcionamiento del ejercicio. |
3 |
Uso correcto de variables y funciones vistas en clase. |
1 |
Código ordenado y comentado. NO hay código que no se utilice. |
NOTA: El uso de funciones, estructuras o fragmentos de código no vistos en clase se considerará equivalente a un trabajo no presentado.
S04: Arrays
Sintaxis en Arduino IV Arrays (Arreglos)
En el lenguaje de Arduino, podemos organizar colecciones de N valores del mismo tipo y acceder a cada valor por su índice:
Sintaxis de un array
String semana[7] = {"lunes", "martes", "miercoles", "jueves", "viernes", "sabado", "domingo"};
int num_dias[7] = {9, 10, 11, 12, 13, 14, 15};
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Día: ");
Serial.print(semana[0]);
Serial.print(", ");
Serial.println(num_dias[0]);
}
Recorrer un array
Para acceder a cada valor dentro del array, podemos utilizar un índice que vaya aumentando su valor en cada vuelta del loop():
String semana[7] = {"lunes", "martes", "miercoles", "jueves", "viernes", "sabado", "domingo"};
int num_dias[7] = {9, 10, 11, 12, 13, 14, 15};
int indice = 0;
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Día: ");
Serial.print(semana[indice]);
Serial.print(", ");
Serial.println(num_dias[indice]);
delay(1000);
indice = indice + 1;
}
Ejercicio (e_4_1): Patrones de LEDs
En este ejercicio conectaremos 5 LEDs y programaremos tres patrones de encendido usando arrays y un índice.
Entrega
Sube a Teams, en la carpeta BLOQUE_II/e_4_1_PatronesLED, un archivo
comprimido .zip que contenga:
-
Código de Arduino (.ino)
-
Incluye como comentario al principio el nombre de las integrantes del equipo que participaron.
-
-
Grabación del circuito funcionando (.mp4)
Nomenclatura de archivos:
-
Archivo comprimido: e_4_1_N.zip
-
Código: e_4_1_N.ino
-
Video: e_4_1_N.mp4
-
Donde N es tu número de equipo.
Este ejercicio cuenta como PARTICIPACIÓN en clase.
Instrucciones
Conecta un circuito con:
-
5 LEDs conectados a los pines digitales de salida 2, 3, 4, 5 y 6 y a GND.
-
Declara un array
int pins[]con los pines de los 5 LEDs y configúralos comoOUTPUTen elsetup()usandopinMode(). -
Declara una array de patrón con los valores que tú elijas:
-
Cada posición del array corresponde a un LED.
-
El valor
1enciende el LED, el valor0lo apaga.
int patron1[] = { , , , , }; // inventa tu patrón aquí -
-
Declara una variable
int indice = 0que usarás para acceder a cada posición de los arrays dentro delloop(). -
En cada vuelta del
loop(), usadigitalWrite()conpins[indice]ypatron1[indice]para encender o apagar el LED correspondiente. -
Suma 1 al índice en cada iteración. Cuando el índice sea mayor a 4, reinícialo a 0.
int pins[] = {2, 3, 4, 5, 6};
int patron1[] = { , , , , };
int indice = 0;
void setup() {
// Inicializa como OUTPUT cada pin
}
void loop() {
// Usa digitalWrite para indicar al pin en turno su estado
// Detener el loop lo suficiente para que el pin mantenga su estado.
// Apagar el pin antes de pasar al siguiente
// Aumenta el valor de la variable "indice"
// Si el valor de indice es igual a 5, regresar su valor a 0.
}
Extra: PARA EL VIERNES 13 DE MARZO
Declara dos arrays adicionales con patrones de encendido distintos:
int patron2[] = { , , , , };
int patron3[] = { , , , , };
Añade una variable int indicePatron = 0 que cambie el patrón activo
automáticamente cada vez que indice complete un ciclo completo.
-
Cuando
indicePatronsea0→ se muestrapatron1 -
Cuando
indicePatronsea1→ se muestrapatron2 -
Cuando
indicePatronsea2→ se muestrapatron3
Cuando indicePatron llegue a 3, reinícialo a 0.
Este ejercicio se entrega por TEAMS en la misma carpeta BLOQUE_II/e_4_1_PatronesLED agregando un "extra" a la nomenclatura:
-
Archivo comprimido: e_4_1_N_extra.zip
-
Código: e_4_1_N_extra.ino
-
Video: e_4_1_N_extra.mp4
-
FECHA LÍMITE: Viernes 13 de marzo, 23:55h
S05: Buzzer y Estructuras de Control II
Componentes Básicos III: Buzzer
Un Buzzer o Zumbador es un actuador que convierte la energía eléctrica en sonido.
-
Contiene una membrana piezoeléctrica que vibra al recibir voltaje, generando sonido.
-
Activo — oscilador interno, frecuencia fija, solo necesita
digitalWrite(). -
Pasivo — sin oscilador, frecuencia variable, puede usar
tone().
Conexión de Buzzer en el circuito
-
Al igual que el LED, el buzzer tiene polaridad.
-
El lado
+se conecta al pin de salida, el lado-a GND.
-
Tiene resistencia interna que limita su consumo a ~7mA.
-
No necesita resistencia externa, a diferencia del LED.
Sintaxis de Arduino V: for() loop
El for() loop es una estructura de control que permite
ejecutar un bloque de código repetidamente con base en una condición específica.
La semana pasada recorrimos un array con un índice que sumábamos y reiniciábamos a mano.
Recordatorio: contador manual
int indice = 0;
void loop() {
digitalWrite(pins[indice], patron1[indice]);
delay(500);
digitalWrite(pins[indice], LOW);
indice = indice + 1;
if (indice == 5) {
indice = 0;
}
}
El for() resuelve eso: inicia, avanza y se detiene en la misma línea.
for ( inicio ; condición ; actualización ) {
// lo que se repite
}
| Parte | Qué hace | Ejemplo |
|---|---|---|
|
Se ejecuta una sola vez al principio |
|
|
Se evalúa antes de cada vuelta. Si es |
|
|
Se ejecuta al final de cada vuelta |
|
Uso de for loop I: no hay que reiniciar el índice
El for() termina solo cuando indice llega al límite, sin if() extra.
void loop() {
for (int indice = 0; indice < 5; indice = indice + 1) {
digitalWrite(pins[indice], patron1[indice]);
delay(500);
digitalWrite(pins[indice], LOW);
}
// cuando indice llega a 5, el for termina solo
}
Uso de for loop II: bloqueo secuencial
El for() permite que el código después del bloque solo se ejecuta cuando todas las iteraciones han terminado.
En este ejemplo, solo hasta que buzzer termina el LED se enciende:
int duraciones[] = {100, 300, 100, 500, 200};
void loop() {
for (int i = 0; i < 5; i=i+1) {
digitalWrite(8, HIGH);
delay(duraciones[i]);
digitalWrite(8, LOW);
delay(100);
}
// esto corre solo cuando las 5 iteraciones terminaron
digitalWrite(13, HIGH);
}
Ejercicio (e_5_1): LED y Buzzer con for() loop
En este ejercicio conectaremos un LED y un buzzer, y programaremos
dos for() loops en secuencia: primero el LED parpadea 3 veces,
y cuando termina, el buzzer reproduce un patrón de sonidos.
Entrega
Sube a Teams, en la carpeta BLOQUE_II/e_5_1_LedBuzzer, un archivo
comprimido .zip que contenga:
-
Código de Arduino (.ino)
-
Incluyir como comentario al principio el nombre de las integrantes del equipo que participaron.
-
-
Grabación del circuito funcionando (.mp4)
Nomenclatura de archivos:
-
Archivo comprimido: e_5_1_N.zip
-
Código: e_5_1_N.ino
-
Video: e_5_1_N.mp4
-
Donde N es tu número de equipo.
Este ejercicio cuenta como PARTICIPACIÓN en clase.
Instrucciones
Conecta un circuito con:
-
1 LED conectado al pin digital de salida 2 y a GND.
-
1 buzzer conectado al pin digital de salida 8 y a GND.
Programa un código que permita
// Declara un array con 5 duraciones en milisegundos (inventar las duraciones como querais).
int duraciones[] = { , , , , };
void setup() {
// Configura el pin 2 como OUTPUT (LED)
// Configura el pin 8 como OUTPUT (buzzer)
}
void loop() {
// FOR 1: escribe un for() que repita 3 veces lo siguiente:
// - Enciende el LED
// - Espera 300ms
// - Apaga el LED
// - Espera 300ms
// FOR 2: escribe un for() que recorra el array duraciones[] y haga:
// - Enciende el buzzer
// - Espera duraciones[i] milisegundos
// - Apaga el buzzer
// - Espera 100ms antes del siguiente sonido
}
Ejercicio (e_5_2): Alarmas con Buzzer y for() loop
En este ejercicio conectaremos un buzzer y un botón para programar tres
patrones de alarma distintos controlados por arrays y for() loops.
Entrega
Sube al CAMPUS VIRTUAL un archivo comprimido .zip que contenga:
-
Código de Arduino (.ino)
-
Incluye como comentario al principio el nombre de las integrantes del equipo que participaron.
-
-
Grabación del circuito funcionando, mostrando todas las funcionalidades (.mp4)
Nomenclatura de archivos:
-
Archivo comprimido: e_5_2_N.zip
-
Código: e_5_2_N.ino
-
Video: e_5_2_N.mp4
-
Donde N es tu número de equipo.
FECHA LÍMITE: viernes 20 de marzo, 23:59h
Instrucciones
Conecta un circuito con:
-
1 buzzer activo conectado al pin digital de salida 8 y a GND.
-
1 botón conectado al pin digital de entrada 2, a la alimentación con 5V y a GND.
Declara las variables necesarias al inicio del código:
-
Tres pares de arrays, uno de duraciones y uno de silencios, con valores distintos para cada alarma. Los valores son libres, pero cada alarma debe sonar claramente diferente a las otras dos:
int duraciones1[] = { , , , , };
int silencios1[] = { , , , , };
int duraciones2[] = { , , , , };
int silencios2[] = { , , , , };
int duraciones3[] = { , , , , };
int silencios3[] = { , , , , };
-
Una variable
int numAlarma = 0para saber qué patrón de alarma está activo.
Programa el código con las siguientes condiciones:
-
En el
loop(), usa unif()para reproducir el patrón correspondiente según el valor denumAlarma. Por ejmplo, cuandonumAlarmasea0, usaduraciones1ysilencios1. -
Cada patrón se reproduce con un
for()loop que recorra el array completo. Dentro de cada vuelta delfor():-
Enciende el buzzer durante
duraciones[i]milisegundos. -
Apaga el buzzer durante
silencios[i]milisegundos. -
Lee el botón con
digitalRead(). Si está presionado, avanzanumAlarmaen 1. -
Si
numAlarmaes mayor a2, reinícialo a0.
-
int duraciones1[] = { , , , , };
int silencios1[] = { , , , , };
int duraciones2[] = { , , , , };
int silencios2[] = { , , , , };
int duraciones3[] = { , , , , };
int silencios3[] = { , , , , };
int numAlarma = 0;
void setup() {
// Configura el pin 8 como OUTPUT (buzzer)
// Configura el pin 2 como INPUT (botón)
}
void loop() {
// Si numAlarma es igual a 0
// Para i = 0, hasta i < 3
// Enciende el buzzer durante duraciones1[i]
// Apaga el buzzer durante silencios1[i]
// Lee el botón. Si está presionado, suma 1 a numAlarma
// Si numAlarma > 2, reinícialo a 0
// Agrega un delay(300) después de cambiar de alarma
}
// Y así para el resto de numAlarma
....
....
....
}
Criterios de Evaluación
| Puntos | Criterio de evaluación |
|---|---|
1 |
Formato de entrega correcto (.zip en la carpeta indicada, nomenclatura exacta de archivos) |
2 |
Montaje correcto del circuito. |
3 |
Funcionamiento de los tres patrones de alarma con cambio de botón. |
3 |
Uso correcto de arrays, |
1 |
Código ordenado y comentado. NO hay código que no se utilice. |
NOTA: El uso de funciones, estructuras o fragmentos de código no vistos en clase se considerará equivalente a un trabajo no presentado.
S06: Inputs analógicos
Los pines analógicos de Arduino convierten un voltaje analógico a un rango de valores.
Lectura de inputs analógicos
analogRead(pin): Leer un voltaje de entrada en un puerto analógico.
int valor = analogRead(A0);
Valores de ejemplo que podemos obtener:
-
0 = 0 volts
-
1023 = 5 volts
-
512 = 2.5 volts
-
1 = 0.00488 volts
Documentación completa sobre analogRead aquí.
Potenciómetro
-
Un potenciómetro es un tipo de resistencia ajustable.
-
Al girarlo, cambia la cantidad de resistencia a la corriente.
-
Permite regular el voltaje en un circuito de forma gradual.
Para conectarlos al Arduino, el pin central se conecta a un input analógico y los dos del extremo se conectan a 5V y GND
Conexión de potenciómetro en el circuito
Código para leer el potenciómetro
// Declarar variable que guardará el valor recibido del potenciómetro.
int pot_value;
void setup() {
// Inicializar el monitor serial
Serial.begin(9600);
// Configurar el pin análogo A0 como INPUT
pinMode(A0, INPUT);
}
void loop() {
// Leer el valor del pin A0 y guardar en variable "pot_value"
pot_value = analogRead(A0);
// Imprimir el valor de la variable "pot_value".
Serial.println(pot_value);
}
Sintáxis en Arduino VI: map()
Función que transforma valores de un rango a otro.
int output = map(input, input_min, input_max, output_min, output_max);
Ejemplos!
map(2, 0, 10, 0, 100);
map(5, 0, 10, 0, 100);
map(5, 0, 10, 0, 50);
map(5, 0, 10, 100, 200);
map(5, 0, 10, 100, 0); // Invertido!
map(pot_value, 0, 1023, 0, 10);
Ejercicio (e_6_1): Potenciómetro y LED con map()
En este ejercicio conectaremos un potenciómetro para encender un LED únicamente cuando el potenciómetro supere el 50% de su recorrido.
Entrega
Sube a Teams, en la carpeta BLOQUE_II/e_6_1_PotLED, un archivo
comprimido .zip que contenga:
-
Código de Arduino (.ino)
-
Incluir como comentario al principio el nombre de las integrantes del equipo que participaron.
-
-
Grabación del circuito funcionando (.mp4)
Nomenclatura de archivos:
-
Archivo comprimido: e_6_1_N.zip
-
Código: e_6_1_N.ino
-
Video: e_6_1_N.mp4
-
Donde N es tu número de equipo.
Este ejercicio cuenta como PARTICIPACIÓN en clase.
Instrucciones
Conecta un circuito con:
-
1 LED conectado al pin digital de salida 2 y a GND.
-
1 potenciómetro con la patilla central conectada al pin analógico A0.
Programa un código siguiendo los siguientes comentarios:
// Declara variable globales para almacenar el valor del potenciómetro
int pot_value;
// Declara variable global para almacenar el valor mapeado del valor del potenciómetro
int pot_mapped;
void setup() {
// Configura el pin 2 como OUTPUT (LED)
// Configura el pin A0 como INPUT (potenciómetro)
}
void loop() {
// Lee el valor del potenciómetro (0–1023) con analogRead()
// Usa map() para convertir el valor leído del potenciómetro a un rango de 0 a 100
// Si el porcentaje es mayor que 50:
// - Enciende el LED
// Si no:
// - Apaga el LED
}
Ejercicio (e_6_2): Indicador de velocidad
En este ejercicio conectaremos un potenciómetro, tres LEDs y un buzzer para
simular un indicador de velocidad. Usaremos map() para convertir
la lectura analógica a un rango de 0 a 300, y según el nivel, se encenderán
más LEDs y el buzzer sonará con diferente ritmo.
Entrega
Sube al CAMPUS VIRTUAL un archivo comprimido .zip que contenga:
-
Código de Arduino (.ino)
-
Incluye como comentario al principio el nombre de las integrantes del equipo que participaron.
-
-
Grabación del circuito funcionando, mostrando todas las funcionalidades (.mp4)
Nomenclatura de archivos:
-
Archivo comprimido: e_6_2_N.zip
-
Código: e_6_2_N.ino
-
Video: e_6_2_N.mp4
-
Donde N es tu número de equipo.
FECHA LÍMITE: viernes 27 de marzo, 23:59h
Instrucciones
Conecta un circuito con:
-
3 LEDs conectados a los pines digitales de salida 2, 3 y 4, cada uno con su resistencia a GND.
-
1 buzzer activo conectado al pin digital de salida 5 y a GND.
-
1 potenciómetro con la patilla central conectada al pin analógico A0.
El comportamiento del circuito debe ser el siguiente:
| Rango (0–300) | LEDs | Buzzer | Situación |
|---|---|---|---|
0 – 99 |
1 LED fijo (pin 2) |
silencio |
Velocidad normal |
100 – 199 |
2 LEDs parpadeando lento (pins 2 y 3) |
pita lento (200ms on, 200ms off) |
Velocidad alta |
200 – 300 |
3 LEDs parpadeando rápido (pins 2, 3 y 4) |
pita rápido (50ms on, 50ms off) |
Velocidad peligrosa |
Programa el código con las siguientes condiciones:
-
Lee el potenciómetro con
analogRead()y conviértelo conmap()a un rango de 0 a 300. -
Usa
ifpara determinar en qué rango está el valor. -
En cada rango, enciende los LEDs que toquen y apaga los que no. Los LEDs deben parpadear junto con el buzzer usando el mismo
delay(). -
El buzzer debe sonar con ritmo diferente en cada rango (usa
digitalWrite()ydelay()).
Criterios de Evaluación
| Puntos | Criterio de evaluación |
|---|---|
1 |
Formato de entrega correcto (.zip, nomenclatura exacta de archivos) |
2 |
Montaje correcto del circuito (tres LEDs, buzzer y potenciómetro en los pines indicados) |
3 |
Funcionamiento correcto de los tres niveles: LEDs y buzzer responden al potenciómetro. |
3 |
Uso correcto de |
1 |
Código ordenado y comentado. No hay código que no se utilice. |
NOTA: El uso de funciones, estructuras o fragmentos de código no vistos en clase se considerará equivalente a un trabajo no presentado.
Artefacto Digital
30% Prototipado y programación de un artefacto digital/electrónico basado en Arduino (recuperable)
Objetivos
-
Prototipar un artefacto digital con Arduino sin tener que desarrollar su forma física
-
El artefacto debe tener como MÍNIMO un sensor y dos actuadores.
-
Programar el código necesario para que el artefacto cumpla su función
-
Visualizar la forma física que podría tener el objeto y describir cómo se integraría en ella la funcionalidad desarrollada
Componentes posibles
Actuadores:
-
LED
-
LED rgb
-
Tira de LEDs
-
Buzzer (pasivo o activo)
-
Servomotor
-
Motor de vibración
Sensores:
-
Botón
-
Potenciómetro
-
LDR
-
Rotary Encoder
-
Sensor de temperatura/humedad
-
Sensor de sonido
Primera Entrega: 13 de abril de 2026
Detalles de entrega
Formato |
|
Contenido |
Propuesta de realización del artefacto digital. |
Descripción |
Describir la propuesta de realización del artefacto digital y el objeto al que representa. |
Fecha límite |
13 de abril de 2026 |
IMPORTANTE: Si no se entrega la propuesta, no será posible realizar la entrega final del proyecto. El equipo se va directo a recuperación.
Entrega Final: 1 de junio de 2026
Detalles de entrega
Formato |
Descripción |
Presentación presencial |
Presentación del prototipo físico del Artefacto Digital. |
|
Ficha final del artefacto digital, prototipo en simulador y visualización del objeto al que representa (max. 1 página). |
|
Código de Arduino implementado para la funcionalidad del artefacto. |
Fecha |
01 de junio de 2026 |
Criterios de evaluación
Detalles de evaluación
| Entrega | Porcentaje | Criterio |
|---|---|---|
Propuesta de realización del Artefacto Digital |
TRUE/FALSE |
Claridad y originalidad del concepto y su funcionamiento. |
Propuesta de realización y Ficha final del Artefacto Digital |
10% |
|
Código del Artefacto Digital |
10% |
|
Presentación del Artefacto Digital |
10% |
Funcionamiento correcto y limpieza de presentación. |