Doel:€250.00
Donaties:€88.00

Per saldo:€-162.00

Steun ons nu!

Laatst bijgewerkt
op 03-06-2025

Vacature: secretaris bestuur
Algemeen

De stichting

Recente berichten

Nahmertaler Kleinbahn door Lucien
Vandaag om 07:19:44
Polderbaan(tje) 0,3m2 door Lucien
Vandaag om 07:15:38
Toon hier je nieuwe (model-) spooraanwinst(en)... door grossraumwagen
Vandaag om 07:06:54
20 jaar BNLS door Jeroen Water
Vandaag om 06:29:38
Reactiveren van de 0N30 Mumby Lumber baan (ex-JD) by Ronald door Ronald Halma
Vandaag om 01:21:57
AI is (gelukkig) nog niet perfect door Joz
23 June 2025, 23:43:11
Plan E - 2023 oplage door jandcargo
23 June 2025, 23:36:04
Depot + vervolg Vlieringen-2 door Hans Reints
23 June 2025, 23:16:02
Bahnstrecke 5867 door Wim Vink
23 June 2025, 23:03:37
Draadbreuk in draaischijf aandrijving door saskia
23 June 2025, 23:01:56
Mijn eerste H0-modeltreinbaan in aanbouw door Wim Vink
23 June 2025, 22:57:45
lais dcc decoder aan sluiten door Biesje
23 June 2025, 22:25:45
Station Roodeschool door Huup
23 June 2025, 22:16:37
Lichtprintjes NS2400 door patrick
23 June 2025, 21:51:00
Bouw spoor nul modulebaan, Bahnhof Königshofen, tijdperk III door bernhard67
23 June 2025, 21:42:38
Raadplaatje door Keska
23 June 2025, 21:41:02
Piko NS1100, materieelbespreking door cor_b
23 June 2025, 21:30:55
Een nieuw begin door dreezy
23 June 2025, 21:23:23
Rails roestig verven door ruudns
23 June 2025, 19:34:43
Cranicher Altbahn door Arjen52
23 June 2025, 19:21:49
Klein baantje 1200x1200mm door Prutsert
23 June 2025, 19:12:10
Mallnitzer Tauernbahnstrecke ÖBB N Spoor door Frank103
23 June 2025, 18:44:14
Ombouw/Pimpen Bolle neuzen door bollen neus
23 June 2025, 17:39:36
BR-18.6 Schaal-0. door FritsT
23 June 2025, 16:35:45
ESU Lokpilot 5 loc 'vliegt weg' door Zillertalbahn002
23 June 2025, 16:31:44
Railcom zender bouwen door AP3737
23 June 2025, 16:19:27
Roco bd218 162-6 doet 't niet meer door Ronald69
23 June 2025, 16:10:55
onderzoeksrapport ontsporing Ertstrein door VictorPM
23 June 2025, 14:45:42
Mitteldorf, baan in H0, DR tp III door bask185
23 June 2025, 14:35:23
US diorama in H0 door MOVisser
23 June 2025, 13:19:12
  

Auteur Topic: Analoge modelbaansturing met Arduino, variatie op het thema  (gelezen 3972 keer)

dickkoning

  • Offline Offline
  • Berichten: 140
Analoge modelbaansturing met Arduino, variatie op het thema
« Gepost op: 19 August 2015, 14:05:44 »
Hallo

op dit forum heeft Paul Smits het onderwerp "Analoge modelbaansturing met arduino" opgestart
Geïnspireerd door zijn voorbeeld heb ik ook een analoge testbaan met arduino besturing gebouwd

In dit draadje wil ik eea gaan beschrijven en hopelijk met jullie input verder gaan uitbouwen
Uiteraard is alles "Work in Progress"
Momenteel is het testbaantje nog super simpel





Ook de arduino hardware is eenvoudig van opzet





