Doel:€250.00
Donaties:€260.00

Per saldo:€10.00

Steun ons nu!

Laatst bijgewerkt
op 26-11-2021

Vacature: secretaris bestuur
Algemeen

De stichting

Recente berichten

Ketelwagens, welke hebben jullie? door Ferry As
Vandaag om 13:25:52
Toon hier je nieuwe (model-) spooraanwinst(en)... door Eelco Storm
Vandaag om 13:24:48
Friskorn/Philotrain 6203 door oostspoor
Vandaag om 13:21:26
Mijn eerste H0-modeltreinbaan in aanbouw door NS1220
Vandaag om 13:18:42
LTM-51 Garratt in messing, Spoor-0 door FritsT
Vandaag om 13:15:32
licht uit van loc bij stoppen door VAM65
Vandaag om 13:15:08
Aansturing wisseldecoders door ucoson
Vandaag om 13:06:09
Bruikbare etsplaten voor NS4000 en NS4700 tenders, en NS slijptrein? door Deetrein
Vandaag om 13:04:37
Decoderadvies gevraagd voor div. analoge locomotieven. door henk
Vandaag om 12:50:55
Roco 2021, nieuws van de fabrikant. door fissy
Vandaag om 12:49:09
Helmerstadt 2.0 door VFR
Vandaag om 12:40:59
Trix Olympische Koploper, rij-eigenschappen verbeteren? door henk
Vandaag om 12:33:16
EifelBurgenBahn door Noordernet
Vandaag om 12:29:55
Roco plastic lichtgeleiders vraag door Fritsprt
Vandaag om 12:24:59
MB-module: Hielan Ware door Eric B
Vandaag om 12:23:33
Grote kleine treinen wedstrijd maar dan in Duitsland door bellejt
Vandaag om 12:20:05
N-rijder in spe. 2,80 mtr x 60 cm. door NS264
Vandaag om 12:07:30
Rivarossi Mat '46 elektrisch koppelen door Duikeend
Vandaag om 11:58:40
NS-61 (ex NCS-7) stoomloc in messing, Spoor-1 bouwproject door FritsT
Vandaag om 11:58:22
De bouw van mijn modelbaan in Thailand door NS264
Vandaag om 11:55:45
Republica Bakoba Verda (start van een beginner), Märklin M door Jelmer
Vandaag om 11:37:28
Heen, En en Weer door Huup
Vandaag om 11:31:02
Rondom Charlois door hrp
Vandaag om 11:26:59
inbouwen decoder in Liliput BR 38 (10901) hoe aan te sluiten? door heuvelbaan
Vandaag om 11:26:35
Mallnitzer Tauernbahnstrecke ÖBB N Spoor door Schachbrett
Vandaag om 11:10:50
NS vervangt uit voorzorg voorlopig DDZ treinen door spoorzeven
Vandaag om 10:58:27
Joops Fantasie Wereld in schaal 0e door joop100
Vandaag om 10:14:29
Jouef NS 1300 h0, verbouwing naar Tp III door Eric B
Vandaag om 10:08:01
Laag-Baarlo door Christoph
Vandaag om 10:01:53
nummerplaatje zwitserse krokodil marklin door bellejt
Vandaag om 09:28:27
  

Auteur Topic: Arduino en H-Brug, hoe schakelen?  (gelezen 1028 keer)

Joost O

  • Offline Offline
  • Berichten: 590
Arduino en H-Brug, hoe schakelen?
« Gepost op: 13 oktober 2021, 22:00:05 »
Beste allen,

Ik wil met 4 transistors een H-brug bouwen, en die gebruiken om met een Arduino een pendeltreintje te besturen.

Het eerste ontwerp is met 4 NPN transistors:


Nu meen ik te begrijpen dat met dit schema er nooit de volle 12V op de rails komen, omdat de Arduino uitgangen op 5V werken. De bovenste NPN transistors zouden dus nooit meer dan 5V doorlaten.

Een tweede versie is deze, met PNP transistors bovenaan:


Mijn vragen zijn:
1. Klopt het dat het eerste schema geen 12V op de rails zal zetten?
2. Werkt één van deze versies goed of zie ik nog iets over het hoofd?
3. Als geen van beide schemas klopt, heeft iemand dan nog andere suggesties?

