Neutrogena light mask part 2: down the rabbit hole

In part 1 I hacked the light mask to get 99 lives. In part 3, I play with the LCD. In part 4, I find it annoyingly doesn’t really have 99 lives.

Final touches

Since it’s more convenient to use the built in timer (for now) than time manually, I added a programming port on the side so I can reprogram it when I need to:


The connections are CS, CK, MOSI, MISO (not required) and GND.

It’s always useful to have IPA or white spirits (effective but smelly) around to wipe off the excess epoxy on the visible bits to get nice looking results. I made the hole with a drill and needle files.

Further analysis of the circuit

I’m now kind of curious about how accurate my guesses about the functionality were. Also, I have another controller kicking around which is now at 0 uses remaining and has no programming port. So, I pulled off the transistor. First, here’s the  hFE:

Measuring Hfe of the main switch transistor

The transistor meter doesn’t get a lot of use these days

That’s comfortably in the middle of the 160-300 range expected from the datasheet.The transistor tester has obnoxiously deep holes for the legs…

So, what about the stiffness of the regulator? So, it’s driven by a 1k resistor from a 3.3v source through the base. I’ve got a bag of ST Microelectronics 7833 regulators. They’re meant for regulation not references and the tolerances are quite weak, but in practice the regulation is very good. From 4.65V to 27V, it’s bang on 3.20V output. It was a tiny bit worse at the low end (4.65 to 5.5V), giving out 3.19V when it was scorching due to being connected up backwards, but cold it’s even better. Here’s the test circuit:


With TP0 and TP1, I’ll be able to measure both the voltage across the transistor and the current through it.


The resistor is a whacking great 10Ω beast from some old board I found in a junk pile at my old cow-orking space:

A circuit board maybe off a UPS

Two of the white ceramic rectangles are 10Ω, 10W resistors. The black column in the lower right is a high power 300Ω resistor. Those relays look beautiful and I want to use them for something.

I find having a junk pile of old boards good. Partly I find that despite being able to easily buy the parts I need, I often don’t think of them until I need them at which point I’d in practice have to wait until the next weekend. Having a pile of oddball parts can often yield something useful which works before the weekend expires. Also there’s something satisfying about getting use out of landfill. And then there’s the nostalgia trip: when I was a kid, many of my components were rescued off old junk boards.

There’s a bit of a knack to removing large parts, but it’s much easier now I have a half decent iron (it’s only half decent, but better than a 25W fixed temperature one!). Setting it hot (426C) helps, of course due to the thermal mass. The other trick is to add lots of extra leaded solder. This dilutes the unleaded stuff lowering the melting point and helps thermal coupling of the iron to the joint. Also, having a moderate amount of solder seems to work better with solder suckers. It’s counterintuitive to add solder when you want to remove it 🙂

The resistor is a Dale (Vishay now) 5% 10Ω wirewound ceramic cased one. Worth a couple of quid new. A nice part from a good manufacturer.

Back to it

Hmm, no that’s not quite going to work. Even at 4V, we’ll push 400mA (the expected value) through the resistor, which may correspond to as little as 4.2V total if the transistor is well saturated. That’s below what the 7833 can regulate; unlike the one on the light mask it’s not LDO (low dropout). Looks like we’ll need two PSUs. Fortunately I have ALL the wall warts. This one (actually a brick not a wart) comes from an old IDE hard disk enclosure of 2008 vintage and gives a good 1.5A at 5 and 12V. Off comes the 5 pin mini DIN and on goes a header suitable for a breadboard or other similar socket:

I always find it’s worth doing things properly: I added a rigid strain relief and insulator using some polycaprolacetone derived plastic. It will stop shorts and annoying breakages.

The modified circuit is now this:


And I also put an ammeter in series with the base. It’s current-ly (heh heh heh) running at 2.49mA. I reckoned 2.7 before, so that’s not a bad guess! I tried a manual voltage ramp using my power supply, but it’s too slow: the transistor heats up a LOT, so the base current increases a lot too. I guess that’s part of the circuit stiffness in a sense, but I want a roughly constant temperature ramp if I can get it.

New circuit time!


I’m using an Arduino for doing the timing. It has a very short duty cycle (0.1%), so instead of dissipating somewhere around 10W, the whole assembly will dissipate 10mW or so. I guess I probably don’t need those power resistors after all. The switching is done using a N channel MOSFET (2N7000) to switch a high side power P channel MOSFET (IRLIB9343). The switch going on causes the 100μF capacitor to charge, rapidly ramping the voltage across the assembly under test, then it goes off, causing it to rapidly ramp down. Given the values, the time constant is around 1ms, so the whole test should be finished in 2-3ms or so (I’m wrong! more like 6-10ms).

