I am an Engineer in the Boston area. I like making things, teaching people how to make things, and tea. This blog is documents the things I make and do, and provides instructions on how to do the things I do, or make the things I make.
After my first dactyl, I decided I needed at least another one, maybe two for my home, my office, and some third place. Unfortunately, instead of just sucking it up and wiring it by hand, I had the delusional notion that it would take less time for me to make a flex PCB to do the wiring for me.
My initial design process was to do a quick paper prototype. To do this I printed out (on a 2d printer) a lot of 1u sized pieces of paper and fit them to an empty dactyl shell. bridges were added to these connections, and the whole thing was scanned on a flatbed scanner. after a few iterations I had a pretty organic board that fit pretty nicely, but ultimately it was going to drive the price up because it did not use board area efficiently, and it was going to bump me out of a lower price bracket.
The original design helped me work out some of the main layout challenges around the thumb cluster, which was helpful for the next iteration. Unfortunately, the organic shape made the flex quite inefficient in space usage. Instead of trying to get a flex that would conform exactly to the shell, I realized the main spacing issue was between columns (keys are spaced about 23 mm vertically). To simplify routing, I decided there would be a single connector between columns, with a few specialized connectors for the thumb cluster and the ‘extra keys’.
I went back and forth between physical prototypes, electrical layouts, and sketches to arrive at this final shape. Paper cutouts are a cheap and fast way to design, and making a physical model gives me a lot more confidence in terms of clearances (especially for assembly). Doing this in a CAD model would have been possible, but nightmareish, due to the curvature and odd angles of the switch connectors.
Here is the final version! Since its a pain to make the actual flex parts of the pcb in kicad, I tried to minimize unique flex connection types.
The inter-column connector design was refined over time, and it let me make sure I had the right number of interconnects between columns. Due to constraints in kicad in routing arcs, the actual flex had to be laid out and then converted to a pad footprint in the footprint editor. this means the flex tracks are represented as parts on the schematic, which is a little annoying because it makes the nets not work for DRC errors/net connections, as each pad can only have one anchor. It also made it a little irritating to change routing, because the actual footprint/schematic needed to be changed to make a routing change. On the other hand, I was guaranteed identical routing between all my interconnects.
There are a few little flex details that I threw in, which I hope help make the board more functional mechanically. As you can see above, the main flex parts were routed without overlapping copper to prevent the thicker copper (copper-kapton-copper standwich) from stiffening the flex. I also tried to add maximum radii on the parts that would flex.
Here you can see the bridge where traces go to the microcontroller. on this flex, there are a couple notches which should help define a board flex location.
Diodes were placed to minimize the stress on the solder joints by putting them perpendicular to the flex direction.
Well…its ordered. The rest of the keyboard parts are in hand, so I am hoping to have another keyboard in a few weeks, with a lot less wiring!
Dactyl builds seem to mostly be done by people who either know what clojure is (professional keyboard pokers), or at least people who are in the electron herding/plumbing industry. This means that there’s not a whole lot of build guides written by people who know to hate STLs with a burning passion, and who might actually want to use typical feature-based CAD (and not keyboard mashing) to edit their keeb to their liking. While there are many reports of being able to open openscad files in freecad, that did not work for me.
Fortunately joshreve used python to make a generator that can create a STEP, albeit one with a lot of self-intersecting and bad geometry that prevented solidworks from opening it on the first go. After a few hours of editing, I was able to knit up all the surfaces and make a solid body. But shoutout to joshreve-this work was critical!
I picked an extremely whacky keyboard to build, because why not? Worst case I get hooked on it, spend a lot of time making a keybord nobody else will use, and I have to build my own keyboard for the rest of my life. Best case, I make it and decide its awful and retreat blissfully into querty land.
Unlike most people who seem to tout the wonders of the manuform, I do a lot of CAD. CAD means you use a mouse, and you have to type a lot of numbers. I’d like to see what the manuform can bring to that- specifically, can I right-hand-mouse and left-hand-numpad? Would I like a layer for common shortcuts just for specific programs? Would it be cool to have a trackball built into my keyboard? I have questions that have not been answered by a cursory google search and so I will have to find out for myself.
What did I change?
As a mechanical-type engineer, I like things to fit together without having to drill extra holes or to hot glue in connectors. So it was important to get the case holes right, to prevent that. The micro however, will be taped (double sided) to the interior, since there will be no force on it from removing connectors etc.
I also moved the screw bosses to the inside of the case, since they will look better there. they are sized for M3 heat set inserts from McMaster.
Of course, there has to be some frivolous embellishment on it because it is both 3d printed and a keyboard. Instead of spending hours on this, I just threw some text on the “knuckles” of the keyboard. “PROTO–TYPER” seemed to be appropriate, as it is a prototype to see if I like split weirdo keyboards enough to keep using them.
There are better guides out there on this but overall it is straightforward to wire these keyboards and if done carefully, there is little danger of anything shorting out, and even if something is shorted, its easy to fix. If I were to do it again I would use enameled copper wire or fully stripped 28 ga wire and a wire wrap tool, with cut to size ptfe tubing as the insulator. I think this would be easier than carefully cutting 20 or so small wires per row. I will say that it took a surprisingly long time to solder this, even for someone who is fairly good at fiddly soldering.
Update: A Few Months Later
It took me a few months to button this project up, and in the mean time I have been using the keyboard. It is now my daily driver- for everything. Surprisingly I have been spending most of my time in kicad and altium instead of solidworks, but the time I have spent in all three programs has been pretty pleasant.
I think the most challenging thing will bet to remap all the important shortcuts to the left hand, and for those that cant be remapped, to make an application specific layer. For example, the ‘M’ key is really important for moving things in kicad- but its on the right hand. That means that to move stuff, one of my hands has to come off the mouse or the keyboard.
One thing that has been surprisingly nice is my navigation layer, which makes the left home keys arrow keys, and the right home keys the mouse directions. the thumb keys on the right side become left and right mouse clicks. I would say if I am not in a cad program, my hands stay on the keyboard, which is nice! The only issue is that its easy to get stuck in a layer (or my numkey layer) and not know that I am in that mode when I first sit down and start typing my password. some kind of indicator will need to be built into the next version.
I am planning on teaching some people to use kicad, since its my new favorite EDA tool. I searched high and low for a decent circuit that would do something cool, with a good variety (but small number) of parts. Basically something fun and not intimidating. I got hooked on formatc1702’s micro word clock. It is an excellent use of the atmega8 series unusually high current drive outputs.
The one catch was that I had a lot of trouble finding the GYXM-788ASR LED matrix called for in the bill of materials. Fortunately adafruit sells a similar 8×8 matrix from luckylight. I tried to design around this by including both footprints, but I ended up mostly making a mess (and I still couldn’t find the 788!). Both are common cathode but the row/column nomenclature is flipped. To formatc’s credit, they did a good job with the firmware. It was easy to find pindefs.h, which let me swap around pins until I was happy. My strategy was to create a test pattern and make sure it shows up where you want it on the matrix. This was much faster than tracing every signal and creating the right pin definition the first time.
The second catch was that after programming, I couldn’t get the time to change! After glossing over the code it seemed like this must have something to do with the RTC- and after some gentle probing/touching the board it would occasionally work. Initially I attributed this to the crystal not starting up, but after many power cycles and other pokes, it seemed like the crystal would actually run just fine. As a last resort I read the datasheet, and lo and behold, the Vbat pin needed to be grounded.
A blob of solder quickly remedied this deficiency in my pcb, and afterwards changing the time worked just fine. I suspect that sometimes the chip “just works” if that pad happens to be at the right potential on reset, but sometimes it doesn’t. The button presses update the RTC time, not a time on the micro. So if the RTC does not start up, then you can’t change the time.
I used the default footprints from kicad for a lot of the parts, and the pin 1 designators are a little wishy-washy. They look more like an printing error than a clear indicator for pin 1. I guess I will get used to it instead of re-creating every part from scratch, but if I only have a few parts, throwing a dot on the PCB would go a long way during assembly.
I should have also added a polarity marking on the power connector, and a couple of i2c test points wouldnt have hurt either. Since this was a quick board just for me and the parts are big, I didn’t worry about it.
Upgrades for V2
I figured if I was going to do this board again, I may as well overdo it. I managed to cram everything into a board roughly the same size as the matrix itself, even after I added a coin cell and a USB connector for 5V power. The coin cell will keep the RTC running for about 10 years, even if it loses usb power. This way I can program it, ship it to someone, and they can just plug it in and the RTC will know what time it is. The ground plane is far from perfect but its about as good as I will get with a board this size
Since the time will basically never need resetting, the switch for changing the time is very very small. I used the NanoT switch which is about the same size as an 0805, which is very very small indeed. And because programming is now a one-time affair, I moved the programming header to castellated vias/PTH on the edge of the board. They .1″ pitch so they should be easy to solder to headers if I cant scare up a pogo pin jig for them. For some reason the ground pad shows an air wire. The 5V is purposely left floating since I don’t care about that connection.
The git repo can be found here. Its probably not ready for prime time yet, but check the readme. I will update that when its reproducible.
As a scuba diver, I know that its only a matter of time until my gear looses the battle against corrosion and crud. Unlike most other sports, getting gear serviced is very frustrating- I have yet to find a place that can tell me exactly how long service will take and even for simple service, kits are often not in stock, or are a pain to get.
So this is a post about servicing my inflator valve, which has felt a little leaky. While I have not noticed any noises, it has felt like there is always a lot of air in the suit, even if I have not added any.
To be fair to sitec, they do make very reasonably priced kits available (from Europe), which contain a few orings, as well as a special clip that will almost certainly be broken when the valve is disassembled. They also do provide disassembly tools, if you want to buy them.
If I could get a kit for a reasonable price (from the US), I would have- however, I have a 3d printer and not a lot of patience, so I decided to fix it myself.
If you cant open it, you don’t own it…
Step one was to get the valve out. Whoever tightened it down really did a “good job”. To avoid waiting to get the special wrench from sitec to even find out if my valve was leaking, I printed my own. You can get the files here. These wrenches fit down over very small lugs on the inside and outside of the inflator valve.
Next, the BARE sticker was peeled off and the button underneath was unscrewed with a 2mm and 4mm hex key. This allowed the valve barrel to be removed and the orings inspected. Interestingly, the bottom one was nicked-possibly the source of the leaking.
I started my maintenance with taking my inflator valve apart. After measuring some orings, it seems like the two small orings in the valve itself can be replaced with -008 orings, the oring in the nipple is a -009 oring and the swivel oring is metric 19.5 ID x 3mm cross section. All are available on McMaster, and buna N should be sufficient. Basically for the same price as a single repair kit, I got about 50- aside from one crucial part- the clip.
I really cant explain why sitec chose to use a plastic clip to retain the outside of the valve to the inside of the valve. While it obviously works, there is no way to get it off without destroying it. Other folks have replaced it with C clips and spacers. I also bought said c clips, but I also modeled the clip and printed one on a pretty beefy multijet fusion printer.
It seems like it works fine! I have managed to stay completely dry while using it. There is no perceptible “wiggle” in the assembly, and it still rotates fine. If you want to make your own, the files for the clip (and the whole valve) are on grabcad.
There was some crusty stuff in the screw that holds the valve together. I imagine it is a sealant to keep water from leaking under the sticker, through the screw, and into the suit. To keep this sealed, I added a little aquaseal during reassembly.
Also, the sticker seems to have gone back on just fine- which is surprising, given that it was left off for several days.
My drysuit neck seal has always been about a 90% fit, which means that 100% of the time my suit floods. Sometimes a little, sometimes a lot! Considering the dropping air and water temps, I decided to do something about it.
Sending my drysuit out for repair was not a good option for me- its prime diving season here in the northeast, and the idea of sending any of my critical gear off for an unknown amount of time makes me sad. If I valued my own time, I don’t think I “saved money” by doing this install, but I certainly now know how I can fix my suit- and how long it will take. To me that is worth it.
Here are my notes- nothing special, and sadly not enough photos.
Material and Process
Sitec Quickneck ring
220 grit sandpaper
DRIS dry adhesive (heat activated sheet adhesive)
Gear-Aid Aquaseal-NEO (NEO. not normal aquaseal!)
First I had to remove the old seal. I heated mine up with a heat gun and it peeled right off. My original seal was on the outside, but this ring will be installed from the inside of the suit, as you can see above.
I needed to enlarge the neck hole ever so slightly on my suit. I started by stenciling the outside of the neck seal onto the inside of the suit. Then I very carefully trimmed the inside hole 2-3 mm at a time until the neck seal could fit through without any distortion of the fabric.
Once that was done, I sanded the area between the stenciled silver sharpie and the neck hole with 220 grit sandpaper, then wiped it with acetone with a lint free rag (aka used “procedure” face mask). Now that the fabric was roughed up, I put down three coats of aquaseal NEO to create a surface that the dry ahesive would stick to. According to DRIS, the sheet adhesive wont stick to some fabrics.
Prepping the ring went just about the same way- I trimmed the adhesive to the size of the ring. Then I sanded the ring with 220 grit, and wiped it with acetone. Then I heated the seal with the heat gun, and pressed it down onto the seal with a brayer/roller.
The photo is after the release liner was removed- you can see the milky white glue where it is cool and the clear glue where it is still hot.
To finalize the installation, I followed the same process of heating the ring and pressing it into the suit. This is fairly forgiving, but it pays to be patient and work you way around the seal.
Results + Recommendations
Two big thumbs up for the new neck ring. I am now dry all the time, and if I tear a seal I can quickly install a new one. More importantly, I now know how to patch my own drysuit, which means I don’t need to worry about sending it out for a few months if it gets a hole in it.
I would recommend this kind of work to anyone who has a drysuit who priorities deterministic execution of repairs over the great mystery of sending stuff out- however its not for the faint of heart since you do have to cut up your drystuit. If you do decide to do this take your time, and good luck!
With the I.D.I.O.T completed and with waterproofing tested in shallow and fairly deep (80 ft) water, it was time to go take it for a spin in “the deep”. The (purposely) sunken boat in Hathaways ponds seemed like the perfect place to go- there’s stuff to see, and places to swim.
The logistics of a “deep” oxygen rebreather dive were not as simple as one would hope. Since the counterlung is also used for buoyancy, it is not easy to accurately predict the volume needed (without prior experience). It is also hard to descend when you are several lbs positively buoyant. It was decided to descend on a buddies O/C and then breathe the normoxic gas from O/C into the counterlung to provide a reasonable PO2 at depth. This worked more or less perfectly, giving me a rough PO2 in the 1-1.4 range.
After completing a swim around the boat, we followed the line across the great murk of the pond to shallower waters (and lower PO2s). However, due to trying to attain neutral buoyancy some gas was exhaled, causing PO2 to increase when the loop was re-inflated. So we made a stop at the “deep” (30ft) platform to take on some more good normoxic air to bring the PO2 back down to oneish. I expected the loop to get a bit rich as I vented air and played with buoyancy on ascent.
From the deep platform we continued along the string to a shallow platform, the mirror, and eventually even found a nice (underwater) chair to sit in.
With the deep testing completed, we headed back to the beach and swapped gear so my buddy could check out the rebreather in shallow water.
Things seemed to be going well until my buddy got a taste of the ol caustic cocktail when he inverted slightly. This caused him to call the dive. Neither of us can figure out where the leak came from since on my dive there was only a little bit of water in the CL after 40 minutes. His flood was at least ~1L of water, which is a significant flood. This underscores the need for backup at all times when diving the rebreather, and this is obviously a reason why people don’t run around breathing off of a single AL6 all the time.
Blowing up my rebreather 😦 + performance notes
I’ll start with the exciting part- performance. I used about 800 PSI from my AL6, which is about 1.6 CF of oxygen for a ~45 minute dive. This was supplemented by 2-4 big breaths from O/C, which would be about the same volume. the dive profile was straightforward, straight down to 40′ and then a slow ascent to the surface.
I was overweighted with 25lbs with my 7mm hooded vest and 7mm wetsuit with booties. This caused my trim to be basically vertical, and the cl volume needed was essentially the whole counterlung. This is because there is no huge cylinder strapped to my back during the dive, so the belt and counterlung create a huge moment on my body. This means I have to swim to stay in trim, which makes for a bit of a frantic dive. Reducing overweighting would help, but really what I need is to move the weight up to my back. On previous dives with a ~2mm wetsuit I held a rock far out in front of my body, which gave the weight of the rock enough leverage to counter the small amount of weight I was wearing. With 25 lbs, it seems unlikely that I will be able to balance that out without moving the weight.
Blowing up the rebreather was much less extreme than it sounds. I tried to dewater the flooded rebreather by pressurizing the counterlung- what I forgot to do was to open the vent, so I just popped the counterlung. Not ideal! But it should just be a matter of buying another drybag and cutting some holes to replace the counterlung.
It was nice to finally give the I.D.I.O.T a real test and to on a really interesting dive. I hope to return someday soon with my own diluent addition!
Knowing your PO2 goes a long way towards making it safer to go deeper with an oxygen rebreather. If you want to go pure O2, it can be used to monitor how purged the loop is, and if you want to go a little deeper it can basically turn an O2 rig into a sort of mixed gas rebreather (or a full mixed gas rebreather with proper diluent addition).
In order to conveniently know my PO2, I have purchased O2 sensors. Having built in temperature compensation and having reliable manufacturing seems like a big plus vs fabricating, assembling, testing, QCing and calibrating my own.
For my first iteration I have started with just two cells. A third would be easy to add if this works out.
Layout and Logic
The electronics are going to be split into three parts- the cells/stuff in the counterlung, an electronics box, and a display. I decided that the only things in the counterlung should be the sensors themselves and a connector.
The “Electronics Box” will house the brains of the operation (an ESP32), and the battery. Batteries and other flammables will be kept outside of the oxygen rich environment of the rebreather, for obvious reasons. In the unlikely event of the battery shorting to the cells, hopefully the high impedance of the cells will limit resistive heating or fire. In the future, a USB port with a cap will be wired in for charging.
This box has been tested to ~80 FSW with just the cord grips+cord installed, and it passed without noticeable leaking. The cord grips are MSM-M SKINTOP connectors. They don’t seem like the should work, and yet they do. Mcmaster sells these as “submersible cord grips”. N.B. they make a face seal with the enclosure, and do not require a gland like an SAE o ring boss (ORB) fitting.
The main oring seal is a 1.5mm oring made from cord stock and superglued at the ends. You can see the join just above the middle heat set insert in this photo. Surprisingly this does not seem to create any significant leak paths, although there is always a slight possibility that I will have to eat my words on that someday.
The display will be upgraded to a HUD at some point, but for now it will be wrist mounted. It displays two PO2 cell readings, a compass heading, and (in the future) the depth. As you can see in the photo, the top row is “highlighted” to show a problem- the cells are disconnected and are reading a very high PO2.
Reading an off the shelf galvanic O2 cell is dead easy, since the temperature compensation and shunt resistor are built in. However, the output voltage is fairly low, and so it should not be fed directly into the ADC of a typical micro. It is possible to read such a voltage (~20mV), but it wastes a good portion of the resolution of the ADC.
For example, the maximum output expected is 2V (representing a PO2 of 2). With a 5v ADC, we are only ever using 2/3 of the range of the ADC, which effectively limits our resolution of PO2s to 2/3 the resolution of the ADC.
Since these signals are also not amplified or buffered in any way, it seems good to keep them away from the mcu. I have resolved to put them on an I2C DAC with an internal gain stage, which will let me both maximize resolution and keep the signal wires for the cells short. To this end, I used an ADS1015 breakout from adafruit.
Since it was on hand, I also threw in an LSM303 to use as an electronic compass. Since the compass has no “inertia” it has kind of jumpy readings, but doing some smoothing should help to get it to be a little less jittery. I could also try some compensation for nearby electronics, but they seem to have little effect. The LSM accelerometer/magnetometer lives in the wrist piece, although I did consider mounting it in the “head”, which would show you body heading, but not necessarily what you are looking at.
The display is the 128×64 OLED featherwing. Its easy to integrate, and it is fairly compact in terms of “extra space” for unused headers/buttons.
I headed to the mystical mystic lake to do some testing. The combination of near zero visibility to start with and a haze of sediment/algae/stuff I don’t want to think about made for a more-or-less night dive like conditions, even with a light, during the day. However, the little O2 cell reader and compass seemed to behave relatively well. Most importantly the firmware did not crash, and no water seemed to get in. Cant wait to test it somewhere actually fun!
In the last post I alluded to a larger pressure pot- the Science Sr. This was totally based off of the $50 Cell Checker from the wreckless diver, which is based off of a now defunct post on some other website. I’ll do my best to document what I have made here, since its an awesome tool. I’ll put a standard disclaimer on building one of these- don’t do it, it could blowup, etc, and it could really kill you, and it might hurt the entire time.
Why this could be a bad idea
The Science Sr. is based around an air filter canister. These are rated to 125 PSI…with water. they are 100% not for use with air as far as I can tell. Air, unlike water, is fairly compressible. That means if the amount of energy stored in pressurized air is huge compared to a hydraulic system at the same pressure. Filling this to 125 PSI might be fine, or it could explode due to some component being exposed to chemicals or because it has been cycled too many times or because it has been cycled too rapidly. Plastic will fatigue over time, and that will reduce the margin between exploding and not exploding.
Just like the wreckless diver, I have added an over pressure relief valve (OPV) to prevent going over ~45 PSI or so. This is not a guarantee that it will not go over 45 PSI- I have it hooked up to a scuba reg with an IP of ~120 PSI that can provide something like 100 SCFM (cubic feet/min of gas at some standard temp and pressure). That is fast enough to drain a typical AL80 scuba tank from 3000 PSI to 0 in under a minute. There is no guarantee that the OPV can keep up with this flow rate, so I am VERY careful operating the valve.
Also, in some kind of blue-moon case where my first stage reg goes haywire, its designed to fail open. This would be bad news because this will shoot tank pressure right out of all the low pressure hoses. In a dive situation this is great, because you have ~30s to breathe off a free flowing reg. In a pressure test situation this is bad, because up to 3000 psi (more for some tanks) will be shooting out of every reg and inflator hose, including the one stuck to the pressure tester, which will almost certainly explode it.
This was mitigated somewhat by testing with a mostly empty (500 PSI) tank, and by very careful control of the valve. For cell checking applications, it may be a good idea to fill this with water partially to reduce the amount of volume that is full of air, reducing the potential energy. Anyway, on to how to build it.
Science Sr. Construction
Here it is, in all its glory. On the top is basically a X manifold that houses all the important stuff. At 12 oclock is a NPT to BC hose adapter going into a ball valve. At 3 oclock is an 1/4-MPT to 1/8-FPT adapter and a 1/8 NPT pressure sensor. These are available on ebay and seem to work just fine. It seems like they are for some kind of automotive application based on the connectors, and they are available in a variety of ranges. At 6 oclock is a 1/4-MPT – 14-MPT adapter. This attaches the female pipe thread cross fitting to the female pipe thread of the canister head. At 9 oclock is a 1/4-MPT 45 PSI overpressure valve.
On the other end is a 1/4″ MPT- 1/8″ FPT adapter. The threads on the filter are one-time-use soft plastic NPTs, so I essentially “replaced” them with a metal 1/8″ npt. Screwed into this is a 1/8 MPT to hose barb adapter with a bunch of wires epoxied to it, creating an airtight pass through. I like the 60 second epoxies that have narrow mixing nozzles for this, because they cure FAST and the nozzle fits into the fitting well. However, they are expensive and usually only come with two nozzles, which is wasteful if you only use a few ml per fitting. Silicone seems to work ok for this, but its probably best to apply with some kind of syringe. While none of these fittings have shot out the epoxy/silicone plug yet, it is probably best to get as much plug in as possible, especially on the inside of the plug. This should create a step in the plug to make it much stronger.
It is important to install this on the side labeled IN, since there is a large pass through there, and the wires will be much easier to pull into the canister body (see the assembly picture above).
*I had these on hand but this mcmaster part should be equivalent
Testing and Results
After some initial testing, it seemed like I would need to return to the teflon tape as a membrane to get good sensor response. I suspect this will let electrolyte evaporate out over time (based on previous experience), but it does give a very satisfactory response time, and over short periods the sensor is serviceable enough. It was necessary to make the sensor up in the electrolyte to eliminate bubbles. This meant pouring the eletrolyte into a dish and then wearing gloves to assemble the sensor “underwater”. Excess KOH was washed off.
As a note- for this exact size of sensor, a ~510 ohm resistor seemed “right”. More discussion of that below.
Here is an example of the step response to pressure. With the ball valve, its a little nerve wracking to throw it fully open, and I wasnt keen on testing the opv, so the pressure step here actually has a rise time of ~250 ms. The rise time of the sensor is about the same- It does not seem like this step is fast enough to elicit any kind of delay in the sensor. The pressure here goes from 1 ATM to 1.5 ATM, and the sensor rises from ~220 mV to 325 mV, which is what we would expect.
The next test was to wrap the sensor up in a bag with the inflator hose, and to shoot O2 straight into it. This should give a value for 100% O2 at 1 ATA.
I wasnt sure how much O2 to squeeze in there or where it was really saturating, so there is a little bump in the middle as I jostled the sensor. But after spewing out a good amount of gas, it looks like the maximum value is 500mV. This is an interesting result and shows that the sensor is actually no good up to 100% O2. If the sensor were linear, the resulting voltage should be 5x atmospheric what it is in normal “air” which is ~20% O2. That would be 1V, which it does not achieve. I believe this means the cell is current limited.
Here is the other end of that test- me tearing the bag to introduce normal air back in. From the initial jostle at 10s, it looks like it takes about ~1 min for the O2 to go back to normal levels. This is not representative of sensor performance because the gas actually has to get agitated for the O2 to go anywhere. In other words, it does not purely measure sensor response, but also incorporates the gas diffusing/getting blown away.
This is a plot of pressure (Y) vs sensor value (X). To produce this, the chamber was cycled several times from 1 ATA (.5V) to 2 ATA (1V). Cursors represent the starting point, and where the sensor “should go” at 1 ATA. Doubling pressure should double sensor value from 190 mV t 380 mV, and that is almost exactly what the line shows. Doubling the pressure represents going from a PO2 of .2 to .4. The voltage is below the 500 mV that the sensor saturates at, so it comes out beautifully linear.
Since the sensor was cycled several times, we can detect some other interesting sensor characteristics, namely a small amount of hysteresis and non-linearity. The cursor generally tracks on the right side on the way “up” in PO2/pressure, an tracks on the left as PO2 drops. This means a sensor will read slightly differently after it has been exposed to higher pressure- it has “memory”. The maximum value of this is almost 50mV!
There is also straight up non-linearity, as the shape of the curve is not straight. However, this seems to be fairly small.
Here is another hysteresis example, with the rise and fall done as slowly as possible. This should give an idea of the minimum hysteresis.
Here is an example of a slow and a fast pressurization and depressurization. I couldn’t color the two differently, but it is easy to see that the rightmost trace (which was a pressure drop) looks quite different- it drops to 0 pressure then moves tot the left to drop the voltage.
Current Limit/Resistor Size
I mentioned above that I used a 510 ohm resistor as a current shunt, and that the cell is current limiting. O2 cells, while read out in mV, are actually current-producing devices. Typically this is measured by putting a shunt resistor across the cell, and measuring the voltage. With low resistances, this produces a small voltage drop which can be difficult to measure. Higher resistances produce higher voltages- but you can only go so high! This is because the cell can only tolerate so much voltage across the cell*, and can only generate so much current. Therefore it is a balancing act to find an appropriate resistance to use- too small and readings get jumpy, too big and the cell wont change value at all, since it will be current limited.
*I am admittedly fuzzy on this but you probably do not want to get close to the open circuit voltage of the cell, which is 1.2v
Building a galvanic O2 sensor is possible and actually fairly easy. I suspect even the polarigraphic sensor would have been fine if capped in electrolyte, and if it did not leak. The sensors can obviously be tuned to give good responses, as this is exactly the same way that commercial O2 sensors work. However, building a really good sensor that could be used for diving, where the sensor is monitoring life support, requires a lot of sensor characterization which is way beyond what I want to do. There’s a lot more to an O2 cell than just getting it to spit out a voltage proportional to the O2 concentration- for example:
shelf life/storage condition determination
repeatable assembly/manufacturing processes
Any one of these could take a month (or longer) to do, and they would require a lot of units. I will stick to commercial O2 cells for now (and in the future), but now that I have a cell checker/pressure pot it should be interesting to compare a “real” cell to home made!
After a maddening time with polarigraphic sensor, I decided I would try to build the galvanic flavor of oxygen sensor. After reading this tech tip from Oakton Instruments, it seemed pretty obvious that galvanic cells have big advantages. The main draw for me was that the output was easy to measure, eliminating the need for the fancy DMM. This would also simplify the electronics needed for reading polargraphic cell.
Electronics Comparison- Galvanic vs Polarographic
Here is what I think would be needed to read a polargraphic cell- a precision buck or LDO to bias the cell, with a feedback pin at the top of the cell. This eliminates the burden voltage of the shunt resistor that is fed into some kind of stack of op amps that then produce a voltage on the other side. This might not be so bad, and given that we have a 0 drop shunt resistor, we no longer need to worry about having a tiny burden voltage.
For a galvanic sensor, its pretty much as simple as it can be- a single resistor and a high impedance amplifier to match the voltage output range to the desired ADC.
The first galvanic sensor I made just replaced the silver electrode with a zinc electrode. Platinum or gold (or likely any noble metal) makes a good anode for this system. Zinc, in contrast to silver or platinum, is a very, very agreeable metal to machine. I can easily take a millimeter or more off at a 25mm diameter. The rod I got from rotometals appeared to be cast, although without any apparent porosity after ~2mm into the diameter. The one offputting thing is that zinc fumes are toxic, and the melting point is alarmingly low~ 400C. So all the operations were done with a lot of coolant, and the soldering to the electrodes was done very gently to prevent or minimize any zinc vapors.
As you can tell from me stating that there was a first sensor, there is also a second sensor. The first sensor seemed to have the same drift problem as the polarigraphic sensor, which makes me suspect that the root cause of both sensors drifting is electrolyte loss through the membrane or leaking at the press fit of the metal to the delrin. I also wanted to increase the area of the zinc so that the electrode and the volume of the electrolyte. More zinc will alleviate any concerns about using up the electrode, and more electrolyte will reduce the impact of loosing small amounts of fluid, or bubbles. This is because each bubble or amount of lost fluid will be small compared to the sensor, since it is bigger.
Much like the polargraphic sensor, it kind of works. It certainly can detect a change in the level of oxygen, but it does it in kind of a non linear way. For example, I would expect that if 20% air is ~300mV, pure O2 should be 5x that, or 1500mV. It is possible that the cell just cant generate that much current, and that I should try a smaller resistor, but I certainly have not verified that yet.
With the improved sensor body, the sensor was also a lot more stable. It dropped a few mv over a fw hours, and its hard to know if that was related to temperature, drift, or the actual O2 concentration in the room. However, this stability was achieved over ~30 minutes as the sensor reached equilibrium. Likely the O2 in the bubbles in the electrolyte needed to be used up first, as they are in direct contact with the electrolyte. I suspect that after that happened, the sensor reached equilibrium with gas diffusing across the membrane and stopped sensing O2 trapped in the sensor.
On the other hand, it does seem very sensitive. Breathing on the sensor produces a small dip, and there is a noticeable difference in value (~30mV) from when I sit right in front of it and breathe on it vs when I leave the room- this is mostly anecdotal but interesting.
The linearity is not very good, as you can see. This is a plot of the pressure transducer vs the sensed voltage. Its all over the place, but is vaguely the right shape. Ideally the sensor should trace a straight line here, but there may be some hysteresis that causes non-linearity.
Unfortunately, just like with the step response, the change here should be much bigger. This test pressurized the sensor from 1 bar to roughly 6 bar- the reading should be about 6x as big, but it only went up a few mv! So this is not that impressive, as it shows either a non-linear sensor or some kind of enormous DC offset.
The last issue seems to be that the sensor leaks somehow. It may be that water vapor is permeating the membrane, because when left overnight the sensor dried out. In a humid environment like a rebreather this may not be a issue, but for storage it certainly is. This answers a question I have had for a while- why are rebreather sensors so slow? They are rated to a rise time of 6s to get to 90% of the final value. This is much slower than any of the sensors that I have seen, and does not seem to be an inherent characteristic of the sensor. My suspicion is that a much thicker membrane is used on rebreather sensors to reduce electrolyte water loss.
This sensor seems a lot easier to use, but it seems like a lot of the issues I have noticed may be due to my membrane selection and leaking. I have parts on order for a larger pressure pot (the under $50 cell checker) to see if I can get the larger sensor to behave in a linear way with a polyethylene or FEP (or even teflon tape) membrane. I think this cell checker will be very useful for a number of other things like depth gauges/computers/ingress testing so I am excited to have it on hand. I will have to make an effort to keep my pressure pot electrolyte free this time!