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

Onze Nederlandse Stoomlocomotieven (nieuwe druk) door R v/d Hoven
Vandaag om 09:24:48
Mijn eerste H0-modeltreinbaan in aanbouw door Wim Vink
Vandaag om 09:16:55
Hengelo in 1981-1982, maar dan anders: Kassenberg in N door Jeroen Water
Vandaag om 08:53:16
Internationale Spoor 0 en 1 dagen in Gießen, 23 en 24 maart, 2024 door bernhard67
Vandaag om 08:42:53
Variaties op Station Zetten Andelst in HO door tothebeach
Vandaag om 08:21:31
US diorama in H0 door Jelmer
Vandaag om 08:19:18
De Hondsrugbaan door mass am see
Vandaag om 08:15:11
Pfarrerwinkel bahn door Jelmer
Vandaag om 08:00:19
M.s.v. De Percee bouwt aan nieuwe clubbaan door J. Moors
Vandaag om 01:00:05
30 maart Modelspoorbeurs Houten & HCC Kennisdag door WimM
Vandaag om 00:42:50
Raadplaatje door Magic
27 maart 2024, 23:27:03
Ronald en Wanda's "Southern Comfort" swamp layout! door Ronald Halma
27 maart 2024, 23:17:30
Rio Grande Southern - Lizard Head Pass door Rody v. G.
27 maart 2024, 23:03:46
Al mijn goede ideeën... door MartinRT
27 maart 2024, 22:57:39
Bouw van materieel 40 treinstellen door Pauldg
27 maart 2024, 22:45:06
Martijn's rariteitenkabinet door Martijn193
27 maart 2024, 22:30:17
Beekdaelen in H0 door Link
27 maart 2024, 22:17:23
Les Billards du Vivarais door Hans1963
27 maart 2024, 22:08:52
"Litter Bin" voor Brits spoor en Britse modelspoorprojecten door BrightonBelle
27 maart 2024, 21:57:24
Bauarbeiten im gange door puntenglijder
27 maart 2024, 21:57:02
Kleine Baan in H0 (≤ 0.5m²) door Jack Black (NS1220)
27 maart 2024, 21:47:16
Lima Koploper ombouwen door Menno 1846
27 maart 2024, 21:31:51
Piko NS 2015 stroomafname probleem door brutus
27 maart 2024, 21:16:45
Zwederbaan door nighttrain1
27 maart 2024, 20:44:09
De overeenkomst tussen een Ovaalramer en een Motorpost. door FritsT
27 maart 2024, 20:31:09
opbouw treinbaan weer opgepakt door teun van drunen
27 maart 2024, 19:21:25
NTM P1 in Schaal-1 door FritsT
27 maart 2024, 18:59:12
PB models: koplopers (voorbespreking) door Marnit
27 maart 2024, 18:58:04
Aachenau West door 741230
27 maart 2024, 18:55:45
Gebruik je Arduino zonder te "programmeren" ;) door bask185
27 maart 2024, 18:22:53
  

Auteur Topic: Arduino en H-Brug, hoe schakelen?  (gelezen 2598 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: 4003
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