Doel:€250.00
Donaties:€50.00

Per saldo:€-200.00

Steun ons nu!

Laatst bijgewerkt
op 03-01-2024

Vacature: secretaris bestuur
Algemeen

De stichting

Recente berichten

De overeenkomst tussen een Ovaalramer en een Motorpost. door RK
Vandaag om 12:25:12
Toon hier je nieuwe (model-) spooraanwinst(en)... door Cegielski
Vandaag om 12:24:25
U-vorm beperkte ruimte (H0 C-rails) door eitreb
Vandaag om 12:16:32
Al mijn goede ideeën... door Karst Drenth
Vandaag om 11:42:58
NTM P1 in Schaal-1 door MaraNCS
Vandaag om 11:39:38
US diorama in H0 door Wim Vink
Vandaag om 11:35:28
Mijn eerste H0-modeltreinbaan in aanbouw door Jack Black (NS1220)
Vandaag om 11:33:00
Rio Grande Southern - Lizard Head Pass door Hans GJ
Vandaag om 11:30:20
Ombouw/Pimpen Bolle neuzen door bollen neus
Vandaag om 11:27:15
Hengelo in 1981-1982, maar dan anders: Kassenberg in N door Mispoes
Vandaag om 11:03:05
Bauarbeiten im gange door Dave.......
Vandaag om 10:55:26
Variaties op Station Zetten Andelst in HO door Duikeend
Vandaag om 10:54:40
De IJmuider spoorlijn - korte geschiedenis en plaatjes door Vislijn
Vandaag om 10:42:29
Onze Nederlandse Stoomlocomotieven (nieuwe druk) door R v/d Hoven
Vandaag om 09:24:48
Internationale Spoor 0 en 1 dagen in Gießen, 23 en 24 maart, 2024 door bernhard67
Vandaag om 08:42:53
De Hondsrugbaan door mass am see
Vandaag om 08:15:11
Pfarrerwinkel bahn door Jelmer
Vandaag om 08:00:19
M.s.v. De Percee bouwt aan nieuwe clubbaan door J. Moors
Vandaag om 01:00:05
30 maart Modelspoorbeurs Houten & HCC Kennisdag door WimM
Vandaag om 00:42:50
Raadplaatje door Magic
27 maart 2024, 23:27:03
Ronald en Wanda's "Southern Comfort" swamp layout! door Ronald Halma
27 maart 2024, 23:17:30
Bouw van materieel 40 treinstellen door Pauldg
27 maart 2024, 22:45:06
Martijn's rariteitenkabinet door Martijn193
27 maart 2024, 22:30:17
Beekdaelen in H0 door Link
27 maart 2024, 22:17:23
Les Billards du Vivarais door Hans1963
27 maart 2024, 22:08:52
"Litter Bin" voor Brits spoor en Britse modelspoorprojecten door BrightonBelle
27 maart 2024, 21:57:24
Kleine Baan in H0 (≤ 0.5m²) door Jack Black (NS1220)
27 maart 2024, 21:47:16
Lima Koploper ombouwen door Menno 1846
27 maart 2024, 21:31:51
Piko NS 2015 stroomafname probleem door brutus
27 maart 2024, 21:16:45
Zwederbaan door nighttrain1
27 maart 2024, 20:44:09
  

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

Cees Baarda

  • Offline Offline
  • Berichten: 166
  • 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 het maken van een apart ijkspoor t.b.v. Koploper of iTrain.

Hans van de Burgt

  • BMB
  • Offline Offline
  • Berichten: 6060
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

Cees Baarda

  • Offline Offline
  • Berichten: 166
  • 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 het maken van een apart ijkspoor t.b.v. Koploper of iTrain.

gvandersel

  • HCC!m maar toch Selectrix (RMX)
  • Offline Offline
  • Berichten: 3602
  • 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: 166
  • 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 het maken van een apart ijkspoor t.b.v. Koploper of iTrain.

Daan Neijenhuis

  • Online Online
  • Berichten: 1508
  • HCC!m-IG
Re: Rangeerpuzzel (Inglenook) met Arduino besturing
« Reactie #5 Gepost op: 23 juni 2015, 20:41:51 »
Die gaan we volgen  :D
Wanneer lees je nou een handleiding?   ;D

Martin Hornis

  • Offline Offline
  • Berichten: 1413
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 voor OC32.

Cees Baarda

  • Offline Offline
  • Berichten: 166
  • 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 het maken van een apart ijkspoor t.b.v. Koploper of iTrain.

willem22

  • Offline Offline
  • Berichten: 1545
    • 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: 166
  • 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 het maken van een apart ijkspoor t.b.v. Koploper of iTrain.

Martin Hornis

  • Offline Offline
  • Berichten: 1413
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 voor OC32.

Cees Baarda

  • Offline Offline
  • Berichten: 166
  • 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 het maken van een apart ijkspoor t.b.v. Koploper of iTrain.

Cees Baarda

  • Offline Offline
  • Berichten: 166
  • 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 het maken van een apart ijkspoor t.b.v. Koploper of iTrain.

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: 166
  • 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 het maken van een apart ijkspoor t.b.v. Koploper of iTrain.