Doel:€250.00
Donaties:€95.00

Per saldo:€-155.00

Steun ons nu!

Laatst bijgewerkt
op 17-10-2019
Algemeen

De stichting

Recente berichten

Stationsplein Baden Baden door Dion
Vandaag om 10:03:48
Toon hier je nieuwe (model-) spooraanwinst(en)... door Dion
Vandaag om 09:57:17
"Litter Bin" voor Brits spoor en Britse modelspoorprojecten door RobbertJan
Vandaag om 09:55:02
Project Halleberg, een digitale tandrad pendelbaan door Marco EB
Vandaag om 09:51:00
De Hondsrugbaan, H0 door Dion
Vandaag om 09:50:32
100 jaar Zwitserse Krokodil door Dion
Vandaag om 09:49:15
Sonderzug van Centralbahn brandt deels uit door Post49
Vandaag om 09:48:22
Mijn eerste H0-modeltreinbaan in aanbouw door Wim Vink
Vandaag om 09:11:01
Baanplan voor herbeginner met een Fleischman H0 door Zilte
Vandaag om 08:34:43
Zijn alle stoomlok nummerschilden allemaal even groot? door Peter Kleton
Vandaag om 08:32:47
MODELSPOOR 2019 by MTD - 19 & 20 Oktober 2019 in EDEGEM (B) door wpinkhof
Vandaag om 08:32:40
Welke besturingssoftware kies ik? door rjr
Vandaag om 08:27:22
Blindegeleidetegels, vanaf wanneer gebruikt op de perrons? door tothebeach
Vandaag om 08:22:30
Bouw Beel + "wat reed er achter de Beel" door Rob Moerkerken
Vandaag om 07:20:00
Nieuwe busmodellen van Holland Oto in schaal 1:87 waaronder de Ambassador! door Tulpendaal
Vandaag om 06:32:48
Update: baan in de tropen door Hans Grasmaijer
Vandaag om 04:20:45
NS 8100 in 0 door FritsT
Vandaag om 00:25:35
NCS 7/8 tot NS 61 62 Maffei lok in spoor 0 door FritsT
21 oktober 2019, 23:57:21
Groterdamse projecten door Chris
21 oktober 2019, 23:35:54
Tegelpatroon voor perrons door phdirk
21 oktober 2019, 23:15:30
BNLS werkspoor NS 8100 van Werps Modelbouw door roadster36
21 oktober 2019, 23:07:25
NS 8100 in Spoor-1 door FritsT
21 oktober 2019, 22:42:59
Frans loodsje door Noordernet
21 oktober 2019, 22:21:12
Arcomora: ARLOCO bezetmelder door erikkral
21 oktober 2019, 22:20:42
Mallnitzer Tauernbahnstrecke ÖBB N Spoor door Proplus
21 oktober 2019, 22:05:26
Vorarlberg (Oostenrijkse treinbaan....n-spoor) door Proplus
21 oktober 2019, 22:03:54
Atlas G3/3 ombouwen naar rijdend model, enkele vragen.. door DE-II
21 oktober 2019, 22:01:15
Schwarzburg-Neuffen-Bahn door Proplus
21 oktober 2019, 22:00:54
BMB 00-modulebaan, Algemeen. door Pinkelpa
21 oktober 2019, 21:47:42
Onlangs gespot - gefotografeerd, de foto's door GerardvV
21 oktober 2019, 21:28:10
  

Auteur Topic: Rangeerpuzzel (Inglenook) met Arduino besturing  (gelezen 32220 keer)

Cees Baarda

  • Offline Offline
  • Berichten: 150
  • hcc!m-IG
    • hcc!m
Rangeerpuzzel (Inglenook) met Arduino besturing
« Gepost op: 10 juni 2015, 17:11:16 »
Dag allemaal

Na wat jaren te hebben meegelezen en her en der wat opmerkingen te hebben gestrooid, is het nu wel tijd om mijn project(je) aan jullie voor te stellen.

Aanleiding
Op BNLS zijn wat projecten aan de gang waarbij microcontrollers een rol spelen en dan met name die waarin gebruik gemaakt wordt van een of meerdere ARDUINO's. Een paar voorbeelden:
Timo met zijn AdServo
RudyB met Nieuwe versie Arduino DCC Servo en Functie Decoders
Smits66 met Arduino analoge(!) modelbaan sturing
NTering met  TT-baan, met Arduino aansturing
HansQ met BNLS/RCU booster

Plan
Ik wil uiteindelijk uitkomen op een Inglenook rangeerpuzzelbaantje in schaal N. Die zal digitaal bestuurd worden. Niet met een computer maar met schakelingen die al eens op BNLS getoond zijn. Ik denk aan Arduino('s) met programma('s) t.b.v.:
- wissels en ontkoppelaars bedienen
- rijregelaar - naar keuze: PWM of DCC (t.b.v. locs met decoder)

Wat heb ik al
Ik heb al rails en wissels van Peco (N code 55). Nog geen ontkoppelaars. Genoeg wagentjes en een rangeerlocomotief(DCC). De onderbouw moet nog gemaakt worden.
Een eigen ontwerp servo-besturing, de hardware en een eenvoudige Arduino sketch met hard gecodeerde firmware. Zelfs delay() ergens voor gebruikt. Dat moet natuurlijk beter opgelost worden.

Hoe ga ik dit realiseren
Allereerst wil ik mijn eigen servo besturing met een aangepaste versie van de AdServo-firmware laten werken. Dat is me deels al gelukt. Ik heb e.e.a. opgebouwd in een proefopstelling (zie onderstaande foto). Daarmee ga ik alle servo dingen testen.
Als dat klaar is, dan komt de "rijregelaar" aan de beurt.

Wordt dit een project zoals BNLS/RCU boosterhub
Absoluut niet, ik heb geen behoefte om te gaan "handelen". Ik ga wel alles met jullie delen. Als er hardware ontworpen is, komen daar Eagle- en CAM-files van op deze plek beschikbaar. Code voor de Arduino natuurlijk ook.

In de volgende posts, stapsgewijs wat er al is. En daarna in een lager tempo wat volgt.
groet Cees
« Laatst bewerkt op: 10 juni 2015, 17:13:14 door Cees Baarda »
Webmaster hcc!m - Microcontrollers (Atmel) : Arduino
Bezig met Rangeerpuzzel (Inglenook)...

Hans van de Burgt

  • BMB & EMV
  • Offline Offline
  • Berichten: 4075
    • Medway Valley Line
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #1 Gepost op: 10 juni 2015, 18:30:37 »
@Cees,

Op mijn modelbaan komt ook een Inglenook.
Zie mijn website.

