Logo Elisava UVic UCC vertical negro

Julia Múgica Gallart

Crédito de ejercicios: Carles Araguz

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.

300

LOS MICROCONTROLADORES ESTÁN EN TODAS PARTES

microcontrollers everywhere

¿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.

luminaria interactiva
Luminaria interactiva
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.

low energy componentsII
3 · Herramientas básicas de prototipado

Construir de forma flexible y rápida un sistema para probar ideas, no para hacer un producto final.

arduino prototypingII
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

arduino inputs outputs
5 · Plataformas Open-Source / Open-Hardware

El diseño y el código son públicos.

Cualquiera puede modificar y reutilizar.

arduino open hardware and source

Arduino

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
Originales
Arduinos Originales
Clones
Clones de Arduino

Y más aqui

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!
  1. Código (50%)

  2. 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.

200
Conceptualización
200
Realización
200
Presentación
180
Prototipado

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.

arduino hardwareIII
Entradas y salidas digitales: sólo pueden tomar un valor binario.
  1. 0 volts = false = 0 = LOW

  2. 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.

    1. 0 volts = 0

    2. 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.

    1. 0 volts = 0

    2. 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.
  1. 0 volts = ground (GND)

  2. 5 volts = Máximo voltaje en Arduino

Software

¿Qué es un lenguaje de programación?
arduino que es programacionII
Arduino IDE
arduino ide
  1. Escribir nuestro código

  2. Comprobar sintaxis

  3. Cargar programa en Arduino

  4. Instalar/gestionar librerías

  5. Depurar el programa.

Link de descarga aquí

Programa vacío de Arduino

arduino loop example

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.

arduino variables
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:

  1. int mi_variable = 10; declara una variable de tipo entero

  2. mi_variable = 20; asigna un nuevo valor a la variable

  3. Podemos usar cualquier nombre de variable válido: el_nombre_de_variable_que_quiera_pero_que_haga_sentido

  4. Pero los nombres de variables deben ser descriptivos para que el código sea más fácil de entender

  5. El valor de la variable n va aumentando por 1 cada vez que se ejecuta el bucle loop().

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.

  1. 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.

  2. 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
  1. Instalar Arduino IDE

  2. Abre Arduino IDE

  3. Conecta la Arduino al ordenador

  4. Selecciona "Arduino UNO" en el Board Manager:

    arduino select board
  5. 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)

  6. En el loop, cada segundo representará un año:

    • La edad aumentará en 1 año

    • La altura disminuirá ligeramente

    • El nombre permanecerá igual

  7. 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

arduino danger

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).

arduino corriente
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).

arduino voltaje
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 (Ω).

arduino circuito electrico resistencia
arduino circuito electrico bosque
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.

arduino ley de ohm
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.

arduino corto circuito
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.

arduino 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

arduino protoboard image
Conexiones de la Protoboard
arduino 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 (Ω).

arduino resistencias
Código de colores
arduino resistencias colorcode

LED (Light emitting diode)

Convierte la energía eléctrica en energía lumínica (Actuador).

arduino led
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).

arduino led catodo anodo

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.

arduino salidas digitales

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:

arduino led circuito

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:

arduino 5leds circuito

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:

  1. true

  2. 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.

arduino boton

Hay de muchas formas y dimensiones, pero todos operan igual: cierran el circuito mecánicamente

arduino boton ejemplo circuito

Leer el estado de un botón

Se utilizan los puertos (pins) digitales de entrada

arduino entradas digitales
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:
arduino bottom circuit pulldown
  • 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

arduino boton con led circuito
  1. 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.

  2. Declara una variable int boton_value para almacenar el valor leído desde el botón.

  3. 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:

arduino 2botones 3leds circuito

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:

arduino pastillero arrays
Sintaxis de un array
arduino arrays
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.

arduino 5leds circuito
  1. Declara un array int pins[] con los pines de los 5 LEDs y configúralos como OUTPUT en el setup() usando pinMode().

  2. Declara una array de patrón con los valores que tú elijas:

    • Cada posición del array corresponde a un LED.

    • El valor 1 enciende el LED, el valor 0 lo apaga.

    int patron1[] = { , , , , };  // inventa tu patrón aquí
  3. Declara una variable int indice = 0 que usarás para acceder a cada posición de los arrays dentro del loop().

  4. En cada vuelta del loop(), usa digitalWrite() con pins[indice] y patron1[indice] para encender o apagar el LED correspondiente.

  5. 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 indicePatron sea 0 → se muestra patron1

  • Cuando indicePatron sea 1 → se muestra patron2

  • Cuando indicePatron sea 2 → se muestra patron3

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().

arduino buzzer
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.

arduino buzzer circuit
  • 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

inicio

Se ejecuta una sola vez al principio

int indice = 0

condición

Se evalúa antes de cada vuelta. Si es false, el loop termina

indice < 5

actualización

Se ejecuta al final de cada vuelta

indice = indice + 1


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.

arduino buzzer boton circuito

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 = 0 para saber qué patrón de alarma está activo.

Programa el código con las siguientes condiciones:

  1. En el loop(), usa un if() para reproducir el patrón correspondiente según el valor de numAlarma. Por ejmplo, cuando numAlarma sea 0, usa duraciones1 y silencios1.

  2. Cada patrón se reproduce con un for() loop que recorra el array completo. Dentro de cada vuelta del for():

    • Enciende el buzzer durante duraciones[i] milisegundos.

    • Apaga el buzzer durante silencios[i] milisegundos.

    • Lee el botón con digitalRead(). Si está presionado, avanza numAlarma en 1.

    • Si numAlarma es mayor a 2, reinícialo a 0.

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, for() loop y lectura del botón dentro del loop.

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.

arduino analog in
Lectura de inputs analógicos
inputs analogicos

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.

arduino potenciometro

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
arduino potenciometro 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);
\[output = \frac{(input - input_{min}) \times (output_{max} - output_{min})}{input_{max} - input_{min}} + output_{min}\]

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.

arduino potenciometro led circuito

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.

arduino potenciometro buzzer 3leds circuito

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:

  1. Lee el potenciómetro con analogRead() y conviértelo con map() a un rango de 0 a 300.

  2. Usa if para determinar en qué rango está el valor.

  3. 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().

  4. El buzzer debe sonar con ritmo diferente en cada rango (usa digitalWrite() y delay()).

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 map(), analogRead(), digitalWrite() y estructura if.

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

.PDF

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.

El documento tendrá máximo 1 página por propuesta (1 propuesta = 1 página). La propuesta deberá contener como mínimo:

1. Bocetos de contexto y concepto — descripción visual detallada del tipo de sistema electrónico que se quiere concebir, con su función y forma finales.
2. Lista de inputs — qué magnitudes se miden con sensores y qué tipo de interacción tiene el sistema.
3. Lista de outputs — qué cambios o acciones realiza el sistema sobre el entorno o la persona usuaria.
4. Referencias — URL e imágenes.

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.

.PDF

Ficha final del artefacto digital, prototipo en simulador y visualización del objeto al que representa (max. 1 página).

.INO

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%

  • Claridad y originalidad del concepto y su funcionamiento.

  • Visualización de la forma física del artefacto.

Código del Artefacto Digital

10%

  • Limpieza y claridad del código.

  • Comentarios detallados de su funcionamiento.

Presentación del Artefacto Digital

10%

Funcionamiento correcto y limpieza de presentación.