乾電池で ATmega328P を動作させようとすると、電池4本では3.6V〜6V強になり定格を超えてしまいます。一方で電池3本では2.7V〜4.5V強で、動作周波数が16MHzでは電池を最後まで使えません。そこで 8MHz 動作にして、5V端子に乾電池3本をつけるとバランスがいいように思います。8MHz 動作の Arduino には Lily Pad Arduino と Arduino Pro, Arduino Mini の 3.3V 版がありますが、形状が大きかったり、USBシリアルが別で必要なので Arduino nano の方が便利な場合があります。
boards.txt (バージョンによって違うので探してください)に以下を加えて Arduino IDE を起動すると「ボード」に「Arduino w/ ATmega328 Internal 8MHz」が加わるので、これを選んでブートローダを書き込みます。ブートローダーを書き込んだ後は「LilyPad Arduino」を選んでも大丈夫(boards.txt を書き換えていない Arduino IDEで使える)です。
ただしこの方法だとうまくArduino IDEから書き換えができない場合がありました。内蔵RC発振の精度は±10%(25℃)なので個体差によってはそういうことがおこります。
############################################################## avr_int8.name=Arduino w/ ATmega328 Internal 8MHz avr_int8.upload.protocol=stk500 avr_int8.upload.maximum_size=30720 avr_int8.upload.speed=57600 avr_int8.bootloader.low_fuses=0xe2 avr_int8.bootloader.high_fuses=0xda avr_int8.bootloader.extended_fuses=0x05 avr_int8.bootloader.path=atmega avr_int8.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex avr_int8.bootloader.unlock_bits=0x3F avr_int8.bootloader.lock_bits=0x0F avr_int8.build.mcu=atmega328p avr_int8.build.f_cpu=8000000L avr_int8.build.core=arduino avr_int8.build.variant=standard
boards.txt (バージョンによって違うので探してください)に以下を加えます。
############################################################## avr_xt16_div2.name=Arduino w/ ATmega328 8MHz (X'tal 16MHz) avr_xt16_div2.upload.protocol=arduino avr_xt16_div2.upload.maximum_size=30720 avr_xt16_div2.upload.speed=57600 avr_xt16_div2.bootloader.low_fuses=0xFF avr_xt16_div2.bootloader.high_fuses=0xDA avr_xt16_div2.bootloader.extended_fuses=0x05 avr_xt16_div2.bootloader.path=atmega avr_xt16_div2.bootloader.file=ATmegaBOOT_168_atmega328_pro_16MHzDiv2.hex avr_xt16_div2.bootloader.unlock_bits=0x3F avr_xt16_div2.bootloader.lock_bits=0x0F avr_xt16_div2.build.mcu=atmega328p avr_xt16_div2.build.f_cpu=8000000L avr_xt16_div2.build.core=arduino avr_xt16_div2.build.variant=standard
そしてATmegaBOOT_168_atmega328_pro_16MHzDiv2.hexをダウンロードして、ATmegaBOOT_168.c のあるフォルダ(ディレクトリ, バージョンによって違うので探してください)にコピーします。 Arduino IDE を起動すると「ボード」に「Arduino w/ ATmega328 8MHz (X'tal 16MHz)」が加わるので、これを選んでブートローダを書き込みます。ブートローダーを書き込んだ後は「LilyPad Arduino」を選んでも大丈夫(boards.txt を書き換えていない Arduino IDEで使える)です。
この方法だと周波数が安定するのでArduino IDEから書き込めないことはないと思います。 一方でマイコンのリセット直後の一瞬だけ16MHzで動作するので最低動作電圧が内蔵RC発振器を使ったときよりも高くなる可能性があります。1個だけですが測ってみたら2.8Vから動作する(おそらくBODが働いている)ようだったので、あまり気にしなくてもよいとは思います。
この方法では Arduino nano にある 16MHz の水晶発振子で動作するようにフューズビットを設定していますが、ブートローダーのプログラムの先頭で動作周波数を16MHzの1/2になるようプリスケーラーを設定しています。具体的な書き換え方はTutorial: 3.3V hacking for Arduino Nano (Baoshiさんによる)のまま(hexファイルのコンパイル方法も)です。