How can I achieve the 104µA power consumption?

Hey,

I recently bought the MRK WAN 1310, as the WAN 1300 did consume too much power and it seems that the 1300 was not able to shut down the LoRa module (see this discussion on thethingsnetwork.org).

The description in the store states:

When properly configured, the power consumption is now as low as 104uA!

How can I achieve this? I'm using the LoRa library (without LoRaWAN) and did get the following measurements:

~30mA while idle, but running (no RX/TX)
~9mA with the SAMD21 in deep sleep and using LoRa.end
~0.45mA with the SAMD21 in deep sleep, using LoRa.end and LORA_IRQ_DUMB low, LORA_BOOT0 low, LORA_RESET low

While this is already a huge improvement over the WAN 1300, I'd love to get it down to the 104µA (which would mean the battery would last 3 times longer).
It would be great if someone could tell me some additional steps I can take to further lower the power consumption.

Thanks
Thomas

You need to pay particular attention to the state of the I/O pins to achieve 104uA. That is, you do not want any of the I/O pins sourcing or sinking current. Also, you want to ensure none of the I/O pins is left "floating".

BTW, if you use an external power supply, you can achieve a sleep current of about 20uA.

So, I finally got time to test it again, with a more precise DMM. I've reduced the code to basically the ArduinoLowPower timed sleep example (although using deepSleep instead of sleep). The whole code is as follows:

#include "ArduinoLowPower.h"

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
  LowPower.deepSleep(2000);
}

I'm using an external 3.3V power supply, but it still uses 577µA while in deep sleep mode. What am I missing?

When using an external power supply, you need to disable the power supply on the mkr wan. There is a solder jumper on the output of the mkr wan power supply. Remove the solder jumper to create an open circuit. This disconnects the on board supply. There is significant leakage if you leave the solder jumper in place.

Also, make sure you detach USB. USB draws significant power when sleeping so you need to shut it down. In your sketch, add the following to your setup():

USBdevice.detach();

sslupsky, would this also be the case for the MKR NB 1500? I am trying to lower the power consumption, but I have no luck. Still stuck at ~577uA as Thomas here. I am using a 18650 battery directly connected to the JST battery connection.

Could you please elaborate on the 20uA with external power supply statement? :slight_smile:

Thanks!

Richard, Apologies, I haven't been here in a while. It would be great if this forum had an @mention feature.

The NB 1500 uses the same battery charger IC and linear regulator as the MKR WAN 1310. I am not aware if it has the jumper to disconnect the power supply though.

I had a quick look at the schematic and confirmed the jumper is not included on the NB 1500. More concerning though is that the SARA module is powered from the 3.8V supply. So, I think this means you pretty much have to use the on-board power supply or you would need to do some major surgery on the board.

There is significant quiescent current with the on-board linear regulator that is used after the battery charger IC. On the order 50uA. The battery charger also has a fairly significant quiescent current on the order of 35uA. So, these two components contribute about 85uA to the sleep current. If you swapped out the linear regulator for one with a lower IQ, you could save close to 50uA.

Your current measurement is quite high. I haven't done any work with the NB 1500 yet so I cannot provide feedback on the power consumption optimization of this board. Do you know what the sleep current of the SARA module is?

...

Ok, i checked the datasheet. The SARA's deep sleep current is 8uA and power off mode is 6uA. The low power current is about 600uA. That current level appears to be consistent with what you measured. So, it could be that the module is not being put into deep sleep. The good news is that the PWR_ON pin is connected to the SAMD21. So, it should be possible to put the SARA module into deep sleep or power off modes.

sslupsky:
Also, make sure you detach USB. USB draws significant power when sleeping so you need to shut it down. In your sketch, add the following to your setup():

USBdevice.detach();

Hi ! Thanks to thomasguenzel what I see is ~ 500uA and I'm very happy ( in confront of MKR WAN 1300 :frowning: ).
But how can I add your advice to add USBdevice.detach(); in setup() ? I've got 'USBdevice' was not declared in this scope .
Can you help me ?

ivanpiffer:
Hi ! Thanks to thomasguenzel what I see is ~ 500uA and I'm very happy ( in confront of MKR WAN 1300 :frowning: ).
But how can I add your advice to add USBdevice.detach(); in setup() ? I've got 'USBdevice' was not declared in this scope .
Can you help me ?

USBDevice.detach() not USBdevice.detach();
a mistake so sneaky !!!!