De hardware bestaat uit een oude fleischmann trafo, een arduino nano, een LM298 motorshield, een ULN 2803 tbv wisselsturing en een 2 tal TRCT5000 lichtsluisjes.
5 volt voor de arduino etc  wordt gegenereerd door een dc-dc converter omdat de gelijkgerichte wisselspanning van de transformator toch in de orde van 18-20 Volt zit. Genoeg om de ingebouwde regulators van de arduino en het het motorshield op te blazen.   :( :( :(
Indien gewenst zal ik het schema wel op papier zetten maar eea is erg standaard

Software en een filmpje van het resultaat komen in de volgende post   :P
« Laatst bewerkt op: 19 August 2015, 16:38:13 door Bert van Gelder. Reden: Titel »

dickkoning

  • Offline Offline
  • Berichten: 140
Re: Analoge modelbaansturing met arduino, variatie op het thema
« Reactie #1 Gepost op: 19 August 2015, 14:18:47 »
De software
//Keyboard Controls:
// 1 -Motor 1 Left // 2 -Motor 1 Stop // 3 -Motor 1 Right
// 4 -Motor 2 Left // 5 -Motor 2 Stop // 6 -Motor 2 Right
// Declare L298N Dual H-Bridge Motor Controller directly since there is not a library to load.


// motorsturing

const int dir1PinA = 2;  // motor driver
const int dir2PinA = 3;  // motor driver
const int speedPinA = 9; // Needs to be a PWM pin to be able to control motor speed
int  speed = 100;        // default speed
bool richting = true;    // richting true = forward  false = backward

// IR sensor
const int led1 = 7;      // de pin van de IR led
const int led2 = 8;
const int sensor1 = A1;  //de pin van de 1e ir sensor
const int sensor2 = A2; // de pin van de 2e ir sensor

int waarde1 = 0;
int waarde2 = 0;


// wisselschakelaar
const int wissel1R = 11;  // wissel 1
const int wissel1L = 10;

// potmeter
const int pot = A0;     //de pin van de potmeter
int potspeed = 0;       //de ingestelde snelheid mbv de potmeter

// switches
bool potmeter = true;
int teller = 0;

// timers
long snelheidTimer = 0;  // timer voor optrekken  afremmen  pauze routines
long sensorTimer1 = 0;   // timer voor sensor1 timeout
long sensorTimer2 = 0;   // timer voor sensor2 timeout

// status variabelen
int stationState = 0; // 0  geen actie  1 remmen 2 wachten 3 optrekken
int blokState = 0;   // 0 geen actie  1 remmen  2 wachten 3 optrekken




void setup() {
  // Setup runs once per reset
  // initialize serial communication @ 9600 baud:
  Serial.begin(9600);


  //Define Pins
  pinMode(dir1PinA, OUTPUT);
  pinMode(dir2PinA, OUTPUT);
  pinMode(speedPinA, OUTPUT);

  pinMode (sensor1, INPUT_PULLUP);
  pinMode (sensor2, INPUT_PULLUP);

  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);

  pinMode (pot, INPUT);

  pinMode (wissel1R, OUTPUT);
  pinMode (wissel1L, OUTPUT);

  // start forward met default speed
  analogWrite(speedPinA, speed);  //Sets speed variable via PWM
  digitalWrite(dir1PinA, LOW);
  digitalWrite(dir2PinA, HIGH);


}

void loop() {

  // Initialize the Serial interface:
  if (Serial.available() > 0) {
    keyboardControl(Serial.read());
  }

  if (richting) {  // de trein rijdt vooruit
    if  (leesSensor1())  {   //   indien sensor 1 positief :rem de trein af, pauzeer , start de trein op (station) schakel de pot meter even uit
      potmeter = false;
      stationState = 1;
    }

    if (leesSensor2() )   {  // de trein gaat vooruit tel bv 3 rondjes, zet dan de wissel om naar station
      ++teller;
      if (teller > 3) {   // eventueel testen of het station leeg is
        wissel1Rechts();
        teller = 0;
      }
    }
  }
  else  {  // de trein rijdt achteruit
    if (leesSensor2()) {     // de trein passeert de sensor achteruit, remt, wissel gaat om en trein gaat weer vooruit
      blokState = 1;
      potmeter = false;
    }
  }

  if (stationState > 0) Station();
  if (blokState > 0) Blok();
  if (potmeter) leesPot();

}




bool Optrekken() {
  bool b = false; // b=false : trein trekt niet verder op (snelheid bereikt)
  if (speed < potspeed) {
    b = true;
    if (millis() - snelheidTimer > 100) {
      speed = speed + 10;
      if (speed > potspeed) speed=potspeed;
      snelheidTimer = millis();
      analogWrite(speedPinA, speed);
    }
  }
  return b;
}

bool Remmen() {
  bool b = false; // b=false : trein remt niet verder af (snelheid bereikt)
  if (speed > 0) {
    b = true;
    if (millis() - snelheidTimer > 100) {
      speed = speed - 10;
      if (speed <0) speed=0;
      snelheidTimer = millis();
      analogWrite(speedPinA, speed);
    }
  }
  return b;
}

void Station() {
  bool b = true;

  switch (stationState) {

    case 1:
      b = Remmen();   // de functie remmen vermindert de snelheid van de trein tot 0, return= false als snelheid 0 is
      if (!b) {
        stationState = 2;
        wissel1Links();
      }
      break;

    case 2:
      if (millis() - snelheidTimer > 10000) {

        if (richting == true) {                  // draai de rijrichting om
          analogWrite(speedPinA, 0);
          digitalWrite(dir1PinA, HIGH);
          digitalWrite(dir2PinA, LOW);
          richting = false;
        }

        // eventuele toets om te kijken of de trein kan vertrekken ( volgende blok vrij bv)
        snelheidTimer = millis();
        stationState = 3;
        wissel1Rechts();
      }
      break;

    case 3:
      b = Optrekken();
      if (!b) {
        stationState = 0;
        potmeter = true;
      }
      break;
  }
}

void Blok() {
  bool b = true;

  switch (blokState) {

    case 1:
      b = Remmen();   // de functie remmen vermindert de snelheid van de trein tot 0, return= false als snelheid 0 is
      if (!b) {
        blokState = 2;
        wissel1Links();
      }
      break;

    case 2:
      if (millis() - snelheidTimer > 1000) {

        if (richting == false) {                  // draai de rijrichting om
          analogWrite(speedPinA, 0);
          digitalWrite(dir1PinA, LOW);
          digitalWrite(dir2PinA, HIGH);
          richting = true;
        }

        // eventuele toets om te kijken of de trein kan vertrekken ( volgende blok vrij bv)
        snelheidTimer = millis();
        blokState = 3;
      }
      break;

    case 3:
      b = Optrekken();
      if (!b) {
        blokState = 0;
        potmeter = true;
      }
      break;
  }
}



void wissel1Rechts() {
  digitalWrite (wissel1R, 1);
  delay(150);
  digitalWrite (wissel1R, 0);
}

void wissel1Links() {
  digitalWrite (wissel1L, 1);
  delay(150);
  digitalWrite (wissel1L, 0);
}


void leesPot() {
  potspeed = map(analogRead(pot), 0, 1023, 0, 255);
  if ((speed - potspeed) > 3 || (potspeed - speed) > 3) {
    speed = potspeed;
    analogWrite(speedPinA, speed);
    //Serial.print("Motor 1 Speed "); Serial.println(speed);
   // Serial.println(" ");
  }
}

bool leesSensor1() {
  bool b = false;
  if (millis() - sensorTimer1 > 1000) { // na activatie van de sensor is die 1 sec niet meer te triggeren
    digitalWrite (led1, HIGH);
    waarde1 = analogRead(sensor1);
    delay(1);
    digitalWrite (led1, LOW);
    waarde2 = analogRead(sensor1);

    if ((waarde1 - waarde2) > 150) {  // arbitraire waarde fine tunen nodig
      b = true;
      sensorTimer1 = millis();
    }
  }
  return b;
}

bool leesSensor2() {
  bool b = false;
  if (millis() - sensorTimer2 > 1000) { // na activatie van de sensor is die 1 sec niet meer te triggeren
    digitalWrite (led2, HIGH);
    waarde1 = analogRead(sensor2);
    delay(1);
    digitalWrite (led2, LOW);
    waarde2 = analogRead(sensor2);

    if ((waarde1 - waarde2) > 150) {  // arbitraire waarde fine tunen nodig
      b = true;
      sensorTimer2 = millis();
    }
  }
  return b;
}

void keyboardControl(int inByte) {

  switch (inByte) {

    case '1': // Motor 1 Forward
      analogWrite(speedPinA, speed);  //Sets speed variable via PWM
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, HIGH);
      richting = true;
      Serial.println("Motor 1 Forward");
      Serial.println(" ");
      break;

    case '2': // Motor 1 Stop (Freespin)
      analogWrite(speedPinA, 0);
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, HIGH);
      richting = true;
      Serial.println("Motor 1 Stop");
      Serial.println(" ");
      break;

    case '3': // Motor 1 Reverse
      analogWrite(speedPinA, speed);
      digitalWrite(dir1PinA, HIGH);
      digitalWrite(dir2PinA, LOW);
      richting = false;
      Serial.println("Motor 1 Reverse");
      Serial.println(" ");
      break;


    case '+': // Motor 1 speed +
      if (speed < 255) ++speed;
      analogWrite(speedPinA, speed);
      Serial.print("Motor 1 Speed "); Serial.println(speed);
      Serial.println(" ");
      break;

    case '-': // Motor 1 speed +
      if (speed > 200) --speed;
      analogWrite(speedPinA, speed);
      Serial.print("Motor 1 Speed "); Serial.println(speed);
      Serial.println(" ");
      break;

    case 'l': //  wissel links
      wissel1Links();
      Serial.print("Wissel links");
      Serial.println(" ");
      break;

    case 'r': //  wissel rechts
      wissel1Rechts();
      Serial.print("Wissel rechts");
      Serial.println(" ");
      break;

  }



}


