Friday, October 16, 2009

Repairing Roomba charging circuit

Sometime ago, a colleague told me that she bought a Roomba 405 but the battery seems dead, unable to charge. Being the curious me and how I like to fix things, I made a deal that if I could fix it, I can use it to clean my house for 1 month :-)
So, this post is a sharing and also a kind of documentation for myself on how I got the Roomba working again.

Initial diagnosis....

So, the next day she brought the Roomba to me in office and I took it home.

First step, I tried to charge it by connecting the AC-DC adapter to the robot. According to the user manual, it seems charging. The amber LED is blinking slowly. A few hours later, I detached the power and try to see if it moves by pressing the "Clean" button. Nope, it is dead as a log. So, next step, I took my multimeter, removed the battery and measured the battery terminal voltage. Huh, it reads approx 0.6V? Now, I gotta monitor the voltages while charging to figure out what's wrong. I attached 2 thin wires to the terminals, replaced the battery into Roomba and attached the charging adapter again. It still reads O.6V! So, then I could say that it is somehow not charging properly.

Next, I gotta verify that the battery is still working by manually charging it. The label on the battery shows 14.4V NiCd battery with 1800mAH. A NiCd battery with 14.4V rated voltage means that it is 12 x 1.2V NiCd cells. So, the fully charged voltage should be 12 x 1.45V = 17.4V.

Since the Roomba's DC adapter outputs 0.75A at 22V and NiCd batteries are relatively easily to charge, I can just make a very simple charging by directly connecting the adapter's 22V output to the battery via a 5ohm resistor as a current limiting resistor. To be safe, I also will keep an eye on the charging voltage and current to ensure they are within reasonable safety limits. Once I applied power, I can see that the battery voltage steady goes up. This should mean that battery seems to be still chargeable. The charging current is approx. 700 mA; seems the the DC adapter has internal current limiter which is a good news. Since the battery capacity is 1800 mAH, it should take approx 2-3 hours to fully charge it, but I have to be careful not to overcharge and damage the internal chemistry.

After about 30 mins and the battery voltage got up to 16V, impatient to wait till fully charged, I poped the battery back into the Roomba and press the "Clean" button. The time the little robot roars to life! It goes around the room while cleaning the floor for about 10 mins before it stops with a blinking red LED and a 4 tone melody that indicates low battery. Alright, now I can confirm that the battery is OK, but Roomba is just not charging it.

Why did it broke?
To fix it, I had to find out why there is no charging voltage applied to the batteries although the LED indicates it is charging. I did a search on google and eventually I came to this forum:
I also found a reverse-engineered schematic at
The problem described seem very similar, so I disassembled the roomba. I probed the MOSFET, U2 and it seems really dead. There are no voltage at the drain although the voltage at source and gate seems normal.

To replace the STN3PF06 P-channel power MOSFET, I found that RS-Online sells them for RM2.58 each and minimum order quantity is 10 but I don't need 10. Even if I replace all MOSFETs in the charging circuit, I'll only need 4. Also, it seems to be a fairly common issue that will probably reoccur if the batteries are fully depleted, causing the initial charge current to be too high that it killed the MOSFET.

Alternatively, I dug around my toolbox and found that I still have a few LM317. Then, I got an idea that if I could bypass the original charging circuit to provide constant current to the battery positive terminal, the Roomba will still be able to indicate charging status but the actual charging current is supplied from the LM317-based constant current charger as shown below on my literally back-of-envelop design.

First, I did a prototype on breadboard to the circuit to verify that it works. From the LM317 datasheet, the resistor value should be:
R = Vref / Iout = 1.25 V / 180 mA = 6.94 ohms.

However, I used the two 12ohm resistor parallel was used because those are the resistors in my toolbox that gives the closes value. The output current is still 1.25V / 6 ohms = 208.3 mA which is slightly more than 0.1C charging rate for the 1800 mAH battery. So, I added the additional 1Kohm resistor and LED to the output to siphon off about 15 to 18 mA current depending on the battery's charging voltage. After successfully charging the battery which this constant current regulator (which takes approx. 10 hours), I decided to go ahead and put it in the Roomba.

Building the circuit
I cut a small piece of stripboard and arranged the components as tightly as possible. Then I took out my old solder gun and solder them together. This is what I got... no too bad considering my soldering skills are long expired since my college days :-p

Robot surgery...
Below is a few pictures I took as I was disassembling the Roomba.

Battery, brushes and dust container removed

Top cover removed

From the picture above, you can see the battery connector is at the top right. However, due to limited space, I decided to place the circuit on the top left side.

Next, I have to connect the circuit to the original wiring. I had to temporary remove the battery and power connector solder on the wire as shown below.

Yellow is the regulator output, red connects to the positive supply and black connects to ground.

Next, I fastened the board on the Roomba using the screw hole on the LM317 to a screw hole just beside the battery compartment. The weird silver coloured strip is actually a few pieces of kitchen aluminium foil folded together to be the regulator's heatsink. This is because from earlier experiment and also from the datasheet, the power dissipation has exceed the limit of using it without heatsink. According to the datasheet, the power dissipation when is battery voltage low should be approximately:
PD= (Vout - Vin) Iout = (22 V- 15 V) 0.208 A = 1.46 W

Maximum allowable temperature rise, TR(MAX):where TJ(MAX) is max junction temperature from datasheet and TA(MAX) max ambient temperature :
TR(MAX) = TJ(MAX) - TA(MAX) = 125 - 32 = 93°C

Thermal Resistance:
θJA = (TR(MAX) / PD) = 93 / 1.46 = 63.6 °C/W

For the TO220 package, the junction to ambient thermal resistance without heatsink is 50 °C/W. So, I needed a heatsink to reduce the thermal resistance.
Since we have only exceed the thermal resistance not much, a simple heatsink should work.

Also from thermometer, without heatsink, the temperature can go dangerously above 80°C. With the heatsink added, temperature stabilizes at around 50 - 60°C throughout the charging.

Finally, below is the picture of the repair Roomba before the housing is assembled again.

I have done a few rounds of change and clean cycle. So far, it seems good. It takes approx. 8 - 12 hours to charge until the top LED turns green.

I have just return the Roomba to the owner a few days ago and I am starting to miss it because now I have to clean the floors manually again :-(

This whole experience made to so tempted to buy a Roomba myself :-D
Post a Comment