Unconventional electrolysis

  • Interesting; definitely worth making sure if it's just radio noise.

    Yes' I'm pretty sure. In the test just done I put a battery-powered GMC directly behind the cell, and it showed nothing above background, while the pancake detector in front of the cell showed about 5x background. So the first thing I need to check is grounding problems in the DAQ system.

    For this test I added 150 ml of deionized water to the cell. The arc in water is still bright blue, with none of the yellowish color seen in tests with HCl. What is interesting is that the waveform at the electrodes was substantially changed by the addition of water. Most of the time it looked like transient2 below. But occasionally something different happened - see transient3a.

    I took a close look at that one with the scope's analysis tools. The anode voltage initially went up to 524 volts with the characteristic curve seen in transient2. Then it abruptly dropped to negative 242 volts in just 36 nsec. Based on the traces in transient2b and c, that's a slope of -21kV/usec, extremely fast. It would be very hard to do this with a semiconductor switch, and it's not surprising that it can generate lots of RF. By integrating the area under the rising part of the curve and estimating the inductance of the coil, it might be possible to calculate the energy involved in this event.

    There's still a tendency of the electrodes to stick together, not surprising given that the clacker resembles a spot welder. Maybe some electrolytic pre-treatment would build up a layer of oxide enough to inhibit this tendency. So that will be my next step on Monday.

  • magicsound

    I haven't performed any particular calculation yet, but attached are the digitized versions of Transient2 and Transient3a.

    Good to have narrowed down the issue purely to a RF noise issue; so far I haven't had any. Arc discharges produced by rapidly putting in contact the electrodes in deionized water will likely be more intense on average than under typical conditions during the experiments with electrodeposition-short circuits in an acidic solution.

    At this point your latest test seems more similar to the contact-arc tests that I used to do quite some time ago or to Parkhomov's Woodpecker device.

    In that case:

    • Using graphite electrodes will prevent or strongly mitigate (depending on the impurities present) sticking issues;
    • A strong magnet strategically placed in proximity of the moving electrode might be able to pull it back when the electrode makes conduction with the other, producing a strong magnetic field due to the large currents involved;
    • As the water will become more conductive over time you might notice a decrease in discharge intensity.

    It might be interesting knowing if by increasing voltage the frequency of the RF signal increases and viceversa.

  • At this point your latest test seems more similar to the contact-arc tests that I used to do quite some time ago or to Parkhomov's Woodpecker device.

    I did think of the Woodpecker along the way, but my primary goal was (and remains) investigation of what's happening with your device. The important implication of what I saw is that there are apparently two distinct modes of wet arc discharge. Transient2 looks like a fairly long-lived contact event where most of the energy stored in the inductor is carried off through a relatively long (millisecond?) metal-to-metal connection.

    The transient3 form suggests rather large current density, far greater than a sub-mm2 contact could sustain. One other curious fact: the ringing seen in my earlier test is absent from both these wet discharge modes. Water has a dielectric constant of 80, so self-capacitance of the electrodes could become a factor at these short time scales.

  • magicsound

    A probably obvious observation could be that the shorter mode arises when the previous contact-arc events leave thin protrusions that can't support large amounts of current in the next one, which would make it interesting to check the behavior when a large amount of fine particles are present/put in the contact area, while still using distilled/deionized water. This might be easier to test by constraining the active volume with a test tube (e.g. immersed in the jar) rather than using the entire jar.

    I wonder if the ringing being present only under dry conditions is somehow related with me hearing the resonant acoustic noise more easily when the electrodes are only partially immersed in the solution or just wetted with the acidic electrolyte. However, so far my AM radio seemed to pick up resonant RF noise only when the electrodes are partially immersed in water, even if a similar noise could be heard acoustically outside of it. (possibly this could be related with broadband noise overpowering the resonant noise on the AM radio under those conditions; it's not exactly a precision instrument).

    EDIT: by the way, from the previously linked video. Left: water at the beginning of the video; right: water 10 minutes into the test.

    EDIT2: probably worth noting that last time during the test with HCl the discharges produced at about the end of the run seemed much brighter although the ones produced here during the contact discharge tests in both air and under water appear to have had a higher temperature (more white-blue).

  • magicsound

    That looks great. Is the clacker going to run continuously as shown or only at an "as-needed" basis to adjust the gap?

    If including the audio spectrum from the AM radio in realtime is too much taxing for your PC, adding its audio to the stream, if you do not wish to record environmental noises from your lab, could be a great addition.

    If you decide to take it slowly for this run and add only a bit of HCl at a time, as electrolysis progresses and the gap gets progressively shorter due to the deposited material, you might at some point start observing broadband AM radio noise even though the electrodes aren't really shorting (perhaps they are on a micro scale?).

  • Great work on the clacker. It seems to be fast enough to generate repeatable experiments while clearing momentary shorts. The piezo actuator I suggested might be used to increase the repetition rate, but that could be a future enhancement if it seems worthwhile.

    Regarding your earlier question:

    First test results with the cell empty of liquid. With the inductor steel core removed, peak-to-peak voltage of 538 volts is seen, with resonant ringing at 5.8 MHz. With the core inserted, the peak voltage is slightly lower and the ringing frequency is higher, at 6.4 MHz and is more quickly damped. This is counter-intuitive, as higher inductance should result in lower frequency.

    The oscillation frequency depends on both L and C. If modeled as lumped L and C , F = 1(2*pi*sqrt(LC). When you add a core, it increases both L and C, which should decrease the frequency as you say. The way I think of it, is that when the clacker opens, you have an energized un-terminated transmission line where the propagation delay determines the transmission time and hence the resonant frequency. You can also think of it as an antenna that resonates at at frequency of about 6 MHz.

    At 5.8 MHz, a quarter wave antenna would be 40.3 ft (484 in).

    At 6.4 MHz, a quarter wave antenna would be 36.6 ft (439 in).

    The electrical length would include the leads to the anode/cathode, the wire in the inductor, the wire to the supply, and the internal wiring inside the supply. Could any of that have changed between tests? Could some windings have shorted out when the core was inserted? I doubt that the core had a very large effect on the inductance without a closed magnetic path and something else must have changed in the other direction.

    If you do not have an LCR meter, you could measure the inductance easily with your scope. Temporarily put a resistor across the inductor (say 100 ohms). Then run the clacker outside of the electrolyte and record the voltage waveform across the parallel LR. The clacker shorts to charge the inductor, then opens and the inductor is discharged through the resistor. Measure the transition time for one time constant (63% drop in voltage). Then L = t/R. If you measure inductance with and without the core, it would help to understand the mystery. That would also help us build an accurate SPICE model of the experiment. While you are at it, measure L with a steel C-clamp clamped between the ends of the bolt to provide a low reluctance magnetic path. That should result in a big increase in inductance.

    (Another way to measure the inductance is to use your signal generator to drive a square wave to the inductor through its internal 50 ohm source impedance.)

  • magicsound

    If the clacker electrode assembly is still running without electrolyte (though I assumed that it would have been added shortly after the last video was posted), have you noticed any change in how often the higher di/dt pulses occur as more of the electrode material gets suspended in the aqueous solution?

  • If the clacker electrode assembly is still running without electrolyte (though I assumed that it would have been added shortly after the last video was posted), have you noticed any change in how often the higher di/dt pulses occur as more of the electrode material gets suspended in the aqueous solution?

    I had other business commitments, so the cell was just resting (rusting) today. I don't want to run it unattended yet, but will give it some exercise tomorrow.

    I've given some thought to quantifying the dynamic waveform behavior, and I think the scope I have can be controlled over GPIB to automate sequential recording of sampled waveforms. That seems like a fairly time-consuming programming chore to me, but it's possible. The result would be a body of time-stamped binary or ASCII sample sets, one for each detected event. Latency of the sampling process would probably mean missing some transients, but a sufficiently long sampling run would give a pretty good estimate of the relative distribution of event types.

    In case someone might want to take on this task, the API for the TDS3054 is available at https://download.tek.com/manual/071038103web.pdf

    The code can be written in Python and run on my Labjack PyCharm platform. The NI GPIB hardware interface looks like a USB port to the host computer, and it is recognized by the TekVISA port driver. A Python lib for TekVISA GPIB is available at https://pyvisa.readthedocs.io/en/stable/

  • magicsound

    It looks like I needed the following libraries installed through Python PIP:

    • PyVISA (1.9.1)
    • PyVISA-py (0.3.1)

    The PyVISA library looks simple, but I have no idea if the commands suggested in the API manual for the oscilloscope will work as intended.

    If leaving any setting on the oscilloscope unchanged through the programming interface retrieves the last displayed waveform on the instrument, the code for configuring the oscilloscope data transfer and saving one waveform could be something like this:

    The waveforms can be up to 10000 data points long and each datapoint is at least 9 bits long. For full precision 17 bits/data point might be required, therefore up to 170000 bits in total for a complete waveform. At a typical maximum USB-serial transfer speed of 115200 bps, saving every complete waveform will require at least 1.5 seconds.

  • can Thanks for fully commenting your code prototype, it's really helpful and how it should be done though seldom is in the hacking world!

    At a typical maximum USB-serial transfer speed of 115200 bps, saving every complete waveform will require at least 1.5 seconds.

    It might be a bit faster than that. The USB 2 spec is around 100 mbps, and 30 mbps is what users typically get. The effective GPIB data rate is around 5 mbps though NI claims more for their hardware,

    It's also worth considering whether 1-byte sampling (255 values), slower sampling clock and a lower sample count would be sufficient to extract the waveform type from the data. The sample transfer overhead might thus be reduced by an order of magnitude.

    Additional code would be needed to re-arm the scope trigger after extracting the data for each detection, but that is trivial time-wise. The majority of the scope settings like vertical and horizontal scale and trigger level would be set manually and need not be changed during the test run.

  • magicsound

    I assumed that the oscilloscope transferred data via RS-232 port to/from the PC, but I see from the instruction manual (1-8 and 1-18) that indeed faster communication options are available. In that case, the quoted data rate of 200 kB/s for the GPIB interface should be fast enough, especially if it's not necessary to transfer the entire waveform.

    At an excessively fast download rate though an enormous number of files would be generated in a relatively short amount of time, which might turn out to be inconvenient to handle and process. A different method might be required, like for example appending incoming waveforms to a single file as rows of data (but if in CSV format after appropriate conversion, some spreadsheets programs might have issues with the number of columns. The limit is 1024 columns on Libreoffice and 16000+ columns on Excel).

    As for other parameters, I considered asking in the previous comment since I don't have experience with how these digital oscilloscopes are usually operated. If re-arming signal triggering is needed after each data extraction it should only be a matter of adding such commands in the last commented code block, which would have to be nested into a loop of some sort, perhaps even something as simple as a "while True:".

    EDIT: in the previously posted code I save the raw data to a binary file as it comes from the interface, but ideally it would be processed into a more easily readable format first. It's not clear if it will work as it is as endianness and data type will probably have to set in the PyVISA instruction used for retrieving the data; it would have to be tested.



    The format at 2 bytes/values should be 'h' ("short" or "int16").

    EDIT2: at the very least the line for retrieving the data should probably be changed to this (I've changed it in the previously posted code as of writing):

    1. inst.query_binary_values('CURVe?', datatype='h', is_big_endian=True)

    EDIT3: the saving to file part needs to be done differently as it won't work as it is. The query_binary_values instruction returns a Python list according to the PyVISA documentation: https://pyvisa.readthedocs.io/…ument.query_binary_values

    EDIT4: updated the file writing part to something which has higher chances to work (can't fully test here).

    Sample output with dummy data (up to 10000 columns might be used in practice):

    1. 2019-01-23T21:15:50.517752,43,21,65,36,25
    2. 2019-01-23T21:16:25.399726,36,12,85,33,22
    3. 2019-01-23T21:19:07.463289,46,12,34,33,12
    4. 2019-01-23T21:19:19.347256,38,12,12,33,62
    5. 2019-01-23T21:19:27.350134,33,12,54,33,22
  • Let's work back from the goal that started this sub-thread. We want to classify each detected transient into one of two types, based on a negative di/dt value above or below a certain threshold. So the data only needs to be sufficiently finee to make that distinction with some accuracy. And if this can be done in real-time, we don't actually need to store the complete data set, just increment the appropriate counter for each transient. The data would still have to be transferred to the host and some math done on it relatively quickly.

  • magicsound

    It could probably be done in real time at a high speed using the NumPy library.

    Perhaps one could simply compute the difference of the list of values with the same shifted by one position and store the maximum absolute value of the resulting array.


    With this change in the code:

    1. # Convert the Python list of values into a NumPy array
    2. np_values = numpy.array(values)
    3. # Retrieve the maximum absolute dy value
    4. max_dy = numpy.absolute(numpy.diff(np_values)).max()
    5. ...
    6. # Write in a single row a human readable UTC ISO timestamp and the maximum dy
    7. csvwriter.writerow([datetime.datetime.utcnow().isoformat(), max_dy])

    With the waveforms I previously digitized from the screenshots provided I get 25.91 for Transient2 and 441.32 for Transient3a. However this would have to be tested with actual data from the oscilloscope.

    EDIT: or it could also be done perhaps more straightforwardly:

    1. n = 1
    2. max_dy = numpy.absolute(np_values[n:] - np_values[:-n]).max()

    With n=1 it gives the same result as the previously linked NumPy diff function with the default settings.

    EDIT2: I previously wrote "dx" but meant "dy", i.e. voltage.

  • can That is very encouraging. I would look at only negative di/dt, to eliminate possible false positives {:>~

    Try truncating the digitized data from the images to 8-bit values, and check whether the max() function in your second example still gives a clear typing signal.

    During testing, the high-res image would still be stored in the scope for comparison. False positives can also be identified by such single-step testing. If poor accuracy is seen with the simpler code, try other integer values of n.

    Do we know the underlying mechanism of numpy.diff. Specifically does it derive slope by averaging over multiple samples, or is it merely a step function like your second example?

  • magicsound

    Reading the programming manual, the 8/16 bit selection does not appear to affect the maximum value voltage that can be read, but only the resolution. The maximum output value for each selection is respectively 256 and 65536, and what these actually mean depends on a so-called vertical scale factor (in volts/unit) that can be configured.

    (EDIT: on a less quick-ish read it's not clear though if this is just for data to be transferred to the oscilloscope. It could be that the scale factor for retrieved data changes dynamically, which means that it would have to be read and taken into account when saving/processing the data. This too would have to be tested in practice)



    The set form of this command sets the vertical scale factor of the reference waveform specified by the DATa:DESTination command, expressed in YUNits per waveform data point level. For 1 byte waveform data, there are 256 data point levels; for 2 byte waveform data there are 65536 data point levels. Note that for a given waveform record, both YMUlt and YZEro have to be a consistent set; otherwise vertical cursor readouts and vertical measurements may give incorrect results.

    The query form returns the vertical scale factor of the waveform specified by the DATa:SOUrce command, if that waveform is on or displayed. If that waveform is not on or displayed, the query fails and the oscilloscope generates an execution error with event code 2244 (waveform requested is not on).

    To look only at the negative di/dt it could be possible to just use the min() function.

    1. max_dy = numpy.diff(np_values).min()

    With this I get -25.91 and -441.32 for the previous waveforms. One could just take the absolute value of this to remove the negative sign.

    The numpy.diff function does not perform averaging. This also accepts an optional n value. With n=1 (default, can be omitted) it works as in the second example, but with higher values of it performs the difference recursively. With n=2 it's equivalent to numpy.diff(numpy.diff(array)); with n=3 as numpy.diff(numpy.diff(numpy.diff(array))) and so on. Higher values appear to have the effect of making changes more pronounced. Below are some examples.

    Original signals

    diff (n=1)

    diff (n=2)

    diff (n=3)

    diff (n=4)

  • magicsound

    Unrelated with the ongoing Python discussion, but by placing a permanent magnet on the nonimmersed portion of one or both ferromagnetic steel electrodes, the particles ablated or formed in the process (e.g. by decomposition of the iron chloride, if HCl will be added, etc) should become attracted to the electrode(s) and more likely be retained inside the gap. While this should in turn make it more likely for electric discharges/short circuit to occur through the particles, it could interfere with the clacker mechanism that you set up, depending on the strength of the magnets. It might also be interesting to check out if this has any significant effect on the oscilloscope readings.

    Have you got any to try? A weak magnet might be sufficient to be helpful on the former aspect. If it won't work, it could still be useful to have magnets placed outside the jar to check out the effect of an external static magnetic field on the observed reactions, since it's been suggested that it can promote the anomalous/unusual processes that are supposed to happen.

    The resonant noise I showed in some of the previously posted videos doesn't require permanent magnets to occur, though.

  • can It's clear from your examples that diff (n=1) is the preferred configuration for the type detection.

    Regarding the magnet, I have some Nd buttons that will work nicely for this test. I put one on the upper part of the cathode (the movable bar)

    One other comment: the amplitude of the clacker motion is controllable, as well as the frequency. Thus it can be used to induce contact in a controlled way once a layer of corrosion builds up between the electrodes.

    I initially added 4 ml of HCl to the cell, based on the previous cell. I turned the electrolysis power on, and found the current immediately went to 15 amperes, far too much for continuous operation. I diluted the electrolyte about 10:1 until a current of under 3 amperes was obtained. It's worth noting that the cell seems more sensitive to electrolyte pH with mild steel electrodes rather than SS.

    The clacker will be left off for now. With the gap set at about 2 mm, I don't expect any contact to occur until I activate the driver, after time TBD.

    Update 1: After just 10 minutes, the electrolyte has turned opaque black and the current is up over 6 amperes. Should I dilute the electrolyte more?

  • magicsound

    For what it's worth, in my early tests I found the response to HCl to be very sensitive after a period of electrolysis (hours-long) with no electrolyte and possibly deliberately after injecting air into the water (I haven't confirmed this), while it would take significantly more amounts of HCl to cause observable changes with new distilled water and cleaned electrodes (as I typically did in later tests where I tried to simplify the process for reproducing the resonating noise). There could have been a similar effect at play since you've applied electrolysis and left the cell rest unpowered for a while (I'm assuming).

    Putting aside the metal particles previously dissolved/suspended in it, deionized water exposed to the air will slowly absorb CO2 and its pH slowly decrease to about 5.5 :

    I have 5.5x3.0mm Nd buttons too and a possible tip if you haven't done so already could also be piling them on top of each other to increase their strength. Not really related, but you can try testing how they can easily affect the orientation of the larger iron particles suspended in the solution also from considerable distances.

    Is clacker motion also fully programmable so that it can be varied depending on external dynamically changing variables? (current, etc)