In opzet een erg simpele dienstregeling:

trein stopt bij station, keert om, gaat naar hoofdspoor, keert om, rijdt 3 rondjes, gaat naar station   ???

Volgende fase 2 treintjes, 2 stations





Bert van Gelder

  • Offline Offline
  • Berichten: 4385
Re: Analoge modelbaansturing met Arduino, variatie op het thema
« Reactie #2 Gepost op: 19 August 2015, 16:43:43 »
Leuk dat je je experiment wilt delen!

Wat is voor jou de reden dat je met Arduino aan het experimenteren bent geweest?

Gr, Bert

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4656
Re: Analoge modelbaansturing met arduino, variatie op het thema
« Reactie #3 Gepost op: 19 August 2015, 17:54:13 »
Hoi Dick,

Altijd leuk om andere bezig te zien. Mag ik je alleen toch een paar tips geven?

Allereerst het maken van iets logischere variabelenamen. Het is logischer om een eits langere naam te gebruiken waarvan je gelijk snapt wat het doet dan een korte naam. Iets als waarde1 is nogal een niets zeggende variabele. Nu weet jij precies wat het doet maar stop je even en ga je over een maandje weer verder kan zo'n variabele toch echt wel wat moeite kosten.

Kom ik gelijk aan volgende punt, declareer variabele waar ze nodig zijn. Je gebruikt de variabele waarde1 en waarde2 alleen voor de sensor uitlezing, waarom declareer je ze niet daar? Dan is de variabel naam al een stuk logischer.

