Skip to Content

Comparación de la velocidad de ESP32 vs Arduino

Comparación de la velocidad de ESP32 vs Arduino

Este artículo le dará toda la información necesaria sobre las placas ESP32 y Arduino. He incluido una especificación detallada y un diagrama de pines de las placas ESP32 y Arduino.

Aprenderás en detalle la diferencia de velocidad y funcionalidad entre el ESP32 y las placas Arduino Uno y Arduino Mega.

Suministros

Componentes de hardware

Arduino Uno Rev3Amazon
Arduino Mega ( Opcional )Amazon
ESP32Amazon
ESP8266 ( Opcional )Amazon
Cable USB tipo A/BAmazon
Cable micro-USBAmazon

Software

Arduino IDEArduino IDE

Makerguides.com participa en el Programa de Asociados de Amazon Services LLC, un programa de publicidad de afiliados diseñado para proporcionar un medio para que los sitios ganen honorarios de publicidad mediante la publicidad y los enlaces a productos en Amazon.com.

Especificaciones de la placa ESP y la placa Arduino

La siguiente tabla compara las especificaciones y características de ESP32 y NodeMCU ESP8266 con las populares placas Arduino:

FunciónESP32NodeMCU ESP8266Arduino UNOArduino Mega2560
MicrocontroladorMicroprocesador Xtensa Dual Core LX6 de 32 bitsTensilica 32-bit Xtensa LX106ATMega328PATMega2560
Memoria Flash4MB4 MB32KB256 KB 
SRAM520MB128 KB2KB8KB
EEPROMNo disponibleNo disponible512 bytes (Software)1KB4KB
Velocidad del relojHasta 240 MHz80 o160 MHz16MHZ16 MHz
Tensión de funcionamiento3.3V DC3.3V DC5V DC5V DC
Tensión de entrada3.3V DC7-12 DC6V-20V DC7-12V
Consumo actual80 mA - 90mA15 µA - 400 mA45 mA - 80 mA150 uA
Corriente continua por pin de E/S40 mA12 mA20 mA20 mA
Corriente continua para la clavija de 3,3 V50 mA1A50 mA50 mA
Pines digitales IO36171454
Pines de entrada analógicaHasta 181616
UARTs3214
SPI4211
I2C2111
CANNoNoNo
PWM164614
Wi-FiSí, 802.11 b/g/nNoNo
BluetoothSí, especificación Bluetooth v4.2 BR/EDR y BLENoNoNo

Comparación de pines de ESP32 y Arduino UNO

Puede consultar el diagrama esquemático del ESP32 para obtener más detalles sobre los componentes presentes en la placa ESP32. El diagrama de pines de ESP32 se representa a continuación.

ESP32 Pinout
ESP32 Pinout

También puede consultar el diagrama esquemático de Arduino Uno para conocer los detalles de los componentes presentes en la placa Arduino UNO. El diagrama de pines de Arduino UNO se representa a continuación.

Arduino Uno Pinout
Arduino Uno Pinout

¿En qué se diferencia el ESP32 del Arduino Uno?

Esta sección proporcionará información sobre la CPU, el reloj y la diferencia de velocidad entre el ESP32 y el Arduino Uno.

1. CPU

ESP32 cuenta con microprocesadores LX6 Xtensa® Dual-Core de 32 bits, que funcionan con 600 DMIPS. Los dos núcleos se denominan CPU de protocolo (PRO_CPU) y CPU de aplicación (APP_CPU).

El procesador PRO_CPU maneja el Wi-Fi, Bluetooth y otros periféricos internos como SPI, I2C, ADC, etc. La APP_CPU queda fuera para el código de la aplicación.

Arduino Uno está diseñado con un microcontrolador AVR. Se basa en el microcontrolador de 8 bits ATmega328P. Es un microcontrolador de un solo chip.

Dispone de una CPU mononúcleo con procesador RISC de 8 bits de arquitectura Harvard modificada.

Así que, como puedes ver aquí, ESP32 es una MCU de 32 bits con doble núcleo, mientras que Arduino Uno es una MCU de 8 bits con un solo núcleo.

2. RELOJ

El ESP32 se puede utilizar con reloj interno o externo. El microcontrolador ESP32 puede utilizar un oscilador de cristal externo.

