Welkom! Login voor uitgebreide toegang en gebruiksfuncties.

Updates:

Arduino perikelen

in Elektronica en analoog

Gestart door TEE-RAM, 28 december 2022 19:18

Vorige topic - Volgende topic

TEE-RAM

Goedenavond,

Ik heb mij laten overhalen iets met arduino te gaan doen. Mijn eerste project(je) is het schakelen van 10 wisselstraten.

Daartoe heb ik gemaakt:
– een toetsenbordje (10 toetsen),
– een printje met 18x BC547 en 18x BD680 voor de aansturing van de wissels (printje had ik al in gebruik),
– een CDU voor het leveren van de benodigde stroom voor de aansturing van de wissels,
– een printje met de arduino nano,
– een printje met 3x PCF8574 via een I2C verbinding aangesloten op de arduino.

Gisteren heb ik het geheel getest en het werkte naar verwachting. Eerst getest (met een testprogramma exclusief toetsenbordje) met leds in plaats van wissels later met 1 wisselspoel (omdat voor het inbouwen op de spoorbaan nog wat aanpassingen nodig zijn is het testen met alle wissels wat lastig). Het principe werkt.
Nu mijn probleem, ik ben voor wat betreft elektronica een leek. Om de wisselspoel te testen had ik 1 PCA op het printje geprikt (dus de andere twee niet). De wisselspoel schakelde netjes zoals verwacht. Daarna heb ik de GND losgehaald (de +5 en +23 volt bleven dus aangesloten) de twee andere PCF'n erin geprikt en de GND weer aangesloten, de arduino werd warm/heet en begaf de geest.

