Guías · 18 min de lectura

Error al subir código a Arduino: avrdude, puerto COM y drivers

¿Arduino no sube el código? Soluciones a avrdude not in sync, puerto COM que no aparece, driver CH340, Nano Old Bootloader, botón BOOT del ESP32 y BOOTSEL.

¿Tu Arduino no sube el código y en la ventana de salida aparece un error rojo de avrdude? Tranquilo: casi nunca significa que la placa esté rota. Lo normal es que la culpa sea de un cable USB que solo carga, un driver CH340 que falta, la placa o el puerto equivocados, un módulo conectado a los pines 0 y 1 u otro programa que tiene ocupado el puerto. Si revisas las cosas en el orden correcto, casi siempre lo resolverás en pocos minutos; e incluso si la placa está realmente averiada, hay una forma sencilla de comprobarlo.

En esta guía verás primero qué pasa por dentro durante la carga y cómo leer el mensaje de error. Después acotaremos el problema paso a paso con una tabla de diagnóstico de síntoma, causa y solución. También tratamos el ajuste ATmega328P (Old Bootloader) del Arduino Nano, el Monitor Serie y otros programas que bloquean el puerto, el error Failed to connect del ESP32 y el botón BOOT, y el método BOOTSEL y UF2 de la Raspberry Pi Pico. Cada sección incluye un pequeño sketch de prueba para comprobar tu placa cuando hayas solucionado el problema.

Placa Arduino Uno R3
Arduino Uno: el pequeño chip junto al conector USB se encarga de la comunicación con el ordenador; las placas originales usan un ATmega16U2 y los clones casi siempre un CH340. Los LED TX, RX y L te ayudan a seguir la carga.

Cómo funciona la carga: ¿error de compilación o error de subida?

Cuando pulsas Cargar ocurren dos cosas distintas. Primero el IDE compila tu código; si todo va bien, la ventana de salida muestra una línea con los bytes que ocupa el sketch (en la interfaz en inglés, Sketch uses 924 bytes). Después un programa llamado avrdude abre el puerto que elegiste, reinicia la placa con la señal DTR y establece contacto con el pequeño programa de carga que hay dentro de la placa, el bootloader. Tras un reinicio, el bootloader solo escucha durante un segundo aproximadamente; si no llegan datos, el programa antiguo sigue funcionando. El mensaje de error te dice qué eslabón de esta cadena se ha roto. Si el texto rojo aparece al compilar, el problema está en tu código y no tiene nada que ver con la placa ni con el cable.

Fase¿Qué ocurre?Mensaje que verás si falla
1. CompilaciónEl código se traduce a código máquina para el procesadorCompilation error: 'x' was not declared in this scope (error de código, no de carga)
2. Abrir el puertoEl IDE abre el puerto COM seleccionadono upload port provided, can't open device, Access is denied
3. ReinicioLa señal DTR reinicia la placaprogrammer is not responding
4. Sincronizaciónavrdude y el bootloader se sincronizanstk500_getsync(): not in sync: resp=0x00
5. Escritura y verificaciónEl programa se graba en la flash, se vuelve a leer y se comparaverification error, first mismatch at byte
Para leer bien el error, abre Archivo > Preferencias y marca la casilla Carga en Mostrar salida verbosa durante. El exit status 1 o el Failed uploading del final solo indican que algo ha fallado; la pista de verdad es la primera línea de error que hay encima y que empieza por avrdude:. Copia esa línea cuando pidas ayuda en los foros.

Los errores de avrdude más frecuentes y qué significan

Mensaje de error (parte clave)Qué significaDónde mirar primero
stk500_recv(): programmer is not respondingEl puerto se abrió pero la placa nunca respondióPuerto elegido, cable, pines 0 y 1, Old Bootloader en el Nano
stk500_getsync() attempt 1 of 10: not in sync: resp=0x00No hay datos en la línea, el bootloader no participó en la sincronizaciónAjuste Processor, reinicio automático, bootloader
not in sync: un valor distinto de resp=0x00 (p. ej. 0xfe)Algo responde, pero no es el bootloaderMódulo en el pin 0, salida serie del sketch en marcha, velocidad incorrecta
ser_open(): can't open device "\\.\COM3": Access is denied.Otro programa está usando el puertoMonitor Serie, una segunda ventana del IDE, PuTTY, Cura y programas parecidos
ser_open(): can't open device ... The system cannot find the file specified.El puerto elegido ya no existePlaca desconectada o número de puerto cambiado; vuelve a elegir el puerto
Failed uploading: no upload port providedNo hay ningún puerto seleccionadoHerramientas > Puerto o el selector de placa de arriba
Device signature = 0x1e950f ... Expected signature for ATmega2560El chip de la placa elegida no coincide con el montadoElige bien la placa de destino en el menú de placas (0x1e950f es el identificador del ATmega328P); esta línea suele salir al grabar el bootloader por ISP
stk500v2_ReceiveMessage(): timeoutMega 2560 seleccionada pero la placa no responde¿Es de verdad una Mega? ¿Es correcto el puerto?
verification error, first mismatch at byte 0x0000Lo escrito no coincide con lo que se vuelve a leerCable, hub USB, alimentación débil, flash desgastada

