Micro power Arduino Nano - a feasibility study and open questions

Hi fellow Arduino designers/users,

Following the design of the DIYino Prime v1 (LINK ), which is based on the Arduino Nano architecture and chipset (among else), I set a new target to myself: design a similar board, based on Nano, but one which can be operated with a very low current consumption in idle/sleep mode.

It is known that the major blocking point for doing so in the Nano is the LDO, which has a static current consumption of ~10mA (I can confirm). So even the Atmega328P is sent to sleep mode, the board still draws 10-20mA.

Another issue is the FTDI chipset FT232RL. It draws an unknown current, but it does not have any programming interface to put it to a low power mode. There is supposedly a USB suspend state, but it still can consume up to 2.5mA and I found no trace of it that the FT232RL enters this state whatsoever.

Apart from all these the DIYino has a number of other modules (an MPU6050 and a fully integrated DFPlayer), which raise the idle mode current even more.

So I spent a considerable time thinking about how I can reach my ambitious target of <1mA current draw for battery supplied applications.

The idea I came up with can be seen on the schamtics I attached in PDF.

  1. To eliminate the power draw of the LDO in case the input voltage is >6V, I included a so called micro-power LDO from type LT1129IST-5. It does eliminate the 10mA for sure. Of course it comes with a price tag, the new LDO costs ~5$, while the UA78M05 is ~0.5$ per piece. But it’s worth the additional invest.

  2. To keep down the power consumption of modules I cannot influence by programming them per se, I choose to include 2 p-channel mosfets as power switches. They control the power to the FTDI chip and the YX5200 (aka DFPlyer) chip. As the 3.3V output of the FTDI supplies the MPU6050, by switching off the supply of the FTDI the MPU will also be powered down.

And now to the results and open question:

  • the concept works (well, sort of)
  • the new LDO eliminates 10mA
  • I can use digital I/Os to connect to the GPS1 and GPS2, so the Atmega328 has full control over the power switches, I can programatically unpower both FTDI and DFPlayer. The audio amp has an own shut-down pin, so I can use the same I/O to unpower the audio amp as for the DFPlayer.
  • in deep sleep mode of the Atmega328P, after unpowering the FTDI and DFPlayer, I can get down to 2mA of current draw with a 7.4V supply on VIN (simulating 2xLi-Ion in series). Well, not yet there, still more than 1mA to go.
  • in this state I observe the following: the 2 LEDs connected to the FTDI, indicating traffic over USB, keep blinking with a high frequency
  • the 3.3V LDO of the FTDI outputs ~2.3V, although the FTDI is not supposed to be supplied

My first assumption was that the FTDI gets a back supply, and the only explanation I could find was through the Reset line, which is connected over a 1kOhm resistance to the 5V output of the main LDO. So in order to reduce the current I first removed the 1kOhm external pull-up. The current stayed the same, but I could not upload any sketches any more. Also I measured an open between Reset and 5V, which, considering that acc. Data Sheet the reset should have ~60kOhs of internal pull-up, is not logical. So I concluded that whatever resistance had been there must have evaporated due to…?
The 2nd observation was that the current stayed the same. Even if I replace the 1kOhm with 4.7kOhm or 10kOhm, in which case I’m able to upload, current is still 2mA.

Next ideas was to successively remove the LEDs. With both LEDs removed, current is still 2mA, although there is no visible sign of something consuming current any more.

To make things even more complicated, the current goes back from 2mA to ~400uA (!!!), under unknown circumstances. If it happens, I can wake-up the whole board, have all the functions working, going back to sleep mode will yield me again 400uA (which is more than satisfactory for me), but it’s hardly reproducible. Next time I do something or there is a full moon and the 2mA is there again…

So that is the current status, if anyone has an idea what I can do to reproducably reduce the current under 1mA, I would be very grateful for hints.

Thanks and Cheers: Protonerd

DIYino_Prime_v2.pdf (139 KB)

I guess that the excess current is drawn from output pins of the controller. If the connected inputs do not normally pull current, you can insert resistors into each output line. These resistors will limit the stray currents, and also can be used to measure the current, drawn from an output, in order to find the culprit.

I guess that the excess current is drawn from output pins of the controller. If the connected inputs do not normally pull current, you can insert resistors into each output line. These resistors will limit the stray currents, and also can be used to measure the current, drawn from an output, in order to find the culprit.

Good idea, thanks. Actually pins are not connected externally, but since it's an integrated board with a large set of functionality, there are many internal connections from uC to other IC's on board. As I mentioned, I suspected the reset line, but other pins could as well be the root cause. I will check and keep you updated!

I appreciate your help!

Have you seen Nick Gammon's low power tutorial.


Thanks Robin2, I did not know this page, but I'm glad I know about its existence now! It is a treasure house of useful hints and code pieces for easy integration, and it has some ideas I haven't considered (possible) yet...

So now I have 3 things to do:

  • check all pins I can access and measure the voltage. Check that they do not have a pull-up connected while being pulled to GND by program.
  • the first thing I will implement from Nick's tutorial is the pin change interrupt, as my application does not use interrupt-capable pins.
  • I have a further idea, it just could be that the due to the FTDI somehow still supplied, the MPU is not fully depowered. I send it to sleep mode, but chances are that it does not have enough time - or just barely - to enter sleep mode, so when I cap power to the FTDI it still is sometimes in normal mode, sometimes already in sleep mode.

OK, I did most of the checks I put on my ToDo list last time. I was able to reproduce both states, the one drawing ~2mA and the one with the lower consumption.

It seems I can switch between the two distint states by connecting the reset line of the FTDI chip either to GND (more current consumed) or 5V (the one not switchable, this will cause the current to go down).

Interestingly although the supply of the FTDI is supposed to be 0V,

  • if the FTDI reset is 0V (i.e. more current), the 3.3V LDO of the FTDI rails at ~2.3V. Rx and Tx LEDs are flickering. This latter is either a charge/discharge effect or the module constantly tries to power up, is undersupplied, shuts down and begins all over again.
  • on the other hand if the FTDI reset is pulled up to 5V, the LDO outputs the 3.3V No flickering from the LEDs.

although from a non-supplied LDO I expected 0V... no clue

So using Nick Gammon's (God bless his name!) power saving codes, now I can use the pin change interrupt to wake up the circuitry, disabling the ADC got me another ~100uA, so now my best with the DIYino is 300uA in sleep mode, which is for me excellent!

If anyone has an idea how come the FTDI reset can toggle any current, let me know! I will also ponder on this. I wil also try if connecting the FTDI reset permanently to 5V is interfering with the USB/UART comm, but I guess not, because I already saw circuits clamping reset to 5V.