Categorie: Projecten

Draad Twist Machine

Ik had nogal veel getwiste draad nodig en kon deze nergens vinden in de juiste dikte / kleuren. Ik kan deze speciaal laten maken, maar dit is nogal duur. Een andere optie is met een boormachine stukken twisten, maar dit lukt maar goed tot 10 meter per keer.  Om deze reden ben ik dan aan een machine begonnen om draad te twisten.

Ik had een motor met riem overbrenging uit een wasmachine. Deze was meteen mooi gelagerd en was daardoor een goed uitgangspunt om alles op te bouwen.  Waar normaal de kuip vast zit heb ik een ronde plank geschroefd.

Hierop heb ik 2 houders voor klossen draad gemaakt. Die bestaan uit een stuk M12 draadstang met 2 tapse “moeren”. Eerst had ik dit op lagers gemonteerd zodat alles makkelijk zou kunnen bewegen, maar al snel bleek dat als de draad te makkelijk kan afrollen het twisten niet goed gaat. Daarom heb ik een paar blokken ge3Dprint met een 12mm gat om de draadstangen te monteren. Boven de rollen heb ik ook een kleine trechter gemaakt zodat de draad altijd op dezelfde plaats naar boven gaat.

De volgende stap is het oprollen van de draad. Daarvoor heb ik een spoelhouder gemaakt die door een motor met vertraging wordt aangedreven.

Om de draad te geleiden heb ik een arm gemaakt met een aantal pulleys op.

Om de 2 motoren aan te sturen heb ik 2 motor controllers in een kastje gebouwd. Voor de kleine motor is hier ook nog een 12V voeding aan toegevoegd.

DC:

AC:

Over hoe je een wasmachine motor kan aansturen met zo een controller heb ik hier wat uitleg geschreven: https://www.schematheek.net/artikel/artikel-wasmachinemotor-snelheid-regelen/

De machine in actie:

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.

 

Puntlasser

Ik heb dit project van een paar jaar geleden weer opgepakt. Eerst heb ik 5V op de elco print gezet, maar onmiddellijk ging er veel te veel stroom lopen (die ook bleef lopen).  Dit kwam doordat er 1 elco intern kortgesloten was. Met veel moeite heb ik kunnen vinden welke het was en deze vervangen. Hierna de print weer getest, maar er liep tijdens het puntlassen veel te weinig stroom. Zo weinig dat er niet eens een stevige vonk kwam bij het kortsluiten.

Na wat verder experimenteren zat er opeens weer een kortsluiting in de print. Na het vinden van de schuldige elco, weer verder gegaan. En opnieuw een elco kapot. Nu waren mijn reserve elco’s ook op en moest ik nieuwe bestellen. Maar voordat ik dat deed maar even narekenen of er dan wel genoeg energie in de elco’s zit. Dit bleek niet het geval te zijn. Tenzij ik elco’s met veel hogere capaciteit zou kopen, maar die zijn duur.

Toen dacht ik eraan dat ik nog een paar transformatoren uit microgolfovens had liggen. Als ik hier op de hoogspanningswikkelingen verwijder en deze vervang door een aantal wikkelingen met dikke draad (16mm² in dit geval) dan levert deze veel stroom bij een lage spanning.
De primaire kant van deze transformator kan ik schakelen met een solid state relays. Om de timing te doen en alles aan te sturen heb ik een PIC16F1788 microcontroller gebruikt. Hier heb ik een ULN2803 bordje bijgezet om de solid state relays aan te sturen. Voor de bediening heb ik nog een LCD en rotary encoder toegevoegd.

Nu kwam er wel een ander probleem naar boven. Bij het oude schema was het makkelijk te detecteren of de las elektroden kortgesloten werden door het te lassen object. Met de nieuwe setup is het wat lastiger omdat de 16mm² draad die met beide pennen in verbinding staat al zorgt voor een enorm lage weerstand. Dit heb ik opgelost door op de uitgang een 50Khz blokgolf te zetten en te meten hoe ver deze inzakt als de uitgang kortgesloten wordt. De draad door de transformator werkt op deze manier als spoel en is een hogere weerstand voor de 50Khz.
Om het signaal op de draad te zetten, had ik meer power nodig dan dat de pin van de microcontroller kan leveren. Daarom heb ik een RS485 IC (mis)gebruikt  als versterker. Achter de RS485 IC heb ik een 1µF condensator gebruikt om het signaal in te koppelen.