Mijn mede EMV leden RudyB en Spock zijn behoorlijk actief hier op BNLS met Arduino.
Trouwens meer leden, hoor.

Zelf heb ik met Ruud de test al uitgevoerd om de Arduino als DCC decoder in te zetten in combinatie met Hornby's Railmaster/eLink als "centrale". Succesvol in ieder geval.

En over Railmaster/eLink gesproken, zie mijn proef in het koppelen en ontkoppelen met dit programma icm Kadee magneet en koppelingen. Tot op de mm nauwkeurig.
Zie: http://youtu.be/jibk1SlJb5c

Grzz, Hans
https://britsemodulebaan.wordpress.com/ (BMB-groep)
https://medwayvalleyline.wordpress.com/ (Wateringbury, Stoneham Lock en Beltring & Branbridges Halt)
http://www.eindhovenmodelbouw.nl/ (EMV)
https://maakonderwijs.wordpress.com (Techniek onderwijs)

Cees Baarda

  • Offline Offline
  • Berichten: 150
  • hcc!m-IG
    • hcc!m
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #2 Gepost op: 13 juni 2015, 11:46:47 »
Die print van mijn eerste post is nog niet helemaal zoals ik 'm in gedachten had. Timo (die van de "adServo") heeft naar mijn schema en opzet gekeken en een aantal opmerkingen gemaakt, die ik inmiddels in mijn schema heb verwerkt (zie afbeelding onderaan). De print gaat daarmee ook nog veranderen.
De firmware voor de APM, die ik in eerste instantie gemaakt had ziet er uit als volgt:
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 S e r v o   W i s s e l S t e l l e r
   
   Testprogramma voor het omzetten van een modelspoorwissel m.b.v.
   een modelbouw servo.
   Te testen:
   - 2 losse drukknoppen voor recht en afbuigend
   - 2 optocoupler ingangen; funtioneel als schakelaar, bedoeld
     voor besturing vanuit HCC!m-systeem of Dinamo OC32
   - 1 van de optocouplers moet later ook DCC kunnen verwerken
   Er wordt gebruik gemaakt van 2 servo's
   Ten behoeve van hartstukpolarisatie zijn er per servo 2 relais
   
   Werking per wissel:
   - na een wisselcommando valt eerst het aangetrokken relais af
   - daarna loopt het wissel om (servo)
   - dan komt het andere relais op
   Bij opstarten gebeurt er niets. Het hartstuk van het wissel heeft
   geen spanning en de servo staat in een ongedefinieerde stand.
   
   De gebruikte Arduino is een Pro Mini, 5V met ATmega328.
   
   Gebruikte libraries en voorbeelden:
   - code uit het Debounce-voorbeeld bestand van Arduino.cc
     http://www.arduino.cc/en/Tutorial/Debounce
   - Servo library uit Arduino - omgeving
   - adServo van Timo Engelgeer
   
   Created:   30-04-2015
   By:        Cees Baarda
   Modified: 
   By:       
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
   
   
// - - - - - L i b r a r i e s   i n   g e b r u i k :
  #include <Servo.h>   // hiermee besturen we de servo's

// - - - - - C o n s t a n t e n :
//           De pinnummers en vaste waarden een naam geven
   
// - - - - - voor wissel 1
  const int optoIn_1  = 3;  // voor externe aansturing met 0 of 1
  const int servo_1   = 9;
  // - - - - - t.b.v puntstukpolarisatie
  const int relaisR_1 = 7;
  const int relaisG_1 = 8;
  // - - - - - t.b.v. bediening met knoppen
  const int knopR_1   = 6;  // input; toets wissel recht leggen
  const int knopG_1   = 5;  // input; toets wissel gebogen leggen

// - - - - - voor wissel 2
  const int optoIn_2  = 2;  // voor externe aansturing met 0 of 1
  const int servo_2   = 10;   // output; Servo 2
  // - - - - - t.b.v puntstukpolarisatie
  const int relaisR_2 = 11;  // output; t.b.v. relais bij recht gelegd wisssel
  const int relaisG_2 = 12;  // output; t.b.v. relais bij gebogen gelegd wisssel
  // - - - - - t.b.v. bediening met knoppen
  const int knopR_2   = A2;  // input; toets wissel recht leggen
  const int knopG_2   = A0;  // input; toets wissel gebogen leggen

  // - - - - - beide wissels met DCC, nog niet in gebruik
  // const int DCC_in    = 2;  // input; de DCC-railspanning gaat hier aan

  const int LED = A1;        // LED op de print

// - - - - - nog niet in gebruik, zijn bedoeld voor extra print aan 8 polige
//           connector
  // const int LEDarduino   = 13; // LED op de arduino
  // const int LEDextern_1  = A2; // evt. extra LED op externe print (pin 4)
  // const int LEDextern_2  = A3; // evt. extra LED op externe print (pin 5)
  // const int externKnop_1 = A2; // evt. extra knop op externe print (pin 4)
  // const int externKnop_1 = A3; // evt. extra knop op externe print (pin 5)
  const long servoWacht = 500;

// - - - - - G l o b a l e   V a r i a b e l e n :
//
  Servo wisselServo1;                // 2 objecten van het type Servo
  Servo wisselServo2;
 
  // - - - - - voor wissel 1
  int relaisR1StateRecht    = LOW;   // de huidige staat van de output pin
  int relaisG1StateGebogen  = LOW;   // *
  int knopG_1State;                  // de huidige waarde van de input pin
  int lastknopG_1State      = LOW;   // de vorige waarde van de input pin
  int knopR_1State;                  // de huidige waarde van de input pin
  int lastknopR_1State      = LOW;   // de vorige waarde van de input pin
  int optoIn1State          = HIGH;  // de huidige waarde van de input pin
  int lastoptoIn1State      = HIGH;  // de vorige waarde van de input pin
 
  // - - - - - voor wissel 2
  int relaisR2StateRecht    = LOW;   // de huidige waarde van de output pin
  int relaisG2StateGebogen  = LOW;   // *
  int knopG_2State;                  // de huidige waarde van de input pin
  int lastknopG_2State      = LOW;   // de vorige waarde van de input pin
  int knopR_2State;                  // de huidige waarde van de input pin
  int lastknopR_2State      = LOW;   // de vorige waarde van de input pin
  int optoIn2State          = HIGH;  // de huidige waarde van de input pin
  int lastoptoIn2State      = HIGH;  // de vorige waarde van de input pin
 
  // de volgende variabelen zijn 'long', omdat de tijd gemeten in milliseconden
  // snel de max waarde van een 'int' zal overschrijden.
 
  // - - - - - voor wissel 1
  long lastDebounceTimeRecht_1 = 0;    // het laatste tijdstip waarop de ingang is veranderd
  long lastDebounceTimeGebogen_1 = 0;  // *
  long lastDebounceTimeoptoIn_1 = 0;   // *
 
  // - - - - - voor wissel 2
  long lastDebounceTimeRecht_2 = 0;    // het laatste tijdstip waarop de ingang is veranderd
  long lastDebounceTimeGebogen_2 = 0;  // *
  long lastDebounceTimeoptoIn_2 = 0;   // *
 
  const long debounceDelay = 50;       // de debounce tijd; hoger maken als de uitgang knippert


