Faller Car drejeskive

Her kan du debattere og stille spørgsmål til alt om elektronik og digitaldrift på modeljernbanen. Skal du have hjælp til en dekoder eller driller signalet? Stil dit spørsmål her.
Besvar
moppe
Lokomotivfører
Indlæg: 3218
Tilmeldt: 30 jul 2011, 12:22
Digital: Ja
Scale: H0 - 2-rail
Geografisk sted: Hammel
Kontakt:

Faller Car drejeskive

Indlæg af moppe » 16 jun 2019, 22:33

Torsdag aften - til klubaften - kom vi til at tale om at det kunne være dejligt at kunne vende en Faller Car, uden at skulle bruge en 30 cm radius og dermed 40 cm cirkel i et landskab.

Mikkelsen gik i tænkeboks og seeeeent torsdag aften var konceptet på plads og hardwaren under udarbejdelse. Det skulle være en drejeskive med magnetstop. En autonom enhed, som kunne indsættes på enhver modelbane.

Fredag talte jeg så med et af de andre klubmedlemmer igen - han havde fundet en video af en - nå ja, Faller Car drejeskive, hvor sensor og servo til stop er placeret på selve drejeskiven og med ledninger der vrides i, hver gang drejeskiven er i bevægelse.

Netop det sidste havde jeg allerede "designet væk", for det bliver en kilde til fejl (erfaring!).

Softwaren blev videreudviklet i løbet af lørdagen og efter en dag på modelbanen, hvor jeg havde viste mekanikken til et par af de andre, lavede jeg mekanikken færdig her til aften.

Resultatet ses her:


Det er langt fra den endelige løsning - det skal nærmere ses som et "proof of concept". Eksempelvis bruger jeg en fotoaftaster til at se om der kommer en bil. Her ville jeg klart vælge en hall switch der kan indbygges i kørebanen. Samtidig er placering af den faste stopmagnet i selve drejeskiven nok heller ikke den mest optimale, den kunne godt have været lidt før og så kan jeg se at der er en lille "bug" omkring skriften i displayet.

Klaus

Søren
Lokomotivfører
Indlæg: 3985
Tilmeldt: 30 jul 2011, 08:36
Digital: Ja
Scale: H0 - 2-rail
Skinnesystem: Trix C
Geografisk sted: Malling
Kontakt:

Re: Faller Car drejeskive

Indlæg af Søren » 17 jun 2019, 11:13

Genialt! Hvor er det godt!
Med venlig hilsen
Søren

2-skinne med CS3 Plus, tysk forbillede IV, V og VI

Marklin4me
Stationsforstander
Indlæg: 79
Tilmeldt: 19 jan 2015, 17:49
Digital: Ja
Scale: H0 - 3-rail
Skinnesystem: Märklin C + M
Geografisk sted: Storkøbenhavn
Kontakt:

Re: Faller Car drejeskive

Indlæg af Marklin4me » 17 jun 2019, 21:59

Hvor er den fed. Fantastisk, den gad jeg da godt bruge :)
Glæder mig til at se og høre lidt mere til den.
De bedste toghilsner

Ulrik
Medlem af MJK Nordbanen, Mist-Zealand

moppe
Lokomotivfører
Indlæg: 3218
Tilmeldt: 30 jul 2011, 12:22
Digital: Ja
Scale: H0 - 2-rail
Geografisk sted: Hammel
Kontakt:

Re: Faller Car drejeskive

Indlæg af moppe » 17 jun 2019, 22:23

Well, som skrevet er der "proof of concept", der er ingen planer om at bygge den ind lige nu.

Men det står enhver frit for at kopiere ideen. Indkøbssedlen er klar:
2x servo
2x magnet
1x arduino
1x 2x char LCD
1x hall sensor
Tilpas mængde plastcard og træ
Magnetbånd.

Og så lige lidt kode til arduino.

Kode: Vælg alt

 /* FallerCar turn around unit
 * Input detecs a car and is blinded until sequence is finish
 * FallerCar drives onto turntable. 
 * Turntable turns 180 degress and the car starts again
 * Second servo moves a magnet close to the stop magnet in the table to neutralize it.
 * After one second the turntable goes back to initial position and "unblinds" the sensor.
 * 
 * LCD shows status of the sequence.
 * Serial port sends status of the sequence.
 * 
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * LCD VSS pin to ground
 * LCD VCC pin to 5V
 * 
 * 
*/

#include <Servo.h>                // include the library code for servo:
Servo Turnservo;                  // create servo object to control a servo
Servo Startservo;                 // create servo object to control a servo