Hier heb ik eerst een simulatie op gedaan met volgend resultaat: (Links op de plot is output open, rechts is gesloten.)

Het “out” signaal is verbonden met de AD converter van een microcontroller. Wanneer het signaal onder een bepaald niveau komt dan gaat het las programma starten. Het programma heb ik zo gemaakt dat het 2 pulsen na elkaar kan geven, dit zou een betere las moeten opleveren. De puls en pauze tijd is allemaal apart aanpasbaar.

Het hoofd deel van het programma:

 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;                    
        }   
    }

 

Water Dispenser

Tijdens de renovatie van mijn huis heb ik al veel tijd verspeeld met het afmeten van water voor bijvoorbeeld beton, gips, … te mixen. Om dit wat makkelijker / sneller te maken heb ik een automatische water dispenser gebouwd. Hiermee kan ik een precieze hoeveelheid water dispenseren. Het apparaat is in te stellen tussen de 0.1L en 25L in 0.1L stapjes. De laatst ingestelde waarde blijft behouden als het apparaat uitgezet wordt.

Een paar foto’s van het afgewerkte 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.

De elektronica draait op een oplaadbare lithium batterij. Deze wordt opgeladen door een kleine water generator die tijdens het dispensen draait. Normaal is dit meer dan genoeg om de batterij vol te houden, moest dit toch niet het geval zijn is er ook nog een kapje dat eruit gedraaid kan worden om bij een USB-C laadconnector te komen.

De solenoid klep die ik gebruikt heb wordt met pulsen geschakeld. Een puls met de stroom in 1 richting opent de klep, en een puls met de stroom in de andere richting sluit deze weer terug. Dit zorgt ervoor dat er veel minder stroom verbruikt wordt dan bij klassieke kleppen. Om deze aan te sturen in 2 richtingen heb ik een MX1508 motor driver printje gebruikt.
Tijdens het schakelen loopt er een vrij grote stroompiek, deze kan de microcontroller laten crashen. Om dit te voorkomen heb ik nog een buffer toegevoegd in de vorm van 3x 3300µF 6.3V condensatoren die via een 100Ω weerstand geladen worden uit de 5V.

Het afmeten van het water gebeurd met een flow sensor, deze genereert 660 pulsen voor elke liter water die erdoor gaat. Deze pulsen worden in de microcontroller ingelezen onder interrupt. Telkens als er een puls binnenkomt verminderd deze de resterend volume waarde, en als die 0 wordt dan wordt de klep terug gesloten.

Een schets van het aansluitschema:

De firmware staat op Codeberg: https://codeberg.org/Stynus/Water-Dispenser

Netspanning Meet Adapter

Vorige week heb ik bij de radiomarkt in Bladel een power meter gekocht. Om deze power meter makkelijker te kunnen gebruiken had ik een meet adapter nodig. Ik kon deze kopen, maar zelf maken is toch veel leuker.

Ik heb onderstaand schema gemaakt van hoe alles is aangesloten. De weerstand in het schema zit in de power meter. De schakelaar is om de spanningsmeting naar voor of achter de shunt te schakelen. Dit is belangrijk omdat de spanningsmeting ook stroom trekt.
Voor hoge vermogens op de uitgang valt er een spanningsdrop over de meet weerstand. Hierom wil je de spanningsmeting aan de  DUT (Device Under Test) kant.
Voor lage vermogens op de uitgang wil je de spanningsmeting aan de netspanningskant. Dit omdat anders het vermogen dat de spanningsmeting trekt wordt opgeteld bij de meting.

Deze kleine schakeling heb ik ingebouwd in een behuizing van een op afstand bestuurbaar stopcontact.

Afgewerkt ziet het er dan zo uit; (Ja, er moeten nog veiligheidsstekkers op, maar die staan nog in bestelling).

Geïnstalleerd op de scheidingstransformator ziet het er dan zo uit: