I'd like to be able to upgrade software on an arduino without physically touching the device or stringing a cable. Can it be done?
Will pick wireless protocol that makes that easiest.
The best and easiest solution I've found is to use the Bluefruit EZ-Link from Adafruit. They have a module you plug into the Serial/Power/reset pins (link here) or a shield for the uno (link here). They've also got a great description and how-to guide (link here) that is pretty good. It basically appears as a serial bluetooth link in the arduino IDE and you program it like normal. It has the added benefit of being of use not only for programming, but also for sending and receiving data.
We have implemented remote updates on a Arduino Pro Mini (ATMega328P) by putting a "boot" command into the normal firmware. How it works is:
This doesn't require a new boot loader or hardware. It is not a good solution for commercial devices though, as if the uploaded firmware is corrupted the board will not be able to be put into boot loader mode without a hard reset.
Some wireless comms devices, such as XBees, have GPIO that can be toggled remotely. Connecting this to the Arduino reset pin will allow the board to be reset into the boot loader instead.
The Arduino Yun can be remotely reflashed (either via wifi or network cable): you'll have to select its IP address under the "Tools > Boards" menu of the Arduino IDE and then press the upload button as usual.
It's possible to write a bootloader running in RAM (or even in Flash, maybe in a special boot block - depends on the microcontroller).
This bootloader has to be able to establish the wireless communication, understand the protocol and to erase/write Flash memory.
There are basically two approaches for software upgrading:
What protocol you choose is almost irrelevant. Just make sure that there are enough resources for keeping it in RAM/Flash. On an Arduino Due - for instance - there are more than enough resources for any such implementation.
Yes, it can be done. Lowpowerlab.com has Moteino which can be programmed OTA.
Spark.io boards are also very nice for OTA programmable Arduino-like devices. I have one and have found it to be fairly easy to work with.