Stijn Coenen

Most commented posts

  1. Resistor Decade Box — 15 comments
  2. Desoldering Station — 12 comments
  3. 3D Printer UV Curing Device — 6 comments
  4. Audio Spectrum Analyzer — 4 comments
  5. ESR-Meter – Update — 4 comments

Author's posts

Weller TCPS Power Supply

For a TCPS soldering iron that was in a auction some time ago I wanted to make a power supply. In my parts collection I had a spare Weller transformer that was perfect for this. For the enclosure I used an enclosure of a 230->110V transformer that I also got very cheap at an auction some time ago. The front panel is 3D printed. To store the soldering iron and the tips I also 3D printed a drawer that is mounted underneath the power supply.

 

Radio flea market Diest 2024 (Dirage)

Today I went to the radio market in Diest.

What I bought:

240GB SSD
2 tubes of SMD connectors
1 tube relay
2 tubes of potentiometers

Dual Lab Power Supply 0-48V 0-3A DC

Although having made more than enough power supply’s, there where still some boards in my storage that I bought from a fund raiser at Circuits Online. These are a dual 0-34V 2,5A PSU with tracking. It would be a waste to have the boards and not build them.

(Above pictures are from CircuitsOnline because I forgot to take pictures myself)

As with the previous PSU build kit (Lab Power Supply 0-70V 0-3A) I was not completely happy with the specs (/wanted to make it more of a challenge) and decided to change them to 2x 0-48V 0-3A. This would mean the transistors had to dissipate a lot more heat. To counter this I used a switch mode power supply instead of a normal transformer. This switch mode power supply I modded so It can be controlled by a 0-1.5mA signal to give 20-60V on the output. This way the voltage on the transistors is limited to 20V max. I made a circuit to keep te input voltage about 10V higher then the output voltage.
This circuit I build using 1 of the op-amps on the main board and a small piece of pcb added fixed to a unused connector.

After this the power supply needs to  be changed. Some components can not handle the larger voltage, some resistors need to be adjusted to increase the range and some other modifications have to be done.

Now that the PSU works, it was time to make an enclosure. I could not really find what I was searching for, so I decided to 3D print the entire enclosure. This way it is exactly to size and I can add custom features, like  the front is on a big printed hinge, making it easier to work / measure on the boards.

On the bottom are 3 power supply’s (2x modded 48V SMPS, 1x 12V for the fans), 4x 12V transformer for auxiliary voltages of the supply circuits.

Above this level are the heat sinks, for this I used old processor coolers, where the transistors are clamped on with a  metal sheet. The fans on these heat sinks can be PWM controlled, so I used a simple dev board (the blue one in the centre) to read out 2 temperature sensors and drive 2 fans.

In the front are the 2 lab PSU boards, and on the front panel the display/pot PCB’s:

The end result:

On the equipment shelve:

Wire Twisting Machine

I needed a lot of twisted wire and I could not find it anywhere in the correct thickness / colour.  I could have it custom made, but this would be too expensive. I could hand twist it with a drill, but that would limit it to 10 meter at a time. So I decided to make a machine to twist wire.

At this time I got a motor, belt and bearing assembly from a washing machine. This makes a good base to build something on. I mounted the assembly on a wooden board and made a round disk on the tub mount.

Next I mounted 2 spool holders on the disk, they use a M12 al-tread axle with 2 conical clamps. At first I used bearings to make it easier for the spools to turn, but after some experiments it turned out it needed some resistance, so I replaced them with 3D printed blocks. Above the spools I made a funnel to make the wire always exit in the same spot.

Next I made a spool winder with a gearbox motor:

Next I made an arm above the machine to guide the wire:

To control the 2 motors I used 2 motor controllers and a DC power supply for the 12V motor. These I build into a box:

DC:

AC:

I have written a small tutorial on how to drive a washing machine motor with this controller:  Link

The machine in action:

Please accept YouTube cookies to play this video. By accepting you will be accessing content from YouTube, a service provided by an external third party.

YouTube privacy policy

If you accept this notice, your choice will be saved and the page will refresh.

Radio flea market Helchteren 2024

Today I went to the radio market in Helchteren.

What I bought:

  • 2type of lenses
  • tube with 25x 10K 12turn potmeters

Radio flea market Bladel 2024

After 5 years I went to the radio flea market in Bladel again. The market is now outside, luckily the weather was good. It felt like a radio market like they were a few years ago again, lots of stuff at reasonable/low prices.

What I bought:

  • Sorting box with variable resistors
  • 3-fold ampere meter (I want to make a clock out of it)
  • Type 2 socket
  • 300W light bulb