The circuit’s been running a while and nothing is warm, and the base current is steady at 2.51mA, which is excellent. This is also where I love having a good 4 channel slope. I’ve set the scope to trigger off the Arduino, giving a very nice trigger. I then set it to averaging mode, to give very clean traces:


Channel 1: V1, Channel 2: Arduino, Channel 3: Vt

Plotting Vt against I=(V1 – Vt)/10 gives:


Yikes!! That’s one hell of a lot of hysteresis and the voltage goes negative??? It is however pretty decently stiff especially on the return leg. There are a few clues knocking around indicating that there’s a problem with my building of the circuit, rather than the hysteresis being due to the device under test. One is that it, well, goes negative. Then there’s a very sharp drop when the switch turns off, far faster than the discharging. And finally, the Arduino voltage takes a very long time to settle back to 0V.

Nonetheless even with this measurement we’re getting 20% regulation of current between 1 and 7V. I think the return leg is probably more accurate since it’s going slower so there are fewer transient effects. That’s more like 10% regulation.

I think the main reason is likely that I’ve been awfully lax with where I’m taking the measurements, see:


Left: the circuit, right: labeled. The power traces are in red and black. Scope probes are labeled in the trace colours (yellow, V1, magenta Vt, cyan Arduino) with ground as grey. The component under test has a white square around it.

The currents are biggish (half an amp or so) and the breadboard trace resistance as well as the contact resistance is nontrivial.You can see there’s a fair bit of stuff between the measurement ground and the transistor, especially the relatively high resistance points between the wires and pins and the breadboard. There’s quite a bit in the way of the bulk storage capacitor too, which explains the slightly wobbly traces too. The solution is to move the measurements right onto the legs of the transistor:


Left: the circuit, right: labeled. The power traces are in red and black. Yellow: V1. Magenta and green are both nominally Vt but green is soldered to the resistor leg and magenta to the transistor leg with no power flowing through the measurement wires. Cyan is the trigger as before. Grey is the scope common and is now soldered to the transistor leg too. There’s also a 1000uF capacitor placed very close to the high current circuit in the centre of the board.

Because of that there’ll be some unknown trace and contact resistance in series with the current sense resistor. I can solve that by making use of the fourth scope probe which will interestingly tell us something about the breadboard’s resistances. If it’s less than 0.5Ω then it’s within the tolerance of the resistor anyway. And while I’m at it, I’ll bump down the delay between measurements to 0.1s (100mW dissipated). That way I can actually get all 1024 measurements in the average without quitting early due to laziness. Here are the very clean looking traces:


One thing I didn’t really note before which you can see is that the decay curve doesn’t look very exponential: it’s actually pretty flat especially at the start: precisely what you”d expect from a constant current sink. The analysis gives:


Well, that’s disappointing. It’s basically the same. There’s less noise (due to more averaging) and it’s slightly smoother, but the hysteresis is still there almost unchanged. I doubt at the moment that it’s a transient effect in the device (e.g. thermal). Suspiciously, the discharge leg which is slower looks better. My current (this is a pun as you will soon see) best guess is that the base drive (see?) is taking a dip, because resistance between the emitter and the ground rail causes the emitter voltage to rise relative to ground, so the base current will drop, maybe until some capacitance charges up?

I’m not sure. The options are to measure the base current (there’s a roughly 2.5V drop across the resistor, which we can measure with the scope), and if there’s a flaw there, then I can stabilize the base current either by changing the drive circuit ground to a different place (e.g. the emitter measurement wire—it’s only a few mA) or sticking a high inductor on the base to resist transient changes in current.

The easiest thing to test is to change the width of the on pulse (and the capacitor) up and down by a factor of 10 to see what if anything changes. That should reveal a lot about the nature of the transient effect.

But first! I can check to see what the board and joint resistances are, using the extra probe that I added. I know the current from the big resistor, and it should be a simply V-vs-I plot…




Temporal tests

Where was I? (there was around a 3 week gap here, so I’ve kind of forgotten). Oh yes, I was going to try varying the pulse length by a factor of 10 up and down. I’m currently using a 1ms pulse (the shortest available with delay() on the Arduino) for which I need a 100μF capacitor. I’m going to go for 10ms and .1ms as well. So, I have to replace that 1000μF with a 470μF one, since apparently I’ve run out of 1000μF capacitors and that’s my last one. Okey dokey then. Also, during these experiments, I tweak the power supply voltage so that the voltage across the transistor. I also had to bump the time up to 15ms for the slowest setting. By the time I got to the 10μF delay, I had to turn off interrupts and switch to delayMicroseconds(95), in order to get a 100μs delay. I also noticed some gnarly ringing, so I added gate resistors to the MOSFETS and a 100nF capacitor to the timing cap to take the edge off. Even so this is a hell of a fast circuit for a breadboard. Without the gate resistor, the gate of the 2N7000 has a rise time of about 20ns.