Se selecciona una fuente de reloj de cristal externa como reloj de la CPU por defecto al reiniciar. ESP32 tiene un oscilador interno de 8 MHz. 

La aplicación puede seleccionar la fuente de reloj del cristal externo. Dispone de un cristal externo de 40 MHz.

El microcontrolador AVR tiene un reloj máximo, que por defecto utiliza un cristal de 16MHz. Se necesita 1 / 16 millonésimas de segundo para realizar una sola operación.

Tiene tres unidades básicas: Fuentes de Reloj, Entrada y Control de Reloj, Salida de Reloj.

Tiene múltiples fuentes de reloj que se multiplexan a múltiples periféricos a través de la Unidad de Control de Reloj del AVR.

¿Por qué necesita cambiar el reloj de la CPU de ESP32?

El reloj de la CPU afecta al consumo de energía, a la velocidad de funcionamiento y al rendimiento de la MCU. Por eso es necesario ajustar la velocidad de la MCU según sus necesidades.

Si desea más detalles sobre la optimización del consumo de energía, consulte el manual de usuario de ESP32.

Cómo cambiar la velocidad de la CPU de ESP32 (en Arduino IDE)

Puedes cambiar la velocidad de la CPU desde tu código usando el comando mencionado abajo en el código. 

bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz);

Los únicos valores preferibles introducidos son 240, 160 y 80, pero también puede utilizar valores menores, es decir, 40MHz, 20MHz y 10MHz, en caso de que no esté utilizando Wi-Fi o Bluetooth.

FrecuenciaConsumo de energía
240 MHz66,8mA
160 MHz45,9mA
80 MHz33,2mA
40 MHz19,88mA
20 MHz15,43mA
10 MHz13,19mA

¿Cómo configurar la fuente de reloj del ATmega328p?

El ATmega328P es un microcontrolador de 8 bits, y la velocidad de reloj por defecto es de 16 MHz. Tiene las siguientes dos opciones de reloj solamente. 

1) Oscilador RC interno calibrado 

2) Oscilador de cristal de bajo consumo. 

El ATmega328P se sincroniza con el oscilador RC interno calibrado, que funciona a 8MHz. Esto es por la configuración por defecto.

El reloj de 8 MHz se divide por 8 debido a la configuración del bit CKDIV8 en el Byte Bajo de Fusibles.

Así que la velocidad de reloj efectiva disponible es de 1 MHz.

Configuración del Byte Bajo del Fusible

Como puedes ver en la hoja de datos del ATmega328P, la tabla 27-7 muestra los bits del fusible inferior de este CI.

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
CLKDIV8(2)4CKOUTSUT1SUT0CKSEL3CKSEL2CKSEL1CKSEL0

Fusible ATmega328P Byte bajo

Este byte bajo del fusible es responsable de configurar la fuente de reloj y algunos otros parámetros del reloj dentro del AVR.

Ahora, la frecuencia se establece en base al valor del Byte Bajo del Fusible.

Si el valor cambia, la frecuencia también cambia.

Byte de fusible alto: D9 Byte de fusible extendido: FF

Caso 1: Si el valor del Byte 0xCE del fusible bajo para establecer la frecuencia estándar establece 16MHz resonador de cerámica de inicio rápido.

Caso 2: Si el valor del Byte de fusible bajo 0xF7 para fijar la frecuencia estándar establece el cristal 16MHz, inicio lento + reloj CLKO.

Caso 3: Si el valor del Byte 0xE2 del fusible bajo para establecer la frecuencia estándar establece el oscilador RC interno con el preescalador desactivado. Reloj de sistema de 8MHz.

Caso 4: Si el Byte de Fusible Alto: D1, Byte de Fusible Extendido: FF 

Fusible bajo Valor del byte 0xFE para ajustar la frecuencia del oscilador de cristal de 8MHz.

Caso 5: Si el Byte de Fusible Alto: DE, Byte de Fusible Extendido: D5

Fusible bajo Valor del byte 0xFF para establecer la frecuencia estándar de 16MHz de arranque lento.

Detalles de la CPU de ESP32

El siguiente código le dará información sobre los detalles de la CPU de ESP32.

uint32_t  CPU_Frequency;