Een paar opmerkingen:
- De transistors ziijn darlington-transistors (TIP120 enz.). Kunnen dus voldoende stroom leveren voor een lok.
- Ik wil niet beginnen aan IC´s, Arduino shields en dergelijke... ik heb nu hier een stapel van deze transistors liggen, en wil zien wat ik ermee kan doen.
- Ik weet dat de Arduino-uitgangen PWM leveren, maar aan/uit is voor mij voldoende. M.a.w. de trein moet rijden of stoppen, geen noodzaak voor optrekken, remmen, kruipen e.d.

Alvast hartelijk dank voor uw hulp!

Joost





Fritsprt

  • Offline Offline
  • Berichten: 1944
Re: Arduino en H-Brug, hoe schakelen?
« Reactie #1 Gepost op: 13 oktober 2021, 22:13:22 »
Bij het laatste schema moet je 2 transistoren toevoegen die de basis van de 2 linker of rechter transistoren naar 0 trekken. De basis moet je met een weerstand aan 12V hangen.

Gr. Frits
Groet Frits

denobis

  • Offline Offline
  • Berichten: 440
Re: Arduino en H-Brug, hoe schakelen?
« Reactie #2 Gepost op: 13 oktober 2021, 22:15:27 »
Is het niet simpeler om gewoon een complete H brug te kopen die dingen kosten geen drol.




/* PENDELAUTOMAAT MODELTREIN
 *
 * Rob van Deursen

 * De motorbesturing gebeurt over 2 'analoge' uitvoer pinnen. Hier wordt met pulsbreedte modulatie
 * de (effectieve) uitgangsspanning ingesteld.
 * Elke rij-richting heeft 1 pin waarmee de pulsbreedte tussen 0 (uit) en 255 (maximaal) wordt geregeld.
 *
 * De pendelautomaat werkt op een deel van een spoor, waar aan één zijde een rail is geïsoleerd en met
 * een diode de stroom slechts in één richting kan lopen. Dit is het vertrekpunt.
 *
 * Bij het opstarten van de automaat wordt eerst naar het vertrekpunt gereden, ook als de trein daar al staat.
 * Hiermee wordt ervoor gezorgd dat na een onverwachte stop van de automaat weer vanuit de uitgangspositie wordt gereden.
 *
 * versie 0.1 - 22 oktober 2019
 * ForumVersie (zonder geluidsfuncties)
*/

// ------------- Instellingen en definities -----------

// === instellingen pendelbedrijf ===
#define rijtijdHeen      13    // tijd in seconden op volle snelheid heenweg
#define snelheidHeen      3    // snelheid heenweg (1-9)
#define optrekkenHeen false    // optrekken op heenweg ja/nee (true/false)

#define rijtijdTerug     20    // tijd in seconden terugweg. Ruim nemen, zodat trein altijd op stroomloos deel komt.
#define snelheidTerug     6    // snelheid terugweg (1-9)
#define optrekkenTerug  true   // optrekken op terugweg ja/nee (true/false)

#define wachttijdBestemming   0 // Wachttijd (seconden) zonder stroom op bestemming (lichten uit)
#define wachttijdVertrekpunt  5 // Wachttijd (seconden) op stroomloos deel zonder stroom
#define wachttijdAankomst    10 // Wachttijd na aankomst (met lichten nog aan)
#define wachttijdVertrek     10 // Wachttijd voor vertrek nadat lichten aan zijn.

// === rij karakteristieken ===
// gebruiksinstellingen
#define lusVertraging        30 // vertraging  in ms in de hoofdlus
#define acceleratieStap       0.025   // stappen waarin snelheid toe- of afneemt
#define aanloopPWM      50.0   // Pulsbreedte waarde (0-255) om aanloopweerstand motoren te overwinnen
#define maxPulsBreedte  250    // Maximale pulsbreedte voor de rijstroom (255 of kleiner, met geluid: max 250)
#define lichtAan             -1.375   // snelheid om licht aan te zetten (kleiner dan 0, snelheid 0 is aanloopPWM motoren)

// === Instellingen motor controller ===
// uitvoer pinnen
#define richtingPin1     10    // pinnen voor vooruit en achteruit (dit moeten beide PWM pinnen zijn)
#define richtingPin2      9


// -------------- Variabelen ----------

// regeling van snelheid en richting
unsigned long richting = 0;          // rijrichting
float snelheid = 0;                  // huidige snelheid
float gewensteSnelheid = 0;          // gewenste snelheid
float acceleratie = acceleratieStap;
int richtingPin[] {richtingPin1,richtingPin2}; // pinnen voor vooruit en achteruit (PWM pinnen)