Tabla de diagnóstico paso a paso: síntoma, causa y solución

Lee la tabla de arriba abajo; las primeras filas son los problemas más frecuentes y los más fáciles de resolver. Vuelve a intentar la carga después de cada cambio. Si cambias varias cosas a la vez, nunca sabrás cuál lo solucionó y el mismo error volverá a sorprenderte la próxima vez.

SíntomaCausa probableSolución
Al conectar la placa no se enciende ningún LEDEl puerto USB o el cable no dan corriente, o hay un cortocircuito en la placaPrueba otro puerto y otro cable, quita todos los módulos, mide entre 5V y GND
El LED de alimentación se enciende pero Herramientas > Puerto está gris o vacíoCable que solo carga o driver que faltaUsa un cable de datos; si el Administrador de dispositivos muestra USB2.0-Serial con un aviso amarillo, instala el driver CH340
Hay varios puertos COM en la listaPuertos virtuales de Bluetooth y del sistemaDesconecta y vuelve a conectar la placa y elige el puerto que desaparece y vuelve
Failed uploading: no upload port providedNo hay puerto seleccionadoElige el puerto en el selector de placa de arriba o en Herramientas > Puerto
Access is denied, Acceso denegado, port busyEl puerto está abierto en otro programaCierra la segunda ventana del IDE, el Plotter Serie, PuTTY, Cura y los scripts de Python, y reconecta la placa
not in sync: resp=0x00 en un NanoLa placa tiene el bootloader antiguoHerramientas > Processor > ATmega328P (Old Bootloader)
El mismo error con un módulo en D0 o D1El módulo habla por la línea serie y rompe la sincronizaciónDesconecta los cables de D0 y D1 al subir, pasa el módulo a otros pines con SoftwareSerial
El mismo error sin nada conectadoPlaca o puerto equivocados, reinicio automático averiado, bootloader borradoRevisa los ajustes, prueba un reinicio manual, haz el test de loopback y, si hace falta, graba el bootloader
Identificador inesperado en la línea Device signatureModelo equivocado en el menú de placasElige la placa según el texto impreso en el chip
La carga se corta a mitad, verification errorCable malo, hub USB, consumo de un motor o servoCable corto y de calidad, puerto directo del ordenador, alimentación externa para los motores
El ordenador desactiva el puerto USB al conectar la placaCortocircuito o exceso de corriente en el circuitoQuita todos los cables, prueba la placa sola y vuelve a montar el circuito pieza a pieza
ESP32: Connecting... y luego Failed to connectLa placa no pudo entrar en modo de descargaMantén pulsado BOOT cuando aparezca Connecting
Pico: no hay puerto o No drive to deployLa placa no está en modo BOOTSELMantén pulsado BOOTSEL mientras conectas el cable USB

Lista de comprobación rápida y sketch de prueba

  1. Quita todo lo que haya en la placa: shields, módulos y los cables de los pines 0 y 1. Deja solo el cable USB conectado.
  2. Conecta la placa directamente a un puerto USB de la parte trasera del ordenador; evita hubs, alargadores y los conectores del frontal de la caja.
  3. Abre Herramientas > Puerto y mira la lista. Desconecta y vuelve a conectar la placa y fíjate en qué puerto desaparece y vuelve. Si la lista no cambia nunca, el problema está en el cable o en el driver.
  4. Elige el modelo exacto de tu placa en Herramientas > Placa; si usas un Nano, elige además el bootloader correcto en Herramientas > Processor.
  5. Asegúrate de que ningún otro programa ni una segunda ventana del IDE estén usando el puerto; si dudas, ciérralos todos.
  6. Activa la salida detallada de la carga y sube el pequeño sketch de prueba de abajo. Probar con un código que sabes que no tiene errores descarta los problemas de compilación.
  7. ¿Sigue sin funcionar? Pulsa el botón de reset: si el LED L parpadea rápido una o varias veces, el bootloader está vivo. Después pasa al test de loopback de más abajo.
  8. Prueba en otro ordenador o con otra placa. Si el problema viaja con la placa, está en la placa; si se queda en el ordenador, está en el driver o en la configuración del sistema.
Arduino (C++)
1// Yükleme testi: LED yanıp söner, sayaç yazılır / Upload test: blinks the LED, prints a counter
2unsigned long sayac = 0;   // çalışma sayacı / run counter
3
4void setup() {
5  pinMode(LED_BUILTIN, OUTPUT);   // Uno ve Nano'da pin 13 / pin 13 on Uno and Nano
6  Serial.begin(9600);
7  Serial.println("Yukleme basarili / Upload OK");
8}
9
10void loop() {
11  digitalWrite(LED_BUILTIN, HIGH);
12  delay(200);                     // yanma süresi: değiştirip tekrar yükle / on time: change it and re-upload
13  digitalWrite(LED_BUILTIN, LOW);
14  delay(800);
15  Serial.println(sayac++);        // Seri Monitör 9600 baud / Serial Monitor at 9600 baud
16}