// - - - - - setup, 1 x doorlopen
//
void setup()
{
// - - - - - setup input en output
  // - - - - - voor wissel 1
  pinMode(knopG_1, INPUT_PULLUP);
  pinMode(relaisR_1, OUTPUT);
  pinMode(knopR_1, INPUT_PULLUP);
  pinMode(relaisG_1, OUTPUT);
  pinMode(optoIn_1, INPUT);
  // - - - - - voor wissel 2
  pinMode(knopG_2, INPUT_PULLUP);
  pinMode(relaisR_2, OUTPUT);
  pinMode(knopR_2, INPUT_PULLUP);
  pinMode(relaisG_2, OUTPUT);
  pinMode(optoIn_2, INPUT);
  // - - - - - LED's
  pinMode(LED, OUTPUT);

// - - - - - zet relais uit
  // - - - - - voor wissel 1
  digitalWrite(relaisR_1, relaisR2StateRecht);
  digitalWrite(relaisG_1, relaisG2StateGebogen);
  // - - - - - voor wissel 2
  digitalWrite(relaisR_2, relaisR2StateRecht);
  digitalWrite(relaisG_2, relaisG2StateGebogen);
 
// - - - - - testen van werking (moet later weg?)
  digitalWrite(LED, HIGH);
 

}

// - - - - - eindeloos doorgaan
void loop()
{
// - - - - - lokale variabelen voor inlezen 'knoppen'
  // - - - - - voor wissel 2
  int readingKnopG2;
  int readingKnopR2;
  int readingOptoIn2;
  int readingKnopG1;
  int readingKnopR1;
  int readingOptoIn1;
 
// - - - - - lees de knoppen in
  readingKnopG2 = digitalRead(knopG_2);
  readingKnopR2 = digitalRead(knopR_2);
  readingOptoIn2 = digitalRead(optoIn_2);
  readingKnopG1 = digitalRead(knopG_1);
  readingKnopR1 = digitalRead(knopR_1);
  readingOptoIn1 = digitalRead(optoIn_1);

// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH),  and you've waited
// long enough since the last press to ignore any noise: 

// If the switch changed, due to noise or pressing:
  if (readingKnopG1 != lastknopG_1State)
  {
    lastDebounceTimeRecht_1 = millis();  // reset the debouncing timer
  }
  if (readingKnopR1 != lastknopR_1State)
  {
    lastDebounceTimeGebogen_1 = millis();  // reset the debouncing timer
  }
  if (readingOptoIn1 != lastoptoIn1State)
  {
    lastDebounceTimeoptoIn_1 = millis();  // reset the debouncing timer
  }
  if (readingKnopG2 != lastknopG_2State)
  {
    lastDebounceTimeRecht_2 = millis();  // reset the debouncing timer
  }
  if (readingKnopR2 != lastknopR_2State)
  {
    lastDebounceTimeGebogen_2 = millis();  // reset the debouncing timer
  }
  if (readingOptoIn2 != lastoptoIn2State)
  {
    lastDebounceTimeoptoIn_2 = millis();  // reset the debouncing timer
  }

// - - - - - zet wissel 1 gebogen met knop
  if ((millis() - lastDebounceTimeGebogen_1) > debounceDelay)
  {
  // whatever the readingKnopG2 is at, it's been there for longer
  // than the debounce delay, so take it as the actual current state:

  // if the button state has changed:
    if (readingKnopG1 != knopG_1State)
    {
    knopG_1State = readingKnopG1;
      if (knopG_1State == LOW)
      {
        wisselServo1.attach(servo_1,1000,2500);  // zet servo aan
        digitalWrite(relaisG_1, LOW);            // relais valt af, hartstuk stroomloos
        digitalWrite(relaisR_1, LOW);            // relais valt af, hartstuk stroomloos
        wisselServo1.write(1832);                // zet servo om
        delay(servoWacht);                       // wacht op omlopen wissel
        digitalWrite(relaisR_1, HIGH);           // andere relais op, hartstuk krijgt juiste spanning
        //digitalWrite(LED, LOW);                  // LED gaat uit (kan na testen weg)
        wisselServo1.detach();                   // zet servo uit, o.a. jitter voorkomen
      }
    }
  }

// - - - - - zet wissel 1 recht met knop
  if ((millis() - lastDebounceTimeRecht_1) > debounceDelay)
  {
    // whatever the readingKnopR1 is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (readingKnopR1 != knopR_1State) {
      knopR_1State = readingKnopR1;

      // only toggle the LED if the new button state is HIGH
      if (knopR_1State == LOW)
      {
        wisselServo1.attach(servo_1,1000,2500);  // zet servo aan
        digitalWrite(relaisR_1, LOW);            // relais valt af, hartstuk stroomloos
        digitalWrite(relaisG_1, LOW);            // relais valt af, hartstuk stroomloos
        wisselServo1.write(1260);                // zet servo om
        delay(servoWacht);                       // wacht op omlopen wissel
        digitalWrite(relaisG_1, HIGH);           // andere relais op, hartstuk krijgt juiste spanning
        //digitalWrite(LED, HIGH);                 // LED gaat aan (kan na testen weg)
        wisselServo1.detach();                   // zet servo uit, o.a. jitter voorkomen
      }
    }
  }

// - - - - - zet wissel 1 om met schakelaar
  if ((millis() - lastDebounceTimeoptoIn_1) > debounceDelay)
  {

    // if the button state has changed:
    if (readingOptoIn1 != optoIn1State)
    {
      optoIn1State = readingOptoIn1;
      wisselServo1.attach(servo_1,1000,2500);   // zet servo aan

      // only toggle the LED if the new button state is HIGH
      if (optoIn1State == LOW)
      {
        digitalWrite(relaisG_1, LOW);           // zie commentaar bij
        digitalWrite(relaisR_1, LOW);           //
        wisselServo1.write(1832);               // zet wissel 1 gebogen met knop
        delay(servoWacht);
        digitalWrite(relaisR_1, HIGH);
        digitalWrite(LED, HIGH);
      }
      else
      {
        digitalWrite(relaisR_1, LOW);           // zie commentaar bij
        digitalWrite(relaisG_1, LOW);           //
        wisselServo1.write(1260);               // zet wissel 1 recht met knop
        delay(servoWacht);
        digitalWrite(relaisG_1, HIGH);
        digitalWrite(LED, LOW);
      }
      wisselServo1.detach();                    // zet servo uit
    }
  }