// Arrays voor instellingen per rijrichting
int rijSnelheid[]{snelheidTerug, snelheidHeen};    // maximale snelheden per richting
double rijtijd[]    {1000*rijtijdTerug, 1000*rijtijdHeen};      // rijtijden per richting
bool optrekken[] {optrekkenTerug, optrekkenHeen};  // optrekken j/n
double wachttijd[]  {1000*wachttijdVertrekpunt, 1000*wachttijdBestemming};  // wachttijden stroomloos

// Overige variabelen
int t=0;                             // algemene teller voor for... loops
int waardePWM;                       // huidige waarde van de pulsbreedte.
int vorigeWaardePWM;                 // vorige waarde van de pulsbreedte.


//--------------- Setup na starten Arduino ---------------------

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);     // ingebouwde led op pin 13 uit
  digitalWrite(LED_BUILTIN, LOW);
 
  // in- en output pinnen initialiseren
  pinMode (richtingPin[0], OUTPUT);
  pinMode (richtingPin[1], OUTPUT);
 
}

// --------------- Hoofd lus Arduino ---------------------------

void loop() {
  // lichten aan en wachten op vertek
  snelheid = lichtAan;
  SnelheidNaarPWM () ;
  delay (1000*wachttijdVertrek);

  // wegrijden
  gewensteSnelheid = rijSnelheid[richting];
  if (optrekken[richting]) {                   // optrekken gewenst
    acceleratie = acceleratieStap;
    while (snelheid < gewensteSnelheid) {
      SnelheidAanpassen();
      SnelheidNaarPWM ();
      delay(lusVertraging);
    }
  }                                            // niet optrekken
  else {
    snelheid = gewensteSnelheid;
    SnelheidNaarPWM ();
  }
  // rijden (op topsnelheid)
  delay (rijtijd[richting]);

  // afremmen en wachten na aankomst.
  gewensteSnelheid = lichtAan;
  acceleratie = - acceleratieStap;
  while (snelheid > gewensteSnelheid) {
    SnelheidAanpassen();
    SnelheidNaarPWM ();
    delay(lusVertraging);
  }
  delay (1000*wachttijdAankomst);

  // stroomloos wachten
  snelheid = 0;
  gewensteSnelheid = 0;
  SnelheidNaarPWM ();
  delay (wachttijd[richting]);

  // rijrichting wisselen
  richting = !richting;
}

//---------------- Functies --------------------

// SNELHEID NAAR PWM OMREKENEN EN OP JUISTE PIN ZETTEN
// naar een pulsbreedte en op de juiste uitvoer pin gezet.
void SnelheidNaarPWM () {
  if (snelheid != 0) {
    waardePWM = aanloopPWM + (maxPulsBreedte-aanloopPWM)/9 * (snelheid);
  }
  else {
    waardePWM = 0;
  }
  analogWrite(richtingPin[richting == 0],0);      // niet richting pin altijd uit
  if (abs(waardePWM - vorigeWaardePWM) >1) {      // significante verandering PWM
                                                  // voorkom onnodig PWM schrijven: dit verandert de puls

    analogWrite(richtingPin[richting],(waardePWM)); // PWM op richting pin
    vorigeWaardePWM = waardePWM;                  // onthou vorige waarde
    //Serial.print(waardePWM);
  }

}

// ===

// SNELHEID AANPASSEN
// Deze functie berekent de nieuwe snelheid op basis van de
// ingestelde acceleratie.


void SnelheidAanpassen() {
  if (abs(snelheid - gewensteSnelheid) <= (acceleratieStap / 2)) {
    snelheid = gewensteSnelheid;
    acceleratie= 0;
  } else {
    snelheid += acceleratie;
  }
  if (snelheid == 0 && gewensteSnelheid == lichtAan ) {
    snelheid == lichtAan;
  }
}
// ===

// --------------- einde schets ----------------
« Laatst bewerkt op: 13 oktober 2021, 22:42:10 door Reinout van Rees. Reden: code-tags toegevoegd »

Joost O

  • Offline Offline
  • Berichten: 590