Si la carga ha funcionado, el LED L parpadea brevemente y se queda apagado más tiempo, y el contador sube cuando abres el Monitor Serie a 9600 baudios. Para asegurarte de que el código nuevo ha llegado de verdad a la placa, cambia delay(200) por delay(50) y vuelve a subirlo: si el ritmo del parpadeo no cambia, sigue funcionando el programa antiguo. Si ves caracteres raros en el Monitor Serie, la velocidad elegida en el Monitor Serie no coincide con la del código; eso no es un error de carga.

El puerto COM no aparece: cable USB y drivers CH340 y CP2102

Si el menú de puertos está gris o vacío, el primer sospechoso es el cable. Muchos cables finos de los cargadores de móvil solo tienen los dos hilos de alimentación; los hilos de datos D+ y D- no existen. Con un cable así el LED de alimentación de la placa se enciende, lo que confunde, pero el ordenador no ve ningún dispositivo y ni siquiera suena el aviso de conexión. Comprueba tu cable pasando archivos a un móvil o con otra placa que sepas que funciona. El grueso cable tipo B del Uno rara vez tiene este problema; es muy habitual con el mini USB del Nano y con los cables micro USB o USB-C del ESP32 y la Pico.

Si el cable está bien, el segundo sospechoso es el driver. Lee el texto del chip que hay junto al conector USB: el Arduino Uno y la Mega originales usan un ATmega16U2, los clones de Uno y Nano casi siempre un CH340G o CH340C, y las placas de desarrollo ESP32 suelen llevar un CP2102 o un CH340. En Windows abre el Administrador de dispositivos: si la placa se reconoce, aparece en Puertos (COM y LPT). Si ves USB2.0-Serial con un signo de exclamación amarillo en Otros dispositivos, falta el driver CH340.

Módulo conversor USB a TTL CH340
El chip CH340: en la mayoría de los clones de Arduino Uno y Nano este chip gestiona la comunicación USB-serie, y su driver debe estar instalado para que el ordenador vea la placa.
Chip USBDónde se encuentraNombre en WindowsNombre del puerto en macOS y Linux
ATmega16U2Uno R3 original, Mega 2560Arduino Uno (COMx)/dev/cu.usbmodem…, /dev/ttyACM0
CH340G, CH340CClones de Uno, Nano y Mega, algunas placas ESP32USB-SERIAL CH340 (COMx)/dev/cu.usbserial-…, /dev/ttyUSB0
CP2102, CP2104ESP32 DevKit, NodeMCUSilicon Labs CP210x USB to UART Bridge (COMx)/dev/cu.SLAB_USBtoUART o /dev/cu.usbserial-…, /dev/ttyUSB0
FT232RLNano original antiguo, adaptadores FTDIUSB Serial Port (COMx)/dev/cu.usbserial-…, /dev/ttyUSB0
CH9102Placas de desarrollo ESP32 más recientesUSB-Enhanced-SERIAL CH9102 (COMx)/dev/cu.wchusbserial… o /dev/cu.usbmodem…, /dev/ttyACM0
USB nativo (RP2040, ATmega32U4)Raspberry Pi Pico, Leonardo, MicroDispositivo serie USB o el nombre de la placa (COMx)/dev/cu.usbmodem…, /dev/ttyACM0

Windows 10 y 11 suelen instalar ellos mismos los drivers del CH340 y del CP2102 a través de Windows Update. Si no lo hacen, descarga de la web del fabricante del chip el driver CH341SER para el CH340 o el CP210x VCP para el CP2102, instálalo y vuelve a conectar la placa. Las versiones actuales de macOS ya traen drivers para los dos chips; instalar drivers antiguos de distintas fuentes uno encima de otro suele empeorar las cosas. En Linux los drivers ya están en el kernel, pero para usar el puerto tienes que añadir tu usuario al grupo dialout (sudo usermod -a -G dialout $USER) y cerrar y volver a abrir la sesión; si no, verás un error Permission denied. Si en Ubuntu 22.04 o posterior el puerto desaparece nada más conectar una placa con CH340, el culpable suele ser el paquete de lector de pantalla brltty; si no lo usas, elimínalo con sudo apt remove brltty.

Si el ordenador desactiva el puerto USB en cuanto conectas la placa, o la placa se conecta y desconecta sin parar, hay un cortocircuito o un exceso de corriente en tu circuito. El Arduino Uno tiene un fusible rearmable de 500 mA que protege la línea USB; cuando salta, la placa no aparece en absoluto. Quita todos los cables, mide con el multímetro entre 5V y GND y alimenta los motores y servos grandes con una fuente externa en lugar de los 5V del USB.

Placa, procesador o puerto equivocados

