This tutorial will show how to modify Arduino Pro Mini into low power Arduino.

As we seen in previous article it's not good idea to use step up regulator to power low power sensors. NRF24L01+ can operate down to 1.8V. If we modify Arduino to operate on 1.8V and use low voltage sensor, then we can create low power sensor.

Arduino Pro Mini is very suitable base for small sensors. But if we measure power consumption of standard Arduino we will see, that power consumption is quite big. For test purpose we use empty program:

 

void setup() {

}

void loop() {

}

 

3V 8MHz Arduino Pro Mini consumes 4.8mA. 

4.8mA is way too high for low power sensor. To lower current consumption we remove regulator and power LED. 

remove regulator and power LED

 

After this modification power consumption is 3.5mA. 

 

Arduino Pro Mini now runs at 8 MHz on external crystal. If we look in Atmel823 datasheet we will see that it is safe to operate at 8MHz down to 2.4V. 

 

If we want to operate at 1.8V we should change frequency to 4MHz (see picture above). To do that we should change crystal. Other way is to switch to internal oscillator at 8MHz and divide frequency by 8. That way it will operate at 1MHz.

To do that we burn fuses:

avrdude -c usbtiny -p m328p -U lfuse:w:0x62:m 

and disable brown-out:

avrdude -c usbtiny -p m328p -U efuse:w:0x07:m

You can program fuses with other Arduino board. Here is tutorial how to do it.

If we measure current consumption now we will see 0.731mA.

 

Now we need to add new board in Adruino IDE. Go to Arduino\hardware\arduino\boards.txt and add:

s328o1.name=EasyIoT Sensor328p (int1MHz, 1.8V)
s328o1.upload.protocol=arduino
s328o1.upload.maximum_size=30720
s328o1.upload.speed=7200
s328o1.bootloader.low_fuses=0x62
s328o1.bootloader.high_fuses=0xda
s328o1.bootloader.extended_fuses=0x06
s328o1.bootloader.path=atmega
s328o1.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
s328o1.bootloader.unlock_bits=0x3F
s328o1.bootloader.lock_bits=0x0F
s328o1.build.mcu=atmega328p
s328o1.build.f_cpu=1000000L
s328o1.build.core=arduino
s328o1.build.variant=standard

 

If you add correctly you should see:

 

 

 

Now we can upload program in our low power Arduino Pro Mini. In sleep mode that modified Arduino consumes about 6μA (μA not mA).

In next post we will show how to create low power sensor which can run up to 10 years on two AA batteries.  

 

See more tutorials at ​http://iot-playground.com/build​

Buying guide

To support this site and EasyIoT framework development please buy in our store.

FT232RL FTDI USB to TTL Serial Adapter 5V, 3.3V

FT232RL FTDI USB for Arduino or ESP8266 programming. Support 5V and 3.3V

3.3V 8Mhz Arduino Pro Mini

3.3V Arduino version. No need for shift leveler when using ESP8266.

5PCS 3.3V 8Mhz Arduino Pro Mini

10PCS 3.3V 8Mhz Arduino Pro Mini

 

 


Comments   

#25 Vladimir 2017-01-08 20:06
If this can help anyone, I have used mega for burning mini pro with this commands:
avrdude -C "C:\Program Fil
es (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf" -v -patmega328p -cstk500v1
-PCOM7 -b19200 -U efuse:w:0x07:m

avrdude -C "C:\Program Fil
es (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf" -v -patmega328p -cstk500v1
-PCOM7 -b19200 -U lfuse:w:0x62:m
#24 Angel Martinez 2015-11-06 01:18
I again, Jeff :

I'm doing something different... and it's working now !! GREAT !!!

I compile the sketch in .hex an then, from my linux command line using my usbasp I flash .hex file to arduino low power, testing with blink sketch (and not using the arduino IDE, so forgot the boards.txt file) with this command :

avrdude -P /dev/ttyUSB0 -c usbasp -p m328p -B250 -U flash:w:Blink.cpp.eightanaloginputs.hex

Working as expected, blinking led 13, with 2 AA used batteries (2.49V total).

Kindly Regards.

Cheers from Madrid (Spain)
#23 Angel Martinez 2015-11-05 17:10
I tried with 19200, without sucess... any other suggestion ??

Thank you !
#22 Jeff Lewis 2015-11-05 16:44
My only boards.txt diff is:

pro.menu.cpu.1MHzatmega328.upload.speed=19200
#21 Jeff Lewis 2015-11-05 16:41
Here is what I have:

set CONF="C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"
avrdude -C %CONF% -v -patmega328p -carduino -PCOM4 -b57600

By the way, i was using my Arduino UNO as an ISP. That was not mentioned above and I was using a FTDI. That won't work based on many many hours of failure.
#20 Angel Martinez 2015-11-05 15:58
Quoting Jeff Lewis:
Try checking your baud rate.

Please, take a look of my boards.txt :

## Arduino Pro or Pro Mini (1.8V, 1 MHz) w/ ATmega328
## --------------------------------------------------
pro.menu.cpu.1MHzatmega328=ATmega328 (1.8V, 1 MHz)

pro.menu.cpu.1MHzatmega328.upload.maximum_size=30720
pro.menu.cpu.1MHzatmega328.upload.maximum_data_size=2048
pro.menu.cpu.1MHzatmega328.upload.speed=7200

pro.menu.cpu.1MHzatmega328.bootloader.low_fuses=0x62
pro.menu.cpu.1MHzatmega328.bootloader.high_fuses=0xDA
pro.menu.cpu.1MHzatmega328.bootloader.extended_fuses=0x06
pro.menu.cpu.1MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex

pro.menu.cpu.1MHzatmega328.build.mcu=atmega328p
pro.menu.cpu.1MHzatmega328.build.f_cpu=1000000L

Thank you !!
#19 Angel Martinez 2015-11-05 15:57
Thanks for your feedback, Jeff :

I asume that in normal mode (atmega328 3.3V, 8Mhz) the upload.speed parameter is 57600. So if I use atmega328 1.8V, 1Mhz, I divide the upload.speed parameter by 8 so results 7200, right ?
+1 #18 Jeff Lewis 2015-11-05 04:31
Try checking your baud rate.
#17 Angel Martinez 2015-11-05 01:14
Cannot upload any sketch.

avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x00

Any help ? The fuses are set and the boards.txt is updated.

Thanks.
#16 Christopher Lawson 2015-10-30 03:37
This low powered sensor worked very well so I built a one based on using only the ATMega328p-pu chip using the internal clock. I used www.arduino.cc/en/Tutorial/ArduinoToBreadboard instructions to update the bootloader to use the internal clock.

drive.google.com/file/d/0B2jB-FlIrSJjak9CY18zSjZ0Slk/view?usp=sharing

I ran this with a 3.7v LS 14500 battery and during the sleep cycles it consumed 40uA (0.04mA) with a NRF24L01+ connected.

You have no rights to post comments