Is the IMU still drawing current ?

I'm trying to get my Nano board to shutdown and consume as less as possible.

When shutting down I do:

digitalWrite(PIN_ENABLE_SENSORS_3V3, LOW);
digitalWrite(PIN_ENABLE_I2C_PULLUP, LOW);
NRF_POWER->SYSTEMOFF = 1;

Afterwards the meter still reports about 0.4mA being drawn.
Is the IMU still powered ? How can it be switched off ?

No; setting PIN_ENABLE_SENSORS_3V3 to LOW cuts power to the IMU.

Some things you can do to further reduce current:

Cut the 3.3 V jumper on the bottom of the board. This will avoid the power usage of the MPM3610 step-down converter used to convert the 5 V power supply to the 3.3 V supported by the components on the Nano 33 BLE. You will then need to supply power to the board via the 3.3V pin, as it will no longer get power from the USB connection.

Turn off the power LED:

digitalWrite(LED_PWR, LOW);

Use delay() in your sketch when you aren't doing anything to put the nRF52840 to sleep.

Unplug the USB cable and power cycle the board.

With all of that, as well as the code you posted, I'm getting power consumption numbers in the tens of microamps on my Nano 33 BLE Sense.

Ok. But what is meant by power-cycling the board ?

Disconnect the power supply to the board and then power it again. From my experiments, it seems that when you have a USB connection, this puts the board in a state that uses more power. When you unplug the USB cable, the power consumption goes down a bit, but it is still in a higher power usage state.

I don't know whether this is still true in combination with the NRF_POWER->SYSTEMOFF = 1; thing you did. I haven't experimented to see whether the things I listed above are still relevant in that state.

I'm at a loss here...

I can't seem to get my board to go below 4mA.

I have a simple assembly with just a nano 33 ble board and a 1.8TFT. I've cut the 3V3 pads below, so I'm powering the whole thing with 2xAA.
Even with the TFT phisically disconnected, I can't get below 4mA.

This is the code that I'm using to shut down:

    for (int i=2; i<14; i++) pinMode(i, INPUT_PULLUP); // make all pins as input
    pinMode(PIN_ENABLE_SENSORS_3V3, OUTPUT);
    pinMode(PIN_ENABLE_I2C_PULLUP, OUTPUT);
    digitalWrite(PIN_ENABLE_SENSORS_3V3, LOW); // turn off sensors
    digitalWrite(PIN_ENABLE_I2C_PULLUP, LOW);
    NRF_POWER->SYSTEMOFF = 1;

What am I missing here ?

With this sketch:

void setup() {
  for (int i = 2; i < 14; i++) pinMode(i, INPUT_PULLUP); // make all pins as input
  pinMode(PIN_ENABLE_SENSORS_3V3, OUTPUT);
  pinMode(PIN_ENABLE_I2C_PULLUP, OUTPUT);
  digitalWrite(PIN_ENABLE_SENSORS_3V3, LOW); // turn off sensors
  digitalWrite(PIN_ENABLE_I2C_PULLUP, LOW);
  NRF_POWER->SYSTEMOFF = 1;
}

void loop() {}

I get 2.96 mA. Not sure why my number is different from yours. Perhaps it's the different voltage (I'm powering mine at 3.3 V. Anyway, we are reasonably close to the same results.

Next, I turn off the power LED:

void setup() {
  digitalWrite(LED_PWR, LOW);
  for (int i = 2; i < 14; i++) pinMode(i, INPUT_PULLUP); // make all pins as input
  pinMode(PIN_ENABLE_SENSORS_3V3, OUTPUT);
  pinMode(PIN_ENABLE_I2C_PULLUP, OUTPUT);
  digitalWrite(PIN_ENABLE_SENSORS_3V3, LOW); // turn off sensors
  digitalWrite(PIN_ENABLE_I2C_PULLUP, LOW);
  NRF_POWER->SYSTEMOFF = 1;
}

void loop() {}

Now I'm at 0.29 mA. Getting better!

Next, I remove the code that sets the internal pull-up resistors:

void setup() {
  digitalWrite(LED_PWR, LOW);
  pinMode(PIN_ENABLE_SENSORS_3V3, OUTPUT);
  pinMode(PIN_ENABLE_I2C_PULLUP, OUTPUT);
  digitalWrite(PIN_ENABLE_SENSORS_3V3, LOW); // turn off sensors
  digitalWrite(PIN_ENABLE_I2C_PULLUP, LOW);
  NRF_POWER->SYSTEMOFF = 1;
}

void loop() {}

Now I'm down to the tens of microamps I quoted before. With the NRF_POWER->SYSTEMOFF = 1; in setup(), I don't think there is any benefit to using delay() or shutting down the USB, since the processor is powered off anyway. You might find those other things to be helpful in other usages though.

Tried several things and still can't get below 3.9mA

However, there are 2 GND pins in the board. Maybe it makes a diference which one do you use ?
I'm using the pin besides VIN

Hi, I am having the same thing, and suspect it has something to do with the IMU. Check also the following thread; IMU Effect on Low Power - Nano 33 BLE - Arduino Forum.

