Arduino Pro Micro - can't communicate

Hi All,

I seem to have run into a problem with an Arduino Pro Micro (actually a clone I bought off eBay). I am working on Mac.

I had built my circuit (for a star tracker) on breadboard, and all was working nicely.

So, I have started soldering it all up on perfboard - I've done a fair bit of intricate work, so I don't really want to unsolder it if I can possibly help it!

Yesterday I tried uploading the standard "Blink" code (actually equivalent test code for Pro Micro that I've used before, see below), and all was running nicely.

Today I tried connecting again to test another component (a 4x7 segment LED), that connects to my circuit via a JST connector.

And today, the IDE can't see the port (and I don't see it via Terminal either): the blink code is still running however. I have tried resetting (connecting RST to GND), and it clearly stops the code running for a while (8 seconds or so) - but then it starts again without ever appearing as a port.

I have tried with another identical Pro Micro clone and that works fine (the port /dev/cu.usbmodem14601 appears): I can upload the blink code to this one, it runs fine. And if I disconnect, and then reconnect, the port appears again - so I'm sure the code, the cables, the drivers etc are not an issue.

Can anyone suggest where I might start troubleshooting?



/* Pro Micro Test Code
   by: Nathan Seidle
   modified by: Jim Lindblom
   SparkFun Electronics
   date: September 16, 2013
   license: Public Domain - please use this code however you'd like.
   It's provided as a learning tool.

   This code is provided to show how to control the SparkFun
   ProMicro's TX and RX LEDs within a sketch. It also serves
   to explain the difference between Serial.print() and

int RXLED = 17;  // The RX LED has a defined Arduino pin
// The TX LED was not so lucky, we'll need to use pre-defined
// macros (TXLED1, TXLED0) to control that.
// (We could use the same macros for the RX LED too -- RXLED1,
//  and RXLED0.)

void setup()
 pinMode(RXLED, OUTPUT);  // Set RX LED as an output
 // TX LED is set as an output behind the scenes

 Serial.begin(9600); //This pipes to the serial monitor
 Serial1.begin(9600); //This is the UART, pipes to sensors attached to board

void loop()
 Serial.println("Hello world");  // Print "Hello World" to the Serial Monitor
 Serial1.println("Hello!");  // Print "Hello!" over hardware UART

 digitalWrite(RXLED, LOW);   // set the RX LED ON
 TXLED0; //TX LED is not tied to a normally controlled pin so a macro is needed, turn LED OFF
 delay(1000);              // wait for a second

 digitalWrite(RXLED, HIGH);    // set the RX LED OFF
 TXLED1; //TX LED macro to turn LED ON
 delay(1000);              // wait for a second

Make sure you have fully inserted the USB cable into the USB jack on the Pro Micro and the computer.

Are you using the same USB cable when uploading to the working and the non-working Pro Micro boards?

Make sure you have fully inserted the USB cable into the USB jack on the Pro Micro and the computer.

Are you using the same USB cable when uploading to the working and the non-working Pro Micro boards?

Thanks - yes, same cable. First board is not communicating, second is.

Oh well, I think the way forward is to start again with the fresh board (these were about £4 each after all!)....

But the lesson learnt is to do it with a DIP socket to plug the Arduino into, like I should have done from the start!

You can try this:

Due to the USB stack running on the same chip as your sketch with this board, it is possible for code in your sketch to break the USB functionality of the Pro Micro. Luckily, the upload code (bootloader) is stored in a separate section of memory and can not be broken by the sketch code. The only tricky thing is that the bootloader has to be activated at just the right time during the upload. Normally this is done by some special code that runs in the background of your sketch code recognizing a 1200 baud connection as the signal to reset the microcontroller and start the bootloader. However, in your current situation, that system wont work so you'll need to manually reset the board to activate the bootloader. You need to get the timing right. If you press the reset button too early, the bootloader will have already timed out by the time the upload starts. The tricky thing is that when you press the "Upload" button in the Arduino IDE, it first compiles your sketch before starting the actual upload. So you need to wait until after the compilation finishes before pressing the reset button. The way to get the timing right is to watch the black console window at the bottom of the Arduino IDE window. As soon as you see something like this:

Sketch uses 444 bytes (1%) of program storage space. Maximum is 30720 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.

press and release the reset button.

Now I know you said that you tried resetting and didn't see a port, but after the reset the bootloader only runs for several seconds before exiting to the sketch. So if you weren't able to check for the port during that short amount of time the bootloader was running then you wouldn't see the bootloader's port appear (and then disappear once the sketch started).