Can't upload to Arduino Leonardo after running in low power

I have a clone of Arduino Leonardo with ATmega32U4 and I’m using the newest version of PlatformIO and VS Code on Ubuntu 18.04.5. Everything worked just fine until I started using LowPower library with a line like this:

  LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF);

It seems that the board is now stuck in some low power state and uploads fail with messages like this one:

Configuring upload protocol...
AVAILABLE: avr109
CURRENT: upload_protocol = avr109
Looking for upload port...
Error: Please specify `upload_port` for environment or use global `--upload-port` option.
For some development platforms it can be a USB flash drive (i.e. /media/<user>/<device name>)
*** [upload] Explicit exit, status 1
======================================================= [FAILED] Took 0.33 seconds =======================================================
The terminal process "platformio 'run', '--target', 'upload'" terminated with exit code: 1.

Cycling the power on Leonardo, USB port or the PC doesn’t help. I took another new board out of the box with the same result: everything was fine until I used LowPower. I tried double-clicking reset button and holding it until upload starts, but none of it helped.

Discussed in usb is closed ............? · Issue #31 · rocketscream/Low-Power · GitHub and USB port disappears when powered down · Issue #99 · rocketscream/Low-Power · GitHub – if you can’t get a USB port to show up, then you need an ISP programmer to rescue it again. From there on, add a delay at the start of the sketch to allow for some more time where the device is reachable. During a power down, the USB peripheral is also shut down down, which makes programming it via USB impossible.

1 Like

I didn’t have an ISP programmer handy, so before I went down the road of uploading a new bootloader, I tried something else. The bootloader on these boards seems to be working just fine. Double-clicking the reset button produces this log:

paul@desktop:~$ dmesg | grep -i USB
...
[46950.337876] usb 1-1: new full-speed USB device number 57 using xhci_hcd
[46950.487849] usb 1-1: New USB device found, idVendor=2341, idProduct=0036, bcdDevice= 0.01
[46950.487850] usb 1-1: New USB device strings: Mfr=2, Product=1, SerialNumber=0
[46950.487851] usb 1-1: Product: Arduino Leonardo
[46950.487852] usb 1-1: Manufacturer: Arduino LLC
[46950.488979] cdc_acm 1-1:1.0: ttyACM0: USB ACM device
[46958.085528] usb 1-1: USB disconnect, device number 57
[46958.390446] usb 1-1: new full-speed USB device number 58 using xhci_hcd
[46958.518460] usb 1-1: device descriptor read/64, error -71
[46958.754473] usb 1-1: device descriptor read/64, error -71
[46958.990506] usb 1-1: new full-speed USB device number 59 using xhci_hcd
[46959.122502] usb 1-1: device descriptor read/64, error -71
[46959.362508] usb 1-1: device descriptor read/64, error -71
[46959.470533] usb usb1-port1: attempt power cycle
[46959.882541] usb 1-1: new full-speed USB device number 60 using xhci_hcd
[46959.882741] usb 1-1: Device not responding to setup address.
[46960.090750] usb 1-1: Device not responding to setup address.
[46960.298424] usb 1-1: device not accepting address 60, error -71
[46960.426571] usb 1-1: new full-speed USB device number 61 using xhci_hcd
[46960.426780] usb 1-1: Device not responding to setup address.
[46960.634773] usb 1-1: Device not responding to setup address.

This and LEDs on the board indicate that USB is available for over 7s before it disconnects. The problem is with forced USB reset by PlatformIO (averdude?) during the upload:

Forcing reset using 1200bps open/close on port /dev/ttyACM0
Waiting for the new upload port...

My recovery strategy was:

  1. Double-click board reset
  2. Start upload
  3. When Forcing reset appears, double-click board reset again

I recovered all 3 bricked boards on the first or the second try.

Of course, I added a delay in setup() to make my life easier in the future.

Is forced USB reset really necessary during the upload process? If not, can it be disabled somehow?

2 Likes

The 1200bps reset is dictated by the entry in the board manifest

Try adding

board_upload.use_1200bps_touch = no

to the platformio.ini, it should disappear.

1 Like

You saved two leonardo boards from throwing away. Thanks mate :partying_face:

2 Likes