En el Arduino IDE 2 eliges la placa y el puerto en la lista desplegable de la barra superior o en los menús Herramientas > Placa y Herramientas > Puerto. En Windows puede que veas COM1 o varios puertos virtuales de Bluetooth; la forma más fácil de dar con el correcto es desconectar la placa y ver qué puerto desaparece. Si en el menú de placas está elegido un modelo equivocado, como Mega en lugar de Uno o Leonardo en lugar de Nano, avrdude no recibe ninguna respuesta o ve un identificador de chip inesperado en la línea Device signature. Un detalle más: usa Ctrl+U para una carga normal. Sketch > Cargar usando el programador espera un programador ISP externo y, si funciona, borra el bootloader de la placa; a partir de ahí la placa ya no acepta cargas por USB.

Arduino Nano no sube el código: ATmega328P (Old Bootloader)

La mayoría de las placas Nano baratas del mercado son clones con CH340, y muchas de ellas siguen llevando el bootloader antiguo. A principios de 2018 Arduino sustituyó el bootloader del Nano por el Optiboot del Uno, más pequeño y rápido, y desde entonces la opción predeterminada ATmega328P del IDE se comunica a 115200 baudios. El bootloader antiguo espera 57600 baudios. Cuando las velocidades no coinciden, parece que la placa no responde y el error not in sync: resp=0x00 se repite durante diez intentos. La solución es un único ajuste de menú: Herramientas > Processor > ATmega328P (Old Bootloader). Como estas opciones vienen del paquete de la placa, en el Arduino IDE 2 el menú se llama Processor también con la interfaz en español (en el antiguo IDE 1.8, Procesador). Si no sabes cuál es la correcta, prueba las opciones una tras otra; elegir mal no daña la placa.

Opción de ProcessorBootloaderVelocidad de carga¿Cuándo elegirla?
ATmega328POptiboot (nuevo)115200 baudiosNano original y placas con el bootloader actualizado
ATmega328P (Old Bootloader)ATmegaBOOT (antiguo)57600 baudiosLa mayoría de los clones de Nano con CH340
ATmega168ATmegaBOOT (antiguo)19200 baudiosPlacas antiguas con ATmega168 impreso en el chip

Los módulos en los pines 0 y 1 bloquean la carga

En el Uno y el Nano el chip USB-serie está conectado al ATmega328P mediante resistencias de 1 kΩ en los pines D0 (RX) y D1 (TX). Durante la carga esa línea pertenece al ordenador. Si hay un módulo serie conectado a esos pines, como un módulo Bluetooth HC-05, un GPS, un ESP-01 o un sensor de huellas, envía sus propios datos a la línea o la mantiene en un nivel fijo y rompe la sincronización del bootloader. El resultado vuelve a ser programmer is not responding o not in sync. Lo más rápido es desconectar los cables de D0 y D1 mientras subes el código; la solución definitiva es mover el módulo a otros pines con SoftwareSerial:

Arduino (C++)
1#include <SoftwareSerial.h>
2
3// HC-05 TX -> D10, HC-05 RX <- D11 (gerilim bölücüyle / through a voltage divider)
4SoftwareSerial bt(10, 11);   // RX, TX pinleri / RX, TX pins
5
6void setup() {
7  Serial.begin(9600);        // USB: Seri Monitör / USB: Serial Monitor
8  bt.begin(9600);            // HC-05 veri modu hızı / HC-05 data mode baud rate
9  Serial.println("Hazir / Ready");
10}
11
12void loop() {
13  if (bt.available()) Serial.write(bt.read());      // telefondan bilgisayara / phone to PC
14  if (Serial.available()) bt.write(Serial.read());  // bilgisayardan telefona / PC to phone
15}

En este sketch el TX del HC-05 va a D10 y su RX a D11. La entrada RX del HC-05 trabaja a 3,3 V, así que pon entre ella y D11 un divisor de tensión con resistencias de 1 kΩ y 2 kΩ. Ahora puedes subir código con el módulo conectado y enviar a tu móvil lo que escribas en el Monitor Serie. Para ver el conexionado completo y el modo de comandos AT, consulta la guía del módulo Bluetooth HC-05. Con una Mega no necesitas SoftwareSerial: la placa tiene puertos serie por hardware adicionales como Serial1 (TX1 = D18, RX1 = D19).

El Monitor Serie y los programas que ocupan el puerto

Un puerto serie solo puede abrirlo un programa a la vez. Por eso Windows muestra Access is denied (en español, Acceso denegado) y macOS y Linux muestran Resource busy. El Arduino IDE suele pausar su propio Monitor Serie durante la carga, pero no funciona a la perfección en todas las versiones ni con todas las placas, sobre todo con el ESP32; si te sale el error, cierra primero la pestaña del Monitor Serie. Lo más habitual es que el puerto lo tenga otra cosa: una segunda ventana del IDE, el Plotter Serie abierto, PuTTY, programas de impresión 3D como Cura, el monitor de PlatformIO en VS Code o un script de Python en segundo plano. Ciérralos, desconecta y vuelve a conectar la placa e inténtalo de nuevo. En Linux puedes ver qué programa ocupa el puerto con sudo lsof /dev/ttyUSB0.

¿Está rota la placa? Test de loopback y grabar el bootloader