// - - - - - zet wissel 2 gebogen met knop
  if ((millis() - lastDebounceTimeGebogen_2) > debounceDelay)
  {
// whatever the readingKnopG2 is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:

// if the button state has changed:
    if (readingKnopG2 != knopG_2State)
    {
    knopG_2State = readingKnopG2;
// only toggle the LED if the new button state is HIGH
      if (knopG_2State == LOW)
      {
        wisselServo2.attach(servo_2,1000,2500);  // zie commentaar bij
        digitalWrite(relaisG_2, LOW);            // zet wissel 1 gebogen met knop
        digitalWrite(relaisR_2, LOW);
        wisselServo2.write(1161);
        delay(servoWacht);
        digitalWrite(relaisR_2, HIGH);
        digitalWrite(LED, LOW);
        wisselServo2.detach();
      }
    }
  }

// - - - - - zet wissel 2 recht met knop
  if ((millis() - lastDebounceTimeRecht_2) > debounceDelay)
  {
    // whatever the readingKnopR2 is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (readingKnopR2 != knopR_2State) {
      knopR_2State = readingKnopR2;

      if (knopR_2State == LOW)
      {
        wisselServo2.attach(servo_2,1000,2500);  // zie commentaar bij
        digitalWrite(relaisR_2, LOW);            // zet wissel 1 gebogen met knop
        digitalWrite(relaisG_2, LOW);
        wisselServo2.write(1760);
        delay(servoWacht);
        digitalWrite(relaisG_2, HIGH);
        digitalWrite(LED, HIGH);
        wisselServo2.detach();
      }
    }
  }

// - - - - - zet wissel 2 om met schakelaar
  if ((millis() - lastDebounceTimeoptoIn_2) > debounceDelay)
  {

    // if the button state has changed:
    if (readingOptoIn2 != optoIn2State)
    {
      optoIn2State = readingOptoIn2;
      wisselServo1.attach(servo_2,1000,2500);

      // only toggle the LED if the new button state is HIGH
      if (optoIn2State == LOW)
      {
        digitalWrite(relaisG_2, LOW);           // zie commentaar bij
        digitalWrite(relaisR_2, LOW);
        wisselServo1.write(1161);               // zet wissel 1 recht met knop
        delay(servoWacht);
        digitalWrite(relaisR_2, HIGH);
        digitalWrite(LED, HIGH);
      }
      else
      {
        digitalWrite(relaisR_2, LOW);           // zie commentaar bij
        digitalWrite(relaisG_2, LOW);
        wisselServo1.write(1790);               // zet wissel 1 gebogen met knop
        delay(servoWacht);
        digitalWrite(relaisG_2, HIGH);
        digitalWrite(LED, LOW);
      }
      wisselServo1.detach();
    }
  }


  // save the readings.  Next time through the loop,
  // it'll be the last_XXX_state:
  lastknopG_1State = readingKnopG1;
  lastknopR_1State = readingKnopR1;
  lastoptoIn1State = readingOptoIn1;
  lastknopG_2State = readingKnopG2;
  lastknopR_2State = readingKnopR2;
  lastoptoIn2State = readingOptoIn2;
}
Voor mijn eerste toepassing voldoende, echter alles (ook de servostanden) hard ingecodeerd. Zelfs gebruik gemaakt van "delay()" in de mainloop. Niet zo'n elegante oplossing. Verder mis je ook nog snelheid instellen.
Daarna de firmware uit het adServo draadje opgepakt en het werk van Timo aangevuld met de sturing voor de relais. Hieronder de aanpassingen in de code.
define     NrRelais     sizeof(relaisMap)
.
.
.
const byte relaisMap[] = {7, 8, 12, 11};  // Pins van de relais (2 per servo) CB
.
.
. in setup()
    // Maak de pinnen voor de relais OUTPUT - CB
    for(byte i = 0; i <  NrRelais; i++)
    {
      pinMode(relaisMap[i], OUTPUT);   
    }
.
.
. in loop()
            servoControl.gotoEndPos(i / 2, 0);    //go to position A
            digitalWrite(relaisMap[i / 2], LOW);        // laat beide relais afvallen
            digitalWrite(relaisMap[i / 2 + 1], LOW);    // CB
            numButtons += 1;
.
.
            servoControl.gotoEndPos(i / 2, 1);    //go to position B
            digitalWrite(relaisMap[i / 2], LOW);        // laat beide relais afvallen
            digitalWrite(relaisMap[i / 2 + 1], LOW);    // CB
            numButtons += 1;
.
.
. aan het eind van loop()
    // zet juiste relais weer aan
    if (servoControl.isAtEndPos(0, 0)) {digitalWrite(relaisMap[0], HIGH);}
    if (servoControl.isAtEndPos(0, 1)) {digitalWrite(relaisMap[1], HIGH);}
    if (servoControl.isAtEndPos(1, 0)) {digitalWrite(relaisMap[2], HIGH);}
    if (servoControl.isAtEndPos(1, 1)) {digitalWrite(relaisMap[3], HIGH);}
Hiermee een poosje gespeeld op mijn testplankje en daar ben ik bijna tevreden mee. De volgende wens is wisselaansturing door de 2 optocouplers naast de 4 drukknoppen. Dan kun je ook met een simpele schakelaar de wisselstand zetten. Daar ga ik binnenkort aan werken.
Webmaster hcc!m - Microcontrollers (Atmel) : Arduino
Bezig met Rangeerpuzzel (Inglenook)...

gvandersel

  • HCC!m maar toch Selectrix (RMX)
  • Online Online
  • Berichten: 3407
  • Als het maar elektrisch is.
    • Homepage Gerard van der Sel
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #3 Gepost op: 15 juni 2015, 10:47:54 »
Zo een draadje van Cees. Ik zal mee kijken en naast de zaterdagse bijeen komsten (HCC!m) ook af en toe hier commentaar geven.

Succes en groeten,

Gerard van der Sel.
Holzburg (IIIb/IVa) schaal N.
Kijk ook eens bij de bouw en lees de avonturen.

