Ir al contenido principal

ESP32

El ESP32 es el que decide

En el esquema de percibir, decidir y actuar, el ESP32 es el del medio: recibe las señales de los sensores, corre el programa y maneja el driver que mueve los motores. Es la única parte del robot que no es ni sensor ni actuador: no toca el mundo, lo interpreta.

El ESP32 es el que se usa en esta unidad, porque cubre todo lo que un robot de aprendizaje necesita y además trae Wi-Fi. Cómo se instala el soporte en el IDE, cómo se conecta a una red y todo el detalle del Wi-Fi están en Programación con ESP32 (EFSI I). Acá se ve lo que cambia cuando el ESP32 va arriba del robot.

Lo que el robot necesita Con qué se resuelve
Leer los fines de carrera, el pulsador y los sensores de línea. Entradas digitales, con resistencia de pull-up.
Medir luz, distancia o posición de una perilla. Entradas analógicas (el conversor de 12 bits).
Regular la velocidad de los motores. Salidas PWM, en cualquier pin de salida.
Mover los motores y los servos. El driver, alimentado por su cuenta. El ESP32 solo le manda la orden. El detalle está en Motores.
Contar lo que está haciendo. Wi-Fi: telemetría, más abajo en esta página.
La placa en el centro del robot: los sensores digitales y analógicos entran por sus pines, la salida PWM va al driver que alimenta los motores, y el Wi-Fi manda los datos a una computadora Sensores digitales final de carrera · pulsador Sensores analógicos luz · distancia ESP32 decide · pines digitales · entradas analógicas (12 bits) · PWM en cualquier pin · funciona a 3,3 V · Wi-Fi integrado PWM Driver le da la corriente al motor Motores y servos actúan sobre el mundo Wi-Fi: telemetría PC o celular para mirar y para dar órdenes La placa no alimenta los motores: solo les manda la orden
El ESP32 ocupa el centro del robot: entran los sensores, sale la orden para el driver, y por Wi-Fi salen los datos. Lo que no hace es darle corriente a los motores; eso lo hace la fuente del robot, con el driver como intermediario.

Los pines que hacen falta

Antes de conectar el primer cable conviene decidir qué pin hace cada cosa y anotarlo. Cambiar un pin después de armar el robot significa mover cables, y mover cables es la forma más rápida de aflojar otro. Un robot de seguidor de línea, por ejemplo, usa más o menos esto:

Función Tipo de pin Cuántos
Dirección de cada motor Salida digital 2 (uno por motor)
Velocidad de cada motor Salida PWM 2 (uno por motor)
Sensor de línea izquierdo y derecho Entrada digital 2
Sensor de distancia Entrada digital, o analógica si es de medición continua 1 o 2
Pulsador de arranque o parada Entrada digital con pull-up 1

Son unos ocho pines, y cualquier ESP32 tiene de sobra. Los problemas no vienen por la cantidad, sino por cuáles:

  • Primero se reservan las entradas analógicas, porque no cualquier pin puede medir. El resto se reparte después, y las salidas no importan tanto: en el ESP32 el PWM funciona en cualquier pin.
  • El pinout se mira, no se adivina. La documentación de Espressif avisa que hay pines con restricciones especiales y que no todos están disponibles en todos los modelos: algunos no sirven como salida, y otros intervienen en el arranque del ESP32. Si un pin de arranque se usa como salida, el ESP32 puede no encender o reiniciarse solo al apretar un botón.
  • Se anota la asignación y se escribe al principio del programa como constantes con nombre. Así, cuando haya que cambiar un cable, se cambia un solo número.
// Asignacion de pines: se copia del pinout del ESP32 que se esta usando
const int sensorIzq  = 34;   // entrada digital o analogica, segun el sensor
const int sensorDer  = 35;
const int boton      = 32;
const int dirMotorA  = 26;
const int velMotorA  = 27;
const int dirMotorB  = 16;
const int velMotorB  = 17;

Los 3,3 V y los sensores

Esta es la diferencia que más problemas causa en el taller. El ESP32 trabaja a 3,3 V, y una buena parte de los módulos que hay en los cajones están hechos para 5 V. Cuando un sensor devuelve 5 V a un pin que espera 3,3 V, no es que "lea mal": el pin se está forzando.

Tipo de módulo Qué se hace
Se alimenta con 5 V y devuelve 5 V No se conecta la salida directo. Se alimenta de 5 V y su salida pasa por un divisor de tensión o un adaptador de nivel antes de llegar al pin.
Se alimenta con 5 V pero su salida ya es de 3,3 V Se alimenta de 5 V y la salida va directo al pin. Muchos módulos modernos traen su propio regulador y adaptador adentro.
Es analógico y puede llegar a 5 V Además de cuidar el pin, hay que dividir la tensión: sin eso la lectura queda clavada en el máximo y no mide nada.

