Doel:€250.00
Donaties:€250.05

Per saldo:€0.05

Steun ons nu!

Laatst bijgewerkt
op 25-10-2021
Algemeen

De stichting

Recente berichten

Ringleiding en diode door 72sonett
Vandaag om 00:51:57
TV-Programma "De Grote Kleine TreinenCompetitie" door Martin Domburg
Vandaag om 00:08:52
LokSound 4 decoders, files verbeteren (voor Roco b.v. TEE RAm, NS2400, etc) door Fritsprt
27 oktober 2021, 23:36:54
Wie kan mij helpen met een 3d printer om iets te printen door Hoontje
27 oktober 2021, 23:29:58
Basic onderhoud locomotieven door Martijn193
27 oktober 2021, 23:27:44
Nieuwe website online: mrmodelrailroad.com door Hasenwald
27 oktober 2021, 23:23:36
Twee-assige rongenwagens door Taigagaai
27 oktober 2021, 22:58:31
Mallnitzer Tauernbahnstrecke ÖBB N Spoor door Schachbrett
27 oktober 2021, 22:46:50
Mijn Ned. N. Spoorbaan ''Echthoven'' door Wim Vink
27 oktober 2021, 22:37:15
Modelspoorwinkels in Google Earth door KNed
27 oktober 2021, 22:35:54
Jubileum? door VictorPM
27 oktober 2021, 22:33:40
Mijn eerste H0-modeltreinbaan in aanbouw door Frank 123
27 oktober 2021, 22:29:42
"Litter Bin" voor Brits spoor en Britse modelspoorprojecten door St00mboy
27 oktober 2021, 22:03:06
Hernieuwde kennismaking door MarcNL
27 oktober 2021, 21:37:50
Nieuwe app en firmware versie (1.0.6) voor de DK50018 schakeldecoder door Bert_Apd
27 oktober 2021, 20:24:41
Update: baan in de tropen door Hans Grasmaijer
27 oktober 2021, 20:13:46
Kreisbahn nach Bad Bimmelberg. door GD
27 oktober 2021, 20:06:08
Lawrie's Mechanical Marvels door GD
27 oktober 2021, 19:44:35
Raadplaatje door Jeronimos
27 oktober 2021, 19:44:28
Zoldergem - nieuwe start op zolder in HO-schaal - 7m x 3.4m door basjuh1981
27 oktober 2021, 19:43:57
EifelBurgenBahn door basjuh1981
27 oktober 2021, 19:42:37
Ook geen Preisers meer in de VS door basjuh1981
27 oktober 2021, 19:40:12
Aachenau West door puntenglijder
27 oktober 2021, 19:17:32
Stoom Stichting Nederland, perikelen… door hrp
27 oktober 2021, 17:59:18
Toon hier je nieuwe (model-) spooraanwinst(en)... door Ronald69
27 oktober 2021, 16:49:53
VERPLAATST: Problemen door woningbouw bij de SSN? door Bert van Gelder
27 oktober 2021, 16:48:31
Stralen van messing modellen; welke materialen gebruiken? door CeesJ
27 oktober 2021, 14:56:50
VIRM kop in de schaal 1:5 door Mitchell
27 oktober 2021, 14:55:13
Nederlandse baan in voorbereiding genaamd Anninkshoeve door valkyrienineball
27 oktober 2021, 14:43:59
Brekina MAN-schienenbus (64000), maakt lawaai na stilstand. Olie helpt niet. door Matthijs1308
27 oktober 2021, 12:30:40
  

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

Joost O

  • Offline Offline
  • Berichten: 587
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: 1908
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

denobis

  • Offline Offline
  • Berichten: 404
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: 587
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: 404
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: 1939
    • 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: 1693
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: 587
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: 1939
    • 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 »