Cees Baarda

  • Offline Offline
  • Berichten: 150
  • hcc!m-IG
    • hcc!m
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #4 Gepost op: 20 juni 2015, 12:00:49 »
Het heeft weer even geduurd. Afbeelding van de printlayout maken, die ook nog wat laat zien, was niet lastig maar wel even werk. De huidige versie, nog zonder de ontkoppeldiode D2 uit het schema, zie je hieronder:


Die heb ik 2 keer onder mijn probeerbaantje hangen en doet al goede diensten bij besturing van dat baantje in combinatie met Dinamo, de primaire hardware (zie foto 1). Het geheel wordt bestuurd met iTrain. Om de andere delen die ik voor de Inglenook wil maken te testen zal de baan een andere electronica laag krijgen; op foto 2 zie je de lege versie. Daar moet handbediening op komen.
Wil je meer willen weten over de algemene opbouw van het baantje, kijk dan op de HCC!m-site. Klik op het menu "Beursflyer".
foto 1: het baantje met Dinamo

foto 2: het baantje met nog niets
Webmaster hcc!m - Microcontrollers (Atmel) : Arduino
Bezig met Rangeerpuzzel (Inglenook)...

Daan Neijenhuis

  • Offline Offline
  • Berichten: 1357
  • HCC!m-IG
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #5 Gepost op: 23 juni 2015, 20:41:51 »
Die gaan we volgen  :D
Terug van weggeweest...

Martin Hornis

  • Offline Offline
  • Berichten: 942
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #6 Gepost op: 24 juni 2015, 12:05:20 »
Mooi overzichtelijk. Ik laat me verrassen.
Märklin K-rails met boogstralen > 500 mm; NS-lichtseinen met cijferbak: 4, 6 en 8 in één bak; iTrain; Intellibox I; OC32; eigen treindetectiesysteem aangesloten op OC32; controleprogramma's voor iTrain en OC32.

