Low Power Arduino Pro Mini running at 1Mhz

After playing with the MySensors1 framework and possible sensor types, I build a prototype of a Temperature Sensor which is battery powered. The MySensors website contains a great guide on battery powered nodes2 but I wanted to go one step further and reduce the clock of the used Arduino Pro Mini from 8Mhz to 1Mhz.

Jean-Matthieu DECHRISTÉ wrote an extensive article on this topic3, so this post only includes the basics.

Requirements

While you can use a simple USB-Serial adapter to program an Arduino, you’ll need an ISP to set the fused which are relevant for the clock. If you have a spare Arduino, you can simply use the Arduino ISP sketch and use it as programmer4.

Furthermore you need to calculate the fuses for the desired settings (e.g. using Fuse Calculator5).

If you want to keep the basic settings of the Arduino to default and only set the clock to 1Mhz and disable the brownout detection, you can use the following values:

FuseValue
Low0x62
High0xDA
Extended0xFF

Write Fuses with AVRDUDE

Depending on the used path and COM port, you might need to modify this command which writes the three fuses to the Arduino:

avrdude -Cavrdude.conf -v -patmega328p -cstk500v1 -PCOM7 -b19200 -U lfuse:w:0x62:m -U hfuse:w:0xda:m -U efuse:w:0xff:m

Program Board in Arduino IDE

After setting the fuses, you will no longer be able to use the default boards provided by the Arduino IDE to program your Arduino. I did not find a reliable way to program a 1Mhz Arduino using the USB-Serial Adapter, therefor it’s required to add a new Board Configuration to the IDE and use the ISP for further programming.

First find the boards.txt of your Arduino IDE installation. On windows it is placed in C:\Program Files (x86)\Arduino\hardware\arduino\avr. Now append the following configuration and save the file:

#############################################
########### Arduino Pro Mini 1Mhz ###########
#############################################

promini1MhzInt.name=Arduino Pro Mini (1MHz internal, 1.8V)
promini1MhzInt.upload.tool=avrdude
promini1MhzInt.build.board=AVR_PRO
promini1MhzInt.build.mcu=atmega328p
promini1MhzInt.build.f_cpu=1000000L
promini1MhzInt.build.core=arduino
promini1MhzInt.build.variant=eightanaloginputs

promini1MhzInt.menu.cpu.8MHzatmega328=ATmega328 (1.8V, 1Mhz)
promini1MhzInt.menu.cpu.8MHzatmega328.bootloader.low_fuses=0x62
promini1MhzInt.menu.cpu.8MHzatmega328.bootloader.high_fuses=0xDA
promini1MhzInt.menu.cpu.8MHzatmega328.bootloader.extended_fuses=0xFF

You should now see a new entry Arduino Pro Mini (1MHz internal, 1.8V) in your IDE.

Footnotes

Related Posts