Monday, January 4, 2016

Olight S1 reverse engineering and MELD install

I finally got an S1 and tore it apart.  To mod it to MELD RGBWUV I had to completely reverse engineer the stock driver - it's a great design.  The video shows the process and results:

Friday, July 31, 2015

MELD flashlight build video

I recently built up another MELD light, this time a Solarstorm SC02. I've made these before as detailed in a BLF post here. This time I filmed the entire process and attempted to create an explanatory sped-up Diresta-style video:

Friday, June 19, 2015

Running the FF32 from Python in Windows environment

I recently discovered the Flyfish-tech FF32 device, which fulfills some functionality that I've wanted for a long time - easily interfacing programs on my Windows machine (Python scripts) with low-level communications (I2C, SPI, bit banging, ADC). This sort of thing can also be accomplished with FTDI chips but there's some extra go-betweens with the serial communcation, so I was very excited to find these parts. Unfortunately, the Python examples provided are meant to run under Linux, and it took me the better part of a day messing around with it to get it to operate under Windows. I'm writing this quick post as a guide for anyone else who might attempt this so they can avoid the same frustration. I've checked that this method works in Windows 7 and Windows 8 with Python 3.4.3 with the FF32 on firmware v0.5. I am a complete beginner with both Python and USB, so this may be obvious to others; it's written for the self-taught people like me who don't have a clue until they slog through hours of trial and error.
  1. Reinstall Python and check the box in the installer to add python.exe to the PATH variable. This is the only option in the installer that's not defaulted to yes, so I hadn't checked it the first time I installed. I'm sure there's an easier way of getting this added if you already have Python, but uninstalling and starting over was quick and easy (and makes sure you have an updated copy of Python).
  2. Open the Windows command prompt (run cmd.exe) and type "python -m pip install pyusb" to install pyusb automatically. This was an adventure in itself for me just working out how to install Python modules...
  3. Download libusb-win32 to get a very useful utility called inf-wizard.exe, which shows up in the bin folder after extracting. 
  4. Plug in the FF32 and let Windows do its automatic installation stuff - it's a generic HID so it's quick and easy
  5. Run inf-wizard as administrator (recent versions of Windows have become a real pain trying to save users from themselves...). Pick the FF32 from the list of devices. Write down the two hex values for Vendor ID and Product ID. Keep clicking through to create a .inf file and save it somewhere. On the last screen click Install Now. If it doesn't install successfully, you probably didn't run as administrator. 
  6. Use the Python examples from Flyfish as a reference only and don't even try to run them with Windows, they have to be entirely rewritten to work with pyusb. Sometime soon I'll get around to doing that and post them. 
  7. Write your script like this to get pyusb to work with the FF32. This is just a very quick example that I got working - there's lots to do to package the functions up nicely. Note the use of the Vendor and Product IDs that we wrote down earlier:

EDIT 7/31/2015: here's my library and an example application:

Sunday, June 14, 2015

Knock Box

This project was an anniversary gift for my wife. The 5th is traditionally a wood gift, so I had eventually settled on this concept of a small wooden box, but it had to have something extra. I had been thinking about secret locking mechanisms for a while and then decided that an automatic opening would be better, especially if the box were designed so that it couldn’t really be opened without activating the mechanism. I ordered some ¼” pieces of walnut on eBay and then started working out the design while I waited for them in the mail.

The first thing to work out was the actuator to open it. I went through a lot of concepts – direct gear drive of the hinge joint, rotary cam, cable reel and spring return – and found flaws with all of them, finally settling on a crank arm mechanism. I have used these little gear motors in a lot of previous projects so I had some lying around. I interfaced the motor with a larger gear to get extra reduction and to get the long radius needed while still making motor mounting easy. I went through a few iterations of the motor and gear assembly until I got to one I liked. This is cut from aluminum extrusion (actually a square tube I had, cut into an angle) and uses #2-56 tapped holes to mount the large gear, the motor hold-down, and the limit switch. The large gear has a nylon washer and a short aluminum bushing over the screw so that it can turn easily.

