- Sigue la línea lo más rápido posible sin salirse.
- Comunicación IoT a través de MQTT
- Comunicación serie entre ESP32 y Arduino UNO
- Si el robot pierde la línea se permite realizar una búsqueda de la línea de nuevo.
- Detección de obstáculos
## 2. Diagrama
## 3. Montaje
Consulta el manual que viene con el kit y el siguiente [vídeo](https://www.youtube.com/watch?v=GQi99xmohdw&ab_channel=ElegooOfficial) para realizar el montaje correctamente. Es el primer paso de la práctica.
## 4. Arduino
El robot incorpora un Ardunio UNO que actúa de cerebro del sistema controlando todos los sensores y actuadores.
### 4.1 Sensor Infra-rojo
### 4.2 Servo
### 4.3 Motores
### 4.4 Acelerómetro / Giroscopio
### 4.5 LED RGB
## 5. ESP32
### 5.1 Arduino-IDE y librerías
El robot incluye un modelo ESP32 CAM, que nos permite comunicarnos a través de cualquier red WiFi. Utilizaremos Arduino-IDE para programarlo, pero es necesario realizar las siguientes acciones:
- Primero, añade el repositorio para ESP32 dentro de tu Arduino IDE
- Asegurate que tienes instalado el paquete ESP32 dentro de "Boards Manager" en tu arduino IDE 
- Asegurate de configurar correctamente el modelo de placa "AI Thinker ESP32-CAM" 
### 5.2 Obtener la MAC del chipset WiFi
- Es necesario obtener la MAC para daros de alta en la wifi (sensoresurjc) que usaremos para las prácticas. Para obtener la MAC utiliza el código que encontrarás en el ejemplo **[getMac](https://gitlab.etsit.urjc.es/roberto.calvo/setr/-/tree/main/practicas/P4-FollowLineIoT/ESP32/)** en el repositorio git de la asignatura.
**IMPORTANTE**: Una vez tengas la MAC notifícala al profesor.
### 5.3 Comprobar la conexión WiFi
- Una vez que te hayan dado de alta en el sistema, puedes comprobar la conexión WiFi y la IP asignada. Puedes utilizar de base el código de ejemplo de **[connectWifi](https://gitlab.etsit.urjc.es/roberto.calvo/setr/-/tree/main/practicas/P4-FollowLineIoT/ESP32/)** del repositorio.
## 6 Comunicación IoT
### 6.1 MQTT
Desde el ESP32 tendrás que conectarte y mantener la conexión abierta para mandar mensajes al servidor según vayas completando el circuito. Para ello necesitarás instalar la librería **[Adafruit-MQTT](https://github.com/adafruit/Adafruit_MQTT_Library)**
Tu robot debe mandar los siguientes mensajes siempre conectando al servidor MQTT y utilizando obligatoriamente el siguiente TOPIC
```bash
/SETR/2022/$ID_EQUIPO/
```
Para comprobar los mensajes que envía tu robot a través de MQTT puedes utilizar el siguiente comando que debes ejecutar en los ordenadores del laboratorio. Básicamente es un subscriptor a un topic determinado que mostrará todo lo que llega a ese topic.
* Descripción: Este mensaje debe enviarse siempre justo antes de empezar la vuelta al circuito. Por tanto debe realizarse sólo 1 vez. **IMPORTANTE: La vuelta nunca podrá comenzar si no hay conexión a la red WiFi ni a MQTT.**
* Payload JSON:
```json
{
"team_name":"$TU_NOMBRE_DE_EQUIPO ",
"id":"$ID_EQUIPO",
"action":"START_LAP"
}
```
#### Mensaje de Fin de vuelta
* Descripción: Este mensaje debe enviarse siempre al finalizar una vuelta, que lo sabrás porque tendrás un obstáculo delante. Por tanto debe realizarse sólo 1 vez.
* Payload JSON:
```
{
"team_name": "$TU_NOMBRE_DE_EQUIPO ",
"id": "$ID_EQUIPO",
"action": "END_LAP"
}
```
#### Mensaje Obstáculo Detectado
* Descripción: Este mensaje debe enviarse siempre que detectes un obstáculo en el camino de la línea.
* Payload JSON:
```json
{
"team_name":"$TU_NOMBRE_DE_EQUIPO ",
"id":"$ID_EQUIPO",
"action":"OBSTACLE_DETECTED"
}
```
#### Mensaje Línea Perdida
* Descripción: Este mensaje debe enviarse siempre que tu robot se haya salido de la línea.
* Payload JSON:
```
{
"team_name": "$TU_NOMBRE_DE_EQUIPO ",
"id": "$ID_EQUIPO",
"action": "LINE_LOST"
}
```
#### Mensaje Línea Encontrada
* Descripción: Este mensaje debe enviarse siempre que tu robot haya encontrado la línea. Además este mensaje sólo se debe enviar si anteriormente se ha enviado el mensaje **LINE_LOST**
* Payload JSON:
```json
{
"team_name":"$TU_NOMBRE_DE_EQUIPO ",
"id":"$ID_EQUIPO",
"action":"LINE_FOUND"
}
```
#### Mensaje Inicio Búsqueda de Linea
* Descripción: Opcionalmente tienes la posibilidad de implementar un comportamiento "encuentra línea" una vez que te hayas salido del camino (esto te permitirá reducir la penalización).
* Payload JSON:
```json
{
"team_name":"$TU_NOMBRE_DE_EQUIPO ",
"id":"$ID_EQUIPO",
"action":"INIT_LINE_SEARCH"
}
```
#### Mensaje Fin Búsqueda de Linea
* Descripción: Si has implementado la búsqueda de línea una vez que la has perdido, deberás mandar este mensaje en el momento que la hayas encontrado y por tanto finalizado el comportamiento "encuentra línea"
* Payload JSON:
```json
{
"team_name":"$TU_NOMBRE_DE_EQUIPO ",
"id":"$ID_EQUIPO",
"action":"STOP_LINE_SEARCH"
}
```
#### Mensajes PING
* Descripción: Mensaje de estado mandado cada 5 segundos.