/* 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 richtingunsigned long richting = 0; // rijrichtingfloat snelheid = 0; // huidige snelheidfloat gewensteSnelheid = 0; // gewenste snelheidfloat acceleratie = acceleratieStap;int richtingPin[] {richtingPin1,richtingPin2}; // pinnen voor vooruit en achteruit (PWM pinnen)// Arrays voor instellingen per rijrichtingint rijSnelheid[]{snelheidTerug, snelheidHeen}; // maximale snelheden per richtingdouble rijtijd[] {1000*rijtijdTerug, 1000*rijtijdHeen}; // rijtijden per richtingbool optrekken[] {optrekkenTerug, optrekkenHeen}; // optrekken j/ndouble wachttijd[] {1000*wachttijdVertrekpunt, 1000*wachttijdBestemming}; // wachttijden stroomloos// Overige variabelenint t=0; // algemene teller voor for... loopsint 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 ----------------
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.
Is het niet simpeler om gewoon een complete H brug te kopen die dingen kosten geen drol.
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.
uitgang A B---------------------kortsluiting H Hlinksom L Hrechtsom H Lstop L L
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?
- 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.
Code: [Selecteer]#define rijtijdHeen 13 // tijd in seconden op volle snelheid heenweg
#define rijtijdHeen 13 // tijd in seconden op volle snelheid heenweg
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)
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.
Beste JoostKijk 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.
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...
Ik zal me eens in de L298N gaan verdiepen.
Hoe zou dat gaan (automatisch dan)? Met relais?