I also started on the electronics, for which I planned to use a PIC16F1824 and a HG7881 H-bridge (or maybe it’s L9110S, I’m getting these from eBay so the sources aren’t exactly reputable). The PIC outputs two lines to the H-bridge and gets two limit switch inputs, as well as the user input (still undecided at this point in the project). I put together some basic code to run the motor in one direction until one switch closes, and then go back until the other one does. Everything was running but I was a bit concerned about quiescent current drawn by the H-bridge during sleep, since this will have to sit idle for many years on battery power.

Once I had that much together, I went forward with the design of the box. I would have liked to use finger joints in the corners but I’m seriously lacking in woodworking tools and experience, so the corners are simply overlapped. I did the design in solidworks, which allowed me to print out patterns for the cuts, but more importantly allowed me to work out the mechanism measurements ahead of time. I modeled up the gear and motor assembly and put them in place, then tweaked the length of the arm link and the pivot location on the lid to get the right extents of lid motion. During this process I had the great realization that with a properly designed mechanism, I could run the motor in only one direction for both opening and closing and ditch the H-bridge. This saves on both complexity and standby power. To accomplish this, I tweaked the linkage design until the limits of lid motion were just beyond where I wanted, and printed out a guide to set the lengths when I built it. 


I also printed my patterns for all the wooden pieces. Once the wood arrived in the mail, I cut them out and glued them to the walnut pieces. 

I actually ended up making a complete box (no mechanism) which I had to reject because the wood got a bit too damaged by my handsaw and left nicks in the finished product, but it was a good test of the design and of the finish I planned to use (linseed oil). 

I started on the final version, switching to a hacksaw to make the cuts more gradually. 

I then brought the edges up to final dimension on the belt sander. For external corners, I left some extra material so that they could be sanded flush after assembly. 

Following another lesson learned from the prototype box, I glued this one up in two separate steps instead of all at once. I also needed some time with the front panel off to debug the mechanism, so the first glue step joined the bottom, sides, and back.

The mechanism was finished off by adding the limit switch to detect the open condition. It does this by contacting the protruding end of the wire link that comes through the back side of the nylon gear. I then mounted the mechanism inside with epoxy and two small wood screws. I then added a post to hold the limit switch which detects the lid closing and glued that in. 

From here I moved on to completing the lid. As usual I continued to add complexity in the middle of a project, and decided to try doing an inlay. To start this, I sketched a heart shape and cut it out of a thin piece of cherry. I then clamped that piece down on the center of the lid and carefully traced it with an x-acto blade to make a score line. 

With the inlay piece removed, I gradually cut on the score line to deepen the cut, followed by angled cuts to remove a wedge of material around the edge of the shape.

Finally, I used a small chisel to scrape out the inside of the shape and flatten the bottom of the pocket. The cherry inlay was then glued in, with some saved walnut sawdust mixed into the glue in an attempt to match the surrounding color at the glue joint. After the glue dried I sanded this flush and the inlay was complete. 

To finish the lid, I drilled in the holes for the hinge pins, and added a full-width fillet to the bottom edge in the back so the hinge could rotate. Finally, the pivot for the wire link went on (a small brass tube held down by a block of wood), as well as an extra block to prevent the wire slipping out of the tube as it tended to do. The last step on the lid was to add two small holes hidden in the back that give access to the ends of the hinge pins. This is so that they can be popped out in case the mechanism or battery fails and get the box open. 

I could then complete the entire mechanism by bending the wire link. This took a few tries to get perfect. The link is a complex part that needs to contact the limit switch, pivot in a hole in the gear, bend out to avoid colliding with the gear screw, and include a u-bend to serve as a spring before finally making a 90-degree bend to go into the pivot on the lid. The spring section is critical to allow the box to fully close: the linkage is designed to pull the lid slightly below horizontal, at which point the u-bend section opens up to put tension on the lid holding it firmly in place. It also allows compliance in the case that something gets jammed so the mechanism won’t destroy itself (the motor is geared down low enough that it has enough torque to destroy the gear if it is completely stopped).