Spotwelder

I picked up this project from a few years ago again. First I connected the cap pcb on 5V, but it immediately started to pull a lot of current. 1 of the caps was shorted internally. With a lot of effort I found which one it was and replaced it. The I powered the circuit again, did a test weld and did not have a lot of power (almost no current even).

After a few test I had to replace another 2 capacitors that had shorted internally. And a few minutes later the board had a shorted cap again. Now I ran out of spare caps, and I had to decide if I wanted to order new ones. I decided to first calculate the energy that could be stored in the caps and also found out that it was not enough. After some searching on the internet I came across some high capacity capacitors, but they were expensive.

Then I remembered I have a few microwave oven transformers laying around and decided to use one of those. The HV secondary I removed and replaced with some 16mm² wire. The primary I switch with a solid state relay. To control everything I used a small board with a PIC16F1788 microcontroller. On this I put a ULN2803 board to drive the solid-state relays, a buzzer, LCD and a rotary encoder.

Now for detecting when to weld. On the old circuit I just used a pull-up resistor and measured the voltages on the pins. With the new version this can not be done since to 16mm² wire is always low resistance. The way I solved this is by injecting a 50Khz wave onto the wires and measure how much it drops when the pins are shorted. The thick wire on the transformer forms an inductor and is like a open circuit for the 50Khz.
In order to put the signal on to the wire I need more power then the standard pin can deliver, therefore I used a RS485 transceiver as an amplifier. After the RS485 IC is a 1µF capacitor to couple the signal.

I first did a simulation and got this result (left on the plot is output open, right is switch closed to simulate the welding pins to metal).

The out signal of this schematic is connected to an AD converter in the microcontroller. When the signal is below a threshold the welding program starts. The program I made so that it can do 2 pulses. The pulse time of both pulses and the pause time can all be set individually.

 

 

The main part of the program:

 while (1)
    {   
        
        MenuDelay ++;   //For debounce
        if (MenuDelay > 4){
            MenuDelay = 0;
            
            if (WeldState){
                LCD_Print_At(1, 1, "Stat:Weld|T1PaT2"); 
            }else{
                LCD_Print_At(1, 1, "Stat:Open|T1PaT2");                 
            }    
            
            sprintf(GetString,"%4u", WeldTime1 * 20); 
            LCD_Print_At(2, 1, GetString);  
            sprintf(GetString,"%4u", WeldPause * 20); 
            LCD_Print_At(2, 6, GetString);      
            sprintf(GetString,"%4u", WeldTime2 * 20); 
            LCD_Print_At(2, 11, GetString);     
            LCD_Print_At(2, 5,  "|");
            LCD_Print_At(2, 10, "|");    
            LCD_Print_At(2, 15, "mS");  
            
            LCD_Cmd(0xFE);
            LCD_Cmd(0x0E);
            LCD_Cmd(0x0F);
            
            switch (MenuItem){ 
                case 0:     
                    LCD_Goto(4, 2);                      
                    WeldTime1 = RotCountValue;
                    if (!RotaryBtn){
                        DATAEE_WriteByte(1, WeldTime1); 
                        MenuItem ++;
                    }
                    break;  
                case 1:
                    if (RotaryBtn){
                        MenuItem ++;
                        RotCountValue = WeldPause;
                        RotMinValue = 1;
                        RotMaxValue = 100;
                        LCD_Cmd(LCD_CLEAR);   
                    }
                    break; 
                case 2:     
                    LCD_Goto(9, 2);  
                    WeldPause = RotCountValue;    
                    if (!RotaryBtn){
                        DATAEE_WriteByte(2, WeldPause); 
                        MenuItem ++;
                    }
                    break; 
                case 3:
                    if (RotaryBtn){
                        MenuItem ++;
                        RotCountValue = WeldTime2;
                        RotMinValue = 1;
                        RotMaxValue = 100;
                        LCD_Cmd(LCD_CLEAR);   
                    }
                    break;                    
                case 4:     
                    LCD_Goto(14, 2);                     
                    WeldTime2 = RotCountValue;
                    if (!RotaryBtn){
                        DATAEE_WriteByte(3, WeldTime2); 
                        MenuItem ++;
                    }                    
                    break;  
                default:
                    if (RotaryBtn){
                        MenuItem = 0;
                        RotCountValue = WeldTime1;
                        RotMinValue = 1;
                        RotMaxValue = 100;
                    }
                    break;
            }      
        }
        
        SensVoltageBuffer = 0;
        for (uint8_t Counter = 0; Counter < 6; Counter++){ 
            SensVoltage = ADC_GetConversion(0); SensVoltage = SensVoltage >> 6;
            SensVoltageBuffer = SensVoltageBuffer + SensVoltage;      
            __delay_ms(20/6);        
        }
        SensVoltage = SensVoltageBuffer / 6;
        WeldDetect = 200;    
        
        switch (WeldState){
            case 0:
                if (SensVoltage < WeldDetect){
                    WeldState ++;
                }
                break;
            case 1:            
                WeldState ++; 
                WeldTimer = 0;
                break;
            case 2:
                if (SensVoltage < WeldDetect){ 
                    WeldState ++; 
                }else{ 
                    WeldTimer ++; 
                    if (WeldTimer == 250){ 
                       WeldState = 0; 
                    } 
                } 
                break; 
            case 3: 
                LATBbits.LATB4 = 1; //Buzzer 
                WeldState ++; 
                break; 
            case 4: 
                LATBbits.LATB4 = 0; 
                WeldState ++; 
                break; 
            case 5:
                WeldTimer = 0; 
                WeldState ++; 
               break; 
            case 6: 
               LATAbits.LATA3 = 1; 
               LATBbits.LATB5 = 1; 
               if (WeldTimer >= WeldTime1){
                    LATAbits.LATA3 = 0;
                    LATBbits.LATB5 =0;
                    WeldTimer = 0;
                    WeldState ++;
                }else{
                    WeldTimer ++;
                }
                break;
            case 7:
                if (WeldPulses == 1){
                   WeldState = 10; 
                }
                if (WeldTimer >= WeldPause){
                    WeldTimer = 0;
                    WeldState ++;
                }else{
                    WeldTimer ++;
                }
                break;
            case 8:
                LATAbits.LATA3 = 1;
                LATBbits.LATB5 = 1;
                if (WeldTimer >= WeldTime2){
                    LATAbits.LATA3 = 0;
                    LATBbits.LATB5 = 0;
                    WeldTimer = 0;
                    WeldState ++;
                }else{
                    WeldTimer ++;
                }
                break;
            case 9:
                WeldState ++;                
                break;               
            case 10:
                WeldTimer ++;
                if (WeldTimer >= (1000/20)){
                    WeldTimer = 0;
                    WeldState ++;
                }
                break;   
            case 11:     
                 if (SensVoltage > WeldDetect){
                    LATAbits.LATA3 = 0;
                    WeldTimer = 0;
                    WeldState = 0;
                }      
                break;                     
            default:
                WeldState = 0;
                break;                    
        }   
    }

 

