Hi all,
I'd like to get some opinions/feedback on an Arduino (Sanguino)-based board I am developing, originally mentioned
here. This board is optimized for environmentally-powered (energy harvesting) and parasitic-powered projects. I made a few divergences from a traditional Arduino, footprint-wise: the pinouts consist of 3 8-pin GPIO blocks, each with its own header block for power and common/bus signals. This allows up to 3 shields(!) to be installed at once if they do not require too many I/O pins, or to span across 2 or 3 slots if they do. Likewise the power conditioning is on an interchangeable "power shield", to support use of diverse power sources (solar, piezo, thermal, RF, ...).
The low-power features (see below) eat up a handful of I/O pins scattered across the various ATmega I/O ports, so I made one fairly ugly change to keep the shields interchangeable: the official Arduino designs generally keep the I/O pin numbers/blocks consistent with the ATmega ports, that is: digitalWrite(0 ~ 7) writes to PORTA[0] through PORTA[7], digitalWrite(8 ~ 15) might cover PORTB[0 .. 7], etc. In my case I mix them around a bit, so digitalWrite(0 ~7) might actually cover the lower 3 bits of PORTA and (skipping a few) the middle 5 bytes of PORTB, etc. As far as I know, this won't have any consequences for anyone using digitalWrite(...), but someone who skips this abstraction and writes to the PORTx registers directly will be in for a surprise. (Do any significant number of Arduino users/libs actually do this?)
The power terminals at X3 route directly to the power shield; it can decide what to do with the input before feeding it back into the board as Vreg/Vunreg. One thing I am debating is whether to add a load-disconnect circuit onboard, or keep this function offloaded to the power shield(s). The purpose of this circuit is to connect the power supply only when it reaches some threshold, say 2.6V, and disable it again when it drops below ~ 1.8, avoiding the "over the hump" problem of starting from a very weak / slowly rising power source. Right now I'm leaning toward leaving this on the power shield as needed, since several of my proposed power shields already include such a switching function "for free".
Note: Component placement (except for I/O and headers) is preliminary and prone to change. Please ignore ugly EAGLE autorouting and temporary working title ("Draculino - little bloodsucker" :-)
The schematic/board and load-disconnect power shield. These can be opened with EAGLE freeware 4.16 or later.
The key divergences from a stock Arduino board are:
3.3V board designed from the ground up with low power consumption in mind. Target quiescent power draw is <1uA including a realtime clock; <3uA when using the onboard LDO regulator (it uses ~1.3uA).
Power supply (beyond basic battery/USB) implemented as interchangeable shields, allowing harvesting from many power sources (solar, piezo, thermal, RF, ...). Shields may provide regulated or unregulated power, and an aux. output for e.g. clock/memory backup.
Large, 40-pin ATMEGA644P (Sanguino) used to provide additional I/O. This is important, as the design uses up a few for power-saving features (see below).
New shield interface allows up to 3 shields to be installed at once. Common signals (PWR/GND, SPI/I2C buses) are pinned out for each shield block.
"FET-Or"ed prioritized power supply (see below) allows regulated, unregulated, and USB power to be used/connected at any time, without backdriving/damaging each other or sacrificing power efficiency. Unregulated power (if present, >4V or so) will supercede a 1.8-3.6V regulated power input, and USB power will supercede both, saving battery power when other sources are present.
Still fits in an Altoids tin!
Specific low-power features:
PC interface (FTDI232 USB-to-serial, like on Duemilanove) operates from isolated USB supply; does not consume current when USB cable unplugged. Likewise, bootloader immediately exits if USB cable unplugged.
Feedback signals to ATMEGA / user program: BUS_SENSE (detect if USB link / "infinite" power is present), POWER_GOOD (changes to false when power source is nearly depleted, if supported by power shield).
Hardware Real-Time Clock and three hardware INTerrupt lines (one for RTC, two uncommitted) to facilitate / encourage event-driven code, CPU sleep mode usage (as opposed to software delay loops) with periodic/scheduled wakeups.
Rather than using "diode-or"ing, the power supply uses reversed MOSFETs as diodes to isolate the different supplies while avoiding the voltage drop of typical diodes, and cut-off less favorable supplies (e.g. battery) when a more favorable one is available. A MOSFET will conduct equally well in reverse (e.g. source-to-drain for NMOS) as long as its turn-on condition continues to be met, so we can point their parasitic body diodes in the right direction as needed too.
Proposed power shields / sources:
"Trivial" (coincell holder; direct wiring of input terminals to Vcc/Gnd via load-disconnect for e.g. solar
Thermal / extreme low voltage (30mV), moderate current (LTC3109)
Piezoelectric / electrostatic (high voltage (5-20V), very low current) (LTC3588)
Low voltage + low current (S-882Z)
Roll-your-own (???)
Thanks!
Tim / Drmn4ea