Doel:€250.00
Donaties:€50.00

Per saldo:€-200.00

Steun ons nu!

Laatst bijgewerkt
op 03-01-2024

Vacature: secretaris bestuur
Algemeen

De stichting

Recente berichten

Raadplaatje door eemstede
Vandaag om 20:43:38
NS GLY omspuiten en opschriften door orientexpress
Vandaag om 20:42:10
De Hondsrugbaan door Noordernet
Vandaag om 20:38:51
Engelse wagon uit 1930 opgegraven in Antwerpen door Entity
Vandaag om 20:37:25
Hengelo in 1981-1982, maar dan anders: Kassenberg in N door 1200blauw
Vandaag om 20:32:41
Onlangs gespot - gefotografeerd, de foto's door eemstede
Vandaag om 20:31:17
Welke Vallejo kleur voor drijfstangen van een DB stoomlocomotief? door Ronald69
Vandaag om 20:00:39
US diorama in H0 door Wim Vink
Vandaag om 19:54:20
Toon hier je nieuwe (model-) spooraanwinst(en)... door arnout
Vandaag om 19:53:27
Mijn eerste H0-modeltreinbaan in aanbouw door Wim Vink
Vandaag om 19:52:07
Punt- en hartstukken door Klaas Zondervan
Vandaag om 19:41:21
MARDEC, de Multifunctionele ARduino dcc DECoder. door bord4kop
Vandaag om 19:34:37
De (3d) knutsels van Ronald. door gdh
Vandaag om 19:22:56
Piko NS 2015 stroomafname probleem door Ben
Vandaag om 19:08:30
Bauarbeiten im gange door ruudns
Vandaag om 18:50:26
HSM D1715 door vpeters1984
Vandaag om 17:34:25
Beekdaelen in H0 door Stieven76
Vandaag om 17:17:41
Al mijn goede ideeën... door Monobrachius
Vandaag om 17:10:33
Gebruik je Arduino zonder te "programmeren" ;) door Rsd1000
Vandaag om 17:07:59
Ombouw/Pimpen Bolle neuzen door bollen neus
Vandaag om 15:58:15
Kleine Baan in H0 (≤ 0.5m²) door Jack Black (NS1220)
Vandaag om 15:06:14
U-vorm beperkte ruimte (H0 C-rails) door Jelmer
Vandaag om 14:58:04
Onlangs gespot - gefotografeerd, de links door Jeroen Water
Vandaag om 14:33:00
N spur scenery elementen maken van gips of klei? door Dave.......
Vandaag om 14:30:06
De overeenkomst tussen een Ovaalramer en een Motorpost. door RK
Vandaag om 14:28:54
BMB-Module: “Corfe Castle Station” door Hans van de Burgt
Vandaag om 14:07:52
welk jaar ging Marklin OVP voor wagons van blauw naar wit door Railman
Vandaag om 13:40:42
GSS Jubileumbaantje (0e / 0n30) door MacArthur
Vandaag om 12:55:30
NTM P1 in Schaal-1 door MaraNCS
Vandaag om 11:39:38
Rio Grande Southern - Lizard Head Pass door Hans GJ
Vandaag om 11:30:20
  

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

Joost O

  • Offline Offline
  • Berichten: 630
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: 2617
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

  • Gast
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: 630
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

  • Gast
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: 2083
    • 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 »
El Carrilet
"te dom om te poepen"
MH

bask185

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

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

Joost O

  • Offline Offline
  • Berichten: 630
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: 2083
    • 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 »
El Carrilet
"te dom om te poepen"
MH