Auteur Topic: Aandrijving inbouwen in handdraaischijf  (gelezen 44467 keer)

0 leden en 1 gast bekijken dit topic.

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #25 Gepost op: 14 februari 2018, 23:51:58 »
PS:
Leuk dat je je neefje helpt bij de modelspoorbaan.

En hier nog een filmpje van de draaischijf in werking (nog van voor mijn ATF experimenten)



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

Offline mark mms

  • Super Modelspoorder
  • ******
  • Berichten: 1.224
  • Thanked: 26 times
  • Geslacht: Man
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #26 Gepost op: 15 februari 2018, 13:19:02 »
Bedankt voor de info.
Ga toch nog eens kijken of ik een stappenmotor kan aansturen met Arduino.
Daarna zien we wel verder.

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #27 Gepost op: 15 februari 2018, 18:12:33 »
Mark,
Die stappenmotor aansturing heb je sowieso nodig, dus dat is een goed begin.
Succes!
Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline mark mms

  • Super Modelspoorder
  • ******
  • Berichten: 1.224
  • Thanked: 26 times
  • Geslacht: Man
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #28 Gepost op: 19 februari 2018, 21:35:11 »
Hallo Rob,

Ik heb zojuist een poging gedaan om een stappenmotor aan te sturen.
Ten eerste gebeurde er helemaal niets, bleek dat ik niet de juiste bibliotheek had.
Na het downloaden van "accel.stepper" kon ik de sketch wel gebruiken.

Als ik de sketch goed lees dan,
moet de motor op 9+10+11+12 (naar printplaatje van 1N1+1N2+1N3+1N4)
leds op 2+3+4+5 (en dan aan de GND???)
push button op A0 (en dan aan de GND???)
push button op A1 (en dan aan de GND???)

Op de foto's heb je verschillende weerstanden bij de leds enz.
Ik ben bang dat ik het helemaal verkeerd doe.
Heb je toevallig een schets van de aansluitingen?

Bvd Mark

Offline Theo

  • Stationchef
  • ***
  • Berichten: 208
  • Thanked: 6 times
  • Geslacht: Man
    • ModelspoorPIC
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #29 Gepost op: 19 februari 2018, 22:12:52 »
Hoi, Misschien is dit ook bruikbaar, ik heb zelf de stappenmotor (28BYJ-48) aangestuurd in JALedit.
Deze taal is erg makkelijk.
Ik heb hem bij de workshop PIC programmeren gezet.
Misschien kan je er wat mee.

Theo

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #30 Gepost op: 19 februari 2018, 23:48:36 »
Hee Mark,

Je bent goed op weg. ik heb geen aansluitschema bij de hand, maar laat ik proberen antwoord te geven op je vragen.

moet de motor op 9+10+11+12 (naar printplaatje van 1N1+1N2+1N3+1N4)
Klopt

leds op 2+3+4+5 en dan aan de GND
inderdaad, maar met een weerstand van 100 ohm er tussen (Ik heb 1 weerstand genomen van de ground naar alle leds. Dat voldoet omdat in normaal gebruik slechts een led aan is).


push button op A0 (en dan aan de GND???)
push button op A1 (en dan aan de GND???)

De input pinnen werken een beetje anders.

A0 is de beginpositie sensor. Je weet bij het aanzetten van de Arduino niet waar de stappenmotor is gestopt voor de Arduino uit ging. Je moet dus een beginpositie 'voelen', waarvandaan alle andere standen uitgeteld worden (aantal stappen vanaf beginpositie).
Op pin A0 zit een schakelaar die wordt ingedrukt als de draaischijf de beginpositie inneemt. Ik gebruik hiervoor een van de spoorstaven maar je kunt ook een microswitch gebruiken. A0 wordt via de schakelaar (of rail) met de ground verbonden (maak contact).
In het programma gaat de stappenmotor eerst 70 stappen tegen de klok in (zodat-ie altijd weg is van de beginpositie), en gaat dan kleine stapjes met de klok mee, totdat de beginpositie wordt gedetecteerd. Van daaruit start het gewone programma, en draait de brug naar een eerste spoor.
Om eindeloos zoeken (en potentieel kapot draaien) te voorkomen, stopt dit zoeken naar de beginpositie na 700 stappen met een foutmelding (snel knipperende led op de Arduino). Dit is vooral handig bij het bouwen en testen.
Om te testen kun je na het starten van de Arduino pin A0 even verbinden met de GND.