Re: Arduino en H-Brug, hoe schakelen?
« Reactie #3 Gepost op: 13 oktober 2021, 22:46:09 »
Bij het laatste schema moet je 2 transistoren toevoegen die de basis van de 2 linker of rechter transistoren naar 0 trekken. De basis moet je met een weerstand aan 12V hangen.
@Frits: Als ik nou de aarde van de h-brug koppel aan de aarde van de Arduino, gaat de basis van de twee linker (of rechter) transistors van de brug dan naar nul als de betreffende Arduino uitgang naar nul gaat?
Dan zou dus de Arduino doen wat jou aanbevolen extra transistors moesten doen.
 ???

Is het niet simpeler om gewoon een complete H brug te kopen die dingen kosten geen drol.
@Hans: Best wel, maar het gaat me om het leren hoe het werkt, ontwerpen, knutselen met wat ik heb liggen...

Groeten,

Joost

denobis

  • Offline Offline
  • Berichten: 440
Re: Arduino en H-Brug, hoe schakelen?
« Reactie #4 Gepost op: 14 oktober 2021, 10:12:19 »
Beste Joost
Kijk eens op de site van instructables daar vind je vele schema's van h bridge schakelingen in combinatie met arduino.
Ook met betrekking tot modelspoor.

72sonett

  • Team encyclopedie
  • Offline Offline
  • Berichten: 1972
    • El Carrilet
Re: Arduino en H-Brug, hoe schakelen?
« Reactie #5 Gepost op: 14 oktober 2021, 11:55:06 »
Nu meen ik te begrijpen dat met dit schema er nooit de volle 12V op de rails komen, omdat de Arduino uitgangen op 5V werken. De bovenste NPN transistors zouden dus nooit meer dan 5V doorlaten.
Nee, de 5 V van de Arduino uitgang op de basis laat de NPN transistoren geleiden, deze schakelen dan de 12 V (of meer) naar de rails/motor. De gnd van de H-brug en van de Arduino moeten wel met elkaar verbonden zijn.

Het probleem met deze schakeling is dat als beide uitgangen van de Arduino 'hoog' gaan, de transistoren een kortsluiting maken en alle 4 doorbranden:
uitgang        A    B
---------------------
kortsluiting   H    H
linksom        L    H
rechtsom       H    L
stop           L    L
Citaat
Een tweede versie is deze, met PNP transistors bovenaan:
Deze versie heeft dat probleem niet, hier is altijd één van de 2 transistoren gesperd, in de situatie H H geleiden de onderste 2 NPN transistoren en wordt de motor kortgesloten naar gnd (elektrische rem).
Citaat
Mijn vragen zijn:
1. Klopt het dat het eerste schema geen 12V op de rails zal zetten?
Nee, er komt 12 V op de rails als de Arduino uitgangen HL of LH zijn.
Citaat
2. Werkt één van deze versies goed of zie ik nog iets over het hoofd?
Beide werken maar versie 1 is gevaarlijk en beide kunnen niet tegen kortsluiten van de rails.
Citaat
3. Als geen van beide schemas klopt, heeft iemand dan nog andere suggesties?
Beide kloppen, maar een kant-en-klare L298N H-brug module heeft ook kortsluitbeveilinging (van de rails)

Citaat
- Ik weet dat de Arduino-uitgangen PWM leveren, maar aan/uit is voor mij voldoende. M.a.w. de trein moet rijden of stoppen, geen noodzaak voor optrekken, remmen, kruipen e.d.

Je gebruikt de H-brug dus alleen als ompoolschakelaar; trein vooruit of achteruit... Om die aan te sturen heb je dan geen Arduino nodig en eigenlijk ook geen H-brug... Je moet die 12 V (of 16 V) dan ook nog wel regelbaar maken.

De kracht van een Arduino in dit soort schakelingen is juist dat je die H-brug met PWM kan aansturen en de trein langzaam kan laten wegrijden en stoppen. In plaats van een uitgang ineens L--->H of H ---> L te maken, doe je dat geleidelijk, met PWM.


#define rijtijdHeen      13    // tijd in seconden op volle snelheid heenweg
Waarom nog steeds #define gebruikt wordt ipv const, is mij een raadsel.
« Laatst bewerkt op: 18 oktober 2021, 19:14:13 door 72sonett »

bask185

  • Offline Offline
  • Berichten: 1751
Re: Arduino en H-Brug, hoe schakelen?
« Reactie #6 Gepost op: 14 oktober 2021, 12:32:25 »
Is het niet simpeler om gewoon een complete H brug te kopen die dingen kosten geen drol.
Ja dat is veel beter. Component 2 de dc-dc converter is trouwens overbodig als je gewoon een 12v DC voeding heb.