Hi all,
If you do not mind me asking, the default MKRWAN example uses MKRWAN.h instead of LoRa.h. Is the latter a lower level library than MKRWAN.h ?
Can I use LoRa.end() while still using the MKRWAN library?
Also, LowPower.deepSleep() is a bit inconclusive in the documentation about what modules it shuts down, do we still need LoRa.end() when using it ?
Thanks!

Hi all,

I read this post with interest and then purchased a MKR WAN 1310. I’ve taken the code that is posted by thomasguenzel and using an simple hardware set-up, measured the current - 9mA.

My hardware setup is a 5V feed into Vin & GND with an ammeter in the line.

So I removed the power LED, it now runs at 1.9mA.

I have tried turning the Serial Flash off, turning off LoraWan via GPIO, but it actually rose to 2.1mA!I have tried various libraries, ArdunioLowPower, LowerPower by RocketStream, even using the RTC library (modified) with standby, but they all sit at 1.9mA.

I am sure I am missing something obvious, but how do I even get below 1mA??

The latter challenge I will have is that I want to also have external interrupts running and the RTC timer, but I’m stuck at this high level of power consumption without even working out how to still have some interrupts running.

Code:

/*
Sleep RTC Alarm for Arduino Zero

Demonstrates the use an alarm to wake up an Arduino zero from Standby mode

This example code is in the public domain

created by Arturo Guadalupi
17 Nov 2015
modified
01 Mar 2016

NOTE:
If you use this sketch with a MKR1000 you will see no output on the serial monitor.
This happens because the USB clock is stopped so it the USB connection is stopped too.
To see again the USB port you have to double tap on the reset button!
*/

#include "RTCZero.h"
//#include "LowPower.h"
#include <SerialFlash.h>
#include <ArduinoLowPower.h>

/* Create an rtc object */
RTCZero rtc;

/* Change these values to set the current initial time */
const byte seconds = 0;
const byte minutes = 0;
const byte hours = 0;

/* Change these values to set the current initial date */
const byte day = 0;
const byte month = 0;
const byte year = 0;

void setup()
{
// Set digital pins to input
for (int i=0; i < 15; i++) {
pinMode(i, INPUT_PULLUP);
}
//pinMode(LORA_RESET, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
delay(2000);
digitalWrite(LED_BUILTIN, LOW);

rtc.begin();

rtc.setTime(hours, minutes, seconds);
rtc.setDate(day, month, year);

rtc.setAlarmTime(0, 0, 25);
rtc.enableAlarm(rtc.MATCH_HHMMSS);

rtc.attachInterrupt(alarmMatch);
USBDevice.detach();
//SerialFlash.begin(SPI1, FLASH_CS);
//delay(500);
//SerialFlash.sleep();
//digitalWrite(LORA_RESET, LOW);
}

void loop()
{
//LowPower.standby(); // Sleep until next alarm match
//LowPower.idle(IDLE_0);
LowPower.deepSleep();
}

void alarmMatch()
{
digitalWrite(LED_BUILTIN, HIGH);
USBDevice.attach();
}

Hi all,

I think I now have it sorted.

Firstly, I was measuring the current that was drawn from the power supply into the VIN & GND pins at 5V. When I started that was reading 8.9mA fairly consistently no matter what I did. I tried deepSleep, turning all I/O pins to INPUT_PULLUP or DOWN,. trying to turn off the Serial Flash, trying to turn off the LoRaWan module, but nothing lowered it.

So from there I removed the power LED, that brought power consumption down to 1.9mA, so it alone draw 7mA. Somewhere in the forums I have read that the Power LED is not powered when on battery, I’ve not validated this, but it appears to make sense and from reading the circuit diagram it is what I would expect to happen.

Next I removed the solder link SJ1 - this is on the bottom of the board, underneath the battery connector. With this link removed, I had to power the SAMD from an external 3V3 supply directly into the VCC and GND pins. What a difference, when powered in this manner the consumption in deepSleep was 10uA, proving that the commands were correctly putting the SAMD chip and the other ancillary parts to sleep.

I then started reading the datasheet for the Battery Charger chip. In reading the electrical characteristics, understanding all the gobbledigook including what can only be described as 50 thousand different acronyms and discovered that when the power supply is NOT switching (i assume charging), the current consumption is typically 1.5mA, but could be as high as 3mA, so that would explain the the majority of the current I was seeing.

Further investigation of the wiring diagram suggests that when running on battery, the charger is in a much lower consumption state, it could be as low as 5uA, so in total when i deepSleep I could be drawing only 15uA.

I have ordered some JST PH connectors so I can measure the current into the MKR WAN 1310 when on battery and I will post an update when completed.