Op A1 heb ik vier knoppen zitten (één voor elk spoor) in een zogenaamde spanningsdeler. Hiermee heb ik slechts 1 pin nodig, en wat minder draden dan elke knop op een afzonderlijke pin. Omdat dit een analoge pin is, kan ik uit de waarde opmaken welke knop is ingedrukt.
Het werkt als volgt: er zijn 4 weerstanden van 10 k-ohm in serie geschakeld tussen de +5V en de GND. Hier loopt dan een kleine stroom door en de spanning wordt in 4 stappen 'gedeeld' Afhankelijk van welke knop wordt ingedrukt leest de pin (ruwweg) 0 - 1,25 - 2,5 - 3,75 Volt uit (geen knop is 5 Volt).
Klinkt misschien wat ingewikkeld (ik had bij het ontwerp geen rekening gehouden met gebruik door anderen), maar op een foto ziet dat er zo uit.



Aan de rechterkant de aansluiting van de Arduino: rood = 5V, bruin = pin A1, zwart = GND
Op elk knooppunt van de weerstandjes zit een drukknop, die aan de andere kant verbonden is met de input pin. De meest linkse knop is direct verbonden met de GND. Elke knop geeft daarmee een andere spanning op de pin, die als waarde tussen 0 en 1024 met analogRead wordt uitgelezen.

Op zich werkt dit goed, maar je kunt natuurlijk ook gewoon 4 pinnen gebruiken, elk met een knopje. Dan hoef je alleen de functie "getButtonpressed" aan te passen. Deze geeft waarde 0, 1, 2 of 3 terug als er een knop is ingedrukt (en -1 als geen knop is ingedrukt)


Ook zie je aan de onderkant van de foto de ledjes, met de gezamenlijke weerstand naar de GND.

Hoop dat dit helpt. Blijf anders gewoon vragen, hoor.

Rob



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


Offline Wim Corduwener

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 10.844
  • Thanked: 300 times
  • Geslacht: Man
  • Enschede (import)
    • Portfolio
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #32 Gepost op: 20 februari 2018, 16:59:52 »
Als ik dat zo bekijk kun je daar ook een portaalkraan mee aandrijven. @Pierre heeft dat ook een keer gedaan, maar dan natuurlijk zonder hulp van Tante Ali.
Trefwoorden:  Mac • Modulebouw • H0, H0e en 0e • Tijdperk III (1950-1960) • Nederlands (H0 en H0e) • Frans (1:45) • Gelijkstroom • Twee rails • Voorlopig nog even analoog • Scratchbuilding en Kitbutchering... en ik maak eigenlijk nooit wat af.

Meest recente projecten: Frans diorama 2.0 (Spoor 0e) en Verbouwing Magic Train (schaal 0e)

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #33 Gepost op: 20 februari 2018, 19:51:18 »
Hoi mark,

Als alternatief voor een draaischijf, was ik aan een rolbrug aan het denken.
Basis een lineaire stappenmotor van tante Ali.

Dat kan natuurlijk ook. Principe blijft hetzelfde: Een kant kiezen als "0"positie en daar een schakelaar (sensor) zetten. De andere sporen zijn dan gewoon uit te tellen. En met zo'n lineaire stappenmotor ben je ook heel nauwkeurig. De constructie van Ali ziet er stabiel uit en met 40cm lengte kun je ook wel wat sporen aansluiten.

En met de levertijd van tante Ali heb je ook nog even tijd om het stappenmotor gebeuren onder de knie te krijgen  :)
Ook kun je alvast kijken wat je over de stappenmotor 17HS2408S te weten kunt komen (spanning en stroomsterkte), zodat je de juiste motorcontroller erbij kunt vinden.
Maar alles stap voor stap, hè!

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

Offline mark mms

  • Super Modelspoorder
  • ******
  • Berichten: 1.224
  • Thanked: 26 times
  • Geslacht: Man
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #34 Gepost op: 20 februari 2018, 21:34:06 »
Hallo Rob,

Ik heb hem aangesloten zoals je hebt uitgelegd, maar er gebeurt zeer weinig.
De sketch heb ik niet aangepast.

De motor draait heel klein beetje en heel erg langzaam.
De LEDs branden alle vier constant.
Na enige tijd gaat stopt de motor met draaien en begint er een ledje te knipperen op de arduino.



Motorshield 1N1+1N2+1N3+1N4 op arduino 9+10+11+12
Motorshield voeding op GND en 5V van de arduino (dat zijn zwart (-) en wit (+))
De LEDs rechtstreeks in 2+3+4+5 en dan op het board daaraan een weerstand 100 ohm en door naar GND van het board



Dan van de arduino met geel naar de drukknoppen.
Aan de andere zijde van de drukknoppen bruggetjes gemaakt van 10k Ohm.
Een zijde, direct aan de drukknop en het eerste bruggetje, is verbonden aan GND.
De andere zijde aan de 5V, rode draad via board naar de arduino.



Wat doe ik fout?
Chinese arduino zou het toch ook moeten doen?


Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #35 Gepost op: 20 februari 2018, 22:15:30 »
Hee Mark,