Ik heb vandaag wat metingen uitgevoerd:
– ik sluit het geheel volgens onderstaand schema aan (overigens zonder geplaatste arduino en PCF'n en zonder toetsenbordje),
– ik meet overal de verwachte spanning,
– ik haal de GND los (de +5 en +23 volt bleven dus aangesloten),
– op de arduino aansluiting ontstaat vervolgens een negatieve spanning (zelfs tot -11 volt, wel kort).
Mijn conclusie is dat het loshalen/weer aansluiten van de GND de arduino vernietigd heeft maar een verklaring daarvoor heb ik niet. Is mijn conclusie juist en zo ja wat is de oorzaak hiervan (gaat er een stroom lopen vanuit de CDU naar de aansluiting van de Arduino??).

N.b.: ongetwijfeld zijn er betere/andere/makkelijkere oplossingen dan die ik gekozen heb maar dat doet er voor mij op dit moment niet toe. Ik wil, voordat ik er een nieuwe nano in prik. weten wat de oorzaak is waarom de arduino de geest gaf.









Menno

Zonder interne schema's van de onderdelen is het gissen naar het waarom, maar over het algemeen is het hartstikke fout om de massa/0V van een schakeling te onderbreken en voedingsspanningen juist aangesloten te laten. Alles gebeurt 'ten opzichte van iets': er staat 5 Volt en 23 Volt ten opzichte van massa (0 Volt). Die 0 Volt is ook voor ingangen en uitgangen een referentieniveau en vooral ingangen kunnen heel raar gaan doen zonder dat referentieniveau.

Op die manier kan er, zeker via digitale electronica, via interne verbindingen die gewoon nodig zijn voor de werking ván die digitale electronica, stroom gaan lopen via wegen die daar niet voor bedoeld zijn. Bijvoorbeeld omdat digitale ingangen vaak ESD-beveiligingen hebben (dat zijn dan vaak zogenaamde clamping-diodes). Zowel naar massa als Vcc zitten dan diodes in tegengestelde richting aangesloten. Haal massa weg en zeker bij twee verschillende voedingsspanningen gaat het dan al snel mis.

Beste les: onderbreek je voedingsspanningen, niet de massa. Nog beter is het om gewoon je gehele voeding uit te schakelen als je iets wijzigt, zodat je bij een vergeten verbinding niet alsnog iets sloopt.

Verder vind ik het gebruik van een CDU bij dit soort elektronica totaal overbodig: zorg gewoon voor een hoge spanning en een voeding die een beetje stroom kan leveren. Je werkt met electronica, laat die het verder afhandelen. Een CDU is moeilijk naar mijn mening.

TEE-RAM

Menno bedankt  voor jouw reactie.
De reden dat ik CDU wil gebruiken is dat ik oude roco wissels gebruik met eindafschakeling. De eindafschakeling werkt niet altijd even goed (de contacten in de wissel zijn slecht/niet schoon te maken). Ook blijkt dat de spanning benodigd om de spoelen te laten reageren nogal varieert (zo tussen de 16 en 20 volt bij ongeveer 1,2 A). De eindafschakeling heb ik overbrugd maar daardoor kan, als er te lang spanning op de spoelen blijft staan, de spoel doorbranden. Ik weet dat de schakeltijd met de arduino in te stellen is maar ik bouw graag een extra zekerheid in. Ik ga echter wel proberen of het zonder CDU kan met een schakeltijd van 10/20 ms (misschien iets langer).

bask185

Citaat van: TEE-RAM op 29 december 2022 12:47
Ik weet dat de schakeltijd met de arduino in te stellen is maar ik bouw graag een extra zekerheid in.

Ik heb daarvoor ooit een simpel lapje code gemaakt. Ik noem het 'coilDriver'.

2 bestandjes: CoilDrive.cpp

#include "CoilDrive.h"

CoilDrive::CoilDrive()
{
}

void CoilDrive::begin( uint8_t _pinA, uint8_t _pinB, uint32_t _switchTime )
{
    pinA = _pinA ;
    pinB = _pinB ;
    switchTime = _switchTime ;   
    pinMode( pinA, OUTPUT ) ;
    pinMode( pinB, OUTPUT ) ;
    digitalWrite( pinA, LOW ) ;
    digitalWrite( pinB, LOW ) ;
}

void CoilDrive::setState( uint8 _state )
{
    prevTime = millis() ;
    set = true ;

    if( _state ) digitalWrite( pinA, HIGH ) ;
    else         digitalWrite( pinB, HIGH ) ;
}

void CoilDrive::update()
{
    if( set == true && (millis() - prevTime) >= switchTime )
    {   set  = false ;
       
        digitalWrite( pinA, LOW ) ;
        digitalWrite( pinB, LOW ) ;
    }
}


En het header bestand CoilDrive.h

#include <Arduino.h>

class CoilDrive {

public:
    CoilDrive() ;
    void setState( uint8_t );
    void update() ;
    void begin(uint8_t, uint8_t, uint32_t) ;

private:
    uint32  switchTime ;
    uint32  prevTime ;
    uint8   pinA ;
    uint8   pinB ;
    bool    set ;
} ;


Hoe te gebruiken?


#include "CoilDrive.h"

const int nWissels = 4 ;

CoilDrive wissel[ nWissels ] ; // maak array van 4 dubbel spoelige wissels

void setup()
{
    wissel[0].begin( 1, 2, 50 ) ; // pin1, pin2, schakeltijd in milliseconde
    wissel[1].begin( 3, 4, 50 ) ;
    wissel[2].begin( 5, 6, 50 ) ;
    wissel[3].begin( 7, 8, 50 ) ;
}

void loop()
{
    for( int i = 0 ; i < nWissels ; i ++ )
    {
        wissel[i].update() ; // zet beide pinnen uit als de schakeltijd is verstreken, continu aanroepen
    }

    if(      event1_0 ) { wissel[0].setState( 0 ) ; }  // event moet je zelf invullen en koppelen aan je knopjes
    else if( event1_1 ) { wissel[0].setState( 1 ) ; }  // 1x aanroepen, niet oneindig vaak.

    if(      event2_0 ) { wissel[1].setState( 0 ) ; }
    else if( event2_1 ) { wissel[1].setState( 1 ) ; }

    if(      event3_0 ) { wissel[2].setState( 0 ) ; }
    else if( event3_1 ) { wissel[2].setState( 1 ) ; }

    if(      event4_0 ) { wissel[3].setState( 0 ) ; }
    else if( event4_1 ) { wissel[3].setState( 1 ) ; }
}


Als je je elektronica werkend heb, heb je er misschien iets aan  ;)

Mvg,

Bas
Train-Science.com
Train-Science github
It ain't rocket science ;-)

TEE-RAM

Bas bedankt voor jouw informatie.
Ik heb reeds een werkend programma, waarschijnlijk niet het kortste en/of het meest logische. Ik heb overal vandaan allerlei informatie verzameld en aan elkaar gekoppeld met een beetje logisch nadenken. In de loop der tijd leer ik waar ik mee bezig ben maar kan nog lang niet alles doorgronden. Gezien mijn leeftijd denk ik dat dat ook niet meer lukt maar tot nu toe ben ik best tevreden (ik kan nu 10 wisselstraten met 9 wissels, 4 uitgaande sporen (naar 1 spoor) en 1 inkomend spoor (naar 4 sporen) instellen met een weergave, leds, op een schakelbord). Dit alles als natuurlijk ook de hardware goed functioneert. Ik ga in ieder geval proberen jouw code te doorgronden.
Wim