Introducción
El ramo de Robótica e IOT de la Universidad de Viña del Mar, está enfocado en enseñar conceptos introductorios de robótica e IOT para alumnos de cuarto año de la carrera de Ingeniería civil informática.
El ramo está basado en el aprendizaje por proyectos con la herramienta ESP32.
Se recomienda que los proyectos sean realizados en grupos de máximo 3 integrantes.
Proyecto 1: Comunicación bi-direccional
El proyecto consiste en conectar una ESP32 a un computador via USB (serial) y realizar una comunicación bi-direccional.
Al precionar un botón en el ESP32 el computador debe ejecutar una tarea (como abrir un programa, subir volumen, etc). Luego el computador debe enviar una señal al ESP32 para encender el LED.
Proyecto 2: Lectura de sensores
El proyecto consiste en una ESP32 con un sensor de proximidad y un parlante pequeño. Se debe crear un prototipo de alarma que gatille un sonido al detectar un elemento cercano.
Adicionalmente se debe conectar este sensor a un servomotor que es controlado desde Home Assistant.
Finalmente se debe configurar un servidor de Grafana que muestra un histórico de las lecturas obtenidas por el sensor.
Aprendizajes
-
Configuración y uso de WIFI en ESP32.
-
Uso de sensores avanzados y servomotores.
-
Configuración y uso de Home Assistant.
-
Configuración y uso de Grafana.
Restricciones y entregables
-
Grafana y Home Assistant debe ejecutarse de forma local en un computador.
-
ESP32 debe enviar datos utilizando WIFI, no por USB.
-
ESP32 programado en C.
-
Debe entregar un informe de los componentes usados, costos, código, fotografías o videos del resultado, tablas y esquemáticos de conexión y posibles usos en la industria.
Proyecto 3: Robots de Batalla
Se debe crear dos robots de batalla. El objetivo es reventar un globo en la parte posterior del robot rival mediante elementos corto punzantes (agujas, clavos, mondadientes).
Los robots deben conectarse a un punto de acceso en común (internet compartido con Hotspot por un celular), el cual permitirá crear una red local y acceder al servidor web proporcionado por cada robot y ser controlados utilizando un dispositivo móvil (android o ios).
Los robots deben ser programados utilizando un lenguaje de programación diferente a C o C++, como Elixir (AtomVM).
Materiales
-
ESP32.
-
Controlador de motores DC.
-
Motores DC.
-
Ruedas.
-
Chasis.
-
Carcasa (a medida).
-
Baterías 7 a 12v.
-
Globos.
-
Cables dupont.
-
Protoboard.
-
Elementos cortopunzantes.
Aprendizajes
-
Servidor web con ESP32.
-
Uso de motores DC y controlador de motores.
-
Uso de lenguajes de programación alternativos a C o C++ para programación de robots.
Restricciones y entregables
-
ESP32 se debe programar con AtomVM (Elixir).
-
Robots deben tener una carcasa de batalla y poder reventar un globo.
-
Robots deben tener al menos 4 ruedas.
-
Ruedas deben funcionar con al menos 7v e idealmente 12v.
-
Debe entregar un informe de los componentes usados, costos, código, fotografías o videos del resultado, tablas y esquemáticos de conexión y posibles usos en la industria.
Proyecto 4: Autobús con GPS
El siguiente proyecto consiste añadir GPS a un autobús y por medio de una pantalla mostrar cuánto tiempo falta para que llegue a un paradero específico (con una posición GPS fija).
El desafío principal es seleccionar un sistema operativo en tiempo real como FreeRTOS y Zephyr para programar los dispositivos ESP32.
ESP32 + GPS + 4G
Para esto se tendrá un ESP32 con módulos de GPS y 4G, alimentado con una batería externa tradicional (conectada al USB del vehículo por ejemplo). Este tendrá la labor de obtener la posición GPS actual y enviarla a un servidor que almacena las posiciones cada 30 o 60 segundos.
Este ESP32 con 4G también debe responder a un SMS (enviado a su número de teléfono) con la información actual del sistema:
-
Última posición GPS reportada.
-
Resultado de llamar a endpoint de salud del servidor de geoposición (para validar conexión a internet y posibilidad de enviar datos al servidor desde el ESP32).
GPS: -33.2231,-71.2232
SERVER: 200 OK (gps.ninjas.cl/status)
ESP32 + OLED
Esta ESP32 tiene la labor de mostrar en una pantalla OLED un mensaje con la distancia y tiempo aproximado de llegada del autobús al paradero. Simula un cartel que muestra la información del próximo bus.
-
Las coordenadas de latitud y longitud serán hardcodeadas en el ESP32 obtenidas con Google maps.
-
Se puede añadir opcionalmente un panel solar como método de carga de la batería.
-
Solo debe enviar la posición al servidor y el servidor debe responder el mensaje a mostrar en la pantalla OLED.
Servidor API GPS
Este servidor puede ser programado con cualquier herramienta disponible o lenguaje de programación, ya que está fuera del alcance del ramo de robótica. Pero se recomienda las siguientes opciones:
-
Servidor API REST personalizado (Phoenix) usando PostgreSQL y PostGIS: https://postgis.net/
-
Supabase: https://supabase.com/docs/guides/database/extensions/postgis
Tabla de Ejemplo
CREATE TABLE gps (
id serial,
lat double precision,
lon double precision,
bus number, -- identificador numérico único de cada bus
ts timestamp
);
Cálculo de distancia
Para calcular la distancia en metros entre dos puntos dados por latitud y longitud, normalmente se utiliza la fórmula de Haversine, que tiene en cuenta la curvatura de la Tierra.
-- POSTGIS
SELECT ST_DistanceSphere(
ST_MakePoint(lon_a, lat_a),
ST_MakePoint(lon_b, lat_b)
) AS distancia_metros;
Cálculo de velocidad
WITH ordenado AS (
SELECT
*,
LAG(lat) OVER (ORDER BY ts) AS lat_prev,
LAG(lon) OVER (ORDER BY ts) AS lon_prev,
LAG(ts) OVER (ORDER BY ts) AS ts_prev
FROM gps
),
calculo AS (
SELECT
ts,
ts_prev,
ST_DistanceSphere(
ST_MakePoint(lon_prev, lat_prev),
ST_MakePoint(lon, lat)
) AS distancia_metros,
EXTRACT(EPOCH FROM (ts - ts_prev)) AS segundos
FROM ordenado
WHERE ts_prev IS NOT NULL
)
SELECT
ts,
distancia_metros,
segundos,
(distancia_metros / NULLIF(segundos, 0)) * 3.6 AS velocidad_kmh
FROM calculo;
Tiempo de llegada aproximado
Fórmula de tiempo de llegada usando distancia geodésica + velocidad.
tiempo = velocidad / distancia
WITH calc AS (
SELECT
ST_DistanceSphere(
ST_MakePoint(lon_a, lat_a),
ST_MakePoint(lon_b, lat_b)
) AS distancia_metros,
velocidad_kmh
FROM datos
)
SELECT
distancia_metros,
velocidad_kmh,
(distancia_metros / 1000.0) / velocidad_kmh AS tiempo_horas,
(distancia_metros / 1000.0) / velocidad_kmh * 60 AS tiempo_minutos
FROM calc;
Endpoints de Ejemplo
-
GET
/status: Devuelve 200 OK si todo esta en orden. ESP32 debe enviar sus datos de acceso para permitir que status pueda ser obtenido desde la ESP32. (Usada para verificar conexión a internet y funcionamiento del servidor) -
POST
/gps: Devuelve 201 Created si tiene éxito.(Usada por ESP32 + GPS) -
GET
/gps: Devuelve el último registro GPS de todos los buses (Usado por el mapa web). -
GET
/gps/<latitud>/<longitud>: Permite saber la distancia y tiempo de espera aproximado para el siguiente bus (el más cercano a la latitud y longitud enviadas). (Usada por ESP32 + Oled)
Página Web con Mapa
Al igual que el servidor de API se tiene total libertad sobre qué herramientas utilizar para mostrar un mapa con la última posición GPS reportada por el autobus.
Materiales
-
ESP32 con módulos de GPS y 4G.
-
ESP32 con módulo de pantalla OLED.
-
Chip 4G prepago con internet habilitado.
-
Panel solar (opcional).
Aprendizajes
-
Uso de módulos 4G y GPS en ESP32.
-
Recepción y envío de SMS con ESP32.
-
Uso de pantallas OLED en ESP32.
-
Uso de sistemas operativos en tiempo real (RTOS).
Restricciones y entregables
-
ESP32 programada en C o C++.
-
Uso de sistema operativo en tiempo real: FreeRTOS o Zephyr (Justificar elección en informe).
-
Debe entregar un informe de los componentes usados, costos, código, fotografías o videos del resultado, tablas y esquemáticos de conexión y posibles usos en la industria.