During all this work I had been thinking about how to get input from the user to trigger the mechanism. I wanted it to be fairly hidden, so the options I thought of were: capacitive sense pad behind the wood (too much standby power), wooden inlay-like button (too hard to make it look good), or knock sensor. A knock sensor (using a piezo element) seemed like the only reasonable option. I originally wanted it to be on the lid, as knocking on the top of the box would be more natural to the user, but this left the problem of how to tell it to close when the lid was up vertical. The compromise was to put the knock sensor in the front panel and use that to trigger both opening and closing. The sensor I used was just the piezo element removed from a buzzer, as they can be used in reverse to convert compression into electrical signals.

The first version of the front panel simply squeezed the piezo element between the front panel and an inset brace piece behind it. The brace had a small circle milled out so that it only contacted the inner section of the piezo , and the inner section was planed down a bit to fit the thickness of the piezo. I drilled holes to get the wires out and then glued these two pieces together.

At this point I finalized the firmware and could test everything with the complete electrical system connected. It all worked, but it became clear that the knock sensor was not nearly sensitive enough – I had to hit it quite hard to trigger, and even then it was with the brace piece flat on the bench, not fixed at its edges like it would be once mounted in the box. The concept I came up with to fix it was to make a new front panel with a very large pocket milled out of it, so that the majority of the area is very thin wood that can flex easily.

This took a few attempts as I don’t have a mill or router, and ultimately I had to do most of the work with a chisel. The brace piece goes against this as before, but now there needed to be an extra pedestal piece to raise the piezo element up to meet the front panel. This new arrangement worked perfectly to detect knocks, and has an additional advantage that I realized too late to use in this project but could do if I ever build another: there’s a large hollow cavity inside the front panel which could be used to hide all the electronics.

With the knock sensor all working and the front panel completed, I wired up the microcontroller (dead bug style on top of the aluminum motor mount) and did a final system test before gluing the front panel in place.

At this point I hadn’t fully planned where to mount the battery holder, but I got really lucky and discovered that it could sit perfectly on top of the flat aluminum piece that clamps the motor down, and use one of the motor clamp screws to hold it in place. Finally I glued in a small piece of wood to divide the box so that the mechanism is kept separate from the usable area. 

After some tweaking of the lid fit to get the mechanism to run smoothly, I did the final sanding. This started on the belt sander to get all the pieces flush, and then finished by hand on increasing grits of sandpaper. The linseed oil finish was then applied to all outside surfaces and allowed to dry. After cleaning it up I also lined the bottom of the pocket with a piece of felt. Once it was all done, I did some final checks of standby current, motor run current, and a check of the voltage drop after a few days of standby. And it’s done!

Here's a demo:

And here's a full Youtube video of the project:

Sunday, August 31, 2014

Olight S20 clone with MELD

I wanted to try putting MELD into an 18650 light, so I looked around and found this: the Solarstorm SC02, which is a clone of the Olight S20. It's a pretty good buy at $15, better machining than I expected at that price. The firmware is awful, as is the norm, so I promptly gutted it:

 I kept the original PCB and stripped off all components except the tantalum input capacitor. This build wouldn't make sense to use MELD hardware in since it will never run on a primary cell, and it should have a higher current on white than the 1.5A that MELD3 is capable of. This one would be run only on secondary cells so I used linear regulators controlled by a PIC16F1825 running the linear version of MELD 2.13 firmware.
The LED board was made using the two-layer method I came up with on my Blackshadow mod, so that the white XP-L gets better thermal performance.

 I glued the PIC upside-down onto the stripped PCB and started wiring. The PIC needs 7 connections: 4 outputs, power, ground, and the switch input.
I then started stacking up the AMC7135 regulators. Here's the four that run the color components. They have a pair of wires that ground them together, and individual output wires that will run up to the LEDs.

 After those 4 were wired to the PIC, I started on the 6 that will be paralleled to run the white emitter (at 2.1 amps). I made them in two groups of 3 to share the current load between two sets of wires, and to make them physically more flexible for when everything has to be fit into the pill.