Cees Baarda

  • Offline Offline
  • Berichten: 150
  • hcc!m-IG
    • hcc!m
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #7 Gepost op: 27 juni 2015, 12:07:14 »
Het lijkt er op dat de updates wekelijks worden.
Afgelopen week ben ik hoofdzakelijk bezig geweest met Arduino en firmware-aanpassingen. Ik wil in mijn adServo-versie de 2 drukknoppen per wissel gaan vervangen door een schakelaar die omschakelt van 0 volt naar 5 of meer volt. Voor dat doel heeft de print al 2 optocouplers.
In de eerste post heb je mijn proefopstelling gezien met een provisorisch toetsenbordje om de servo's en relais te bedienen. Dezelfde toetsen gebruikt de adServo-firmware om de eindstanden en de draaisnelheid van de servo's in te stellen.
Voor een ander doel heb ik een schakelaar paneeltje gemaakt (foto). Door een overlay op een A4 is die ook goed bruikbaar voor de adServo. Ik gebruik dan niet alles, maar wie weet. De draaiknop, die je in het midden ziet is nu een potentiometer. Dat zou in de toekomst best wel eens een quadrature encoder kunnen worden (zo'n ding dat je eindeloos kunt doordraaien). Het display heeft nog geen functie.



groet Cees
Webmaster hcc!m - Microcontrollers (Atmel) : Arduino
Bezig met Rangeerpuzzel (Inglenook)...

willem22

  • Offline Offline
  • Berichten: 1553
    • willem22
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #8 Gepost op: 19 augustus 2015, 17:59:21 »
Hoi Cees, maak dit draadje wakker , volg deze maar zie elders update's.

Wil.

Cees Baarda

  • Offline Offline
  • Berichten: 150
  • hcc!m-IG
    • hcc!m
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #9 Gepost op: 19 augustus 2015, 22:35:41 »
Na een lange poos weer een kleine update. Vakantietijd en worstelen met een stukje Arduino programmering - en nog steeds mee aan het worstelen - heeft de boel wel even stil gelegd. Bovendien voor HCC!m had ik ook nog een klus aan een andere demo van mezelf. Die is deels ook noodzakelijk voor dit project.

Wim heeft wel schijnbare updates gezien in het draadje van Timo. Dat ging echter over het gebruik van Timo's firmware en het leek me beter gepast om de opmerking daar te plaatsen.

Hoe ver ben ik nu? De library van Timo op een andere manier benut om een wissel niet met 2 toetsen te hoeven bedienen. Verder een andere manier  van 'debounce' gebruikt. Ik probeer nu het instellen iets anders te doen m.b.v. o.a een LCD-display. Dat wil niet erg vlotten. Komt door keuze dilemma's in de menustructuur die nodig is.
Ik heb inmiddels ook een Arduino als Commander getest. I.p.v. een motor-shield heb ik de DCC-uitgang van de Arduino rechtstreeks aan de BNLS Boosterhub gehangen en dat functioneerde gelijk.

Vooralsnog eerst maar eens de wisselstellers afmaken.

Nog een vraag voor de modelspoorders:
Ik rijd N en wil gaan voorontkoppelen bij het uitrangeren op de Inglenook. Waar zouden jullie een ontkoppelvoorziening maken? Op ieder van de 3 opstelsporen aan het begin of slechts 1 voor het eerste verdelende wissel. Het gaat me niet om de financiën maar om de meest praktische plek.

groet, Cees.


Webmaster hcc!m - Microcontrollers (Atmel) : Arduino
Bezig met Rangeerpuzzel (Inglenook)...

Martin Hornis

  • Offline Offline
  • Berichten: 942
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #10 Gepost op: 20 augustus 2015, 11:23:11 »
Nog een vraag voor de modelspoorders:
Ik rijd N en wil gaan voorontkoppelen bij het uitrangeren op de Inglenook. Waar zouden jullie een ontkoppelvoorziening maken? Op ieder van de 3 opstelsporen aan het begin of slechts 1 voor het eerste verdelende wissel.
Bij voorontkoppelen: vóór het eerste verdelende wissel. Hierbij mag de koppeling niet meer vastklikken bij het verder duwen van het rangeerdeel. Als dat teveel problemen geeft, dan aan het begin van de opstelsporen.
Märklin K-rails met boogstralen > 500 mm; NS-lichtseinen met cijferbak: 4, 6 en 8 in één bak; iTrain; Intellibox I; OC32; eigen treindetectiesysteem aangesloten op OC32; controleprogramma's voor iTrain en OC32.

Cees Baarda

  • Offline Offline
  • Berichten: 150
  • hcc!m-IG
    • hcc!m
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #11 Gepost op: 24 augustus 2015, 12:21:37 »
Een update:
Onderstaand de code voor firmware van mijn print. Hier moet nog het nodige bij komen. Het instellen van de eindstanden en de bewegingssnelheid. Ik gebruik de servo-library's van de AdServo van Timo. Debounce van de knoppen gaat zonder library. Ik heb zoveel mogelijk Nederlands gebruikt. Niet omdat ik Engels niet beheers maar voor de duidelijkheid. Verder gebruik ik principieel waar mogelijk Nederlandse benamingen voor variabelen en dergelijke, om te voorkomen dat ik een "keyword" van IDE of library gebruik.

Binnenkort eerst maar eens een weekje op vakantie. Veel natuur en zo. 's Avonds misschien verder filosoferen over de manier van instellen.

M.vr.gr. Cees
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 S e r v o   W i s s e l S t e l l e r
   
   Testprogramma voor het omzetten van twee modelspoorwissels m.b.v.
   een modelbouw servo.
   Te testen:
   - 4 losse drukknoppen voor recht en afbuigend
   - 2 optocoupler ingangen; funtioneel als schakelaar, bedoeld
     voor besturing vanuit HCC!m-systeem of Dinamo OC32
   - 1 van de optocouplers moet later ook DCC kunnen verwerken
   Er wordt gebruik gemaakt van 2 servo's
   Ten behoeve van hartstukpolarisatie zijn er per servo 2 relais
   
   Werking per wissel:
   - na een wisselcommando vallen eerst beide relais af
   - daarna loopt het wissel om (servo)
   - dan komt het juiste relais op
   Bij opstarten gebeurt er niets. Het hartstuk van het wissel heeft
   geen spanning en de servo staat in een ongedefinieerde stand.
   
   De gebruikte Arduino is een Pro Mini, 5V met ATmega328.
   
   Gebruikte libraries en voorbeelden:
   - code uit het Debounce-voorbeeld bestand van Arduino.cc
     http://www.arduino.cc/en/Tutorial/Debounce
   - ServoExtend library van Timo Engelgeer
   - ServoControl library van Timo Engelgeer
   
   Created:   30-04-2015
   By:        Cees Baarda
              Eerste opzet met gebruikmaking van de library Servo uit de Arduino-
              omgeving.
   Modified:  15-07-2015
   By:        Cees Baarda
              Aangepast aan gebruik met de libraries van Timo Engelgeer
              De servo's starten nu op in de middenstand, ongeacht de stand van schakelaars.
              De relais blijven afgevallen tot het eerste wisselstel commando. Nadeel:
              Je moet het wissel 2 keer stellen als je het wissel in de stand van de
              schakelaar wilt hebben.
              Je kunt de drukknoppen en schakelaars door elkaar gebruiken.
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *   
// - - - - - L i b r a r i e s   i n   g e b r u i k :
#include <ServoExtend.h>
#include <ServoControl.h>

#include <Wire.h>
#include <LiquidCrystal_I2C.h>


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// - - - - - C o n s t a n t e n :
//           De pinnummers en vaste waarden een naam geven
   
// - - - - - voor wissel 1
  const int optoIn_1  = 3;  // voor externe aansturing met 0 of 1
  const int servo_1   = 9;
  const int servo1_endPosR = 10;    // voorlopig hard coderen, later uit EEPROM
  const int servo1_endPosG = 1002;  // voorlopig hard coderen, later uit EEPROM
  // - - - - - t.b.v puntstukpolarisatie
  const int relaisR_1 = 7;
  const int relaisG_1 = 8;
  // - - - - - t.b.v. bediening met knoppen
  const int knopR_1   = 6;  // input; toets wissel recht leggen
  const int knopG_1   = 5;  // input; toets wissel gebogen leggen

// - - - - - voor wissel 2
  const int optoIn_2  = 2;  // voor externe aansturing met 0 of 1
  const int servo_2   = 10;   // output; Servo 2
  const int servo2_endPosR = 10;    // voorlopig hard coderen, later uit EEPROM
  const int servo2_endPosG = 1002;  // voorlopig hard coderen, later uit EEPROM
  // - - - - - t.b.v puntstukpolarisatie
  const int relaisR_2 = 11;  // output; t.b.v. relais bij recht gelegd wisssel
  const int relaisG_2 = 12;  // output; t.b.v. relais bij gebogen gelegd wisssel
  // - - - - - t.b.v. bediening met knoppen
  const int knopR_2   = A2;  // input; toets wissel recht leggen
  const int knopG_2   = A0;  // input; toets wissel gebogen leggen

// - - - - - beide wissels met DCC, nog niet in gebruik
  // const int DCC_in    = 2;  // input; de DCC-railspanning gaat hier aan
  const int servoSnelheid = 30;
  const int servoStepInterval = 1;
  const int LED = A1;        // LED op de print

// - - - - - nog niet in gebruik, voor servo instelmodus
//           encoder: common moet aan GND, andere aan pin 5 en 6
//  const int pgmEncA   = 6;
//  const int pgmAncB   = 5;
//  const int pgmOK     = A0;  // kan losse knop of knop van de encoder zijn

// - - - - - nog niet in gebruik, zijn bedoeld voor extra print aan 8 polige
//           connector
  // const int LEDarduino   = 13; // LED op de arduino
  // const int LEDextern_1  = A2; // evt. extra LED op externe print (pin 4)
  // const int LEDextern_2  = A3; // evt. extra LED op externe print (pin 5)
  // const int externKnop_1 = A2; // evt. extra knop op externe print (pin 4)
  // const int externKnop_1 = A3; // evt. extra knop op externe print (pin 5)
 

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// - - - - - G l o b a l e   V a r i a b e l e n :
//
  ServoControl wisselServos;         // 1 object van het type ServoControl
  // - - - - - voor wissel 1
  int knopG_1State;                  // de huidige waarde van de input pin
  int lastknopG_1State      = LOW;   // de vorige waarde van de input pin
  int knopR_1State;                  // de huidige waarde van de input pin
  int lastknopR_1State      = LOW;   // de vorige waarde van de input pin
  // door de huidige PIN-waarde in te lezen wordt het wissel niet direct gesteld in een
  // stand na opstarten
  int optoIn1State          = digitalRead(optoIn_1);  // de huidige waarde van de input pin
  int lastoptoIn1State      = digitalRead(optoIn_1);  // de vorige waarde van de input pin
 
  // - - - - - voor wissel 2
  int knopG_2State;                  // de huidige waarde van de input pin
  int lastknopG_2State      = LOW;   // de vorige waarde van de input pin
  int knopR_2State;                  // de huidige waarde van de input pin
  int lastknopR_2State      = LOW;   // de vorige waarde van de input pin
  // door de huidige PIN-waarde in te lezen wordt het wissel niet direct gesteld in een
  // stand na opstarten
  int optoIn2State          = digitalRead(optoIn_2);  // de huidige waarde van de input pin
  int lastoptoIn2State      = digitalRead(optoIn_2);  // de vorige waarde van de input pin
 
  // de volgende variabelen zijn 'long', omdat de tijd gemeten in milliseconden
  // snel de max waarde van een 'int' zal overschrijden.
 
  // - - - - - voor wissel 1
  long lastDebounceTimeRecht_1 = 0;    // het laatste tijdstip waarop de ingang is veranderd
  long lastDebounceTimeGebogen_1 = 0;  // *
  long lastDebounceTimeoptoIn_1 = 0;   // *
 
  // - - - - - voor wissel 2
  long lastDebounceTimeRecht_2 = 0;    // het laatste tijdstip waarop de ingang is veranderd
  long lastDebounceTimeGebogen_2 = 0;  // *
  long lastDebounceTimeoptoIn_2 = 0;   // *
 
  const long debounceDelay = 50;       // de debounce tijd; hoger maken als de uitgang knippert




// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// - - - - - prototypes
//
  void servoInstellen();


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// - - - - - setup, 1 x doorlopen
//
void setup()
{
// - - - - - setup input en output
  // - - - - - voor wissel 1
  pinMode(knopG_1, INPUT_PULLUP);
  pinMode(relaisR_1, OUTPUT);
  pinMode(knopR_1, INPUT_PULLUP);
  pinMode(relaisG_1, OUTPUT);
  pinMode(optoIn_1, INPUT);
  // - - - - - voor wissel 2
  pinMode(knopG_2, INPUT_PULLUP);
  pinMode(relaisR_2, OUTPUT);
  pinMode(knopR_2, INPUT_PULLUP);
  pinMode(relaisG_2, OUTPUT);
  pinMode(optoIn_2, INPUT);
  // - - - - - LED's
  pinMode(LED, OUTPUT);

// - - - - - zet relais uit
  // - - - - - voor wissel 1
  digitalWrite(relaisR_1, LOW);
  digitalWrite(relaisG_1, LOW);
  // - - - - - voor wissel 2
  digitalWrite(relaisR_2, LOW);
  digitalWrite(relaisG_2, LOW);

// - - - - - initialiseer de servo's
  // voor wissel 1
  wisselServos.setEndPos(0, 0, servo1_endPosR);
  wisselServos.setEndPos(0, 1, servo1_endPosG);
  wisselServos.setSpeed(0, servoSnelheid, servoStepInterval);
  wisselServos.init(0, servo_1);
  // voor wissel 2
  wisselServos.setEndPos(1, 0, servo2_endPosR);
  wisselServos.setEndPos(1, 1, servo2_endPosG);
  wisselServos.setSpeed(1, servoSnelheid, servoStepInterval);
  wisselServos.init(1, servo_2);
 
// zet beide servo's in de middenstand
  wisselServos.gotoPos(0,511);
  wisselServos.gotoPos(1,511);
  wisselServos.update();

// - - - - - testen van werking (moet later weg?)
//  digitalWrite(LED, HIGH);
}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// - - - - - eindeloos doorgaan
void loop()
{

// - - - - - lokale variabelen voor inlezen 'knoppen'
  // - - - - - voor wissel 2
  int readingKnopG2;
  int readingKnopR2;
  int readingOptoIn2;
  // - - - - - voor wissel 1
  int readingKnopG1;
  int readingKnopR1;
  int readingOptoIn1;
 
// - - - - - lees de knoppen in
  readingKnopG2 = digitalRead(knopG_2);
  readingKnopR2 = digitalRead(knopR_2);
  readingOptoIn2 = digitalRead(optoIn_2);
  readingKnopG1 = digitalRead(knopG_1);
  readingKnopR1 = digitalRead(knopR_1);
  readingOptoIn1 = digitalRead(optoIn_1);

// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH),  and you've waited
// long enough since the last press to ignore any noise: 

// If the switch changed, due to noise or pressing:
  if (readingKnopG1 != lastknopG_1State)
  {
    lastDebounceTimeRecht_1 = millis();  // reset the debouncing timer
  }
  if (readingKnopR1 != lastknopR_1State)
  {
    lastDebounceTimeGebogen_1 = millis();  // reset the debouncing timer
  }
  if (readingOptoIn1 != lastoptoIn1State)
  {
    lastDebounceTimeoptoIn_1 = millis();  // reset the debouncing timer
  }
  if (readingKnopG2 != lastknopG_2State)
  {
    lastDebounceTimeRecht_2 = millis();  // reset the debouncing timer
  }
  if (readingKnopR2 != lastknopR_2State)
  {
    lastDebounceTimeGebogen_2 = millis();  // reset the debouncing timer
  }
  if (readingOptoIn2 != lastoptoIn2State)
  {
    lastDebounceTimeoptoIn_2 = millis();  // reset the debouncing timer
  }

// - - - - - zet wissel 1 gebogen met knop
  if ((millis() - lastDebounceTimeGebogen_1) > debounceDelay)
  {
  // if the button state has changed:
    if (readingKnopG1 != knopG_1State)
    {
    knopG_1State = readingKnopG1;
      if (knopG_1State == LOW)
      {
        digitalWrite(relaisG_1, LOW);            // relais valt af, hartstuk stroomloos
        digitalWrite(relaisR_1, LOW);            // relais valt af, hartstuk stroomloos
        wisselServos.gotoEndPos(0,0);                // zet servo om
      }
    }
  }

// - - - - - zet wissel 1 recht met knop
  if ((millis() - lastDebounceTimeRecht_1) > debounceDelay)
  {
    // if the button state has changed:
    if (readingKnopR1 != knopR_1State) {
      knopR_1State = readingKnopR1;

      // only toggle the LED if the new button state is HIGH
      if (knopR_1State == LOW)
      {
        digitalWrite(relaisG_1, LOW);            // relais valt af, hartstuk stroomloos
        digitalWrite(relaisR_1, LOW);            // relais valt af, hartstuk stroomloos
        wisselServos.gotoEndPos(0,1);                // zet servo om
      }
    }
  }

/* - - - - - zet wissel 1 om met schakelaar--*/
  if ((millis() - lastDebounceTimeoptoIn_1) > debounceDelay)
  {

    // if the button state has changed:
    if (readingOptoIn1 != optoIn1State)
    {
      optoIn1State = readingOptoIn1;
     
// - - - - - Eerst het hartstuk stroomloos maken
      digitalWrite(relaisG_1, LOW);   // relais valt af
      digitalWrite(relaisR_1, LOW);   // relais valt af

// - - - - - stuur servo alleen aan als die nog naar een nieuwe eindpositie moet
      if (optoIn1State == LOW)
      {
        if (!wisselServos.isAtEndPos(0,1)) wisselServos.gotoEndPos(0,1);
      }
      else
      {
        if (!wisselServos.isAtEndPos(0,0)) wisselServos.gotoEndPos(0,0);
      }
    }
  }
// - - - - - zet wissel 2 gebogen met knop
  if ((millis() - lastDebounceTimeGebogen_2) > debounceDelay)
  {
// if the button state has changed:
    if (readingKnopG2 != knopG_2State)
    {
    knopG_2State = readingKnopG2;
// only toggle the LED if the new button state is HIGH
      if (knopG_2State == LOW)
      {
        digitalWrite(relaisG_2, LOW);            // relais valt af, hartstuk stroomloos
        digitalWrite(relaisR_2, LOW);            // relais valt af, hartstuk stroomloos
        wisselServos.gotoEndPos(1,0);                // zet servo om
      }
    }
  }

// - - - - - zet wissel 2 recht met knop
  if ((millis() - lastDebounceTimeRecht_2) > debounceDelay)
  {
    // whatever the readingKnopR2 is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (readingKnopR2 != knopR_2State) {
      knopR_2State = readingKnopR2;

      if (knopR_2State == LOW)
      {
        digitalWrite(relaisG_2, LOW);            // relais valt af, hartstuk stroomloos
        digitalWrite(relaisR_2, LOW);            // relais valt af, hartstuk stroomloos
        wisselServos.gotoEndPos(1,1);            // zet servo om
      }
    }
  }

/* - - - - - zet wissel 2 om met schakelaar*/
  if ((millis() - lastDebounceTimeoptoIn_2) > debounceDelay)
  {

    // if the button state has changed:
    if (readingOptoIn2 != optoIn2State)
    {
      optoIn2State = readingOptoIn2;
      digitalWrite(relaisG_2, LOW);            // relais valt af, hartstuk stroomloos
      digitalWrite(relaisR_2, LOW);            // relais valt af, hartstuk stroomloos

      // only toggle the LED if the new button state is HIGH
      if (optoIn2State == LOW)
      {
        if (!wisselServos.isAtEndPos(1,1)) wisselServos.gotoEndPos(1,1);                // zet servo om
      }
      else
      {
        if (!wisselServos.isAtEndPos(1,0)) wisselServos.gotoEndPos(1,0);            // zet servo om
      }
    }
  }

  wisselServos.update();

  // zet juiste relais weer aan
  if (!wisselServos.isMoving(0))    // zorg eerst dat het servo stil staat, dan relais aan
  {
    if (wisselServos.isAtEndPos(0, 0)) {digitalWrite(relaisR_1, HIGH);}
    if (wisselServos.isAtEndPos(0, 1)) {digitalWrite(relaisG_1, HIGH);}

  }
  if (!wisselServos.isMoving(1))    // zorg eerst dat het servo stil staat, dan relais aan
  {
    if (wisselServos.isAtEndPos(1, 0)) {digitalWrite(relaisR_2, HIGH);}
    if (wisselServos.isAtEndPos(1, 1)) {digitalWrite(relaisG_2, HIGH);}
  }

  // save the readings.  Next time through the loop,
  // it'll be the last_XXX_state:
  lastknopG_1State = readingKnopG1;
  lastknopR_1State = readingKnopR1;
  lastoptoIn1State = readingOptoIn1;
  lastknopG_2State = readingKnopG2;
  lastknopR_2State = readingKnopR2;
  lastoptoIn2State = readingOptoIn2;
}
Een update:


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// - - - - - Servo instelmodus