Si has probado todo lo anterior y sigue sin subir, tienes que averiguar si el problema está en la parte USB o en el procesador principal. El método clásico para el Uno y el Nano es el test de loopback (bucle): mantienes el procesador principal en reset y haces que el chip USB-serie hable consigo mismo. Para esta prueba no hace falta subir ningún código.

  1. Quita todos los cables de la placa y deja solo el cable USB conectado.
  2. Con un cable jumper une el pin RESET con GND; así el ATmega328P se queda en reset y no interfiere en la línea.
  3. Con un segundo cable une los pines D0 y D1.
  4. Elige el puerto de la placa en el IDE y abre el Monitor Serie; la velocidad no importa para esta prueba.
  5. Escribe unas letras en la casilla y envíalas. Si el texto vuelve tal cual, el cable, el driver y el chip USB-serie están bien y el problema está en el procesador principal o en el bootloader. Si no vuelve nada, el problema está en la parte USB.
  6. No olvides quitar los dos cables al terminar.

Si la placa pasa el test de loopback pero la carga sigue fallando, y el LED L no parpadea rápido al pulsar reset, puede que el bootloader se haya borrado o que se haya cambiado el chip. Puedes volver a grabar el bootloader con un segundo Uno. Sube Archivo > Ejemplos > 11.ArduinoISP > ArduinoISP al Uno que hará de programador. Después une el D10 del programador con el pin RESET de la placa de destino, D11, D12 y D13 con los pines del mismo número del destino, y 5V y GND entre sí. Coloca un condensador de 10 µF entre RESET y GND del Uno programador; así evitas que se reinicie solo. Por último elige Herramientas > Programador > Arduino as ISP, selecciona la placa de destino en el menú de placas y ejecuta Herramientas > Grabar Bootloader. Con este método también puedes darle a un clon de Nano el nuevo Optiboot.

El ESP32 no sube el código: Failed to connect y el botón BOOT

En el ESP32 la carga no la hace avrdude, sino esptool. En la salida aparece primero la línea Connecting........_____..... mientras esptool intenta poner la placa en modo de descarga. Si no lo consigue, verás un error que empieza por A fatal error occurred: Failed to connect to ESP32. En las versiones actuales de esptool, si la placa arrancó en modo normal, el mensaje sigue con Wrong boot mode detected (0x13)! The chip needs to be in download mode.; 0x13 indica que la placa arrancó en su modo normal en lugar del modo de descarga. Si la placa no responde en absoluto, el mensaje termina con No serial data received; las versiones antiguas lo escriben como Timed out waiting for packet header. Si la placa no entra sola en modo de descarga, lo haces tú a mano.

Placa de desarrollo ESP32
Placa de desarrollo ESP32: los botones EN (reset) y BOOT (GPIO0) de la placa permiten ponerla a mano en modo de descarga cuando la carga automática falla.
  1. Pulsa Cargar en el IDE y vigila la ventana de salida.
  2. En cuanto aparezca Connecting..., mantén pulsado el botón BOOT de la placa.
  3. Si aun así no conecta, con BOOT pulsado da una pulsación corta a EN y suéltalo.
  4. Suelta BOOT cuando en la salida empiecen a correr las líneas Writing at y el porcentaje de la carga.
  5. La carga termina con Hard resetting via RTS pin.... Si el programa no arranca, pulsa EN una vez.

¿Por qué pasa esto? Para entrar en modo de descarga, el pin GPIO0 del ESP32 tiene que estar en LOW en el momento del arranque. El circuito de reinicio automático de dos transistores de las placas de desarrollo lo hace solo con las señales DTR y RTS del chip USB; en las placas baratas ese circuito puede fallar en la sincronización. Si te cansa pulsar BOOT cada vez, hay una solución permanente: conecta un condensador electrolítico de 10 µF entre el pin EN y GND de la placa (la pata negativa a GND). El condensador retrasa la subida de la línea EN y da tiempo al circuito de reinicio automático para mantener GPIO0 en LOW.