My current draw on a coin cell is down to about 0,3 mA but it should be in the order of 15-30 microAmps when using the SYSTEMOFF mode. Of course disconnected the USB and all other connections to the board except the 3,3 V.

From Pert’s code it seems as if the inputs should not be pulled up? Perhaps it helps setting them all as output and to Low? I will try again this weekend when I can work on my Nano BLE board again.

Any news on this ?
I'm still stuck at around 3.9 mA and I'm clueless on how to proceed.

Next monday I'll start afresh with another 33BLE and another TFT and proceed step by step....

I will continue testing as well to find out what the problem is. In the meantime as plan B I ordered the new Adafruit board: Adafruit ItsyBitsy nRF52840 Express - Bluetooth LE : ID 4481 : $19.95 : Adafruit Industries, Unique & fun DIY electronics and kits. It doesn't come with an accelero/gyro but with another prototype of my project based on the Feather board I successfully tested the Bosch BMG250 gyro, which has a much lower current draw during normal operation, and can shutdown successfully to low power mode when not used

What were trying to achieve here, must be a very common goal for the buyers of the Nano 33 BLE.
Maybe someone technical from Arduino "central" can shed some light on this ?

Hello ! Anybody out there ?

pjrebordao:
However, there are 2 GND pins in the board. Maybe it makes a diference which one do you use ?
I'm using the pin besides VIN

Doesn't matter, same current with either GND pin.

Please @petorrr and @pjrebordao, if you haven't already, try the exact, unmodified final sketch I posted in my last reply:

pert:
With this sketch:

void setup() {

digitalWrite(LED_PWR, LOW);
  pinMode(PIN_ENABLE_SENSORS_3V3, OUTPUT);
  pinMode(PIN_ENABLE_I2C_PULLUP, OUTPUT);
  digitalWrite(PIN_ENABLE_SENSORS_3V3, LOW); // turn off sensors
  digitalWrite(PIN_ENABLE_I2C_PULLUP, LOW);
  NRF_POWER->SYSTEMOFF = 1;
}

void loop() {}

1 Like

Yes, with this simple scheme, I can achieve the micro amps.

But if I use the IMU, whatever I do, I can't go back to this low values again....

Please post a complete, minimal demonstration sketch.

OK I ran a test again to check the difference with or without the IMU.begin(); statement. I ran the current tests with the board powered on a coin cell to the 3.3 V input pin. Jumper cut through and USB cable also not attached after flashing. Just the bare board on a 3 V coin.

  1. Test confirmed that with this code the current is down to around 10-15 microAmps after the 10 seconds delay as you would expect;
void setup() {
  digitalWrite(LED_PWR, LOW);
  pinMode(PIN_ENABLE_SENSORS_3V3, OUTPUT);
  pinMode(PIN_ENABLE_I2C_PULLUP, OUTPUT);
  digitalWrite(PIN_ENABLE_SENSORS_3V3, LOW); // turn off sensors
  digitalWrite(PIN_ENABLE_I2C_PULLUP, LOW);
  // Delay 10 seconds for allowing easier flashing, boot mode doesn't always come up properly
  delay (10000);
  NRF_POWER->SYSTEMOFF = 1;
}

void loop() {}
  1. Adding IMU.begin() with the code below the current goes only down to around 0,35 milliAmps (after the 10 seconds delay;
void setup() {
  IMU.begin();
  digitalWrite(LED_PWR, LOW);
  pinMode(PIN_ENABLE_SENSORS_3V3, OUTPUT);
  pinMode(PIN_ENABLE_I2C_PULLUP, OUTPUT);
  digitalWrite(PIN_ENABLE_SENSORS_3V3, LOW); // turn off sensors
  digitalWrite(PIN_ENABLE_I2C_PULLUP, LOW);
  // Delay 10 seconds for allowing easier flashing, boot mode doesn't always come up properly
  delay (10000);
  NRF_POWER->SYSTEMOFF = 1;
}

void loop() {}

So clearly the IMU.begin() triggers something on the board that keeps on a larger current flowing when you turn everything off. The 3V3 sensor output should be off, and thus cutting the power to the IMU. Could it be that this doesn't work as expected and keeping the IMU in a sort of a floating state after it was initialized?

Any ideas and input are welcome. By the way I would never have designed the HW in this way. Powering sensors out of an output port is on the edge of the currents you can source from such an output pin..... And I am only using the Nano 33 BLE, and not even the Nano 33 BLE Sense with more sensor components powered from the same pin.

Those are exactly the same results i got. I also have a TFT on the circuit so I was a bit worried that it might be the cause of it.

I also tried calling IMU.end() afterwards but it didn't change the results.

Same here, IMU.end() doesn’t help.

Good news !

The problem was the Pullups, that should be set high:

pinMode(PIN_ENABLE_I2C_PULLUP, OUTPUT);
digitalWrite(PIN_ENABLE_I2C_PULLUP, HIGH);

In this way, after calling IMU.end(), I achieved 15 uA

Hi @pjrebordao. Would you mind posting a sketch that demonstrates your findings? I'd like to try to understand why setting this pin HIGH reduces the power consumption for you.