void servoInstellen()
{
 

}
Webmaster hcc!m - Microcontrollers (Atmel) : Arduino
Bezig met Rangeerpuzzel (Inglenook)...

Cees Baarda

  • Offline Offline
  • Berichten: 150
  • hcc!m-IG
    • hcc!m
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #12 Gepost op: 28 augustus 2015, 12:32:50 »
Dag allemaal,

nog even een update voor een weekje vakantie.
De Inglenook die ik ga gebruiken ziet er kwa baanplan als volgt uit:


Ik maak gebruik van 2 bakjes van een andere demobaan met een keer driehoek. De hardware voor de bediening van de wissels en het rijden met een computer is al aanwezig (zie de tweede foto). Op de plek van de rode stip zal een ontkoppelaar komen, die wordt ook uitgevoerd met een servo. De wagens en lok krijgen profi-koppelingen. De rails is Peco N code 55 en de wissels hebben een metalen hartstuk.


Er is inmiddels ook een soort principe schema van de opbouw van de aansturing:


De beide servostellers worden mijn eigen interpretatie van de AdServo, die ik al in een eerdere post liet zien. De rijregelaar wordt ook gemaakt op basis van een Arduino Pro Mini. De wissels en de ontkoppelaar zullen bediend worden met een schakelaar.  De rijregelaar krijgt slechts 3 knoppen. Voor rangeren ga ik gebruik maken van lage snelheden en de optrek- en remvertraging van de decoder in de lok. Zoals je  ziet wordt het totale handbediening en dat lijkt me voor deze spelsituatie ook de mooiste oplossing.