Mensaje de error del ESP32Causa probableSolución
Wrong boot mode detected (0x13)El circuito de reinicio automático no pudo poner la placa en modo de descargaBotón BOOT; como solución permanente, 10 µF entre EN y GND
No serial data received o Timed out waiting for packet headerNo llega ningún dato de la placa: cable que solo carga, puerto equivocado o placa que nunca entró en modo de descargaCable de datos, puerto correcto en Herramientas > Puerto, botón BOOT
This chip is ESP32-S3 not ESP32. Wrong --chip argument?En Herramientas > Placa está elegido un modelo de ESP32 distinto del de tu placaElige el modelo que corresponde al módulo de la placa (ESP32, ESP32-S3 y ESP32-C3 son placas distintas)
Could not open COM3, the port is busy or doesn't existEl Monitor Serie u otro programa tiene ocupado el puertoCierra el Monitor Serie y los demás programas, desconecta y vuelve a conectar la placa
Invalid head of packet: Possible serial noise or corruptionCable largo o de mala calidad, alimentación débil, velocidad de carga altaBaja Herramientas > Upload Speed de 921600 a 115200
La carga funciona pero al arrancar sale flash read err, 1000GPIO12 en HIGH al arrancar, se elige una tensión de flash incorrectaMueve el módulo de GPIO12 a otro pin
El puerto desaparece tras la carga (ESP32-S3, ESP32-C3)En una placa con USB nativo el programa se colgó o desactivó el USBConecta el USB con BOOT pulsado; Herramientas > USB CDC On Boot: Enabled
Los pines GPIO0, GPIO2, GPIO12 y GPIO15 del ESP32 son pines de configuración (strapping) que se leen al arrancar. Un módulo que pone GPIO2 en HIGH o que impide que GPIO0 baje a LOW bloquea el modo de descarga; un módulo que pone GPIO12 en HIGH puede impedir incluso que la placa arranque. Si la carga solo falla con tu circuito conectado, revisa primero estos pines. Para ver la lista de pines seguros, consulta la herramienta Pinout y la guía ¿Qué es el ESP32?.
Arduino (C++)
1// ESP32 yükleme testi / ESP32 upload test
2const int LED_PIN = 2;   // birçok DevKit kartında dahili LED / onboard LED on many DevKit boards
3
4void setup() {
5  pinMode(LED_PIN, OUTPUT);
6  Serial.begin(115200);   // Seri Monitör 115200 baud / Serial Monitor at 115200 baud
7  delay(500);
8  Serial.print("Model: ");
9  Serial.println(ESP.getChipModel());                 // ör. ESP32-D0WD-V3 / e.g. ESP32-D0WD-V3
10  Serial.print("Flash (MB): ");
11  Serial.println(ESP.getFlashChipSize() / (1024 * 1024));
12  Serial.print("CPU (MHz): ");
13  Serial.println(getCpuFrequencyMhz());
14}
15
16void loop() {
17  digitalWrite(LED_PIN, !digitalRead(LED_PIN));   // LED'i tersle / toggle the LED
18  delay(500);
19}

Raspberry Pi Pico: cargar con BOOTSEL y UF2

La Pico no tiene un chip USB-serie aparte; el RP2040 tiene su propio controlador USB y el bootloader está en la ROM del chip, que no se puede borrar. Por eso es casi imposible estropear una Pico por software. Si mantienes pulsado el botón BOOTSEL mientras conectas el cable USB, la Pico aparece en el ordenador como una unidad llamada RPI-RP2 (en la Pico 2 la unidad se llama RP2350). Cualquier archivo .uf2 que arrastres a esa unidad se graba en la placa, que luego se reinicia sola; así es también como se instala MicroPython.

Si programas la Pico con el Arduino IDE, en la primera carga todavía no hay puerto COM; conecta la placa con BOOTSEL pulsado y haz clic en Cargar. Después del primer sketch la placa abre un puerto serie y las cargas siguientes ya no necesitan BOOTSEL. Si tu código se cuelga o desactiva el USB, el puerto vuelve a desaparecer y aparece el error No drive to deploy; entonces vuelve al método BOOTSEL. Si usas MicroPython, en la esquina inferior derecha de Thonny debe estar seleccionado el intérprete MicroPython (Raspberry Pi Pico). Para conocer los pines y la configuración de la Pico, consulta la guía ¿Qué es la Raspberry Pi Pico?.

SíntomaCausa probableSolución
La unidad RPI-RP2 no aparece nuncaCable que solo carga, o BOOTSEL pulsado después de conectar el cableUsa un cable de datos; pulsa primero BOOTSEL, luego conecta el cable y suelta cuando aparezca la unidad
Arduino IDE: No drive to deployLa placa no está en modo BOOTSEL y no hay puerto serieVuelve a conectarla con BOOTSEL pulsado y haz clic en Cargar
Thonny: Couldn't find the device automaticallyMicroPython no está instalado o la placa sigue en modo BOOTSELInstala el UF2 con la opción Install or update MicroPython de Thonny
Thonny: Device is busy or does not respondmain.py está atrapado en un bucle intenso y no respondePulsa el botón Stop o Ctrl+C; si no basta, desconecta y vuelve a conectar la placa
El código funcionó pero la placa no lo arranca solaEl archivo no se guardó en la Pico con el nombre main.pyGuarda el archivo en la ubicación Raspberry Pi Pico como main.py
La placa se cuelga continuamente y no carga nadaArchivo dañado o programa defectuoso en la flashBorra la flash con flash_nuke.uf2 y vuelve a instalar MicroPython
MicroPython
1import time
2from machine import Pin
3
4time.sleep(3)   # açılışta 3 sn bekle, Thonny durdurabilsin / wait 3 s so Thonny can stop the script
5
6led = Pin("LED", Pin.OUT)   # Pico ve Pico W dahili LED / onboard LED on Pico and Pico W
7sayac = 0
8while True:
9    led.toggle()
10    print("Calisiyor / running", sayac)
11    sayac += 1
12    time.sleep(0.5)