El divisor de tensión, con números

El ejemplo clásico es el sensor de distancia por ultrasonido HC-SR04: se alimenta con 5 V y su patita ECHO entrega 5 V cuando vuelve el eco. Con dos resistencias —una de 1 kΩ en serie y una de 2 kΩ hacia masa— la tensión de esa línea baja a los 3,3 V que el pin tolera:

Divisor de tensión para bajar los 5 voltios de la salida de un sensor a 3,3 voltios: una resistencia de 1 kiloohm en serie y una de 2 kiloohm hacia masa, y el pin se conecta entre las dos ECHO del sensor 5 V 1 kΩ 3,3 V → pin del ESP32 2 kΩ 5 V × 2 kΩ / (1 kΩ + 2 kΩ) = 3,3 V La misma cuenta se usa para cualquier sensor que devuelva más de 3,3 V.
El pin se conecta entre las dos resistencias, no después de la segunda. Cuanto más grande la de abajo respecto de la de arriba, más baja la tensión que llega al pin.

PWM para la velocidad y la dirección

El driver de motores necesita dos señales por motor: una digital que decide para dónde gira, y una PWM que decide a qué velocidad. El ESP32 manda las dos; la corriente la pone la fuente del robot.

const int dirMotorA = 26;   // direccion del motor A
const int velMotorA = 27;   // velocidad del motor A (PWM)
const int dirMotorB = 16;
const int velMotorB = 17;

void setup() {
  pinMode(dirMotorA, OUTPUT);
  pinMode(velMotorA, OUTPUT);
  pinMode(dirMotorB, OUTPUT);
  pinMode(velMotorB, OUTPUT);

  analogWriteFrequency(velMotorA, 5000);   // 5 kHz
  analogWriteFrequency(velMotorB, 5000);
}

void avanzar(int velocidad) {        // velocidad de 0 a 255
  digitalWrite(dirMotorA, HIGH);
  digitalWrite(dirMotorB, HIGH);
  analogWrite(velMotorA, velocidad);
  analogWrite(velMotorB, velocidad);
}

void frenar() {
  analogWrite(velMotorA, 0);
  analogWrite(velMotorB, 0);
}

Tres cosas para tener en cuenta:

  • La dirección se cambia con las dos señales invertidas. Si el robot gira sobre sí mismo o va para atrás cuando debería ir adelante, el error más común no es el programa: son los cables del motor puestos al revés, o los dos valores HIGH y LOW intercambiados.
  • La frecuencia del PWM se elige. Con frecuencias bajas el motor zumba y arranca a los tirones; subiéndola a unos pocos miles de hercios el movimiento se vuelve suave y silencioso. Es una diferencia que se escucha. Por encima de 20 kHz, además, deja de oírse.
  • El motor nunca va conectado a un pin. Ni al ESP32 ni a ningún otro: la corriente que necesita lo destruiría. Entre el ESP32 y el motor siempre hay un driver. Está explicado con números en Motores.

Alimentar el robot sin que se reinicie

Es el problema que más tiempo hace perder, porque el síntoma no se parece a la causa: el robot anda bien hasta que arrancan los motores, y ahí el ESP32 se reinicia. El programa vuelve a empezar de cero, el robot se queda quieto, y parece un problema de código cuando es de alimentación.

La regla es una sola: los motores y el ESP32 no comparten el consumo. El ESP32 se alimenta por su cable, y los motores y servos toman la energía de la fuente del robot, con el driver en el medio. Lo que sí se une son las masas: sin un GND común, las señales no tienen referencia y nada funciona.

Las dos alimentaciones de un robot: arriba la fuente de los motores con el driver y los motores, abajo la alimentación de la placa, las dos unidas por una masa común Potencia (motores) Batería del robot 6 a 12 V Driver Motores señal PWM y dirección Lógica (la placa) USB o batería chica 5 V por el cable USB ESP32 GND común
Arriba la potencia, abajo la lógica, y las masas unidas. Compartir la fuente es lo que hace que, al arrancar los motores, la tensión caiga y el ESP32 se reinicie.
Qué probar Por qué
Fuente aparte para los motores. Lo que consume un motor al arrancar es varias veces lo que consume en régimen. El ESP32 no tiene por qué bancarse ese pico.
Cables cortos y gruesos en la línea de los motores. Un cable fino tiene resistencia: en el pico de arranque, esa resistencia hace caer la tensión justo cuando más se necesita.
Un capacitor de 470 µF a 1000 µF en la entrada del driver. Funciona como un depósito: entrega la corriente del pico durante los milisegundos que la fuente tarda en responder.
Servos con su propia alimentación. Un servo parado contra un tope consume muchísimo. Alimentado desde el ESP32, lo hace reiniciar.
Batería de 9 V rectangular: no. Es la que todos tienen a mano y la que no sirve: entrega muy poca corriente. Los motores no giran o el ESP32 se reinicia.