#include <LiquidCrystal.h>                                      // include the library code for LCD:
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;     // initialize the library by associating any needed LCD interface pin
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);                      // with the arduino pin number it is connected to

                                 // Variabels for the first servo, that controls the turntable
int pos = 0;                     // variable to store the servo position
int MinPos = 10;                 // minimum servo angle in degrees
int MaxPos = 180;                // maximum servo angle in degrees
int ServoSpeedLoad = 25;         // delay in servospeed under load
int ServoSpeedEmpty = 25;        // delay in servospeed empty

                                 // Variables for the second servo, that controls the start magnet.
int SSpos = 0;                   // variable to store the stopservo position
int SSMinPos = 20;               // minimum servo angle in degrees
int SSMaxPos = 90;               // maximum servo angle in degrees
int SSServoSpeed = 25;           // delay in servospeed


                                 // I/O pins:
const int inputPin = 8;          // the number of the input pin
int InputState = 0;              // variable for reading the input status
const int ledPin1 =  A0;         // the number of the LED1 pin (sequence running)
const int ledPin2 =  A1;         // the number of the LED2 pin (table turning)
const int ledPin3 =  A2;         // the number of the LED3 pin (pause)


int FCInPause = 2000;            // Pause for Faller car entering turntable
int FCOutPause = 1000;           // Pause for Faller car leaving turntable


void setup() {

  pinMode(inputPin, INPUT_PULLUP);      // initialize the input pin as an input with pullup:
  pinMode(ledPin1, OUTPUT);             // initialize the LED1 pin as an output:
  pinMode(ledPin2, OUTPUT);             // initialize the LED2 pin as an output:
  pinMode(ledPin3, OUTPUT);             // initialize the LED3 pin as an output:

  Serial.begin(9600);                   // start serial port
  Serial.println("Startup");            // Send status to serial port            

  lcd.begin(16, 2);                     // set up the LCD's number of columns and rows:
  lcd.setCursor(0, 0);                  // Goto pos 0 line 0
  lcd.print("   Faller Car   ");        // Print start up message to the LCD.
  lcd.setCursor(0, 1);                  // Goto pos 0 line 2
  lcd.print("   Turntable    ");        // Print start up message to the LCD.
  
  Turnservo.attach(9);                  // attaches the servo on pin 9 to the servo object
  Turnservo.write(MaxPos);              // tell servo to go to reference position
  delay (1500);                         // wait 1,5 second
  Turnservo.detach();                   // detach servo to supress stutter
  
  Startservo.attach(10);                // attaches the servo on pin 10 to the servo object
  Startservo.write(SSMaxPos);           // tell servo to go to reference position
  delay (1500);                         // wait 1,5 second
  Startservo.detach();                  // detach servo to supress stutter
  
  digitalWrite(ledPin1, HIGH);          // turn off LED1 (sequence running)
  digitalWrite(ledPin2, HIGH);          // turn off LED2 (table turning)
  digitalWrite(ledPin3, HIGH);          // turn off LED3 (pause)
  
  lcd.clear();                          // clear LCD
  
 }


