Simple bike lights:

Step-up converter with current feedback measurement
Battery voltage monitor
Status LED
Button

CPU: ATtiny45

Step-up converter:
	Driven by PWM output OC1B (PB4 pin) with MOSFET.
	Current feedback measured at ADC3 (PB3 pin).
	Output on the PB4 header (pin 1 is negative, pin 2 is positive side).
Battery voltage monitor:
	Uses ADC1 (PB2 pin), voltage is divided using 1M5 and 100K resistors,
		low-pass filter added on input (R30 capacitor, R32 resistor)
Status LED:
	Uses PB1 pin, R22 resistor, positive side is PB1 header pin 2,
		negative side is PB1 header pin 1
Button:
	Connected to PB0 header pin 2 using R12 0-Ohm link R12,
	negative side is PB1 pin 1 (alternatively PB0 pin 1 could be
	used instead - 0-Ohm link R15 needs to be added). Internal
	pull-up resistor of ATtiny itself provides the voltage.
	Pins 2 and 3 of PB2 header are shorted, and 100K resistor R3x
	is added between pins 1 and 2.


Bill of materials:

C1,C2	1.5uF tantalum
C3,C51	10uF ceramic
D50	SS24 Schottky diode (SMB package, 40V, 2A)
L50	470uH, 390mA, 200 mil pin distance (probably too big for 20mA LEDs :-)
PB4	two-pin header soldered to pins 1 and 2 of PB4
Q50	IRLML6344TRPBF N-channel MOSFET, 30V, 5A, SOT-23 package
R30,R40	220nF capacitor (not resistor!)
R32	15K
R33	1M5
R3x	100K (see above)
R45	1K5
R50	15K
R12,R51,R53	0R00 (zero-ohm link)
R55	3R0 (can safely measure currents from ~1 mA up, for higher currents use lower value)
U1	ATtiny45-20SU
U2	MCP1703T-5V


Pin-out:

PB0 header:
	2: button +
PB1 header:
	2: status LED +
	1: status LED -, button -
PB4 header:
	2: LED string +
	1: LED string -

Firmware:

The firmware is a dumbed-down version of firmware for my other
project: http://www.fi.muni.cz/~kas/bike-lights/, modified
for ATtiny45.


Theory of operation:

After power-up, the firmware sets up the CPU and powers it down,
waiting for a long button press. In this condition the system
takes about 8uA from the 9V battery. So a typical 500 mAh 9V battery
would last about 2604 days in this mode.

When the button is pressed for a sufficiently long time, the CPU
wakes up, switches the status LED on (providing visual feedback),
and starts blinking.

The firmware main loop is timed by ADC interrupt. It continuously measures
the voltage on R55 feedback resistor, and adjusts the PWM value on OC1B
to match the expected current through the LED string. Occasionally
the ADC is switched to the battery voltage sensing, and the battery
voltage is read. If the battery is critically low, the system
is switched to the power-saving light pattern (see below).

The step-up converter has four target values of current (2 mA,
6 mA, 12 mA, and 20 mA as of this writing, see pwmled.c). The blinking pattern
is adjusted separately from the target value in the firmware.

The firmware recognizes short and long button presses. The short one
cycles through all blinking modes, the long one switches the system off and on.

The status LED has two blinking modes:
- in the normal one, it is off by default, and uses a series of
	short switch-on blinks to display the battery voltage
	(the number of blinks is voltage above 7V in 0.5V steps).
- when an error occurs, the status LED stays on by default, and displays
	the error condition as a series of short switch-off blinks:
	- one blink is a "power low" condition
	- three blinks is "step-up error" (a LED string disconnected,
		for example).
- when the long (-enough) button press is detected, i.e. when powering on
	or off, the LED is switched on to provide a visual feedback
	of long-enough button press.

The blinking modes and patterns are currently set up as follows:
1. power-saving minimal mode
	- a single short blink at minimum current
2. blinking mode 1
	- 2 and 3 blinks at the second-lowest current
3. blinking mode 2
	- 2 and 3 blinks at the third-lowest current
4. blinking mode 3
	- 2 and 3 blinks at the highest current
5. steady light at the minimum current
6. steady light at the second-lowest current
7. steady light at the third-lowest current
8. steady light at the highest current

The system starts up set to mode 3, and switches to mode 1 when
the power is critically low. Other modes can be chosen via short
button press.

