If Arduino Nano uploads fail and the IDE throws an avrdude: stk500_recv(): programmer is not responding error, the immediate fix is usually selecting Tools > Processor > ATmega328P (Old Bootloader) in the Arduino IDE, or installing the correct CH340/FTDI Virtual COM Port (VCP) drivers. Most cheap Nano clones ship with an older 57600-baud bootloader and a CH340 USB-to-serial chip, while the IDE defaults to expecting a modern 115200-baud Optiboot environment.
This guide walks through the exact failure modes of the stk500 handshake, provides a decision tree to isolate the fault in under two minutes, and includes a complete ISP rescue procedure and verification code to get your board back on the bench.
The Exact Error String and Root Causes
When you hit upload, the Arduino IDE compiles your sketch and hands the hex file to avrdude. Avrdude opens the serial port, pulses the DTR (Data Terminal Ready) line to trigger the Nano's auto-reset circuit, and waits for the ATmega328P's bootloader to reply to a synchronization request. If that handshake fails, you get this exact error block:
avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00 avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00 Failed uploading: uploading error: exit status 1
The resp=0x00 means the microcontroller is completely silent. The ranked causes for this silence are:
- Bootloader Mismatch (80% of cases): The IDE is sending sync commands at 115200 baud, but the clone Nano's bootloader is listening at 57600 baud (the 'Old Bootloader').
- Missing VCP Driver (10% of cases): The OS doesn't recognize the CH340 or FT232RL chip, so no COM port is assigned, or the port is locked by another program (like a 3D printer slicer or serial monitor).
- Power-Only USB Cable (5% of cases): The cable lacks the D+ and D- data lines. The board powers on, but no serial data can flow.
- Bricked Bootloader or Dead Auto-Reset (5% of cases): The bootloader flash section was corrupted by a bad sketch, or the 100nF capacitor on the DTR reset line has failed, meaning the chip never reboots into programming mode.
Decision Path: The First Three Things to Check
Don't start rewiring your bench. Run through this decision tree to isolate the fault. Follow the 'If' condition to your concrete fix.
| Symptom / Observation | Diagnosis | Concrete Fix |
|---|---|---|
| If the Nano does not appear in the Tools > Port menu at all. | Missing driver or bad cable. | Swap to a known data-capable USB cable. If it still fails, install the CH340 VCP drivers from SparkFun (for clones) or FTDI drivers (for genuine boards). |
If the COM port appears, but upload fails at 99% or throws resp=0x14. |
Bootloader baud rate mismatch. | Go to Tools > Processor and select ATmega328P (Old Bootloader). Re-upload. |
If the COM port appears, but upload fails instantly with resp=0x00. |
Auto-reset failure or corrupted bootloader. | Press and hold the physical RESET button on the Nano. Click Upload in the IDE. Release the RESET button exactly when the IDE says 'Uploading'. If this works, your 100nF DTR capacitor is dead. If it fails, proceed to the ISP Rescue section below. |
Rescue Mission: Burning a New Bootloader via ISP
If the manual reset trick fails, your bootloader is corrupted. You need to use a second Arduino as an In-System Programmer (ISP) to flash a fresh Optiboot bootloader directly to the ATmega328P's memory. This bypasses the USB-to-serial chip entirely.
Parts List
- Programmer: 1x Genuine Arduino Uno R3 (or compatible clone with ATmega16U2/ATmega328P)
- Target: 1x Bricked Arduino Nano V3 (ATmega328P)
- Wiring: 6x Male-to-Male jumper wires
- Anti-Reset Cap: 1x 10µF electrolytic capacitor (rated 16V or higher)
Pin Mapping Table (Uno to Nano)
Wire the programmer's ICSP header (or digital pins) directly to the target Nano's corresponding pins. Do not use the Nano's USB port for power during this process.
| Programmer (Uno R3) | Target (Nano V3) | Function |
|---|---|---|
| Pin 10 (SS) | RESET | Target Reset Control |
| Pin 11 (MOSI) | Pin 11 | Master Out, Slave In |
| Pin 12 (MISO) | Pin 12 | Master In, Slave Out |
| Pin 13 (SCK) | Pin 13 | Serial Clock |
| 5V | 5V | Target Power |
| GND | GND | Common Ground |
Place a 10µF electrolytic capacitor between the RESET and GND pins on the Programmer Uno (positive leg to RESET, negative to GND). When the Arduino IDE opens the serial port to initiate programming, it pulses the Uno's DTR line, which would normally reset the Uno and break the ISP connection. The capacitor absorbs this pulse, keeping the Uno awake to act as the programmer. Remove it when you're done.
Numbered Steps to Burn the Bootloader
- Connect the Uno to your PC via USB. Open Arduino IDE 2.x.
- Go to File > Examples > 11.ArduinoISP > ArduinoISP. Upload this sketch to the Uno.
- Disconnect the Uno. Wire the Uno to the Nano using the pin mapping table above. Install the 10µF capacitor on the Uno.
- Reconnect the Uno to your PC. In the IDE, go to Tools > Board and select Arduino Nano.
- Go to Tools > Processor and select ATmega328P (This will flash the modern 115200-baud Optiboot bootloader).
- Go to Tools > Programmer and select Arduino as ISP (Do not select 'ArduinoISP').
- Click Tools > Burn Bootloader. Wait for the 'Done burning bootloader' message.
For a deeper dive into the AVR fuse bits and custom bootloader compilation, refer to Nick Gammon's definitive guide to AVR bootloaders.
Verification: Compilable Test Code with Error Handling
Once the bootloader is burned, disconnect the ISP wires, plug the Nano directly into your PC via USB, and select the standard ATmega328P processor (no 'Old Bootloader' needed now). Upload this hardware health-check sketch. It targets the Arduino Nano (ATmega328P) and includes robust error handling for I2C bus lockups, which frequently mimic board-death symptoms when a sensor shorts the SDA line.
#include <Wire.h>
// Pin definitions for Nano onboard LED and I2C
const int LED_PIN = 13;
const uint32_t I2C_TIMEOUT_MS = 500;
void setup() {
pinMode(LED_PIN, OUTPUT);
// Initialize Serial with a timeout to prevent hanging if USB bridge is faulty
Serial.begin(115200);
uint32_t serialStart = millis();
while (!Serial && (millis() - serialStart < 2000)) {
// Wait up to 2 seconds for serial port to open
}
Serial.println("--- Nano Hardware Health Check ---");
// Configure I2C with timeout to handle SDA stuck-low errors
Wire.begin();
Wire.setWireTimeout(I2C_TIMEOUT_MS, true); // true = reset bus on timeout
Serial.println("Setup complete. Scanning I2C bus...");
}
void loop() {
int deviceCount = 0;
for (byte address = 1; address < 127; address++) {
Wire.beginTransmission(address);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("Device found at 0x");
if (address < 16) Serial.print("0");
Serial.println(address, HEX);
deviceCount++;
}
else if (error == 4) {
Serial.print("FATAL: Unknown error at I2C address 0x");
if (address < 16) Serial.print("0");
Serial.println(address, HEX);
Serial.println("Action: Check for SDA/SCL short to GND.");
blinkErrorPattern();
}
}
if (Wire.getWireTimeoutFlag()) {
Serial.println("ERROR: I2C Bus Timeout. SDA line is stuck LOW.");
Serial.println("Action: Power cycle the Nano and check sensor wiring.");
Wire.clearWireTimeoutFlag();
blinkErrorPattern();
} else {
Serial.print("Scan complete. Devices found: ");
Serial.println(deviceCount);
}
// Heartbeat blink
digitalWrite(LED_PIN, HIGH);
delay(100);
digitalWrite(LED_PIN, LOW);
delay(2900);
}
void blinkErrorPattern() {
for (int i = 0; i < 5; i++) {
digitalWrite(LED_PIN, HIGH);
delay(100);
digitalWrite(LED_PIN, LOW);
delay(100);
}
// Halt further execution to prevent I2C bus hammering
while(1) {
digitalWrite(LED_PIN, HIGH);
delay(1000);
}
}
How to Extend or Simplify the Build
Depending on your project's end goal, you have two distinct paths forward after stabilizing your Nano:
- To Extend (Go Bare-Metal): Once your code is verified on the Nano, you can migrate the ATmega328P chip to a custom breadboard or PCB. You'll need to add a 16MHz crystal, two 22pF load capacitors, a 10kΩ pull-up on the RESET pin, and a 100nF decoupling cap on the VCC line. This strips away the USB bridge and regulator, dropping your BOM cost to under $3.00 and reducing sleep-mode power draw to microamps.
- To Simplify (Ditch the UART Bridge): If you are tired of CH340 driver issues and bootloader mismatches, switch to the ESP32-C3 SuperMini or the Raspberry Pi Pico (RP2040). Both feature native USB CDC (Communications Device Class). They appear as serial ports natively in the OS without secondary bridge chips, and they support drag-and-drop UF2 flashing, completely eliminating
avrdudeand stk500 errors from your workflow.
Final Verdict: Which Board to Buy Next Time
If your project strictly requires the 5V logic and ATmega328P architecture of the Nano, stop buying $4 clones with the CH340G chip and the 'Old Bootloader'. The time you lose debugging driver signatures and burning bootloaders via ISP far outweighs the $15 hardware savings.
The Default Pick: Buy the Adafruit Metro Mini 328 V2 (Product ID 2590).
It is a direct physical drop-in replacement for the Nano, but it uses a genuine FT232RL USB-to-serial chip (which has native OS support on almost every modern machine), features a properly tuned auto-reset circuit, and ships pre-flashed with the modern 115200-baud Optiboot bootloader. Select 'Arduino Uno' in the IDE, hit upload, and it will work on the first attempt, every time.






