Modelbaanbesturing > Elektronische en digitale techniek

Pendelautomaat met Arduino - voor analoge rijders

(1/8) > >>

Rob:
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.


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


--- Einde van code ---

Rob

mark mms:
Rob is top  ;)

Bedankt.

Henry:
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.

Rob:
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

Henry:
Hallo Rob

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

Navigatie

[0] Berichtenindex

[#] Volgende pagina

Naar de volledige versie