Mattb, Yes, that is an important detail. The power consumption of 104uA that Arduino publishes is the power into the battery input. The consumption is mainly due to the bq24195L pmic chip and the linear regulator. Power into VIN would be an order of magnitude higher due to the pmic chip.

Your hardware modification removes the pmic and the linear regulator from the circuit. This saves a considerable amount of power at the expense of having to provide a separate low power regulated voltage supply.

Thanks for your reply sslupsky.

I have created a PCB based on the NB 1500, and changes the LDO on order to lower the consumption.
I have a stack of these cards, but to my surprise almost all of them have different power consumption during deep sleep mode. The variations can be from 90 uA to 1 mA during deep sleep. I've tried setting all the digital and analog pins to make sure they're not floating, but there are still variations, and I don't know why.
The SARA module is shut off. Do you guys have any suggestions? I've tried the USB detach also, same result.
Could it be other pins on the SARA module which could be floating?

Having done some further testing and measuring, I can reliably achieve 110uA, close enough for me. This is only when running on battery. I can also confirm that when on battery the power led is off, so there was no need to do that step either.

However, to achieve this you need deep sleep, the clocks need to be off and this is playing havoc with my code. Functions like millis don’t work anymore, i think there may be an issue in the LoRa comms stuff too as it regularly stops, interrupts also only work on high and low, no edge triggering.

1 Like

Hi @mattb1969 ,
Could you post your code to achieve ~ 110uA please? I am consistently getting ~ 550-600uA with a MKR zero using a Current Ranger. I started with the RTC example, tried both the rtc.standbyMode() and LowPower.deepSleep() calls : same result.
I am powering the board via a LiPo 3.7 V Batt on the batt. in JS2 connector with the Current Ranger in series.

I also call :

 // detach USB so chip is asleep
  USBDevice.detach();

and :

 // Set digital pins to input  to save on current drain
 for (int i=0; i < 15; i++) 
 {
   pinMode(i, INPUT_PULLUP);
 }
#include <RTCZero.h>
#include <ArduinoLowPower.h>

/* Create an rtc object */
RTCZero rtc;

/* Change these values to set the current initial time */
const byte seconds = 0;
const byte minutes = 00;
const byte hours = 17;

/* Change these values to set the current initial date */
const byte day = 24;
const byte month = 11;
const byte year = 20;

void setup()
{
   // Set digital pins to input  to save on current drain
 for (int i=0; i < 15; i++) 
 {
   pinMode(i, INPUT_PULLUP);
 }
  
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  rtc.begin();

  rtc.setTime(hours, minutes, seconds);
  rtc.setDate(day, month, year);

  rtc.setAlarmTime(17, 00, 20);
  rtc.enableAlarm(rtc.MATCH_HHMMSS);

  rtc.attachInterrupt(alarmMatch);

  // detach USB so chip is asleep
  USBDevice.detach();
  rtc.standbyMode();
}

void loop()
{
  //rtc.standbyMode();    // Sleep until next alarm match
  LowPower.deepSleep();
}

void alarmMatch()
{
  digitalWrite(LED_BUILTIN, HIGH);
  USBDevice.attach();
}

Not sure why I am getting ~600uA with that. Any idea?

Thx.

L.

Hi,

Sorry about that - for some reason this post didn’t;t trigger there had been a change. However, I have just dug out the code and here you go.

#include "ArduinoLowPower.h"
#include <MKRWAN.h>

LoRaModem       modem;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  delay(2000);
  pinMode(1, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
  
  //modem.sleep();
  USBDevice.detach();
  
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
  LowPower.deepSleep(2000);
}

Thx Matt,

I do not see a solder link SJ1 on the MKR Zero, so I did not modify the board at this point.

The battery charge controller and LDO should use little enough to be around 100u when sleeping.
I will try without RTC, but doing this without the RTC is not going to help because I will need the RTC, but interesting to see if it is the cause of the current usage.
L.

Hi,

I don’t know and I am no expert on this, but in another experiment I am performing, I am finding that having any form of clocks running sucks loads of power, I am getting 3.1mA with both a rtc and a wdt configured.

What do you get without the rtc being configured?

Generally speaking a RTC should not cause this additional current drain unless there is some issues in the library. Sleeping for hours and waking up at a pre-established time is one of the main use of RTCs while sleeping the board.
:o

...not using RTC, just LowPower.deepSleep(5000) leads to ~ 300-350 uA, leaving MKRZero to sleep for 25 sec each time, no change.