void loop() {
    InputState = digitalRead(inputPin);                       // read the state of the pushbutton
    if (InputState == LOW) {                                  // check if the pushbutton is pressed. If it is, the InputState is LOW:
        digitalWrite(ledPin1, LOW);                           // turn on LED1 (sequence running)
            Serial.println("Car detected - Sequence start");  // Send status to serial port            
            
            digitalWrite(ledPin3, LOW);                       // turn on LED3 (pause)
            Serial.println("Car entering turntable");         // Send status to serial port               
            lcd.setCursor(0, 0);                              // Goto pos 0 line 0
            lcd.print("Car entering    ");                    // Send status message to the LCD.
            lcd.setCursor(0, 1);                              // Goto pos 0 line 1 
            lcd.print("turntable       ");                    // Send status message to the LCD.
            delay(FCInPause);                                 // wait for FallerCar to enter the turntable
            digitalWrite(ledPin3, HIGH);                      // turn off LED3 (pause)


      Turnservo.attach(9);                        // attaches the servo on pin 9 to the servo object
      Serial.println("Table turning");            // Send status to serial port                           
            lcd.setCursor(0, 0);                  // Goto pos 0 line 0
            lcd.print("Table turning   ");        // Send status message to the LCD.
            lcd.setCursor(0, 1);                  // Goto pos 0 line 1
            lcd.print("Pos:            ");        // Send status message to the LCD.

       
       
       {
        digitalWrite(ledPin2, LOW);                       // turn on LED2 (table turning)
          for (pos = MaxPos; pos >= MinPos; pos -= 1) {   // goes from maximum servo angle to minimum servo angle in 1 degree steps
            Turnservo.write(pos);                         // tell servo to go to position in variable 'pos'
            delay(ServoSpeedLoad);                        // waits XXms for the servo to reach the position
            Serial.print("Pos = ");                       // Send status to serial port                 
            Serial.print(pos);                            // Send position to serial port
            Serial.println(" deg.");                      // Send status to serial port                     
            lcd.setCursor(9, 1);                          // Goto pos 6 line 1
            lcd.print("   ");                             // Clear field for position
            lcd.setCursor(9, 1);                          // Goto pos 6 line 1            
            lcd.print(pos);                               // Send actual position to LCD
           }
           
          digitalWrite(ledPin2, HIGH);                    // turn off LED2 (table turning)
          Turnservo.detach();                             // detach servo to supress stutter
        }
      
      Startservo.attach(10);                      // attaches the servo on pin 10 to the servo object
      Serial.println("Table turning");            // Send status to serial port                             
            lcd.setCursor(0, 0);                  // Goto pos 0 line 0
            lcd.print("Start servo turn");        // Send status message to the LCD.
            lcd.setCursor(0, 1);                  // Goto pos 0 line 1
            lcd.print("Pos:            ");        // Send status message to the LCD.

       
       
       {
          for (SSpos = SSMaxPos; SSpos >= SSMinPos; SSpos -= 1) {     // goes from maximum servo angle to minimum servo angle in 1 degree steps
            Startservo.write(SSpos);                                  // tell servo to go to position in variable 'SSpos'
            delay(SSServoSpeed);                                      // waits XXms for the servo to reach the position
            Serial.print("Pos = ");                                   // Send status to serial port                 
            Serial.print(pos);                                        // Send position to serial port 
            Serial.println(" deg.");                                  // Send status to serial port                 
            lcd.setCursor(9, 1);                                      // Goto pos 6 line 1
            lcd.print("   ");                                         // Clear field for position
            lcd.setCursor(9, 1);                                      // Goto pos 6 line 1            
            lcd.print(SSpos);                                         // Send actual position to LCD.
           }
           
            Startservo.detach();                                      // detach servo to supress stutter
        }

     
            digitalWrite(ledPin3, LOW);                 // turn on LED3 (pause)
            Serial.println("Car leaving turntable");    // Send status to serial port                 
            lcd.setCursor(0, 0);                        // Goto pos 0 line 0
            lcd.print("Car leaving     ");              // Send status message to the LCD.
            lcd.setCursor(0, 1);                        // Goto pos 0 line 
            lcd.print("turntable       ");              // Send status message to the LCD.


            delay(FCOutPause);                          // wait for FallerCar to leave the turntable
            digitalWrite(ledPin3, HIGH);                // turn off LED3 (pause)


      Startservo.attach(10);                            // attaches the servo on pin 10 to the servo object
      Serial.println("Start servo turn");               // Send status to serial port 
            lcd.setCursor(0, 0);                        // Goto pos 0 line 0
            lcd.print("Start servo turn");              // Send status message to the LCD.
            lcd.setCursor(0, 1);                        // Goto pos 0 line 1
            lcd.print("Pos:            ");              // Send status message to the LCD.
      
      
      {
          for (SSpos = SSMinPos; SSpos <= SSMaxPos; SSpos += 1) {       // goes from minimum servo angle to maximum servo angle in 1 degree steps
            Startservo.write(SSpos);                                    // tell servo to go to position in variable 'SSpos'
            delay(SSServoSpeed);                                        // waits XX ms for the servo to reach the position
            Serial.print("Pos = ");                                     // Send status to serial port                   
            Serial.print(SSpos);                                        // Send position to serial port
            Serial.println(" deg.");                                    // Send status to serial port
            lcd.setCursor(9, 1);                                        // Goto pos 6 line 1
            lcd.print("   ");                                           // Clear field for position
            lcd.setCursor(9, 1);                                        // Goto pos 6 line 1            
            lcd.print(SSpos);                                           // Send actual position to LCD.
           }
            Startservo.detach();                                        // detach servo to supress stutter


      Turnservo.attach(9);                          // attaches the servo on pin 9 to the servo object
      Serial.println("Table turning");              // Send status to serial port  
            lcd.setCursor(0, 0);                    // Goto pos 0 line 0
            lcd.print("Table turning   ");          // Print first line
            lcd.setCursor(0, 1);                    // Goto pos 0 line 1
            lcd.print("Pos:            ");          // Print second line
      }      
      
      {
        digitalWrite(ledPin2, LOW);                         // turn on LED2 (table turning)
          for (pos = MinPos; pos <= MaxPos; pos += 1) {     // goes from minimum servo angle to maximum servo angle in 1 degree steps
            Turnservo.write(pos);                           // tell servo to go to position in variable 'pos'
            delay(ServoSpeedEmpty);                         // waits XX ms for the servo to reach the position
            Serial.print("Pos = ");                         // Send status to serial port  
            Serial.print(pos);                              // Send position to serial port
            Serial.println(" deg.");                        // Send status to serial port  
            lcd.setCursor(9, 1);                            // Goto pos 6 line 1
            lcd.print("   ");                               // Clear field for position
            lcd.setCursor(9, 1);                            // Goto pos 6 line 1            
            lcd.print(pos);                                 // Send actual position to LCD.
           }
          Turnservo.detach();                               // detach servo to supress stutter
          digitalWrite(ledPin2, HIGH);                      // turn off LED2 (table turning)
        }
        
     digitalWrite(ledPin1, HIGH);           // turn off LED1 (sequence running)
     Serial.println("Sequence end");        // Send status to serial port                  
     lcd.clear();                           // clear LCD
}
    
    else {
  lcd.setCursor(0, 0);                  // Goto pos 0 line 0
  lcd.print("Waiting for next");        // Send status message to the LCD.
  lcd.setCursor(0, 1);                  // Goto pos 0 line 2
  lcd.print("car to turn     ");        // Send status message to the LCD.
         }
}