Alles is goed aangesloten en het werkt, hoor!
Wat je ziet gebeuren is het bepalen van de 0-positie. Dat is het opstart gedeelte.

Het enige wat je moet doen is pin A0 even met de ground verbinden als de motor kleine stapjes maakt en de vier ledjes branden.
Dat is het signaal dat de 0-positie is gevonden. De motor draait daarna de andere kant op en een van de ledjes gaat knipperen.
Als de motor stopt brand het ledje continue, en dan ben je bij het 'spoor' aangekomen.
Vanaf dat moment moeten de knopjes het doen!

Als de A0 niet even met de ground wordt verbonden, dan stopt de motor na 700 stappen en knippert de Arduino LED snel. Dat is de 'foutmelding' dat de 0-positie niet is gevonden. Deze voorkomt dat er eindeloos naar de 0 positie wordt gezocht.

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

Offline mark mms

  • Super Modelspoorder
  • ******
  • Berichten: 1.224
  • Thanked: 26 times
  • Geslacht: Man
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #36 Gepost op: 22 februari 2018, 21:28:15 »
Joepie!

Het werkt!
Die A0 had ik over het hoofd gezien.

Maar hoe kan ik meer sporen aansluiten.
Ik heb het een en ander geprobeerd.
Hij gaat wel naar die positie, maar direct weer terug naar de uiterst rechtste positie.
Kun je aangeven welke regel(s) veranderd moeten worden om 1-2-3 sporen toe te voegen?


Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #37 Gepost op: 22 februari 2018, 21:55:46 »
Hee Mark,
Gefeliciteerd!

Je werkt nu nog met een oude versie van de sketch. Sinds de inbouw van de draaischijf heb ik wat verbeteringen toegevoegd.
Zo was de het uitlezen van de knoppen niet helemaal betrouwbaar.
En was het uitrekenen van de motorpositie ingewikkeld (en niet helemaal juist).
Verder heb ik de sketch wat opgeschoond en geprobeerd alles in definities onder te brengen, zoals de snelheden, afstanden (ik denk dat je met een spindelmotor eerder duizenden dan honderden stappen moet maken) en het aantal sporen instellen.
Verder branden bij het begin nu alleen led 1 en 4.

Voor meer sporen zul je ook meer knopjes en meer leds nodig hebben.
Voor de knoppen kun je de spanningsdeler uitbreiden: gewoon meer weerstanden op een rijtje. Je moet dan wel even uitvogelen wat de analoge waarden worden.je kunt daar eventueel even een korte sketch voor schrijven die de waarde op print (serial print).
Precies tussen deze waarden zet je de grenzen op in (zie de nieuwe versie van de sketch hier onder, werkt niet in de oude versie):

int buttonBoundary[] {900, 750, 600, 300}; // voltage divider boundary values between buttons on buttonsPin

Let op: dit moet van hoog naar laag.

Verder kun je het aantal ledjes uitbreiden. Dat doe je met de pindefinities en in deze array:

int ledPins[] {trackled1 ,trackled2, trackled3, trackled4};   // array for light track moving to or pointing at


Het aantal sporen en de stappen naar elk spoor zet je dan hier op:

#define numberOfTracks      4              // number of tracks on turntable
                                           // arrays below must correspond with number of tracks:
int track[]        {-9, -185, -454, -624}; // positions for 4 turntable tracks (motor steps from 0)



Ik heb het meer sporen niet uitgeprobeerd, maar dat kun jij dan mooi testen...
Ook als je de ledjes niet hebt aangesloten, moet je toch net zovel leds definiëren als er sporen zijn. Je kunt natuurlijk ook de bestaande Leds hergebruiken, led 1 = spoor 1 en 5, led 2 = spoor 2 en 6, etc. Dat doe je bijvoorbeeld zo voor 8 sporen:

int ledPins[] {trackled1 ,trackled2, trackled3, trackled4, trackled1 ,trackled2, trackled3, trackled4};   // array for light track moving to or pointing at



Affijn, hier is de nieuwe versie:
/* Turntable control
 * =================
 * For a partial turntable. 4 tracks at  angles of 15, 20 and 15 degrees
 *
 * Beschrijving (NL)
 * Besturing voor eeen modelspoor segmentdraaischijf met 4 sporen.
 * De draaischijf wordt aangedreven met een stappenmotor.
 * Bediening met een '0-positie' sensor en 4 drukknoppen op een spanningsdeler
 * Terugmelding over 4 LEDs: een LED voor elk spoor.
 */
/***** Import needed libraries ******/
#include <AccelStepper.h>
#define FULLSTEP 4
#define HALFSTEP 8


/***** Declare Pin Numbers *******/

// motor pins
#define motorPin1  12  // Blue   - 28BYJ48 pin 1
#define motorPin2  11  // Pink   - 28BYJ48 pin 2
#define motorPin3  10  // Yellow - 28BYJ48 pin 3
#define motorPin4  9   // Orange - 28BYJ48 pin 4