Causas pequeñas pero traicioneras que se pasan por alto

  • Leonardo, Micro y Uno R4: En estas placas con USB nativo el puerto puede cambiar un instante durante la carga. Si la carga se queda colgada, haz clic en Cargar y pulsa el botón de reset una vez justo cuando termine la compilación y empiece la carga (en el Uno R4, dos veces rápido); la placa espera un rato en el bootloader y el código se sube en ese momento.
  • Reinicio automático averiado: Si el reinicio automático no funciona en un Uno o un Nano, mantén pulsado reset, haz clic en Cargar y suéltalo justo cuando aparezca en la salida la línea con el tamaño del sketch.
  • Shields y circuitos externos: Un shield de motores o un circuito que carga la línea de 5V puede hacer caer la tensión durante la carga y cortar la escritura a mitad.
  • Puerto equivocado en macOS: /dev/cu.Bluetooth-Incoming-Port y /dev/cu.debug-console en la lista de puertos no son tu placa, sino puertos del sistema. El puerto de tu placa lleva usbmodem, usbserial o wchusbserial en el nombre; si dudas, desconecta y vuelve a conectar la placa y mira cuál desaparece.
  • Caracteres especiales en el nombre de usuario: Si la carpeta de tu usuario de Windows contiene tildes, la ñ u otros caracteres especiales, las herramientas de compilación y carga de algunos paquetes de placas, sobre todo el del ESP32, pueden no encontrar los archivos. Mueve la carpeta de sketches a una ruta sin esos caracteres desde Preferencias; si el problema sigue, crea un usuario de Windows nuevo.
  • Sketch demasiado grande: El aviso Sketch too big no es un error de carga; indica que tu código no cabe en los aproximadamente 31,5 KB de flash que le quedan al Uno después del bootloader. Recorta librerías y textos largos o pasa a una placa más grande.
  • Puerto bloqueado tras la suspensión: Cuando el ordenador sale de la suspensión el puerto puede quedarse bloqueado; reiniciar el IDE o conectar la placa a otro puerto USB suele bastar.
Cuando pruebes una placa nueva por primera vez, empieza siempre con un código sencillo que sepas que no tiene errores, como el sketch de prueba de arriba, y no con el código de tu proyecto. Si el sketch sencillo se sube y tu proyecto no, la placa está bien; el problema está en la compilación de tu código o en los pines que usa tu proyecto. Hacer esta distinción es la mitad del diagnóstico.

La carga funciona: ¿y ahora qué?

  • Primer circuito: Monta tu propio circuito Blink con un LED y una resistencia y después añade un pulsador para tu primer proyecto interactivo.
  • Comunicación serie: Ahora que sabes cómo afectan los pines 0 y 1 a la carga, prueba a encender un LED desde el móvil con el módulo Bluetooth HC-05.
  • Leer sensores: Con la guía de sensores para Arduino elige tus primeros proyectos para medir temperatura, distancia y luz.
  • Pasarte a lo inalámbrico: Haz con el ESP32 un proyecto que se conecte al Wi-Fi y se controle desde el móvil; gracias a OTA, más adelante podrás subir el código también sin cables.
  • Elegir la placa adecuada: Si dudas entre Uno, Nano y Mega, lee ¿Qué Arduino debo comprar?.

Los errores de carga son molestos la primera vez, pero cada uno tiene una causa lógica y casi todos se encuentran en el mismo orden: cable, driver, puerto, ajustes de placa, línea serie y, por último, el bootloader. Si tienes en mente este orden, resolverás el próximo error en minutos. En cuanto tu placa acepte código, en la app BlueGrays encontrarás muchos proyectos para Arduino, ESP32 y Raspberry Pi Pico, desde encender un LED hasta Wi-Fi y actualizaciones OTA inalámbricas, cada uno con su esquema de conexión paso a paso y su código listo, para poner tu placa a trabajar enseguida.

Preguntas frecuentes

¿Por qué no se sube el código a mi Arduino?

Las causas más habituales son un cable USB que solo carga, un driver CH340 que falta, la placa o el puerto equivocados y módulos conectados a los pines 0 y 1. En los clones de Nano, además, Herramientas > Processor debe estar en ATmega328P (Old Bootloader). Si revisas estos puntos por orden, la placa casi siempre resulta estar bien.

¿Cómo soluciono avrdude stk500_getsync not in sync resp=0x00?

Este error indica que el ordenador no consigue sincronizarse con el bootloader de la placa. Primero elige el puerto y la placa correctos, prueba la opción Old Bootloader en Herramientas > Processor si usas un Nano y desconecta los cables de D0 y D1. Si persiste, comprueba la parte USB con el test de loopback y, si hace falta, vuelve a grabar el bootloader.

¿Por qué mi Arduino no aparece en el ordenador?

Si Herramientas > Puerto está vacío, el cable no transmite datos o falta el driver del chip USB-serie. Prueba otro cable de datos y mira en el Administrador de dispositivos de Windows si la placa aparece en Puertos (COM y LPT). Si ves USB2.0-Serial con un aviso amarillo en Otros dispositivos, instala el driver CH340.

¿Cómo se instala el driver CH340?