Gaat eigenlijk vooral om het slimmer schrijven van functies. Je hebt nu een aantal functies die eigenlijk een volledige copy past van elkaar zijn. (leesSensor 1 en leessenson2 of wissel1Links en wissel2Rechts.) Eigenlijk kan je als vuistregel houden als je heel veel dingen schrijft die erg op elkaar lijken er een makkelijkere manier is om het te doen. Voorbeeld voor de sensoren is:
const byte SensorPinnen[] = {A1, A2}; //Pinnen van de lichtsluis sensoren
const byte LedPinnen[] = {7, 8};      //Pinnen van de ledjes voor de lichtsluizen
unsigned int sensorTimers[sizeof(SensorPinnen)];//Timers voor de sensoren (int omdat <65sec)

bool leesSensor(byte nummer){
  unsigned int millisNow = millis(); //omdat we intervallen van minder dan 65sec bekijken gaan we naar een uint
  int waardes[2];
 
  if (millisNow - sensorTimers[nummer] > 1000) { // na activatie van de sensor is die 1 sec niet meer te triggeren
    //Bekijken met led aan en led uit
    digitalWrite (LedPinnen[nummer], HIGH);
    waardes[0] = analogRead(SensorPinnen[nummer]);
    //delay(1); //lijkt me niet nodig
    digitalWrite (LedPinnen[nummer], LOW);
    waardes[1] = analogRead(SensorPinnen[nummer]);

    if ((waardes[0] - waardes[1]) > 150) {  // arbitraire waarde fine tunen nodig
      sensorTimers[nummer] = millisNow;
      return true;
    }
  }
  return false;
}
Op deze manier is het schaalbaar naar oneindig veel sensoren door alleen de pinnen toe te voegen. Er is een functie voor alle sensoren met als input het nummer van de sensor (natuurlijk nu startende bij 0).