Si el robot ya está armado y el reinicio aparece recién ahora, el método para encontrarlo es el de Diagnóstico de problemas: cambiar una cosa por vez, de lo simple a lo complejo, y anotar qué se probó.

Wi-Fi para la telemetría

La ventaja de tener Wi-Fi en el ESP32 es que se puede ver lo que el robot está midiendo mientras se mueve, sin desarmarlo ni perseguirlo con un cable. Eso se llama telemetría, y es la forma más rápida de ajustar un umbral: en lugar de adivinar por qué el robot se va de largo, se mira la sucesión de valores en la pantalla.

Para eso alcanzan las librerías que vienen con el core, y el detalle está en Programación con ESP32. Lo que cambia acá es una regla:

En la práctica eso significa no usar delay() largos ni esperas por la red dentro del ciclo principal. La consulta se hace entre ciclos, cada tanto, comparando tiempos con millis():

unsigned long ultimoEnvio = 0;

void loop() {
  leerSensores();              // el control del robot corre siempre
  decidir();
  mover();

  // el envio es cada 500 ms y no frena el control
  if (millis() - ultimoEnvio >= 500 && WiFi.status() == WL_CONNECTED) {
    ultimoEnvio = millis();
    enviarTelemetria();        // los valores de los sensores y el estado
  }
}

La frecuencia del envío es una decisión de diseño: alcanza con dos o tres envíos por segundo para ver una gráfica, y no tiene sentido mandar cientos. Cada envío ocupa la red y consume tiempo del ESP32, que es el mismo que necesita para controlar los motores. La latencia del Wi-Fi, además, hace imposible pilotear el lazo de control por red: la red es para supervisar, no para manejar el robot cable a cable. La forma de organizar ese ciclo está en Programación estructurada, y los proyectos posibles, en IoT (Internet of Things).

Problemas típicos del ESP32

Qué pasa Por qué Qué hacer
El sensor analógico siempre devuelve el valor máximo. La tensión que llega supera lo que el conversor puede medir, o el pin elegido no es de entrada analógica. Medir la tensión en el pin y revisar que sea un pin de entrada analógica del pinout.
El sensor funciona un rato y después no. Su salida es de 5 V y el pin trabaja a 3,3 V: se está forzando. Divisor de tensión o adaptador de nivel antes del pin.
El ESP32 se reinicia cuando arrancan los motores. Los motores y el ESP32 comparten el consumo. Fuente aparte para los motores, cables gruesos y un capacitor en el driver.
El ESP32 no arranca, o se reinicia cuando se aprieta el pulsador. Se está usando como entrada o salida un pin que interviene en el arranque. Cambiar ese cable a otro pin y revisar el pinout.
El robot va al revés o gira sobre sí mismo. Los cables del motor están invertidos o la lógica de dirección quedó al revés. Probar invirtiendo los dos cables de ese motor, o los dos valores de dirección en el programa.
Los motores hacen un zumbido fuerte y arrancan a los tirones. La frecuencia del PWM es demasiado baja. Subirla con analogWriteFrequency() a unos pocos miles de hercios.
El servo tiembla y el ESP32 se reinicia. El servo está alimentado desde el pin de 3,3 V o desde el USB. Alimentarlo desde la fuente de los motores, con la masa en común.
El robot anda bien pero no llega ningún dato por Wi-Fi. La red es de 5 GHz, la clave es incorrecta, o la consulta está dentro del lazo de control y lo frena. Probar con una red de 2,4 GHz y sacar la consulta del ciclo, comparando millis().

Resumen

  • El ESP32 es la parte que decide: lee los sensores, corre el programa y le manda la orden al driver.
  • Los motores no se alimentan desde el ESP32. El ESP32 da la señal; la corriente la da la fuente del robot.
  • Se planifica la asignación de pines antes de cablear, reservando primero las entradas analógicas, y se anota.
  • El pinout del ESP32 se mira, no se adivina: hay pines con restricciones, y algunos intervienen en el arranque.
  • El ESP32 trabaja a 3,3 V: lo que devuelva 5 V pasa por un divisor de tensión o un adaptador de nivel.
  • Cada motor necesita una señal de dirección y una de velocidad, y la frecuencia del PWM se elige: más alta, más suave.
  • El reinicio al arrancar los motores es un problema de alimentación, no de programa.
  • El Wi-Fi sirve para telemetría y órdenes, nunca para sostener el control del robot.