// sensor pins (analog)
#define startPin   A0   // pin to detect turntable start position
#define buttonsPin A1   // analog pin to read buttons by Voltage divider

// led indicators pins
# define trackled1 5    // led for track 1
# define trackled2 4    // led for track 2
# define trackled3 3    // led for track 3
# define trackled4 2    // led for track 4

#define ledpin     13  // LED on Arduino


/******* Definitions for turntable control ******/

// ---- Turntable ----
// Physical definitions
#define slack               9          // steps of slack in stepper motor axel from middle
#define initMove          -30          // steps to move at initialisation before sensor read

#define numberOfTracks      4              // number of tracks on turntable
                                           // arrays below must correspond with number of tracks:
int track[]        {-9, -185, -454, -624}; // positions for 4 turntable tracks (motor steps from 0)
int buttonBoundary[] {900, 750, 600, 300}; // voltage divider boundary values between buttons on buttonsPin
int ledPins[] {trackled1 ,trackled2, trackled3, trackled4};   // array for light track moving to or pointing at

// Operational definitions
#define startTrack          1         // initial track to move to (after detecting 0-position sensor)
#define maxTurnSpeed       55.0       // maximum speed of stepper motor normal operation
#define startTurnSpeed     20.0       // start speed of stepper motor
#define turnAccelleration  46.0       // acceleration of stepper motor

// ---- Led display ----
unsigned long prevms = 0;             // blinking led milisecs last on/off
unsigned long curms = millis();       // blinking led milisecs now
const long blnkint = 250;             // blink interval in milliisec.


/******* Global variables ******/

// ---- Turntable variables ----
int currentTrack = 0;            // position after initialisation
int newTrack = 0;                // 1st position to move to after initialisation
int button = -1;                 // button pressed (0, 1 2 or 3, -1 is no button)

// ---- Led display variables ----
int blnk = HIGH;


/****** Objects *******/

// ---- Stepper motor object ----
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);


/****** Functions ******/

// ---- initialiation: 0-position detection ----
// Turntable initialisation after starting/resetting Arduino.
// It first moves the stepper motor counterclockwise (defined by initMove),
// and then moves the turntable clockwise slowly untill 0-positions is sensed
// on "startPin".
// Motor position "0"is set to the sensor position.
// Function returns "true" if sensor has been detected.
//
// Maximum steps is to find sensor: last track position + initial move steps.
// When 0 position is not sensed, function returns "false".