Windows 10 y 11 suelen instalarlo automáticamente; si no, descarga y ejecuta el paquete CH341SER del fabricante WCH y vuelve a conectar la placa. Las versiones actuales de macOS ya lo incluyen y en Linux viene con el kernel. En Linux solo tienes que añadir tu usuario al grupo dialout.

¿Cuándo hay que pulsar el botón BOOT para subir código al ESP32?

Mantén pulsado BOOT en cuanto aparezca Connecting... en la salida y suéltalo cuando empiecen a correr los porcentajes de la carga. Así el ESP32 entra en modo de descarga. Si lo necesitas en cada carga, un condensador de 10 µF entre EN y GND suele solucionarlo para siempre.

¿Qué hago si el ordenador no reconoce mi Raspberry Pi Pico?

Mantén pulsado el botón BOOTSEL y conecta la Pico al ordenador con un cable de datos; debería aparecer como una unidad llamada RPI-RP2. En este modo puedes arrastrar el archivo UF2 de MicroPython o subir código desde el Arduino IDE. Si no aparece ninguna unidad, el cable no transmite datos; el bootloader de la Pico está en la ROM, así que el software no puede estropearlo.

Ver todos los proyectos
Iluminación Led
#1Principiante

Iluminación Led

Proyecto básico de entrada que enciende y apaga un único LED a determinados intervalos con Arduino. Enseña el uso de las funciones digitalWrite y delay.

4.7(163)
782
LED Parpadeante con ESP32
#103Principiante

LED Parpadeante con ESP32

Enseña el uso básico de la salida GPIO con ESP32. Conseguimos un efecto de parpadeo encendiendo y apagando un LED desde el pin digital. Versión para ESP32 del clásico proyecto blink en Arduino UNO; el mapa de pines y la sintaxis son los mismos, la diferencia está sólo en los números de pin.

4.7(36)
92
Parpadeo del LED interno del ESP32
#106Principiante

Parpadeo del LED interno del ESP32

Parpadeo del LED azul incorporado en el ESP32 DevKit V1. ¡No se necesitan componentes externos! El primer proyecto que debe probar cuando compra un ESP32. GPIO 2 está conectado al LED interno.

4.8(29)
53
Parpadeo LED Integrado Raspberry Pi Pico (GP25 LED Onboard)
#147Principiante

Parpadeo LED Integrado Raspberry Pi Pico (GP25 LED Onboard)

¡El proyecto de apertura de la serie Raspberry Pi Pico! Hacemos parpadear el LED integrado (LED verde conectado a GP25) para verificar que la placa funciona — un experimento clásico "Hello World". SIN componentes externos, solo Pico y cable USB. El código está escrito en **MicroPython** (el lenguaje oficialmente respaldado por la Raspberry Pi Foundation). Aprende la clase `machine.Pin`, el modo `Pin.OUT`, los métodos `led.on()/off()` y `time.sleep()` en Thonny IDE. Sigue cada cambio en vivo en l

5.0(1)
9
HC-SR04 Medición de distancia (pantalla en serie)
#27Principiante

HC-SR04 Medición de distancia (pantalla en serie)

Sensor ultrasónico HC-SR04 para medir distancias y mostrar el resultado en cm en el monitor serie. Enseña el principio del cálculo de distancias con ondas sonoras.

4.6(44)
65
Iluminación Led desde el teléfono vía Bluetooth
#34Principiante
Premium

Iluminación Led desde el teléfono vía Bluetooth

Proyecto de control inalámbrico que enciende y apaga LEDs con comandos enviados desde el teléfono con módulo Bluetooth HC-06. Enseña el intercambio de datos Bluetooth a través de la comunicación serie

4.8(68)
88
2 Comunicación unidireccional Arduino
#57Intermedio
Premium

2 Comunicación unidireccional Arduino

Un proyecto para la transferencia unidireccional de datos entre dos Arduinos mediante comunicación serie. Detecta la pulsación del botón en el lado del transmisor y enseña a controlar el LED en el lad

4.4(37)
50
Actualización OTA del ESP32 — Instalación inalámbrica del firmware (con pantalla LCD)
#132Avanzado
Premium

Actualización OTA del ESP32 — Instalación inalámbrica del firmware (con pantalla LCD)

En este proyecto aprenderás a instalar un nuevo firmware en el ESP32 a través de Wi-Fi, sin necesidad de un cable USB. Con la biblioteca `ArduinoOTA`, el ESP32 se hace visible en la red y aparece automáticamente como `bluegrays-ota` en la pestaña «Puerto de red» del IDE de Arduino. La primera instalación se realiza mediante USB; a partir de ahí, todas las actualizaciones se realizan de forma inalámbrica, lo cual es una característica fundamental para los dispositivos de campo. En la pantalla LCD

4.7(13)
21

Aprende a leer el error de carga, a encontrar la causa con una tabla de síntomas y a resolver paso a paso los problemas de cable, driver, puerto y bootloader en Arduino, ESP32 y Raspberry Pi Pico.

Error al subir código a Arduino: avrdude, puerto COM y drivers | BlueGrays