De l298n module heeft ook een 5v regulator aan boord waarmee je de Arduino kan voeden deze is iets betrouwbaarder dan die van de Arduino volgens mij.

Je zegt wel geen optrek en remvertraging te willen. Maar je trein wordt daar wel gelukkiger van. Je trein houdt er niet van op plots van 0v naar 12v te gaan. Of het echt kwaad kan, weet ik natuurlijk niet 100% zeker maar bekijk het zo: "het kan niet mogelijk goed zijn voor je trein dus dan moet het wel slecht zijn".

Nog een reden waarom je PWM wilt gebruiken, is omdat je daarmee de max snelheid kan aanpassen. Stel dat je toch vindt dat je trein te hard gaat dan je met pwm dat nog makkelijk aanpassen. Dit vind ik zelf althans makkelijker dan een lagere voeding te pakken of om een dc dc converter er tussen te stouwen.

Dat de Arduino 6 ingebouwde pwm kanalen heeft is erg leuk en vaak ook handig maar die heb je niet nodig. De perfecte mix tussen goed rijgedrag en geluidsniveau ligt tussen de 20Hz en 100Hz. Alles tussen 100Hz en 20000Hz veroorzaakt een erg irritant geluid in je treinen en alles boven 20000Hz geeft erg slecht rijgedrag. Voor 100Hz kan je het pwm regelen met de ingebouwde micros() functie.

Ik heb speciaal voor d'n modeltreinen een Weistra library geschreven die voor je zowel dutycycle (pwm niveau) ook de frequentie voor je regelt. Je kan dan een snelheid van 0 tot 100% invoeren. Het rijgedrag is bijzonder goed en de treinen piepen niet irriterend.

Met deze library wordt je loop() ook erg simpel.
https://github.com/bask185/State-Machine-Scripts/tree/master/modules

Mvg,

Bas


Joost O

  • Offline Offline
  • Berichten: 590
Re: Arduino en H-Brug, hoe schakelen?
« Reactie #7 Gepost op: 18 oktober 2021, 17:15:43 »
Beste allemaal:

Hartelijk dank voor alle reacties, speciaal 72sonnett voor de duidelijke antwoorden op mijn vragen.
Sorry dat ik zo laat reageer, maar ik moest het allemaal even verwerken  :o

beide kunnen niet tegen kortsluiten van de rails.Beide kloppen, maar een kant-en-klare L298N H-brug module heeft ook kortsluitbeveilinging (van de rails)
Dat wist ik niet en geeft de doorslag voor mij. Ik zal me eens in de L298N gaan verdiepen.

Ik heb speciaal voor d'n modeltreinen een Weistra library geschreven die voor je zowel dutycycle (pwm niveau) ook de frequentie voor je regelt. Je kan dan een snelheid van 0 tot 100% invoeren. Het rijgedrag is bijzonder goed en de treinen piepen niet irriterend.
Thanks Bas, ik zal het bestuderen als ik de hardware heb.

Beste Joost
Kijk eens op de site van instructables daar vind je vele schema's van h bridge schakelingen in combinatie met arduino.
Ook met betrekking tot modelspoor.
Goede tip, bedankt!

Je gebruikt de H-brug dus alleen als ompoolschakelaar; trein vooruit of achteruit... Om die aan te sturen heb je dan geen Arduino nodig en eigenlijk ook geen H-brug...
Hoe zou dat gaan (automatisch dan)? Met relais?

Als ik wat werkend heb zal ik het t.z.t. hier melden. Maar dat kan met mijn tempo best een paar maanden duren, dus lig er maar niet van wakker  ;D


Groeten uit Colombia,

Joost

72sonett

  • Team encyclopedie
  • Offline Offline
  • Berichten: 1972
    • El Carrilet
Re: Arduino en H-Brug, hoe schakelen?
« Reactie #8 Gepost op: 18 oktober 2021, 17:57:56 »
Ik zal me eens in de L298N gaan verdiepen.
Daar zitten ook nog eens 2 H-bruggen in.
Citaat
Hoe zou dat gaan (automatisch dan)? Met relais?

Ja, met een dubbelpolig relais en een aan-uit schakelaar, of bistabiel relais met (aan)-uit-(aan) pulsschakelaar. Om de snelheid te regelen heb je dan nog een regelaar of DC/DC converter nodig. Met een Arduino kan dat ook allemaal.
« Laatst bewerkt op: 18 oktober 2021, 21:29:55 door 72sonett »