Zelfde kan je doen voor wissels. Maar daar zou ik nog iets meer werk in stoppen om van de delay af te komen....

Ook alle dingen voor de motorsturing zou ik in losse functies onder brengen. Dit scheelt weer code als je de motor aan wilt sturen. Een library/classe kan het nog simpeler maken. Je zou hiervoor de AamsTrein library kunnen gebruiken. Ik heb hem even als library online gezet. Ik heb hem eigenlijk niet getest (heb geen LM298 / niet met de scope gekeken  ::) ) maar het moet je een idee geven.

Nog klein puntje, alle variabele voor pinnen mogen ook een byte zijn. Dit scheelt weer wat geheugen. Ook vind ik het zelf altijd handig om voor constante (wat je hier prima toepast  (y) ) de naam te laten beginnen met een hoofdletter (cont byte ConstantVariableNaam) om me te helpen herinneren dat ik er niet naar kan schrijven.

Ook zou ik voor serial gewoon de volle bak gaan. Dus Serial.begin(115200).


Ik hoop dat je hier wat mee kunt :) Succes verder en ik zla het blijven volgen.


Timo
Verzonden vanaf mijn desktop met Firefox

dickkoning

  • Offline Offline
  • Berichten: 140
Re: Analoge modelbaansturing met Arduino, variatie op het thema
« Reactie #4 Gepost op: 19 August 2015, 19:26:12 »
hallo

@Timo: je hebt gelijk, ik ben nog niet zo gewend met array's te werken maar het is natuurlijk veel makkelijker om op te schalen
Gelukkig heeft de nano maar 5 analoge pinnen.  Ik neem je commentaar mee in de volgende versie van de code
Harde delay in de aansturing van de wissel heb ik als veiligheid opgenomen ::)

@Bert: ik heb met een Multimaus en de digitale interfaces van Rosoft heel gemakkelijk een DCC baantje kunnen bouwen.
Werkt prima maar is vooral een kwestie van goed lezen wat er in de handleidingen staat
Arduino is een leuke manier om te kijken of het ook anders kan.  Hardware is heel makkelijk verkrijgbaar en met wat fantasie knoop je allerlei zaken aan elkaar  De uitdaging die ik me zelf gesteld heb is een baantje waarin autonoom 2 treintjes rijden

dickkoning

  • Offline Offline
  • Berichten: 140
Re: Analoge modelbaansturing met Arduino, variatie op het thema
« Reactie #5 Gepost op: 19 August 2015, 20:45:09 »
de besturing in actie   ;D

