Auteur Topic: Pendelautomaat met Arduino - voor analoge rijders  (gelezen 4133 keer)

0 leden en 1 gast bekijken dit topic.

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.367
  • Thanked: 137 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Pendelautomaat met Arduino - voor analoge rijders
« Gepost op: 22 oktober 2019, 14:40:50 »
Afgelopen Kerst had ik onder de kerstboom een pendeltreintje rijden. Dat was een eenvoudige opzet met aan één kant een stukje geïsoleerd spoor met een diode. Van hier uit werd dan een tijdje (letterlijk tijd) gereden naar de andere kant van het pendelbaantje, gestopt bij een halte en dan weer terug tot op het geïsoleerde deel.

Vandaag heb ik dat idee even wat netter uitgewerkt. Misschien omdat er enige vraag naar is  :D, maar om ook te kunnen pendelen naar en van de halte bij de Inglenook Sidings rangeerpuzzel.

Een en ander staat op film.


Het idee is dat er ruimschoots rijtijd is naar het geïsoleerde deel van de rails om zeker te stellen dat de trein daar altijd aankomt. Vanaf dit deel gaat het dan naar de andere kant van de pendelbaan volgens (vrij nauwkeurige) instellingen van snelheid en tijd om precies op de halte te komen. Het voordeel van deze opzet: er zijn geen terugmeldingen nodig. Het is wel nodig dat de trein betrouwbaar en voorspelbaar rijdt, en dat het spoor niet te lang is en/of er voldoende marge is waar gestopt wordt (lang perron).

Hier het aansluitschema van de voeding, Arduino en motorcontroller.




Dan de code. Bovenin dit programma'tje zijn de rijsnelheden en wachttijden in te stellen. "Heen" is van het geïsoleerde deel naar de halte, "Terug" is weer naar het geïsoleerde stukje spoor.

/* 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 ----------------


Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...
The following users thanked this post: PietB

Offline mark mms

  • Super Modelspoorder
  • ******
  • Berichten: 1.216
  • Thanked: 26 times
  • Geslacht: Man
Re: Pendelautomaat met Arduino - voor analoge rijders
« Reactie #1 Gepost op: 23 oktober 2019, 07:37:32 »
Rob is top  ;)

Bedankt.

Offline Henry

  • Perronmedewerker
  • **
  • Berichten: 89
  • Thanked: 4 times
  • Geslacht: Man
Re: Pendelautomaat met Arduino - voor analoge rijders
« Reactie #2 Gepost op: 23 oktober 2019, 07:46:53 »
Ziet er prima uit, ben zelf op zoek naar een simpele pendelautomaat.
Kan deze voor de voeding op een gewone trafo, helaas was de pendelautomaat bij de elektronica webshop uit verkocht.
Wat ik nu zie kan het voor mij ook prima doen, is dit te koop.

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.367
  • Thanked: 137 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Pendelautomaat met Arduino - voor analoge rijders
« Reactie #3 Gepost op: 23 oktober 2019, 17:41:10 »
Ha Mark,
Graag gedaan.

Hoi Henry,

Ja, deze pendelautomaat kan op een gewone trafo. Wissel- of gelijkstroom, dat maakt niet uit.
De onderdelen zijn allemaal te koop. Bij elkaar kost dat een kleine 20 euro (inclusief verzenden) als je dat in Nederland online koopt. Dan heb je het een dag of 2 later in huis.
Bij Ali Expres kopen kan ook. Dan zal de totaalprijs rond een tientje uit komen, maar ben je snel 6 weken verder....

Verder zul je de Ardino IDE (programma om Arduino te programmeren) op je computer moeten installeren, maar die is gratis te downloaden.

Als je dit ziet zitten, kan ik wel een lijstje opstellen.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Henry

  • Perronmedewerker
  • **
  • Berichten: 89
  • Thanked: 4 times
  • Geslacht: Man
Re: Pendelautomaat met Arduino - voor analoge rijders
« Reactie #4 Gepost op: 23 oktober 2019, 18:04:47 »
Hallo Rob

Bedankt voor je reactie, zal mijn zoon even laten kijken die is wat handigere met deze materie  :D.

Offline TrixExpressfan

  • Kruier
  • *
  • Berichten: 10
  • Thanked: 1 times
  • Geslacht: Man
  • Een echte Rotterdammer is een Spartaan
Re: Pendelautomaat met Arduino - voor analoge rijders
« Reactie #5 Gepost op: 13 januari 2022, 17:45:08 »
Hallo Rob,
Dank je voor je reactie op YouTube.
Heb je er ook een aansluitschema van gemaakt ??
Kun je dat hier nog vermelden aub.

Alvast mijn dank

MVG,
Leo Hamelinck
Lid van MSG Drechtsteden
Always look on the bright side of life

Offline PietB

  • Rangeerder
  • ****
  • Berichten: 279
  • Thanked: 7 times
  • Ik slaap slecht, maar daar lig ik niet wakker van.
Re: Pendelautomaat met Arduino - voor analoge rijders
« Reactie #6 Gepost op: 14 januari 2022, 01:36:58 »
Hele creatieve oplossing Rob.
Klasse.

grt Piet.

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.367
  • Thanked: 137 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Pendelautomaat met Arduino - voor analoge rijders
« Reactie #7 Gepost op: 14 januari 2022, 16:58:17 »
Hoi Leo,

Heb je er ook een aansluitschema van gemaakt ??

Bedoel je zoiets als dit?




Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline TrixExpressfan

  • Kruier
  • *
  • Berichten: 10
  • Thanked: 1 times
  • Geslacht: Man
  • Een echte Rotterdammer is een Spartaan
Re: Pendelautomaat met Arduino - voor analoge rijders
« Reactie #8 Gepost op: 15 januari 2022, 14:17:45 »
Hallo Rob,

Ik denk dat ik het ga snappen.
Ik was in de veronderstelling dat er aansluitingen aan de rails zaten, maar dat wordt door tijdinstellingen geregeld door de Arduino, toch?
Je ziet van Arduino is mijn kennis nog niet erg groot, helaas.
Mag ik als ik vragen heb contact met je opnemen ?

Dank voor je reactie.
En succes met een volgend project.

MVG
Leo Hamelinck
Lid van MSG Drechtsteden
Always look on the bright side of life

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.367
  • Thanked: 137 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Pendelautomaat met Arduino - voor analoge rijders
« Reactie #9 Gepost op: 16 januari 2022, 15:35:09 »
Hoi Leo

Ik was in de veronderstelling dat er aansluitingen aan de rails zaten, maar dat wordt door tijdinstellingen geregeld door de Arduino, toch?
Oh, je bedoelt de aansluiting van de rails. Een één kant van het pendeltraject is de rails is één spoorstaaf onderbroken en daaroverheen zit een diode. Dit zorgt er oor dat de trein op de 'terugweg' hier altijd stopt en alleen weer wegrijdt als de stroom is omgekeerd voor de 'heenweg'. Met deze stroomonderbreking begint elke cyclus met exact dezelfde beginsituatie. Een ingebouwd ijkpunt, zeg maar.
De uitgang van de pendelautomaat zit dan ergens in het midden van het pendeltraject.
Mag ik als ik vragen heb contact met je opnemen ?
'Tuurlijk. Hert beste kun je dan even een PB'tje (persoonlijk bericht) sturen via dit forum.

groet,
Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.367
  • Thanked: 137 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Pendelautomaat met Arduino - voor analoge rijders
« Reactie #10 Gepost op: 16 januari 2022, 16:43:26 »
Hierbij nog even de aansluiting van de pendelautomaat op de rails.



Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...