## Joule Thief #050 - R1 Review
[[!Joule Thief]]
**Contents:**
- [[#Joule Thief R1 Module - Board Review]]
- [[#Joule Thief R1 - Power Flows]]
- [[#Joule Thief R1 - Board Layout Zones]]
- [[#Joule Thief R1 - Errors]]
- [[#Joule Chief R1 Mainboard - Board Review]]
- [[#Joule Chief R1 Mainboard - Power Flows]]
- [[#Joule Chief R1 Mainboard - Board Layout Zones]]
- [[#Joule Chief R1 Mainboard - Errors]]
- [[#Joule Chief R1 - The Important Part - Harvested Energy Deposition Schema]]
- [[#Joule Thief R1 - The Cool Part - Throttling MPPC to Subvert ESR Creep]]
Now that the project is complete and Open Sauce is over, it's finally time to review the final Joule Thief. This is a moderately long writeup explaining how the boards are laid out, what they're supposed to do, how well they actually do it, and some mistakes I made along the way.
---
### Joule Thief R1 Module - Board Review
![[Pasted image 20250804100837.png]]
#### Joule Thief R1 - Power Flows
The Joule Thief Module extracts energy from an alkaline AA cell and runs it through a boost converter.
Once the energy has been boosted from AA voltages (0.5-1.5V) up to 5V, it runs through a DPDT switch:
**Mode 1: Headless**
- The 5V becomes a power rail to energize the rest of the chips on board.
- The remaining energy after the board's overhead gets used to trickle charge an onboard 18650.
- No diagnostics are available in this mode, and extraction is not optimized through the MPPC system.
**Mode 2: Slave Module**
- The 5V runs through a schottky diode and jumps off board, sent to the Joule Chief mainboard for consolidation
- The Joule Chief Mainboard extends its own 5V power rail to the module and creates an I2C connection
![[Pasted image 20250804111337.png]]
#### Joule Thief R1 - Board Layout Zones
The Joule Thief module has two INA219's (White) set up on either side of the LTC3105 boost converter (Red).
The boost converter has a large power inductor, and an AD5280, 200kΩ digital potentiometer for MPPC control.
There is also a barebones BMS onboard for headless charging mode, a JST connector to mainboard, and a DPDT switch.
![[Pasted image 20250804111831.png]]
#### Joule Thief R1 - Errors
![[Pasted image 20250804112231.png]]
**Crossover Cables**
The M-M JST cables I purchased for this project were not color matched on either end, but reversed instead.
I was planning on them being matched, so I had to solder on the female connectors for each Joule Thief Module backwards.
![[Pasted image 20250805084354.png]]
**Miswired DPDT Switch**
The DPDT switch was miswired. Specifically the bottom center and bottom right pins should have been swapped.
Because of this, the switch won't work as intended and it's necessary to hardwire it with jumpers for this iteration of the board.
![[Pasted image 20250805123817.png]]
**Wrong Footprint on the FS8205A**
I accidentally ordered the boards with an outdated and undersized version of the footprint for this chip. The Joule Chief had the most recent version, but I didn't remember to update it on the Joule Thief Module. Given that the DPDT was miswired anyway, and the Open Sauce demo was explicitly to show off the parallelization, this wasn't that big of a deal.
You only need the FS8205 if you're running in headless mode, as it's part of the onboard BMS.
![[Pasted image 20250805084059.png]]
### Joule Chief R1 Mainboard - Board Review
![[Pasted Image 20250804113445_393.png]]
#### Joule Chief R1 Mainboard - Power Flows
![[Pasted image 20250804114933.png]]
#### Joule Chief R1 Mainboard - Board Layout Zones
![[Pasted image 20250804115859.png]]
#### Joule Chief R1 Mainboard - Errors
**Address Space Constraints**
I designed the mainboard around the INA219's address space, which allows for 16x INA219's on a single I2C bus.
Since I'm using an INA219 at the input and output of each boost channel, that means 8 channels total.
There's 1 chief, so the remaining 7 can be modules. This is why the chief has 7 module ports.
I completely did not even consider that the AD5280 only has 4 addresses, which means it's actually 1 chief, 3 modules.
If I were to connect an additional channel after the 3rd, the new one would
![[Pasted image 20250804132437.png]]
**18650 Charging Inefficiencies**
The TP4056 and FS8205A are the main sources of inefficiency in the whole system.
Since the entire Joule Chief/Thief system is only intended for charging, and has no means of attaching a load to the battery, it's arguable that the BMS constraints are fairly minimal and could be even more barebones. Something as simple as a voltage cutoff would be sufficient.
But I didn't want to risk any sort of issues at Open Sauce, because a battery fire would definitely get be uninvited LOL.
In testing I did find that simply shorting the dual FET FS8205 universally doubled power transfer rate into the 18650 cell.
Adding the 1F supercap buffers on either side of the final boost channel means my efficiency values are pretty meaningless. I can measure extraction efficiency fairly well, but I would need to rewrite the firmware to implement real Coulomb Counting for that channel.
I believe the TP4056 is also pretty wasteful for this low-power application. I get that impression at least, and several people have told me as such. I cloned a BMS layout I found on Amazon though. Literally pulled the chips off the breakout boards, looked at it under a microscope, and reintegrated it into my board design (after validating the breakout board itself actually worked of course). I haven't read the TP4056 datasheet though.
There's a longer bit of commentary here about how I'd go about setting up a proper battery pack with load balancing & power supply etc. but we'll save that for another time.
![[Pasted image 20250804113010.png]]
**Arduino Shield Shorting to Ground through USB Shield**
This is the kind of thing that happens when you decide last minute to make it a shield instead of designing an on-board MCU.
the THT pins from the female JST connectors poked through and made contact with the metal shell of the Arduino Uno's USB port, shorting ~all the pins to GND.
I fixed this by using flush cutters to cut off all 7x6=42 pin nubs, then actually grinding them smooth with a dremel, and then adding several layers of electrical tape to both cover the pin nubs and the USB shield to prevent any further shorting. This fixed the issue.
![[Pasted image 20250804113401.png]]
### Joule Chief R1 - The Important Part - Harvested Energy Deposition Schema
**A key point to all this is that there is an abstraction between the harvester and the depositor.**
All the Joule Thief Modules have to do is step an intermittent, low-voltage, low-power source up to ~5V and pass that energy across the diode and onto the mainboard. As it passes through the shunt, it lands in the 1F buffer. There's a low Vf schottky diode on the slave boards so no backflow should be possible, and the losses are minimal. Once the energy has been dumped into the buffer, the Thief's job is done. It doesn't care about what happens after that and the state of the 18650 battery it is ultimately charging is actually irrelevant to the Joule Thief Module.
![[Pasted image 20250805115639.png]]
**There is a 1F supercap on both ends of the mainboard's LTC3105 boost chip, each with their own Schmitt Trigger.**
The first Schmitt Trigger is managed by the MCU and uses the bus voltage reading from the first INA219 to get a read on the voltage level of the first supercap. The MCU can pull a SHDN pin on the LTC3105 `LOW` and disable the boost chip, and so the first supercap is only allowed to dump energy through the boost stage and into the second supercap after enough harvested energy accumulates to reach 5V. From there, it will activate and forward all its energy into second buffer on the other side until it reaches a bottom threshold of 2.5V. This ensures the LTC3105 is always operating in a current-saturated state within its high-efficiency regime.
After the boosted energy is deposited in the second supercap buffer, a second Schmitt Trigger serves to toggle the 18650 charging path. An 18650 Li-Ion cell is going to be somewhere between 3.0 and 4.3V, so the second supercap has much tighter thresholds between 4.5V and 5.0V so it is always at an appropriate charging voltage.
As energy comes through the boost chip from the first buffer, the second buffer will discharge repeatedly as Supercap #2 climbs to 5V, closes the charging path, dumps the energy into the 18650, hits the floor at 4.5V, and then waits until it charges back up again.
![[Pasted image 20250805121255.png]]
**It is effective for low power, but quickly bottlenecks itself.**
In cases where extracted energy is plentiful, there is a steady-state charging scenario. The extracted energy flows through both supercap buffers, and both schmitt triggers remain enabled continuously without any intermittent stoppage or pulse-charging. This is fine. The pulse system is designed to efficiently accumulate energy from any number of parallel sources, no matter how weak or intermittent. One performance limitation of the board that emerges here is the final boost channel actually has a fairly low max power throughput when energy IS abundant.
**This energy abstraction layer / dual-buffer schema means the source of the energy no longer matters.**
Any intermittent energy source, no matter how low-voltage or low-power, should be possible to accumulate through the Joule Thief system. The LTC3105's minimum voltage is 0.250V, so that's the limit today, but there are other boost chips that can go as low as 50mV input. All it needs to do is step up enough to help charge a cap. I believe it should also be possible to add an arbitrarily number of extraction modules in parallel as well. The real question here is an economical one. Is it worth it? Not really. Maybe a hand-crank generator ran through this system can charge your phone and save your life one day. But as far as the energy tucked away in discarded alkaline batteries goes, it's not worth the trouble. You'd be better off with a shitty solar panel of the same footprint as the PCB. The energy would come faster and cheaper with less tech overhead.
![[Pasted image 20250804114049.png]]
### Joule Thief R1 - The Cool Part - Throttling MPPC to Subvert ESR Creep
#### Background on Alkaline Cell ESR
A key point in all this is that the Joule Thief is designed specifically to get energy out of Alkaline Cells as quickly and efficiently as possible. As these batteries die, the amount of power they can output continuously steadily declines, meaning there's an asymptote you have to run upon if you chase 100% battery depletion.
For an AA with an unloaded Cell Voltage of 1.5V, you might load it for 100-200mA and then read a cell voltage of 1.2 or even 1.0V. A battery tester will tell you the ESR is 100mΩ but just comparing the unloaded vs. loaded cell voltage for a given load current lets you calculate the ESR, and it usually comes out around 3Ω in my experience.
ESR is dynamic and affected by a lot of things inside the battery such as electrolyte gradients forming and ionic mobility decay that give it a pretty large time constant, on the order of minutes. The ESR will continuously fluctuate and grow as these chemical factors further inhibit current flow and reduce cell voltage.
Typically when you want to get the maximum power out of a voltage source, you try and set R_load = R_ESR. But our ESR is constantly fluctuating, and will only get worse the longer we load it. Measuring the ESR once and matching it just won't work.
Because these chemical ESR factors only worsen the situation the longer and more loaded the battery runs, some PWM or other intermittent loading scheme may come to mind. If you can track the ESR dynamically and match that, what will eventually happen is the load will increase, reducing the burden on the cell, which allows it to catch its breath, and the ESR will decrease slightly. From there, the ESR-tracking-Load will decrease in turn, allowing for increased power output. And the cycle continues as our tracker forces the battery to oscillate right around an optimal point.
This scheme can probably get skewed too though, it's not what I'm doing. Measuring the ESR of a battery typically requires disconnecting it, at least for a few seconds, and it can be fairly complicated, involving sending pulses into the battery to measure its impedance and other cool analog kickflips.
#### What I'm actually doing
I'm using a combo of all the chips involved to create a control loop set to maximize the average power output of the battery.
The LTC3105 Boost chip has an MPPC pin. This MPPC pin acts as a 10µA current source. The user places a resistor between this pin and ground in order to generate a voltage based on the value of the resistor. The LTC3105 then reads that voltage and throttles the main inductor's switching patterns in order to ensure that its input voltage matches the voltage seen at the MPPC pin.
So now we're producing the ESR formula a bit backwards. We know the unloaded cell voltage, and we are essentially manually selecting the loaded cell voltage by setting the MPPC resistor.
```
Unloaded Cell: 1.5V
MPPC Resistor: 100kΩ
MPPC Voltage:
10µA x 100kΩ = 1.0V
ESR Calculation:
1.5V -> 1.0V means 0.5V drop,
produces 400mA current into the LTC3105,
thus ESR is 0.5/0.4 = 1.25Ω
```
This works fine, but as the cell decays, the loaded cell voltage remains static. If we were matching ESR as described above, we'd see a loaded cell voltage of exactly 50% the unloaded cell voltage across the entire range as it depletes from 1.5V.
Now, we run into a different asymptote, where eventually the cell will reach 1.0V unloaded, and the boost chip will still be set to 1.0V loaded. No voltage drop means no current flow, and the water wheel stops turning.
So what we really need to do is make this MPPC voltage adjustable. And the way to do that is to add a digital pot across the MPPC pin so we can arbitrarily modulate the resistance, and thus the voltage setpoint.
All we really need for a control loop is a sensor and an actuator. As long as there's some coupling between them, simple algorithms can figure out the rest for us. So we run the energy leaving the battery and entering the boost chip across a shunt meter and get a power reading. Then we hand that to the MCU and tell it to wiggle the digital pot around until it finds the top and stay there. That's all that's going on here. But it manages to deliver superior performance to my bench DC Electronic Load, which is static. I was able to get 400-500mW max out of a fresh AA with the bench load.
With the Joule Thief board, I was able to achieve 600-700mW, sometimes upwards of 900-1100mW.
In this case, our control loop is running around 10-100Hz, which is far greater than the time constant of these batteries. The result is the Joule Thief can maintain 70-80% extraction efficiency while pulling energy out of the battery as aggressively as possible, faster than the chemistry can react. I don't know what's going on inside the chemistry of the battery to prevent the ESR buildup I was seeing on static load tests. The responsive and dynamic throttling of the effective load seen by the battery allows it to consistently push higher power outputs indefinitely, where static loads would eventually "fatigue" the cell and it would reach a variety of failure conditions such as outputting 50mV,1A (aka Crashing Out).
Overall, this isn't really that clever of a solution. I developed an understanding and intuitive feel for what limitations alkaline cells have based on their chemistry, but this schema doesn't require any of that knowledge.
It's very simple: find the power throttle, then strap a sensor & MCU to it and tell Claude to make it work better.
![[Pasted image 20250804125610.png]]
![[Pasted image 20250804125633.png]]