This isn't a cry for help, it's a success story.
So, I've been intensely studying Arduino for the last couple weeks ever since I had a project in mind that needed one (automatic chicken coop door). Since my application will be solar powered, I didn't want an onboard USB-serial power hog so I'm making my own PCB (using perfboard, actually). I also decided to use the internal oscillator for this project because... well, just because I could. Now, I know the internal osc. isn't super accurate, but that doesn't matter for a lot of projects. But wait you say, what about serial communications, like uploading sketches? Well yeah, the default 57,600 bit rate isn't very reliable without a good clock, but http://www.wormfood.net/avrbaudcalc.php shows that 38,400 is still pretty fast, yet has a much better chance of success @ 8MHz. And in my case, it was indeed successful.
So, here's the recipe for anyone else who wants to either save 50¢, simplify their project, or free up two more GPIO pins:
Step one is to go into arduino-1.0.1\hardware\arduino\bootloaders\optiboot and edit the 'Makefile' file with your favorite text editor. Go down the standard atmega328 section and below it paste in:
# Standard atmega328, only at 38,400 baud for closer clock accuracy AND using 8Mhz internal RC oscillator
#
atmega328_384_8: TARGET = atmega328
atmega328_384_8: MCU_TARGET = atmega328p
atmega328_384_8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400'
atmega328_384_8: AVR_FREQ = 8000000L
atmega328_384_8: LDSECTIONSÂ = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
atmega328_384_8: $(PROGRAM)_atmega328_384_8.hex
atmega328_384_8: $(PROGRAM)_atmega328_384_8.lst
atmega328_384_8_isp: atmega328
atmega328_384_8_isp: TARGET = atmega328
atmega328_384_8_isp: MCU_TARGET = atmega328p
# 512 byte boot, SPIEN
atmega328_384_8_isp: HFUSE = DE
# Int. RC Osc. 8MHz, slowly rising power-65ms
atmega328_384_8_isp: LFUSE = E2
# 2.7V brownout
atmega328_384_8_isp: EFUSE = 05
atmega328_384_8_isp: isp
(To get these fuse settings, I used http://www.engbedded.com/fusecalc/)
Then go to a command prompt and change to the arduino-1.0.1\hardware\arduino\bootloaders\optiboot folder and issue
omake atmega328_384_8
This will fail, because optiboot.c has a bug. Fortunately, the bug was fixed -- just grab the patched code from Google Code Archive - Long-term storage for Google Code Project Hosting. and then you can proceed to run the command again to compile your custom bootloader.
Now go into arduino-1.0.1\hardware\arduino and edit boards.txt. Add an entry like this:
##############################################################
atmega328_384_8.name=ATmega328 Optiboot @ 38,400baud w/ 8MHz Int. RC Osc.
atmega328_384_8.upload.protocol=arduino
atmega328_384_8.upload.maximum_size=30720
atmega328_384_8.upload.speed=38400
atmega328_384_8.bootloader.low_fuses=0xE2
atmega328_384_8.bootloader.high_fuses=0xDE
atmega328_384_8.bootloader.extended_fuses=0x05
atmega328_384_8.bootloader.path=optiboot
atmega328_384_8.bootloader.file=optiboot_atmega328_384_8.hex
atmega328_384_8.bootloader.unlock_bits=0x3F
atmega328_384_8.bootloader.lock_bits=0x0F
atmega328_384_8.build.mcu=atmega328p
atmega328_384_8.build.f_cpu=8000000L
atmega328_384_8.build.core=arduino
atmega328_384_8.build.variant=standard
Now you can proceed to use your ISP (I used a second Atmega328 as ISP, but whatever) to burn this bootloader onto your chip. Note, if you're changing the bootloader on a chip that previously was configured to use an external clock, you'll need to have that external clock hooked up during the first bootloader burn.
Of course, I realize that using the internal RC oscillator is kind of iffy. Clock speed will fluctuate with changing VCC and temperature. If more accuracy is desired, the next phase would be to calibrate each chip individually and add a couple lines of code to optiboot to apply a different custom OSCCAL to each one. However I'm guessing that even without this, using baud rates like 38400, 19200, or 9600 will serve many asynchronous serial applications adequately.
I'll admit I'm an Arduino noob, so feel free to tear me apart now.