Chris Hall has been trying to make the most of power for a RISC OS based RaspberryPi for his GPS system. In his guest post , he lifts the lid on how he does this...
A Raspberry Pi can be powered by a mains adapter or by a powerbank. I found myself often pulling out the power plug to power cycle the Pi and came up with a software power switching method that would allow power to be removed under software control.
A 'power booster' board allows an internal 3.7V Lithium-Polymer battery to produce a 5.2V output and any external 5V power source will take over this rule and charge the internal battery until fully charged. Switching on and off is controlled by an 'ENABLE' input, pulled high by default. A blue LED lights if power is being supplied to the computer. With the booster board output disabled, only a minimal current is drawn from the internal battery. A red LED lights if the internal battery becomes discharged below 3V (and if a diode is fitted to the 'LBO' pad this can disable the output automatically). Fully discharging the internal battery is likely to damage it.
While the internal battery is being charged a yellow LED lights, turning green when it is fully charged. A small current drain to light the green LED to show a full charge seems enough to keep some power banks happy even whilst the unit is otherwise powered down and the internal battery fully charged.
This means the external source can be connected and disconnected without affecting the operation of the device except to extend battery life.
With no power control hardware it is difficult to ensure that the computer is not, inadvertently,turned off during a write operation to the SD card, which can corrupt the file or the whole card. My power control circuit allows power to be applied at any time by pressing the 'on' button. The 'off' button simply signals that a power off has been requested, which can be detected in software. A shutdown/restart cycle will then remove power as soon as the system has been shut down and the CMOS updated.
If software detects a 'power off' request then all it has to do (once it has completed any essential tasks) is to issue the command:
which will do a shutdown/restart cycle.
Doing a manual shutdown (CTRL-SHIFT-f12) and then pressing 'Restart' will also remove power (if a 'power off' request has been issued).
How Does It Work?
Software can detect the 'on' button being pressed or held down by reading the GPIO 19 line and can use this information for any purpose. The fact that the 'off' button has been pressed (and the 'on' button remains open circuit) can be detected by reading GPIO 26, meaning that 'power off' has been requested.
A little piece of software in !Boot.Choices.Boot.PreDesk sets GPIO 4 to output high (which ensures power stays on even after a 'power off' request).
During a restart cycle, before any writes are made to the SD card, the ROM modules are reset which takes GPIO 4 to high impedance: with a 'power off' request pending this will remove power.
Provided that the unit has been operating for at least six seconds (enough time for the RISC OS desktop to start), the 'off' button will pull GPIO 26 low but do nothing else. Software can detect this, complete any essential tasks and then either explicitly set GPIO 4 low (if a Witty Pi is present, this will remove power immediately) or (if not) perform a complete system shutdown using the command SYS "TaskManager_Shutdown",162 which will shutdown all applications tidily and restart RISC OS. The effect of this is to update the CMOS êlast time onë setting and restart the ROM. As the ROM reinitialises, GPIO 4 becomes high impedance thus removing power.
The 'on' button has some additional functions: whilst pressed, components (R6, R7 and LED) may also be fitted to present an LED load to any external power source that will only light if the external source is healthy (this works by sensing whether Vs from the power boost board is 3.7V or 5.2V). If a voltmeter is fitted as shown, the voltage of the internal LiPo battery is displayed whilst the button is depressed. A power meter can also be connected between the power boost board and the Raspberry Pi giving a voltage, current and power consumption readout.
With an internal 4400mAh LiPo battery, a Raspberry Pi Zero with an OLED display and GPS module (but with no HDMI connection) uses about 170mA (at 5V) and the battery should therefore last for about (4400 x 3.7)/(170 x 5.2)h which is just over 18 hours. A 5000mAh 5V powerbank should extend this by about 28 hours.
Chris Hall's website