<a href="https://www.youtube.com/v/HqNdlAGVY90" target="_blank" class="new_win">https://www.youtube.com/v/HqNdlAGVY90</a>
« Laatst bewerkt op: 19 August 2015, 21:15:53 door dickkoning »

Klaas Zondervan

  • Online Online
  • Berichten: 26577
    • Pagina van klaas
Re: Analoge modelbaansturing met Arduino, variatie op het thema
« Reactie #6 Gepost op: 19 August 2015, 20:53:04 »
Ik zie niet veel actie. Krijg een boodschap: Meld je aan om deze video te bekijken. Zo krijg je geen hoge kijkcijfers. ;D
Projecten:
Dubbelom
Halte Assel
Geluk, dat is vooraan staan als de overweg gesloten is.

dickkoning

  • Offline Offline
  • Berichten: 140
Re: Analoge modelbaansturing met Arduino, variatie op het thema
« Reactie #7 Gepost op: 19 August 2015, 20:56:40 »
is ook een erg saai filmpje ;D
zal eea gaan uitzoeken

Klaas Zondervan

  • Online Online
  • Berichten: 26577
    • Pagina van klaas
Re: Analoge modelbaansturing met Arduino, variatie op het thema
« Reactie #8 Gepost op: 19 August 2015, 21:15:58 »
Nu werkt het wel. Inderdaad doodsaai. ;D
Projecten:
Dubbelom
Halte Assel
Geluk, dat is vooraan staan als de overweg gesloten is.

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4656
Re: Analoge modelbaansturing met Arduino, variatie op het thema
« Reactie #9 Gepost op: 19 August 2015, 21:51:29 »
Leuk leuk, goed begin :)

Vink in YouTube alleen nog ff het beeldstabilisatie effect aan ;)

En harde delay, tja, die gaat later altijd voor problemen zorgen ;)


Timo
Verzonden vanaf mijn desktop met Firefox

dickkoning

  • Offline Offline
  • Berichten: 140
Re: Analoge modelbaansturing met Arduino, variatie op het thema
« Reactie #10 Gepost op: 20 August 2015, 00:11:57 »
Hallo

@Timo
De eerste verbeterde versie van de arduino code
Nog niet alle suggesties verwerkt maar dat gaat nog wel komen   ::)
Moet nog even wennen aan de array constructies, volgende stap de library

// Arduino analoge modelbaan besturing  vs 1a
// Dick koning augustus 2015

//Keyboard Controls:
// 1 -Motor 1 Left // 2 -Motor 1 Stop // 3 -Motor 1 Right
// 4 -Motor 2 Left // 5 -Motor 2 Stop // 6 -Motor 2 Right
// Declare L298N Dual H-Bridge Motor Controller directly since there is not a library to load.


// motorsturing

const int dir1PinA = 2;  // motor driver
const int dir2PinA = 3;  // motor driver
const int speedPinA = 9; // Needs to be a PWM pin to be able to control motor speed
int  speed = 100;        // default speed
bool richting = true;    // richting true = forward  false = backward

// IR sensor

const byte SensorPinnen[] = {A1, A2}; //Pinnen van de lichtsluis sensoren
const byte LedPinnen[] = {7, 8};      //Pinnen van de ledjes voor de lichtsluizen


// wisselschakelaar
const byte WisselPinnen[] = {10, 11}; // Pinnen van de wisselsturing   1L, 1R etc


// potmeter
const int pot = A0;     //de pin van de potmeter
int potspeed = 0;       //de ingestelde snelheid mbv de potmeter

// switches
bool potmeter = true;
int teller = 0;

// timers
long snelheidTimer = 0;  // timer voor optrekken  afremmen  pauze routines
unsigned int sensorTimers[sizeof(SensorPinnen)];//Timers voor de sensoren (int omdat <65sec), size off definieert de lengte van de array