bool initTurntable () {
  bool succesfull = true;     // return parameter
  int x = 0;                  // step counter
  digitalWrite (ledpin,LOW);  // show initialisation ongoing on Arduino board

  // calculate total maximum number of steps (maxSteps) to find sensor:
  // the number of steps to position of last track, including slack and initial move
  int maxSteps = abs(track[numberOfTracks - 1]) + abs(initMove) +2*slack;  // sensor must be found in less steps
 
  // move  turntable into start / reset position

  stepper1.setMaxSpeed(1);
  stepper1.setAcceleration(500.0);
  stepper1.setSpeed(1);
  // start with a move counterclockwise in case just beyond sensor...
  x = initMove; 

  // now keep turning the table slowly until start point sensed
  do {
    stepper1.runToNewPosition(x);
    x++;
  } while ( (digitalRead (startPin) == HIGH) && (x < maxSteps) ); //run until sensor active, or until max steps done (error)

  if (x < maxSteps) {                 // start position sensed. Intialise stepper position
    stepper1.setCurrentPosition(0);   // sensor position = 0
    digitalWrite (ledpin,HIGH);       // end of initialisation
  } else {                            //initialisation error
    succesfull = false;
  }
  stepper1.disableOutputs();          // Turn off stepper motor power
  return succesfull;


// ---- read button sensor ----
// function to get button from analog pin
// returns button 0-3 pressed.
// returns -1 if no button pressed
int getButtonPressed () {
  int r = analogRead (buttonsPin);
  int b = -1;
  if (r < buttonBoundary[0]) {  // a button was pressed
    delay(200);                 // wait for analog pin to stabalize
    r = analogRead (buttonsPin);

    // check which boundary value has been read on analog buttonPin
    if (r < buttonBoundary[0]) {
      b = numberOfTracks -1;          // check lat button to first
      while (r > buttonBoundary[b]) {
        b--;
      }
    }
  }
  return b;
}

// ---- turntable movement calculation ----
// function to calculate new position for turntable to move to
// input: new track number
// output: new stepper position with corrections mechanical inaccuracies
int calcNewPosition (int trk) {
 
  int pos = 0;                 // new stepper motor position
  int curTurnDirection = 0;    // current direction in Turntable = calculate for slack in movement

  // keep values last move before calculating new move
  currentTrack = newTrack;
  newTrack = trk; 

  // Init new move
  // check direction for additional slack movement.
  // calculate new stepper position
  if ( newTrack > currentTrack ) {
    curTurnDirection = -1;                 // counter clockwise
  } else {
    curTurnDirection = 1;                  // clockwise
  }
  // calculate position to move to     
  pos = track[newTrack];                   // bare track position
  pos = pos + (curTurnDirection*2*slack);  // correction for slack
  return pos;
}

// ---- LED indiator function ----
// led on / of / blink function
// input: led number
//        func: 0 = off, 1=blink, 2 = on

void setLed (int led, int func) {
  if (func == 0) {
    digitalWrite(ledPins[led], LOW);
  }
  if (func == 2) {
    digitalWrite(ledPins[led], HIGH);
  }
  if (func == 1) {
    curms = millis();
    if (curms - prevms >= blnkint) {
      prevms = curms;
      if (blnk == HIGH) {
        blnk = LOW;
      } else {
        blnk = HIGH;
      }
      digitalWrite(ledPins[led], blnk);
    }
  }
}


/****** SETUP: RUNS ONCE ******/

void setup() 
{
  bool init = false;  // turntable intialisation status
  int x = 0;
  // set the digital led pins as output and initialise values
  while (x < numberOfTracks) {
    pinMode(ledPins[x], OUTPUT);
    analogWrite (ledPins[x], 255);
    digitalWrite (ledPins[x], LOW); // show initializing: all track leds off
    x++;
  }

  digitalWrite (ledPins[0], HIGH); // show: initializing: outermost track leds on
  digitalWrite (ledPins[3], HIGH);
  pinMode (ledpin, OUTPUT);
  digitalWrite (startPin,HIGH);     // initialise startpin high
  digitalWrite (buttonsPin,HIGH);   // initialise button read
 
  // turntable initialisation: search for 0-position sensor
  init = initTurntable() ;          // initialise turntable.

  while (not init) {                // Find 0-position (sensor), false = 0-pos. not found
    digitalWrite(ledpin,HIGH);      // Blink led indefenitely
    delay(100);
    digitalWrite(ledpin,LOW);
    delay(100);
  }

  // no error: setup turntable and led indicators for normal operation
  x=0;
  while (x < numberOfTracks) {  // switch of track leds
    digitalWrite (ledPins[x], LOW);
    x++;
  }
  // Setings for speed and accelaration during normal operation
  stepper1.setMaxSpeed(maxTurnSpeed);
  stepper1.setAcceleration(turnAccelleration);
  stepper1.setSpeed(startTurnSpeed);

  // move to initial track
  stepper1.moveTo(calcNewPosition(startTrack));  // move to new position in normal operation
  stepper1.runSpeed();
 
}//--(end setup )---


/****** LOOP: RUNS CONSTANTLY ******/

void loop()   
{
  stepper1.run();                      // operate the stepper motor

  // turntable stop
  if (stepper1.distanceToGo() == 0) {  // turntable at desired position
    stepper1.disableOutputs();         // turn stepper motor off (all pins low)
    setLed (newTrack,2);               //turn on led for track positioned to

    button = getButtonPressed ();      // check if a button was pressed
    if (button > -1 && button != newTrack) {     // button pressed for another track than positioned on
      setLed (newTrack,0);             //turn off led for this track, we're moving away from it.
      stepper1.moveTo(calcNewPosition(button));  // calculate new stepper position and move to it.
    }
  }
 
  // turntable moving
  else {                               // turntable turning (moving to desired position)
    setLed (newTrack,1) ;              // blink the led for the track where turntable is moving to
  }

}//--(end main loop )---


//*********( THE END )***********

Succes!

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

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #38 Gepost op: 22 februari 2018, 22:00:18 »
Help,
Het forum doet iets met de vierkante haken in de sketch....
Even kijken hoe ik dit goed kan posten.
[...]
Ah, gevonden. Sketch alsnog als "code" in de post gezet.
Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline mark mms

  • Super Modelspoorder
  • ******
  • Berichten: 1.224
  • Thanked: 26 times
  • Geslacht: Man
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #39 Gepost op: 23 februari 2018, 21:19:05 »
Hallo Rob,

Het is gelukt!
Ik heb nu zelfs zes sporen aangesloten.
Wellicht dat ik nog meer wil, maar voor zover ben ik zeer tevreden.


Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #40 Gepost op: 23 februari 2018, 21:37:16 »
Da's mooi Mark. Gaaf!
Tsja, nu is het wachten op tante Ali, denk ik...
En zodra de spullen geleverd zijn ben ik wel benieuwd naar de bouw van de rolbrug (en ik ben vast niet de enige).
Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Stoomlokkie

  • Perronmedewerker
  • **
  • Berichten: 58
  • Thanked: 1 times
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #41 Gepost op: 23 januari 2019, 17:10:49 »
Leuk project. Die Arduino stappenmotor herken ik. Want die heb ik thuis ook liggen. Helaas kan ik de sketch niet uploaden. krijg altijd een foutmelding. Waar zit hem dat in? Want ik wil dit wel na gaan maken, al heb ik de draaischijf nog niet in mijn bezit.

Offline Semantha

  • Moderator
  • Super Modelspoorder
  • *****
  • Berichten: 2.312
  • Thanked: 69 times
  • Geslacht: Vrouw
  • I didn't choose photography, photography chose me!
    • Van der Kuijp Photography
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #42 Gepost op: 23 januari 2019, 19:12:39 »
Is de sketch een .jpg bestand???
Als dat zo is dan moet je hem eerst uploaden naar een externe server/host aangezien hier niet direct .jpg bestanden geplaatst kunnen worden vanwege de ruimte op onze eigen server.
Fotografen met passie.

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #43 Gepost op: 23 januari 2019, 23:31:21 »
Hoi Semantha,

Is de sketch een .jpg bestand???
Als dat zo is dan moet je hem eerst uploaden naar een externe server/host aangezien hier niet direct .jpg bestanden geplaatst kunnen worden vanwege de ruimte op onze eigen server.

Nee, het is tekst. Meestal zet ik sketches als 'code' in het bericht.


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

Offline Stoomlokkie

  • Perronmedewerker
  • **
  • Berichten: 58
  • Thanked: 1 times
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #44 Gepost op: 12 februari 2019, 11:24:37 »
Ik ga zo'n handdraaischijf een keer opsnorren! En dan ga ik dit eens maken. Het stappenmotortje heb ik al liggen.

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #45 Gepost op: 12 februari 2019, 13:54:33 »
Hoi Stoomlokkie,

Leuk.
Ik ga zo'n handdraaischijf een keer opsnorren! En dan ga ik dit eens maken. Het stappenmotortje heb ik al liggen.
Als je zover bent, laat het even weten: dan zet ik de nieuwste versie van het programma'tje (sketch) hier nog even neer.

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

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #46 Gepost op: 9 september 2019, 09:08:48 »
Op verzoek hierbij de laatste software voor de draaischijf.

/* Turntable control
 * =================
 * For a partial turntable. 4 tracks at  angles of 15, 20 and 15 degrees
 *
 * Beschrijving (NL)
 * Besturing voor eeen modelspoor segmentdraaischijf met 4 sporen.
 * De draaischijf wordt aangedreven met een stappenmotor.
 * Bediening met een '0-positie' sensor en 4 drukknoppen op een spanningsdeler
 * Terugmelding over 4 LEDs: een LED voor elk spoor.
 *
 * versie 2.0, 20 okt 2018
 */
/***** Import needed libraries ******/
#include <AccelStepper.h>
#define FULLSTEP 4
#define HALFSTEP 8


/***** Declare Pin Numbers *******/

// motor pins
#define motorPin1  2   // Blue   - 28BYJ48 pin 1
#define motorPin2  3   // Pink   - 28BYJ48 pin 2
#define motorPin3  4   // Yellow - 28BYJ48 pin 3
#define motorPin4  5   // Orange - 28BYJ48 pin 4

// sensor pins (analog)
#define startPin   8    // pin to detect turntable start position
#define buttonsPin A1   // analog pin to read buttons by Voltage divider

// led indicators pins
# define trackled1 9    // led for track 1
# define trackled2 10   // led for track 2
# define trackled3 11   // led for track 3
# define trackled4 12   // led for track 4

#define ledpin     13   // LED on Arduino


/******* Definitions for turntable control ******/

// ---- Turntable ----
// Physical definitions
#define slack               9          // steps of slack in stepper motor axel from middle
#define initMove          -30          // steps to move at initialisation before sensor read

#define numberOfTracks      4              // number of tracks on turntable
                                           // arrays below must correspond with number of tracks:
//int track[]        {-9, -185, -454, -624}; // positions for 4 turntable tracks (motor steps from 0)
int track[]        {-37, -207, -473, -643}; // positions for 4 turntable tracks (motor steps from 0)
int buttonBoundary[] {800, 500, 400, 200}; // voltage divider boundary values between buttons on buttonsPin
int ledPins[] {trackled1 ,trackled2, trackled3, trackled4};   // array for light track moving to or pointing at

// Operational definitions
#define startTrack          1         // initial track to move to (after detecting 0-position sensor)
#define maxTurnSpeed       55.0       // maximum speed of stepper motor normal operation
#define startTurnSpeed     20.0       // start speed of stepper motor
#define turnAccelleration  46.0       // acceleration of stepper motor

// ---- Led display ----
unsigned long prevms = 0;             // blinking led milisecs last on/off
unsigned long curms = millis();       // blinking led milisecs now
const long blnkint = 250;             // blink interval in milliisec.


/******* Global variables ******/

// ---- Turntable variables ----
int currentTrack = 0;            // position after initialisation
int newTrack = 0;                // 1st position to move to after initialisation
int button = -1;                 // button pressed (0, 1 2 or 3, -1 is no button)

// ---- Led display variables ----
int blnk = HIGH;


/****** Objects *******/

// ---- Stepper motor object ----
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);