groet, Cees.
Webmaster hcc!m - Microcontrollers (Atmel) : Arduino
Bezig met Rangeerpuzzel (Inglenook)...

dickkoning

  • Offline Offline
  • Berichten: 140
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #13 Gepost op: 28 augustus 2015, 20:04:45 »
Hallo Cees

ga in de rijregelaar een dcc signaal opwekken mbv een arduino of ga je een analoge regelaar bouwen ?

De tekst van de link is in het frans (google translate ?) maar er wordt een arduino gebaseerde DCC centrale gebouwd

  http://bultez.fr/post/2013/02/08/Construction-de-la-mini-centrale 


vr groeten

dick koning
« Laatst bewerkt op: 28 augustus 2015, 20:07:06 door dickkoning »

Cees Baarda

  • Offline Offline
  • Berichten: 150
  • hcc!m-IG
    • hcc!m
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #14 Gepost op: 28 augustus 2015, 21:25:20 »
Die kende ik nog niet. Mijn Frans is wat minder, dus lastig te lezen.

Mijn bedoeling is echter alleen een "DCC-throttle" te maken. Het wordt dus geen centrale. Een voorbeeld van zo'n project heb ik o.a. hier gevonden. Ik heb even niet de library paraat, die ik zal gaan gebruiken.

groet, Cees.


Webmaster hcc!m - Microcontrollers (Atmel) : Arduino
Bezig met Rangeerpuzzel (Inglenook)...