// status variabelen
int stationState = 0; // 0  geen actie  1 remmen 2 wachten 3 optrekken
int blokState = 0;   // 0 geen actie  1 remmen  2 wachten 3 optrekken




void setup() {
  // Setup runs once per reset
  // initialize serial communication @ 115200 baud:
  Serial.begin(115200);


  //Define Pins
  pinMode(dir1PinA, OUTPUT);
  pinMode(dir2PinA, OUTPUT);
  pinMode(speedPinA, OUTPUT);

  for ( int i = 0 ; i < sizeof(SensorPinnen); i++) {
    pinMode (SensorPinnen[i], INPUT_PULLUP);
    pinMode (LedPinnen[i], OUTPUT);
  }


  for ( int i = 0 ; i < sizeof(WisselPinnen); i++) {
    pinMode (WisselPinnen[i], OUTPUT);
  }

  pinMode (pot, INPUT);

  // start forward met default speed
  analogWrite(speedPinA, speed);  //Sets speed variable via PWM
  digitalWrite(dir1PinA, LOW);
  digitalWrite(dir2PinA, HIGH);


}

void loop() {

  // Initialize the Serial interface:
  if (Serial.available() > 0) {
    keyboardControl(Serial.read());
  }

  if (richting) {  // de trein rijdt vooruit
    if  (leesSensor(0))  {   //   indien sensor 1 positief :rem de trein af, pauzeer , start de trein op (station) schakel de pot meter even uit
      potmeter = false;
      stationState = 1;
    }

    if (leesSensor(1) )   {  // de trein gaat vooruit tel bv 3 rondjes, zet dan de wissel om naar station
      teller++;
      if (teller > 2) {   // eventueel testen of het station leeg is
        wissel(1);        // wissel R
        teller = 0;
      }
    }
  }
  else  {  // de trein rijdt achteruit
    if (leesSensor(1)) {     // de trein passeert de sensor achteruit, remt, wissel gaat om en trein gaat weer vooruit
      blokState = 1;
      potmeter = false;
    }
  }

  if (stationState > 0) Station();
  if (blokState > 0) Blok();
  if (potmeter) leesPot();

}




bool Optrekken() {
  bool b = false; // b=false : trein trekt niet verder op (snelheid bereikt)
  if (speed < potspeed) {
    b = true;
    if (millis() - snelheidTimer > 100) {
      speed = speed + 5;
      if (speed > potspeed) speed = potspeed;
      snelheidTimer = millis();
      analogWrite(speedPinA, speed);
    }
  }
  return b;
}

bool Remmen() {
  bool b = false; // b=false : trein remt niet verder af (snelheid bereikt)
  if (speed > 0) {
    b = true;
    if (millis() - snelheidTimer > 100) {
      speed = speed - 5;
      if (speed < 0) speed = 0;
      snelheidTimer = millis();
      analogWrite(speedPinA, speed);
    }
  }
  return b;
}

void Station() {
  bool b = true;

  switch (stationState) {

    case 1:
      b = Remmen();   // de functie remmen vermindert de snelheid van de trein tot 0, return= false als snelheid 0 is
      if (!b) {
        stationState = 2;
        wissel(0);  // wissel 1 l
      }
      break;

    case 2:
      if (millis() - snelheidTimer > 10000) {

        if (richting == true) {                  // draai de rijrichting om
          analogWrite(speedPinA, 0);
          digitalWrite(dir1PinA, HIGH);
          digitalWrite(dir2PinA, LOW);
          richting = false;
        }

        // eventuele toets om te kijken of de trein kan vertrekken ( volgende blok vrij bv)
        snelheidTimer = millis();
        stationState = 3;
        wissel(1);  // wissel 1 r
      }
      break;

    case 3:
      b = Optrekken();
      if (!b) {
        stationState = 0;
        potmeter = true;
      }
      break;
  }
}