Here are all the regulators wired up, insulated with kapton, and the wiring bundled into two groups to pass through the holes.
The driver fit fine, but I was just about at the limit of how much could be fit into the cavity. Here's the LED board going on, with thermal grease under it.

 And here's the result of wiring in the individual LEDs.
To get the spacing just right, I cut the original plastic insulator so it had room for the extra LEDs, and then used it under the reflector.
Finished product!
Here's a video that goes over the latest firmare:
And here's the config menu:

Saturday, August 2, 2014

MELDv3 in Fenix HL50 & Sunwayman C10R

MELDv3 boards came in! This version brings big improvements to the SEPIC converter on the white channel, mostly in the area of thermal performance. It also makes an electrical change that allows the SEPIC to run well at much lower battery levels if the light is running on primary cells.

  The inductors are much bigger to better handle high current, so to avoid increasing the stack height I rearranged the daughter board so that they are both on the top side.

I did two projects right away with the new boards, one of which is to upgrade my new Fenix HL50 headlamp. I was very excited when this headlamp was released because single-CR123 headlamps are rare and I don't like any other battery setups, but of course the UI is terrible and needed an upgrade.

As soon as I got it, I opened it up to see how much room there was. The construction is pretty good. Here you can see the stock driver with a daughter board that sits vertically:

I was able to fit MELDv3 by removing the inductors and free wiring them up in the vertical space.

My standard MELD LED board with XB-H and XQ parts fit with one edge filed down. I also had to drill out the reflector slightly to get it around the LEDs. Here's the LED board installed and wired up:

And the finished result, the perfect headlamp:

And here's the second project with MELDv3, a Sunwayman C10R. I really like the construction on the C10R. It has a nice big reflector so I was able to fit an XP-size LED board in it with an XP-L as the white emitter. MELDv3 went in pretty easily by epoxying a momentary switch onto the main board:

Here it is with wires attached, going into the head of the light. Not shown here is a grounding ring needed to make contact with the body (this difficult grounding is my only complaint about the design of the C10R). Also shown is the MELD XP LED board with all LEDs installed and notches cut to fit the wires:

And all wired up:

Nitecore EX11 with MELD.EX

In continuing my trend of putting RGBWUV and my MELD UI in every light possible, I got a hold of the discontinued Nitecore EX11, which uses piston drive (which I love and have worked with before). I wanted to fit the full MELD2 driver into it, but there is just not enough room in the pill with the piston drive mechanism. I ended up designing a custom board stack that gets rid of all the inductive converters and just uses AMC7135 regulators (1 per color channel, 3 for white). This means the light is restricted to rechargeable cells, unfortunately.

The daughter board actually came so close to the wall of the pill that I had to notch it out to pass wires through from the main board. The entire thing is run by the same PIC16F1825 as regular MELD boards, and it runs the same firmware (with a compile option for linear lights, which makes a few slight changes).

Here's the schematic for the main board:

And the daughter:

Four connections go between main and daughter board. The main board has the positive battery contact and the contact ring for the piston. Since my total available height was very small, I intentionally aligned the regulator on the bottom of the daughter to sit above the PIC, which is shorter than the regulators on the main board. This lets them stack together into a pretty short assembly:

Here's the pill completed, and an XML color wired up for electrical test:

The other challenge with this light is that the reflector opening wasn't big enough to fit a MELD LED board. I didn't want to ruin it by drilling it out, so I went back to a crazy technique I've used before of mounting the color LEDs around the reflector in individual holes. This process started with wiring them up in mid-air:

I then drilled four holes evenly spaced around the reflector, about midway up. Then to reduce the depth to get the LEDs farther out, I filed down around the holes until the wall was about a millimeter thick. I carefully arranged the LEDs and the wires to get the LEDs centered in the holes, and glued them down with thermal epoxy. This was a painstaking process because I had to hold the LEDs in place while the epoxy cured, and I had to do it four separate times so that the epoxy was facing up and wouldn't drip down. 

Here's the result:

And the back of the driver:

It all turned out great, although the color beam patterns are terrible, as expected. The white beam is perfect, and isn't noticeably affected by the color emitters.