/****** Functions ******/

// ---- initialiation: 0-position detection ----
// Turntable initialisation after starting/resetting Arduino.
// It first moves the stepper motor counterclockwise (defined by initMove),
// and then moves the turntable clockwise slowly untill 0-positions is sensed
// on "startPin".
// Motor position "0"is set to the sensor position.
// Function returns "true" if sensor has been detected.
//
// Maximum steps is to find sensor: last track position + initial move steps.
// When 0 position is not sensed, function returns "false".

bool initTurntable () {
  bool succesfull = true;     // return parameter
  int x = 0;                  // step counter
  digitalWrite (ledpin,LOW);  // show initialisation ongoing on Arduino board

  // calculate total maximum number of steps (maxSteps) to find sensor:
  // the number of steps to position of last track, including slack and initial move
  int maxSteps = abs(track[numberOfTracks - 1]) + abs(initMove) +2*slack;  // sensor must be found in less steps
 
  // move  turntable into start / reset position

  stepper1.setMaxSpeed(1);
  stepper1.setAcceleration(500.0);
  stepper1.setSpeed(1);
  // start with a move counterclockwise in case just beyond sensor...
  x = initMove; 

  // now keep turning the table slowly until start point sensed
  do {
    stepper1.runToNewPosition(x);
    x++;
  } while ( (digitalRead (startPin) == HIGH) && (x < maxSteps) ); //run until sensor active, or until max steps done (error)

  if (x < maxSteps) {                 // start position sensed. Intialise stepper position
    stepper1.setCurrentPosition(0);   // sensor position = 0
    digitalWrite (ledpin,HIGH);       // end of initialisation
  } else {                            //initialisation error
    succesfull = false;
  }
  stepper1.disableOutputs();          // Turn off stepper motor power
  return succesfull;


// ---- read button sensor ----
// function to get button from analog pin
// returns button 0-3 pressed.
// returns -1 if no button pressed
int getButtonPressed () {
  int r = analogRead (buttonsPin);
  int b = -1;
  if (r < buttonBoundary[0]) {  // a button was pressed
    delay(200);                 // wait for analog pin to stabalize
    r = analogRead (buttonsPin);

    // check which boundary value has been read on analog buttonPin
    if (r < buttonBoundary[0]) {
      b = numberOfTracks -1;          // check lat button to first
      while (r > buttonBoundary[b]) {
        b--;
      }
    }
  }
  return b;
}

// ---- turntable movement calculation ----
// function to calculate new position for turntable to move to
// input: new track number
// output: new stepper position with corrections mechanical inaccuracies
int calcNewPosition (int trk) {
 
  int pos = 0;                 // new stepper motor position
  int curTurnDirection = 0;    // current direction in Turntable = calculate for slack in movement

  // keep values last move before calculating new move
  currentTrack = newTrack;
  newTrack = trk; 

  // Init new move
  // check direction for additional slack movement.
  // calculate new stepper position
  if ( newTrack > currentTrack ) {
    curTurnDirection = -1;                 // counter clockwise
  } else {
    curTurnDirection = 1;                  // clockwise
  }
  // calculate position to move to     
  pos = track[newTrack];                   // bare track position
  pos = pos + (curTurnDirection*2*slack);  // correction for slack
  return pos;
}

// ---- LED indiator function ----
// led on / of / blink function
// input: led number
//        func: 0 = off, 1=blink, 2 = on

void setLed (int led, int func) {
  if (func == 0) {
    digitalWrite(ledPins[led], LOW);
  }
  if (func == 2) {
    digitalWrite(ledPins[led], HIGH);
  }
  if (func == 1) {
    curms = millis();
    if (curms - prevms >= blnkint) {
      prevms = curms;
      if (blnk == HIGH) {
        blnk = LOW;
      } else {
        blnk = HIGH;
      }
      digitalWrite(ledPins[led], blnk);
    }
  }
}


/****** SETUP: RUNS ONCE ******/

void setup() 
{
  bool init = false;  // turntable intialisation status
  int x = 0;
  // set the digital led pins as output and initialise values
  while (x < numberOfTracks) {
    pinMode(ledPins[x], OUTPUT);
    analogWrite (ledPins[x], 255);
    digitalWrite (ledPins[x], LOW); // show initializing: all track leds off
    x++;
  }

  digitalWrite (ledPins[0], HIGH); // show: initializing: outermost track leds on
  digitalWrite (ledPins[3], HIGH);
  pinMode (ledpin, OUTPUT);
  digitalWrite (startPin,HIGH);     // initialise startpin high
  digitalWrite (buttonsPin,HIGH);   // initialise button read
 
  // turntable initialisation: search for 0-position sensor
  init = initTurntable() ;          // initialise turntable.

  while (not init) {                // Find 0-position (sensor), false = 0-pos. not found
    digitalWrite(ledpin,HIGH);      // Blink led indefenitely
    delay(100);
    digitalWrite(ledpin,LOW);
    delay(100);
  }

  // no error: setup turntable and led indicators for normal operation
  x=0;
  while (x < numberOfTracks) {  // switch of track leds
    digitalWrite (ledPins[x], LOW);
    x++;
  }
  // Setings for speed and accelaration during normal operation
  stepper1.setMaxSpeed(maxTurnSpeed);
  stepper1.setAcceleration(turnAccelleration);
  stepper1.setSpeed(startTurnSpeed);

  // move to initial track
  stepper1.moveTo(calcNewPosition(startTrack));  // move to new position in normal operation
  stepper1.runSpeed();
 
}//--(end setup )---


/****** LOOP: RUNS CONSTANTLY ******/

void loop()   
{
  stepper1.run();                      // operate the stepper motor

  // turntable stop
  if (stepper1.distanceToGo() == 0) {  // turntable at desired position
    stepper1.disableOutputs();         // turn stepper motor off (all pins low)
    setLed (newTrack,2);               //turn on led for track positioned to

    button = getButtonPressed ();      // check if a button was pressed
    if (button > -1 && button != newTrack) {     // button pressed for another track than positioned on
      setLed (newTrack,0);             //turn off led for this track, we're moving away from it.
      stepper1.moveTo(calcNewPosition(button));  // calculate new stepper position and move to it.
    }
  }
 
  // turntable moving
  else {                               // turntable turning (moving to desired position)
    setLed (newTrack,1) ;              // blink the led for the track where turntable is moving to
  }

}//--(end main loop )---


//*********( THE END )***********

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

Offline Francisbl4

  • Kruier
  • *
  • Berichten: 2
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #47 Gepost op: 15 april 2020, 22:01:30 »
Beste ,
Ik ben nieuw hier en ook pas gestart met arduino .
Nu vergelijk ik de 3 versies van programmering voor de draaischijf . Heeft het een reden waarvoor A0 verwisseld is met startpin 8 in de laatste programmering ?
Ik zou de programmatie willen gebruiken op een draaischijf die ik reeds uitprintte van thingivers . (type met de tandwielen) Gebruik ook marklin wisselstroom sporen type C .
Het startpunt moet ik nog opbouwen met een sleepring , zoals jullie dat deden , of met een switch of iets dergelijks . Denk er nog over na . Moet daar ook een weerstand in dit contact verwerkt worden zoals in de drukknoppen ?

Alvast bedankt voor de hulp .

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #48 Gepost op: 15 april 2020, 22:41:45 »
Hoi Francis,

Leuk dat je ook met de Arduino begonnen bent.
In de laatste 'sketch' heb ik de pin van analoog (A0) naar digitaal (8) gewisseld, omdat ik de "0 positie" (startpositie) detectie heb aangepast. Dit gebeurt nu met een magneetje in de draaischijf en een magneet detector (z.g Hall sensor). Daarvoor had ik een duidelijke 0 en 1 nodig, dus een digitale pin. De 0 positie op de rails was te onbetrouwbaar, met name niet nauwkeurig genoeg. Hierdoor was soms de uitlijning op de sporen niet goed.

Op zich hoeven er geen weerstanden op de pinnen van de Aduino, zolang je de spanning maar tussen de 0 en 5 volt houdt. Een spanning lager dan 0 (negatief) boven de 5 V op een I/O pin kan de Arduino beschadigen, net als een stroom van meer dan 40 mA.

Rob.

PS: wil je je misschien ook nog even voorstellen in dit topic http://www.h0modelspoor.nl/index.php?topic=3736.0 ?
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Bert

  • Rangeerder
  • ****
  • Berichten: 372
  • Thanked: 20 times
  • Geslacht: Man
Re: Aandrijving inbouwen in handdraaischijf
« Reactie #49 Gepost op: 24 januari 2022, 14:41:57 »
Interessant project Rob! Was van plan een draaischijf te maken met microschakelaars voor de posities maar je hebt de drempel voor Arduino besturing weggehaald :)

Op MP staan nu ook Fleischmann schijven voor weinig maar die zijn wat klein lijkt me. Mijn grootste loc is bijna 20cm. Hoe groot is jouw draaischijf?