void Blok() {
  bool b = true;

  switch (blokState) {

    case 1:
      b = Remmen();   // de functie remmen vermindert de snelheid van de trein tot 0, return= false als snelheid 0 is
      if (!b) {
        blokState = 2;
        wissel(0);  // wissel l
      }
      break;

    case 2:
      if (millis() - snelheidTimer > 1000) {

        if (richting == false) {                  // draai de rijrichting om
          analogWrite(speedPinA, 0);
          digitalWrite(dir1PinA, LOW);
          digitalWrite(dir2PinA, HIGH);
          richting = true;
        }

        // eventuele toets om te kijken of de trein kan vertrekken ( volgende blok vrij bv)
        snelheidTimer = millis();
        blokState = 3;
      }
      break;

    case 3:
      b = Optrekken();
      if (!b) {
        blokState = 0;
        potmeter = true;
      }
      break;
  }
}


void wissel(byte n) {
  digitalWrite (WisselPinnen[n], 1);
  delay(150);
  digitalWrite (WisselPinnen[n], 0);
  //Serial.Print("Wissel ");Serial.println(n);
}


void leesPot() {
  potspeed = map(analogRead(pot), 0, 1023, 0, 255);
  if ((speed - potspeed) > 3 || (potspeed - speed) > 3) {
    speed = potspeed;
    analogWrite(speedPinA, speed);
    //Serial.print("Motor 1 Speed "); Serial.println(speed);
  }
}

bool leesSensor(byte nummer) {
  unsigned int millisNow = millis(); //omdat we intervallen van minder dan 65sec bekijken gaan we naar een uint
  int waardes[2];

  if (millisNow - sensorTimers[nummer] > 1000) { // na activatie van de sensor is die 1 sec niet meer te triggeren
    //Bekijken met led aan en led uit
    digitalWrite (LedPinnen[nummer], HIGH);
    waardes[0] = analogRead(SensorPinnen[nummer]);
    delay(1); //lijkt me niet nodig
    digitalWrite (LedPinnen[nummer], LOW);
    waardes[1] = analogRead(SensorPinnen[nummer]);

    if ((waardes[0] - waardes[1]) > 150) {  // arbitraire waarde fine tunen nodig
      sensorTimers[nummer] = millisNow;
      // Serial.print("Sensor ");Serial.println(nummer);
      return true;
    }
  }
  return false;
}


void keyboardControl(int inByte) {

  switch (inByte) {

    case '1': // Motor 1 Forward
      analogWrite(speedPinA, speed);  //Sets speed variable via PWM
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, HIGH);
      richting = true;
      Serial.println("Motor 1 Forward");
      Serial.println(" ");
      break;

    case '2': // Motor 1 Stop (Freespin)
      analogWrite(speedPinA, 0);
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, HIGH);
      richting = true;
      Serial.println("Motor 1 Stop");
      Serial.println(" ");
      break;

    case '3': // Motor 1 Reverse
      analogWrite(speedPinA, speed);
      digitalWrite(dir1PinA, HIGH);
      digitalWrite(dir2PinA, LOW);
      richting = false;
      Serial.println("Motor 1 Reverse");
      Serial.println(" ");
      break;


    case '+': // Motor 1 speed +
      if (speed < 255) ++speed;
      analogWrite(speedPinA, speed);
      Serial.print("Motor 1 Speed "); Serial.println(speed);
      Serial.println(" ");
      break;

    case '-': // Motor 1 speed +
      if (speed > 200) --speed;
      analogWrite(speedPinA, speed);
      Serial.print("Motor 1 Speed "); Serial.println(speed);
      Serial.println(" ");
      break;

    case 'l': //  wissel links
      wissel(0);
      Serial.print("Wissel links");
      Serial.println(" ");
      break;

    case 'r': //  wissel rechts
      wissel(1);
      Serial.print("Wissel rechts");
      Serial.println(" ");
      break;

  }



}

@Klaas
de bedoeling is 2 treintjes te besturen met 1 microprocessor. Dat geeft dus zo wie zo kans op een botsing, ergo een veel spannender filmpje. Gaat wel een paar weken duren ;D ;D