void setup(){
  Serial.begin(9600);

  CPU_Frequency = getXtalFrequencyMhz();
  Serial.print("ESP32 Crystal Frequency is = ");
  Serial.print(CPU_Frequency);
  Serial.println(" MHz"); 
  setCpuFrequencyMhz(40);

  CPU_Frequency = getCpuFrequencyMhz();
  Serial.print("ESP32 CPU Frequency = ");
  Serial.print(CPU_Frequency);
  Serial.println(" MHz");
  
  CPU_Frequency = getApbFrequency();
  Serial.print("ESP32 APB Frequency = ");
  Serial.print(CPU_Frequency);
  Serial.println(" Hz");
}

void loop() {
}

Explicación del código

 Frecuencia_CPU = getXtalFrequencyMhz();
 Serial.print(Frecuencia_CPU);

Paso 1: Declarar una variable uint32_t CPU_Frequency; para almacenar un valor de retorno.

Paso 2: En la función setup() inicializar a Serial.begin(); función para establecer la tasa de baudios a 9600.

Paso 3: Puede obtener un reloj de CPU más bajo para optimizar el consumo de energía. Para ello, debe comprobar la frecuencia del cristal XTAL mediante esta función.

setCpuFrequencyMhz(40); usando esta función, puede establecer la frecuencia del reloj de la CPU del ESP32 e imprimirla en la terminal serial.

Paso 4: Después de cambiar la frecuencia del reloj de la CPU, puede comprobar el valor de la frecuencia del reloj de la CPU leyendo el valor de retorno de la siguiente función. CPU_Frequency = getApbFrequency(); y obtener el resultado en el terminal serie.

Prueba de velocidad de la placa ESP32 y Arduino usando DSO

Puedes usar el siguiente código para probar las diferentes placas usando el Osciloscopio de Almacenamiento Digital (DSO).

#define test_pin 5  //for ESP8266 use D5 instead of 5

void setup() {
  pinMode(test_pin, OUTPUT); //set pin as output
}

void loop() {
  digitalWrite(test_pin, HIGH); //make pin 5 high
  digitalWrite(test_pin, LOW);  //make pin 5 low
}

Código Descripción

Este código se utiliza para detectar la ejecución de la misma instrucción en las placas ESP32, ESP8266, Arduino Uno y Arduino Mega.

He utilizado el pin 5 como pin de salida, y en void loop(), lo he puesto alto y bajo sin retardo.

He conectado el pin 5 de cada placa en el osciloscopio de almacenamiento digital (DSO). La siguiente imagen muestra la duración del pulso para digitalWrite(test_pin, HIGH) y el periodo total en void loop().

Pulsos de salida del ESP32
Pulsos de salida del ESP32
Pulsos de salida del ESP8266
Pulsos de salida del ESP8266
Pulsos de salida de Arduino Uno
Pulsos de salida de Arduino Uno
Pulsos de salida del Arduino Mega
Pulsos de salida del Arduino Mega
ParámetrosESP32ESP8266Arduino UnoArduino Mega
digitalWrite Ancho de pulso112,37 nS (0,1123 μS)800,00 nS(0,800 μS)4,0657 μS5,4367 μS
Período de bucle vacío325,00 nS(0,325 μS)5,1625 μS8,5050 μS11.248 μS

¿Cómo probar la velocidad de ESP32 y Arduino utilizando el código?

Ahora, te mostraré cómo puedes probar la velocidad de las placas ESP y Arduino usando sólo el código, sin usar el DSO.

unsigned long start, Total ;
#define test_pin 5             //    for ESP8266 use D5 instead of 5

void setup() {
  Serial.begin(9600);
  pinMode(test_pin, OUTPUT);
}

void loop() {
  start = millis();
  for (int i = 0; i < 20000; i++) {
    digitalWrite(test_pin, HIGH);
    digitalWrite(test_pin, LOW);
  }
  Total = millis() - start ;
  Serial.print("Total time taken to state change : ");
  Serial.println(Total);
}

Explicación del código

Paso 1: unsigned long start, Total ;

En primer lugar, declarar una variable para iniciar y Total contar en un milisegundo.

Paso 2: #define test_pin 5

Define un Pin utilizado para alternar el estado del pin.

Paso 3: En void setup(), configure la tasa de baudios a una velocidad de 9600, y pruebe la selección del modo del pin como modo de salida.

Paso 4: En millis() la función devuelve el número de milisegundos transcurridos desde el arranque de la placa Arduino.