I also connected it up wrong, slightly smoked the DUT and burned my finger. Amazingly, it still seems to be in full working order. Ouch ouch ouch ouch. Anyway (ouch) here’s the traces:


No perfect, (ouch) but let’s see how the V/I cures look:


The legend indicates the capacitor used. That corresponds to pulse widths of 15ms, 1ms, 100μs and 10μs.

Well, that’s  lot better!! Those long pulses have awful transient effects, sine the power draw is high. As the pulse shortens that goes away, and the hysteresis cure closes up. I don’t believe that overshoot however on the quickest curve. I suspect I’m getting a different sort of transient effect there.

Also my PSU has now become unstable above 24V out. Naturally I need about 26 for this setup. Whyyyyyyyyyyy???

But that regulation is not bad (5% over quite a wide voltage range), or would be if the circuit actually hit that range. It is serving as a decent upper limit on the current, I guess, using only very cheap components and what was already required for other things (the 3.3V regulator).

More on transient effects

I’d still like to reduce the size of the hysteresis loop. I speculated that the base current had something to do with it too. The circuit has no star ground and has pretty high currents. Due to the voltage drop along the ground rail, the regulator circuit will probably drift up and down. So, I’ve measured the voltage on either side of the base resistor. Using the scope’s maths functions (through a truly interesting interface), you can see (red channel) what the voltage fluctuation over the base resistor is.


As usual, blue is the trigger, and yellow is the capacitor voltage. Green and purple are measured either side of the base resistor and red is the difference between them. It’s a much smaller scale, so very very noisy. The temporal averaging really helps here.

That’s around a 5% change, which is certainly significant. Inductors resist change in current, so I’m going to stick a big inductor (if I have one) series with the base resistor to stabilise the current. The old PSU board has a transformer on it. I’m going to take that off and see how it looks.

Wretched device was press-fit and solered, so I almost busted it trying to take it out. The transformer has two sides: 1.6Ω/5.4Ω with inductances of  13/35mH, which is somewhat less that I expected. And that made little or no difference. That board also has a whacking great Omron LY4 relay which has a coil of a more respectable 3.5H, with 350Ω nominal resistance. Here’s the result 10th a 100μF timing capacitor:


Same as before, but looks like I got bored waiting for the averaging to finish, so the red trace is noisier.

It’s much better, but not quite as better as it looks because the current is being measured as voltage across 600Ω, not 1kΩ, so it’s more like a 33μA rather than 160μA, which is still a huge improvement. The VI curve is:




Yeah, so that’ll teach me for being lazy (no it won’t). Turns out it’s a 120V relay, not the 24V model, so the coil has a resistance of 1.7kΩ, which I would have known if I’d measured it. I have another relay with the specs of 750Ω/1.35H.


Still a 100μF timing capacitor.

Well, that’s a little bit better. As one might expect, it’s better on the outward leg, which is where the majority of the variation was. I strongly suspect I won’t be able to get much better than this without making the circuit on a board that allows substantially better design. For fun, here’s the one with the apparently optimum timescale:


10μF timing capacitor (100μs pulse width)

You know, that’s actually not bad!

Edit: I forgot to include the final circuit diagram, so here it is:


The circuit excluding the 7833 regulator and the power supply decoupling capacitors. Note the inclusion of the major board resistances (RBOARD), and the power resistors with 4 point measurements. I’ve also put the relay in in full.

Conclusions (i.e. tl;dr)

  1. I burned my finger (ouch).
  2. The regulation is decidedly OK.
  3. The user of the transistor was indeed a clever hack.
  4. Measurement is hard.
  5. This was a very long post.

8 thoughts on “Neutrogena light mask part 2: down the rabbit hole

  1. Pingback: Hacking the Neutrogena visible light therapy system to get 99 lives | Death and the penguin

  2. Sorry.
    If you’ll excuse me, can I be asked?
    I have received Arduino sauce.

    You’ve turned the photos over the first five pins wonder internal photos.


  3. Pingback: Neutrogena light mask part 3: about that LCD… | Death and the penguin

  4. Pingback: Neutrogena light mask: annoying resets | Death and the penguin

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s