Klaus

henho
Ledvogter
Indlæg: 195
Tilmeldt: 16 jul 2012, 14:02
Digital: Ja
Scale: H0 - 2-rail
Skinnesystem: PIKO A Peco Roco
Geografisk sted: Ringkøbing

Re: Faller Car drejeskive

Indlæg af henho » 20 jun 2019, 15:33

WOW :lol:
Du er godt nok en hård banan Klaus :D
Med venlig hilsen

Henrik

2-skinne, medlem af SdMJK. Bruger Z21 på hjemmebanen.

moppe
Lokomotivfører
Indlæg: 3218
Tilmeldt: 30 jul 2011, 12:22
Digital: Ja
Scale: H0 - 2-rail
Geografisk sted: Hammel
Kontakt:

Re: Faller Car drejeskive

Indlæg af moppe » 20 jun 2019, 23:13

Hård banan og hård banan, det ved jeg nu ikke.

Mekanikken er en stor og en lille servo, limet fast på en træklods.
Så er der nogle tykke stykker plastic ("vejbane") og nogle tynde (udfyld mellem mangnetstrimler) og et tykt stykke mere (udkørselsmagnetholder).

Det resterende er programmering. Her er eksemplerne i Arduino IDE en stor hjælp.

Jeg har stykket min kode sammen stort set ud fra følgende eksempelfiler:

02.Digital -> Button (læs af trykknap)
01.Basics -> Digital read serial (sende status til computer via seriel port)
LiquidCrystal -> Display (sende status til display)
01.Basics -> Blink (tænde og slukke udgange og pauser/delay)

Til sidst har jeg importeret et bibliotek kaldet Servo, herfra har jeg brugt eksemplet "sweep".

Viden tilegnet ud fra de fem eksempler har jeg så bygget en sekvens ud fra, ryddet godt op i udseendet og tilføjet en masse kommentarer.

Det mest besværlige i hele seancen var faktisk at finde frem til hvor udkørselsmagneten skulle placeres. Jeg havde håbet på at en magnet med modsat polaritet under den på broen kunne klare opgaven, men det kunne den ikke, så jeg måtte have en ekstra magnet der kunne drejes ind til den oprindelige stopmagnet og "suge" magnetfeltet til sig.
Armen til udkørselsmagnet kunne være udført anderledes, det ville se godt ud, hvis den dukkede op fra under broen, men jeg vurderede at det kunne ende i et havari, hvis en servo "flippede", så jeg lavede det "fail-safe".

På et fast anlæg kunne jeg have valgt at bruge en Faller stopspole, men den kræver en noget højere spænding end hvad jeg har med Arduino, så det blev en servoløsning for lethedens skyld.


Klaus

Besvar