Radio flea market Diest 2025 (Dirage)

Today I went to the radio market in Diest.

What I bought:

  • 4A analog panel meter
  • 0-1 0-100? analog panel meter
  • Small airpump

Water Dispenser

During my home renovation, I found myself wasting a lot of time measuring water for mixing concrete, gypsum, and other materials. To streamline the process, I built this automatic water dispenser. It allows precise dispensing from 0.1L to 25L in 0.1L increments. The last set value is stored in memory and retained even after a power cycle.

Pictures of the finished project:

Please accept YouTube cookies to play this video. By accepting you will be accessing content from YouTube, a service provided by an external third party.

YouTube privacy policy

If you accept this notice, your choice will be saved and the page will refresh.

The unit runs on a rechargeable lithium battery, which is charged by a water-powered generator. This means the battery charges while water is being dispensed. In the rare case the battery runs out (unlikely, as the charging power exceeds the average consumption), there’s a USB-C charging port hidden behind a screw-in plug on the side.

The solenoid valve I used is pulse-driven: a single pulse opens the valve, and a reverse pulse closes it. This design significantly reduces power usage. To drive the valve, I use a compact MX1508 motor driver board. However, the current spike during valve switching can cause the microcontroller to crash. To avoid this, I added a buffer circuit consisting of 3x 3300µF 6.3V capacitors charged through a 100Ω resistor from the 5V line. This buffer powers only the valve driver, isolating it from the main 5V supply and preventing voltage dips during switching.

The water flow is monitored using a flow sensor that generates 660 pulses per liter. These pulses are fed into a microcontroller pin configured to trigger an interrupt. Each interrupt decrements a remaining volume counter, and once the counter reaches zero, the valve is closed.

A quick sketch circuit diagram:

The firmware can be found on Codeberg: https://codeberg.org/Stynus/Water-Dispenser

Radio flea market Helchteren 2025

Today I went to the radio market in Helchteren.

What I bought:

  • Enclosure for a project
  • Rol of 4mm² stranded wire