Y devolver millis(); valor de retorno de la función para atrapar en la variable de inicio ,que antes de declarar.

Step 5: for (int i = 0; i < 20000; i++) 

digitalWrite(test_pin, HIGH);
 digitalWrite(test_pin, LOW);

Este bucle gira 20.000 veces y hace que test_pin sea HIGH y LOW.

Paso 6: Diferencia entre el milisegundo de hasta ahora y el milisegundo de antes de recibirlo y el resultado se almacena en la variable Total y se imprime en el terminal de serie.

Ahora, usted puede observar la salida en el terminal de serie.

Aquí están los resultados de las pruebas de velocidad que hice comparando la velocidad de las placas ESP32 vs ESP8266 vs Arduino Mega2560 vs Arduino Uno.

Caso 1: Salida del ESP32

Salida de ESP32

Caso 2: Salida del ESP8266

Salida del ESP8266

Caso 3: Salida del Arduino Mega2560

Salida del Arduino Mega2560

Caso 4: Salida de Arduino Uno

Salida de Arduino Uno

Esta tabla resume los resultados de las pruebas de velocidad que realicé comparando las 4 placas:

ESP32ESP8266ArduinoMega2560Arduino Uno
5 milisegundos64 milisegundos226 milisegundos171 milisegundos

Como puedes ver, la placa ESP32 fue la más rápida con diferencia, seguida por la ESP8266, luego la Arduino Uno, y la más lenta fue la Arduino Mega2560.

¿Es el ESP32 más rápido que el ESP8266?

Sí, el ESP32 es más rápido que el ESP8266. El ESP32 es el sucesor del ESP8266. Añade un núcleo de CPU adicional, Wi-Fi más rápido, más GPIOs, y soporta Bluetooth 4.2 y Bluetooth de baja energía.

Ambos chips tienen un procesador de 32 bits. El ESP32 es una CPU de doble núcleo de 160MHz a 240MHz, mientras que el ESP8266 es un procesador de un solo núcleo que funciona a 80MHz.

Además, el resultado muestra que el ESP32 es casi siete veces más rápido que el ESP8266 porque para la instrucción digitalWrite el ESP32 tarda 112,37 nS mientras que el ESP8266 tarda 800 nS.

¿Es ESP32 más potente que Arduino?

Sí, el ESP32 es más rápido y potente que Arduino.

El ESP32 es un potente microcontrolador de 32 bits con Wi-Fi integrado, una pila TCP/IP completa para la conexión a Internet y Bluetooth 4.2. Cuenta con 10 sensores táctiles capacitivos internos.

Arduino Mega y Uno es un microcontrolador de 8 bits. Las placas Arduino no tienen conectividad inalámbrica, Bluetooth y sensores táctiles.

Además, ESP32 es mucho más rápido que las placas Arduino. Por lo tanto, ESP32 es más potente que la placa Arduino.

¿Podemos usar ESP32 en lugar de Arduino?

La placa de desarrollo ESP32 es realmente más barata que la placa Arduino. Como ya sabes, la placa de desarrollo ESP32 es una placa más potente por un precio más bajo.

Aunque la ESP32 tiene una arquitectura diferente a la de las placas Arduino, soporta el framework de Arduino IDE. Por lo tanto, el código es similar para ambas placas.

Conclusión

En este artículo, le he mostrado la especificación de la placa ESP y la placa Arduino, y cómo ESP32 es más rápido que ESP8266 y placas Arduino.

Espero que hayas encontrado este artículo informativo. Me encantaría saber qué proyecto planeas construir o ya has hecho con el Arduino o ESP32.

Si tienes alguna duda o sugerencia, o si crees que faltan cosas en este tutorial, deja un comentario abajo.

Tenga en cuenta que los comentarios son retenidos por la moderación para evitar el spam.

team antimaker`s

Friday 28th of July 2023

hola, estoy haciendo un robot sumo, quiero competir en una copa robotica, actualmente estoy usando un arduino mega, me conviene usar el esp32? habra un mejor desempeño de mi robot usando el esp32? reaccionara mas rapido al leer los sensores? especificaciones de mi sumo: dos driver: Puente H Driver Bts7960 43a tres sensores ir para ver al contrincante dos sensores de linea 2 motores dc de 300rpm a 6kgf