- Labornetzteil AliExpress         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Immer wieder Servos...

  1. #1
    Neuer Benutzer Öfters hier Avatar von Radom
    Registriert seit
    18.12.2016
    Ort
    Raisting
    Beiträge
    11

    Immer wieder Servos...

    Anzeige

    E-Bike
    Hi an alle!

    Zur Zeit versuche ich eine Weichensteuerung für die Lego Eisenbahn meines Sohnes zu realisieren.

    Zur mir:
    - bin recht neu in Arduino/Microcontroller
    - lese gerade das AVR Lehrbuch von Roland Walter
    - hab mir das meiste Programmieren selbst beigebracht (ca. 8 Jahre beruflich VBA, 2x C++ Kurs)
    - Elektronik-Kenntnisse auch selbst beigebracht (Anfängerkenntnisse würde ich sagen)
    - mit dem Projekt und den Bauteilen beschäftige ich mich jetzt ca. seit 5 Monaten, immer mal wieder am Wochenende, oder wenn es sich Abends ausgeht

    Folgende Bauteile verwende ich:
    - Arduino UNO
    - MUX-Shield (1. Generation)
    - umgebautes PC-Netzteil als ext. Stromquelle (so ähnlich wie das hier http://www.kondensatorschaden.de/201...ntiernetzteil/ )
    - Servos "Tower Pro SG90" (also die http://www.micropik.com/PDF/SG90Servo.pdf)
    - Taster mit RC-Glied (10 k & 100nF)
    - Shift-Register 74HC595

    Jede Weiche hat einen Taster, dieser toggelt die Weiche. Für die Gerade Fahrt auf der Weiche brauche ich den Servo auf 45°, für die Abzweigung ganz links (0°).

    Das Programm ist ungefähr so aufgebaut (Code am Ende):
    # herzlichen Dank an Oberallgeier für die Lösung mit dem Timer PWM ! https://www.roboternetz.de/community...l=1#post577715
    (hoffentlich hab ich es richtig verstanden )

    - Timer 1 CompA
    → Prescaler 1:64
    → 4999 Ticks / n Servos um das 20ms Intervall für jeden Servo zu starten
    → setzt den Ausgang des Registers des aktuellen Servos auf 1
    → prüft auf Tastendruck
    →→ wenn gedrückt, führe Funktion aus und setzt die Shift-Register der LEDs neu
    (so gelöst damit die LEDs nicht flackern und dass TIMER 1 so wenig wie möglich gestört wird)
    → setzt den Wert für Timer 1 CompB

    - Timer 1 CompB
    → sendet eine 0 an die Register und schaltet so das Servosignal ab


    Im Grunde funktioniert es, ABER
    - anders als im Datenblatt des Servos fahren die Servos nur auf die
    → linkeste Position, wenn die Pulsweite ~ 0,6 ms ist
    → 45° Position, wenn die Pulsweite ~ 1 ms ist
    - manche Servos fahren spiegelverkehrt ( 0 = 180 und die Bewegung ist auch gespiegelt )
    - der Puls ab dem 2. Schieberegister zappelt am Ende
    → Register 1: schönes Rechteck-Signal
    → Register 2: steigende Flanke sauber, das Zappeln beginnt ab dem eigentlichen Ende des Signals (z.B. 1ms) und verlängert das Signal um ca. 0,75 ms

    Edit: irgendwo habe ich gelesen dass ein Servo ca. 1 A Strom braucht, wenn 12 Servos am Netzteil hängen, zeigt das Multimeter aber nur ~350 mA an - ist da was falsch ?

    Und mir gehen jetzt die Ideen und Suchbegriffe aus um eine Lösung zu finden...


    Hat jemand Lust sich das anzusehen und mir vielleicht Tipps zu geben?


    PS: im Code habe ich 18 Weichen eingestellt, da ja (aktuell) die Pulsweite für die benötigten 45° nur 1ms sein muss (die Bahn hat auch 18 Weichen, das passt halt auch zu gut )
    In den Versuchen macht es keinen Unterschied ob ich max. 18 oder max 10 einstelle.



    Code:
    //  Define *********************************************************************************************************************
    #define CONTROL0  6   // 5    //MUX control pin 0 (S3 is connected to Arduino pin 2)
    #define CONTROL1  5   //4
    #define CONTROL2  4   //3
    #define CONTROL3  3   //2
    /*  --> das Shield wurde um einen Pin nach oben verschoben, um den Pin 2 fuer die Interrupt der Taster zu
     *      verwenden !!   
     *      
     *      !! ALT !! -> Interrupt mit Taster sind nicht empfohlen, wegen Prellen
     *                -> meine Schaltungs-/Softwareversuche haben das bestaetigt...
     */
    
    #define MUX0   14     //^= Analog 0
    #define MUX1   15     //^= Analog 1
    #define MUX2   16     //^= Analog 2
    
    
    //  Variablen / Konstanten *****************************************************************************************************
    //  1. konstante Vorgaben
    const int PIN_TMR_INI_OK      = 1;    //Kontroll-LED für erfolgreiche Timer-Initialisierung
    const int PIN_TMR_INI_NOK     = 13;   //Kontroll-LED für fehlgeschlagene Timer-Initialisierung -> wenn ocr1a < ocr1b ist !!
    
    const int PIN_TAKT_SRV       = 7;     //Takteingang              ( SH_CP )
    const int PIN_SPEICHER_SRV   = 8;     //Speicher-Sendung         ( ST_CP )
    const int PIN_DATEN_SRV      = 9;     //Pin für den Binär-Wert   ( DS )
    
    const int PIN_TAKT_LED      = 10;     //Takteingang              ( SH_CP )
    const int PIN_SPEICHER_LED  = 11;     //Speicher-Sendung         ( ST_CP )
    const int PIN_DATEN_LED     = 12;     //Pin für den Binär-Wert   ( DS )
    
    const int TICKS_ABZW       = 150;     //Weiche abzweigend - 0.60 ms = 150 Ticks bei Prescaler 1 : 64
    const int TICKS_GERADE     = 250;     //Weiche gerade     - 1.00 ms = 250 Ticks bei Prescaler 1 : 64
    
    const int nSRV_MAX         = 18;         //max Anzahl an Servos  -> es sind max 18 Servos moeglich !
    //  -> ocr1a > ocr1b ist Pflicht
    //  -> 4999 / 250 = 19.9 -->> 18 fuer Puffer
    //  -> NUR wenn max Stell-Signal = 250 ist !!
    
    const int FLAG_LED_GERADE = 0;          //Offset um die LED des n-ten Servos fuer gerade Fahrt zu setzen
    const int FLAG_LED_ABZW   = 1;          //Offset um die LED des n-ten Servos fuer abzweigende Fahrt zu setzen
    
    const int IX_SRV_POS        = 0;          //Index der Positionen im Array
    const int IX_RTG_LED        = 1;          //Index der LED-Flags im Array
    
    //  2. variable Werte
    int srv = -1;                                     //der aktuelle Servo als Zähler - für OCR1A
    int srvPositionen[ nSRV_MAX ][ 2 ];     //Array für die Servo-Positionen und den Pin fuer die Richtungs LED
    int tasterStatus[ nSRV_MAX ];            //Logische Schaltung zur Erfassung der Taster-Status-Wechsel
    
    int ocr1b;                                 //variabler Wert für das, je Servo verschiedene, Steuersignal
    
    int srvByte = 0;                         //1 Byte = 8 Bit, also ein Paket von 8 Servos
    int srvZaehler = 0;                     //Zaehler zur Ermittlung in welchem Byte = Register sich der aktuelle Servo befindet
    
    int ledByte = 0;                         //1 Byte = 8 Bit, also ein Paket von 4 Servos, da 1 Servo = 2 LED
    int ledZaehler = 0;                     //Zaehler zur Ermittlung in welchem Byte = Register sich die LEDs befinden
    
    int nShiftRegisterSrv;                 //Anzahl der vorhandenen/noetigen Register fuer die Servos
    int nShiftRegisterLEDs;               //Anzahl der vorhandenen/noetigen Register fuer die Richtungs-LEDs
    
    //  3. Berechnete Werte
    int ocr1a = 4999 / nSRV_MAX;     //Intervall für OCR1A um für jeden Servo ein 20 ms Intervall zu erhalten  ( 1 : 64 )
    
    
    
    //  Setup **********************************************************************************************************************
    void setup (  ) {
      //  Serial Monitor
    //  Serial.begin ( 115200 );
    
      //  MUX Pins setzen
      pinMode(CONTROL0, OUTPUT);
      pinMode(CONTROL1, OUTPUT);
      pinMode(CONTROL2, OUTPUT);
      pinMode(CONTROL3, OUTPUT);
    
      pinMode( MUX0, INPUT);   //Multiplexer 0 zu input setzen  - empfaengt die Taster-Eingaben
      pinMode( MUX1, INPUT);   //Multiplexer 1 zu input setzen  - empfaengt die Taster-Eingaben
      pinMode( MUX2, INPUT);   //Multiplexer 2 unbenutzt
    
      //  Ausgaenge festlegen
      pinMode ( PIN_TAKT_SRV, OUTPUT );
      pinMode ( PIN_SPEICHER_SRV, OUTPUT );
      pinMode ( PIN_DATEN_SRV, OUTPUT );
    
      pinMode ( PIN_TAKT_LED, OUTPUT );
      pinMode ( PIN_SPEICHER_LED, OUTPUT );
      pinMode ( PIN_DATEN_LED, OUTPUT );
    
      pinMode ( PIN_TMR_INI_OK, OUTPUT );
      pinMode ( PIN_TMR_INI_NOK, OUTPUT );
    
      //Es muss zwingend ocr1a > ocr1b sein! -> fuer ocr1b muss das laengste Servo-Signal angenommen werden (nServMax x laen. SrvSig)
      if ( ocr1a < TICKS_GERADE ) {
        digitalWrite ( PIN_TMR_INI_NOK, HIGH );
      }
      else {
        //  nShiftRegisterSrv bestimmen und Ueberlauf abfangen
        nShiftRegisterSrv = nSRV_MAX / 8 + 1;          //Register je aktueller Servo Nr., bzw. Anzahl Register bei nServMax
    
        if ( nShiftRegisterSrv * 8 == nSRV_MAX )       //Korrektur bei einer Oktave ( 16 / 8 + 1 = 3, es sind aber nur 2 Byte ! )
          nShiftRegisterSrv--;
    
        //  nShiftRegisterLEDs bestimmen und Ueberlauf abfangen
        nShiftRegisterLEDs = ( nSRV_MAX ) / 4 + 1;     //Teiler = 4 da es pro Servo 2 LEDs gibt (gerade Fahrt && abzweigende Fahrt)
    
        if ( nShiftRegisterLEDs * 4 == nSRV_MAX )      //Korrektur bei einer Oktave ( 16 / 4 + 1 = 5, es sind aber nur 4 Byte ! )
          nShiftRegisterLEDs--;
    
        //  Definiere Timer
        cli (  );                                                     //Interrupts abschalten
    
        //  Interrupt - Timer 1
        TCCR1A = 0;                                              //reset Register A
        TCCR1B = 0;                                              //reset Register B
        TCNT1 = 0;                                               //Zaehler nullen
    
        OCR1A = ocr1a;                                         //setze Intervall A
        TCCR1B |=  ( 1 << CS11 ) |  ( 1 << CS10 );   //Prescaler Timer 1 auf 1 : 64 einstellen
        TCCR1B |=  ( 1 << WGM12 );                       //Timer auf CTC mode stellen
        TIMSK1 |=  ( 1 << OCIE1A );                       //Timer 1 aktivieren
    
        sei (  );                                                    //Interrupts einschalten
    
        digitalWrite ( PIN_TMR_INI_OK, HIGH );
    
        //  Alle Positionen initialisieren
        for ( int serv = 0; serv < nSRV_MAX; serv++ ) {
          srvPositionen[ serv ][ IX_SRV_POS ] = TICKS_ABZW;
          srvPositionen[ serv ][ IX_RTG_LED ] = FLAG_LED_ABZW;
          tasterStatus[ serv ] = 0;
        }
      }
    
      //  Register der Servos loeschen
      digitalWrite ( PIN_SPEICHER_SRV, LOW );
      for ( int shift = nShiftRegisterSrv; shift >= 0; shift-- )
        shiftOut (  PIN_DATEN_SRV, PIN_TAKT_SRV, MSBFIRST, 0 );
      digitalWrite ( PIN_SPEICHER_SRV, HIGH );
    
      //  Register der LEDS setzen
      setLEDs();
    }
    //  //  ************************************************************************************************************************
    
    
    
    //  ISR TIMER 1 COMP A *********************************************************************************************************
    ISR (  TIMER1_COMPA_vect ) {
      const int muxMax = 16;                        //max Anzahl Pins je MUX-Register   (Anzahl, NICHT hoechste Pin-Nr !!)
      const int mux0 = 14;                            //Pin des 1. MUX-Registers
      
      int offsetMUXRegister;                          //Offset um das aktuelle MUX-Register aus dem aktuellen Servo zu errechnen
      int muxReg;                                        //MUX-Register des Servo-Tasters
    
      
      int muxPin;                                         //Pin des akt. Servos je MUX-Regisert
      
      
      //  Auf naechsten Servo zeigen
      srv++;
      if ( srv > nSRV_MAX - 1 ) {                   //Ueberlauf abfangen
        srv = 0;
        srvZaehler = 0;
        srvByte = 0;
      }
    
      //  Den n-ten Servo dem richtigen Register zuordnen
      int servRegister =  srv / 8 + 1;
    
      //  Dem n-ten Servo ueber das entsprechende Register das Steuersignal senden
      digitalWrite ( PIN_SPEICHER_SRV, LOW );
    
      for ( int shiftToRegister = nShiftRegisterSrv; shiftToRegister > 0; shiftToRegister-- ) {
        if ( shiftToRegister == servRegister ) {
          //  sende an Shift-Register
          //  -> der Binaer-Wert ist 2^( srv - srvByte * 8 )
          shiftOut (  PIN_DATEN_SRV, PIN_TAKT_SRV, MSBFIRST, 1 << ( srv - ( srvByte * 8 ) ) );  
            
          //  Taster des aktuellen Servos auf Veraenderung pruefen
          offsetMUXRegister = srv / 16;
          muxReg = mux0 + offsetMUXRegister;
          muxPin = srv - offsetMUXRegister * muxMax;
    
          digitalWrite ( CONTROL0, ( muxPin & 15 ) >> 3 );
          digitalWrite ( CONTROL1, ( muxPin & 7 ) >> 2 );
          digitalWrite ( CONTROL2, ( muxPin & 3 ) >> 1 );
          digitalWrite ( CONTROL3, ( muxPin & 1 ) );
    
          if ( digitalRead ( muxReg ) && digitalRead ( muxReg ) != tasterStatus[ srv ] ) {
            if ( srvPositionen[ srv ][ IX_SRV_POS ] == TICKS_ABZW ) {
              srvPositionen[ srv ][ IX_SRV_POS ] = TICKS_GERADE;
              srvPositionen[ srv ][ IX_RTG_LED ] = FLAG_LED_GERADE;
            }
            else {
              srvPositionen[ srv ][ IX_SRV_POS ] = TICKS_ABZW;
              srvPositionen[ srv ][ IX_RTG_LED ] = FLAG_LED_ABZW;
            }
    
            //  bei Tastendruck die LEDs neu schalten
            setLEDs();
          }
    
          tasterStatus[ srv ] = digitalRead ( muxReg );
        }
        else {
          //  sende an Shift-Register
          shiftOut (  PIN_DATEN_SRV, PIN_TAKT_SRV, MSBFIRST, 0 );
        }
      }
    
      digitalWrite ( PIN_SPEICHER_SRV, HIGH );
    
        //  Das Byte des naechsten Servos ermitteln
      srvZaehler++;
    
      if (  srvZaehler == 8 ) {
        srvZaehler = 0;
        srvByte++;
      }
    
      ocr1b = srvPositionen[ srv ][ IX_SRV_POS ];           //Länge des Steuersignals aus dem Array lesen
      OCR1B = ocr1b;                                      //Timer B setzen
      TIFR1  |= ( 1 << OCF1B );                           // ??? Klappt immer wenn das gesetzt wird
      TIMSK1 |= ( 1 << OCIE1B );                          //Timer B aktivieren
    }
    //  //  ************************************************************************************************************************
    
    
    
    //  ISR TIMER 1 COMP B *********************************************************************************************************
    ISR (  TIMER1_COMPB_vect ) {
      TIMSK1 &= ~ ( 1 << OCIE1B );                                  //CompB Match interrupt disabled
    
      digitalWrite ( PIN_SPEICHER_SRV, LOW );
      for ( int shift = nShiftRegisterSrv; shift >= 0; shift-- )    //das Steuersignal abschalten             --> Shift-Ausgang = OFF
        shiftOut (  PIN_DATEN_SRV, PIN_TAKT_SRV, MSBFIRST, 0 );
      digitalWrite ( PIN_SPEICHER_SRV, HIGH );
    }
    //  //  ************************************************************************************************************************
    
    
    
    //  setLEDs ********************************************************************************************************************
    void setLEDs() {
      //Reset
      shiftOut (  PIN_DATEN_LED, PIN_TAKT_LED, MSBFIRST, 0 );
    
      //Senden der 0/1 Zustaende der LEDs an die Register
      //  -> festes setzen aller LEDs um Flackern zu verhindern
      
      digitalWrite ( PIN_SPEICHER_LED, LOW );
      
      for ( int srvLEDs = nSRV_MAX; srvLEDs >= 0; srvLEDs-- ) {
        if ( srvPositionen [ srvLEDs ][ IX_RTG_LED ] == FLAG_LED_GERADE ) {
          digitalWrite ( PIN_TAKT_LED, HIGH );   //"abzweigendes" Bit auf 0 setzen
          digitalWrite ( PIN_TAKT_LED, LOW );    //Takt wieder abschalten
          
          digitalWrite ( PIN_DATEN_LED, HIGH );  //"gerades" Bit auf 1 setzen
          digitalWrite ( PIN_TAKT_LED, HIGH );   //"gerades" Bit uebertragen
          digitalWrite ( PIN_DATEN_LED, LOW );   //Daten abschalten
          digitalWrite ( PIN_TAKT_LED, LOW );    //Takt abschalten
        }
        else {
          digitalWrite ( PIN_DATEN_LED, HIGH );  //"abzweigendes" Bit auf 1 setzen
          digitalWrite ( PIN_TAKT_LED, HIGH );   //"abzweigendes" Bit uebertragen
          digitalWrite ( PIN_DATEN_LED, LOW );   //Daten abschalten
          digitalWrite ( PIN_TAKT_LED, LOW );    //Takt abschalten
          
          digitalWrite ( PIN_TAKT_LED, HIGH );   //"gerades" Bit auf 0 setzen
          digitalWrite ( PIN_TAKT_LED, LOW );    //Takt abschalten
        }
      }
    
      Serial.println();
      digitalWrite ( PIN_SPEICHER_LED, HIGH );
    }
    //  //  ************************************************************************************************************************
    
    
    
    //  loop ***********************************************************************************************************************
    void loop ( ) { }
    //  //  ************************************************************************************************************************
    Geändert von Radom (25.03.2017 um 11:08 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    .. Weichensteuerung für die Lego Eisenbahn ..
    - anders als im Datenblatt des Servos fahren die Servos ..
    - manche Servos fahren spiegelverkehrt ( 0 = 180 und die Bewegung ist auch gespiegelt ) ..
    Ich habe bei den von mir bisher verwendeten Servos selten ein richtiges Datenblatt gesehen. Bei vielen Servos sehe ich bei gleichen Typen die Anschläge bei unterschiedlich langen Signalen; selbst der Gleichlauf paarig-auf-Umschlag angeordneter Servos war bei mir mal nicht gewährleistet und ich musste die Servos anders einbauen (=> neue Tragestruktur) um einen weitgehend simultanen (Ab-)Lauf zu erreichen. Letzteres dürfte für die Weichensteuerung aber eher nicht von Bedeutung sein.

    .. → Register 2: steigende Flanke sauber, das Zappeln ..
    Dazu habe ich grad keine Idee, leider.

    .. irgendwo habe ich gelesen dass ein Servo ca. 1 A Strom braucht, wenn 12 Servos .. aber nur ~350 mA an - ist da was falsch ? ..
    Das ist, glaube ich, schon richtig. Der Servo zieht entsprechend seiner Belastung mehr oder weniger Strom. Tip: fahre den Servo auf eine beliebige Stellung. Erst ohne Last, später mit verschiedenen Lasten (z.B. Servohebel händisch belasten). Dabei sollte die Stromaufnahme sinnvoll steigen bzw. fallen. Die 1A-Auskunft: Servos brauchen zum Anfahren ne satte Strommenge. Das war mir bei kräftigen Servos aufgefallen, als ich einen bestimmten Typ (siehe hier)
    a) in den USA einkaufte (pololu) und später
    b) im Chinashop erwarb.

    Lastlos zogen die Servos ca. 34 mA inclusive Nanoclone bei 9,5V Speisespannung und zwei, drei Kontroll-LEDs. Die Chinadinger waren für mich daher Schrott - zittriges Fahrverhalten, teils lausiges Zittern auf der Stelle statt Anfahrt an die ungefähr vorgewählte Stellung. Hatte diese Chinateile weggelegt. Später mal zufällig hervorgeholt und bei 4A max. zulässiger Stromstärke (Netzteileinstellung) bei sonst gleichen Bedingungen betrieben. Da fuhren die problemlos. Bei rund 1A als obere Stromgrenze spinnen sie wie eh und je . . . Das ist reproduzierbar.

    .. Hat jemand Lust sich das anzusehen und mir vielleicht Tipps zu geben? ..
    Vielleicht hilft Dir das? Mehr Antwort ist jetzt, nach einer Woche Schifahren leider nicht drin.
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.04.2013
    Beiträge
    526
    Ist ein Servo nicht Overkill für eine Weichensteuerung? Bei den klassischen Modelleisenbahnen tut es da eine einfach Spule, die je nach Weichenstellung bestromt wird. Andererseits sind Servos so spottbillig... Wie alle Elektromotoren brauchen Servos je nach Last mehr oder weniger Strom, 1 A ist schon relativ viel. Für die Weichen müssten doch Microservos genügen, die brauchen sicher nicht viel. Man übrigens auch ne Feder ins Gestänge einbauen, dann geht nichts kaputt, wenn der Endanschlag nicht genau stimmt.

  4. #4
    Neuer Benutzer Öfters hier Avatar von Radom
    Registriert seit
    18.12.2016
    Ort
    Raisting
    Beiträge
    11
    Danke für eure schnellen Antworten!

    selten ein richtiges Datenblatt gesehen.
    Ui, in Datenblätter hatte ich bisher ein Urvertrauen...

    später mit verschiedenen Lasten (z.B. Servohebel händisch belasten)
    Es ist genau wie du sagst, in Ruhe verbrauchen sie die 350 mA und unter Last steigt es ein wenig.
    Die Stromzufuhr definiert erhöhen kann ich ja nicht, oder? Das System zieht doch immer so viel Strom wie es benötigt und nicht mehr?

    Vielleicht hilft Dir das? Mehr Antwort ist jetzt, nach einer Woche Schifahren leider nicht drin
    Klar hilft mir das schon. Jetzt steht fest dass ich nicht davon ausgehen kann, dass ich alle Servos wirklich simultan hinbekomme.

    Overkill für eine Weichensteuerung?
    Kannst du mir eine "einfache" Spule als Bsp geben? Und meinst du dann den Magnetismus aus der Spule zum Weiche stellen verwenden?

    Feder ins Gestänge
    Danke dafür, da ist es mir gleich wie Schuppen von den Augen gefallen - wegen den verschiedenen Endpunkten der Servos.

    Anbei ein Bild, wie die Weiche mit Servo (bisher) gedacht war:
    Klicke auf die Grafik für eine größere Ansicht

Name:	20170326_095611.jpg
Hits:	22
Größe:	38,9 KB
ID:	32504

    Einen schönen Sonntag wünsche ich euch!

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Zitat Zitat von hbquax Beitrag anzeigen
    ne Feder ins Gestänge einbauen
    Grade im Modellbau sollte man das nicht unbedingt wörtlich nehmen im Sinne von ein zusätzliches Bauteil einbauen.
    Da es den Draht für Servogestänge auch federhart gibt, macht man oft einfach ein "Z" ins Gestänge um federnde Eigenschaften zu implementieren.
    Klicke auf die Grafik für eine größere Ansicht

Name:	Servo-Federgestänge.png
Hits:	3
Größe:	2,5 KB
ID:	32505




    Zitat Zitat von Radom Beitrag anzeigen
    Kannst du mir eine "einfache" Spule als Bsp geben? Und meinst du dann den Magnetismus aus der Spule zum Weiche stellen verwenden?
    Google dazu einfach mal nach "Märklin Weichenantrieb". Da findest Du den Aufbau mit Spulen.
    Bei Youtube finden sich dann auch diverse Videos zu Lösungen mit Servos.

    Da die Lego Bahn jetzt nicht unbedingt zu der klassischen Gruppe der Modellbahnen gehört die dauerhaft aufgebaut wird, sondern eher zu denen die fürs Spielen aufgebaut werden und dann wieder abgebaut, würde ich eher den Servo seitlich neben die Weiche an den manuellen Antrieb setzen, so das er oberhalb der Montageebene sitzt, eventuell sogar mit einem Legogehäuse (oder 3D-Druck) so das er als Baustein modular angebaut werden kann.

    Ideen zu Kopplung eines Antriebgestänges kann man sich direkt bei den Legobastlern holen.
    https://www.1000steine.de/de/gemeins...09e3ad27557c00
    Geändert von i_make_it (27.03.2017 um 06:51 Uhr)

  6. #6
    Neuer Benutzer Öfters hier Avatar von Radom
    Registriert seit
    18.12.2016
    Ort
    Raisting
    Beiträge
    11
    Danke, gut zu wissen wie das mit dem Gestänge eigentlich gemeint war...

    Die Feder werde ich mir trotzdem noch gut überlegen.

    Die Häuschen auf 1000steine.de hab ich natürlich schon gesehen - die sind auch wirklich toll gelöst und wir haben lange überlegt, schon als wir überlegt haben das Projekt überhaupt zu machen. Wir sind aber wieder davon abgekommen, da sie für uns zu viel Platz brauchen.
    Tatsächlich haben wir mit der Lego-Bahn schon vor sie länger stehen zu lassen. Es gibt einen extra Kellerraum mit Tisch, Schattenbahnhof (wenn auch noch klein), einem Güterhof und aktuell zwei Personenbahnhöfen
    die alle mehrere Gleise haben. Mein Sohn ist ein richtiger Zug-Fan und nimmt es da sehr genau, deshalb liegen die Schienen auch so wie sie real liegen (soweit das eben mit Lego geht), also sehr nah zusammen.
    Für die Servos habe ich mich entschieden, weil ich sie unter die Schienen bauen kann und die Servos dann im Schotterbett verschwinden würden (kein Witz, echter Streu-Kies).

    Der Charm am Lego ist, dass er noch lange wirklich damit spielen kann, also drauf klettern, Häuser umbauen, Autos in Unfällen zerlegen, die Züge crashen lassen und worauf die Kids halt so stehen...

    Danke für den Suchtipp, damit werde ich mich jetzt mal beschäftigen. Magnetisch klingt sehr verlockend.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Ich meinte auch nur die Kopplung und nicht das ganze Häuschen.
    Mit zwei von den runden Steckverbindern und zwei Technik Hebeln (1/3 Stein hoch) müsste sich was bauen lassen das direkt auf der Weiche geführt wird und in das ein Servohorn direkt eingreifen kann.
    Bsp.:
    Klicke auf die Grafik für eine größere Ansicht

Name:	Weiche-Lego-Antr-1.png
Hits:	8
Größe:	36,9 KB
ID:	32507
    oder
    Klicke auf die Grafik für eine größere Ansicht

Name:	Weiche-Lego-Antr-2.png
Hits:	9
Größe:	33,9 KB
ID:	32508

    Mit Ein paar Steinen ein minimalistisches Gehäuse als Führung drum rum.
    Geändert von i_make_it (27.03.2017 um 07:14 Uhr)

  8. #8
    Neuer Benutzer Öfters hier Avatar von Radom
    Registriert seit
    18.12.2016
    Ort
    Raisting
    Beiträge
    11
    Die kleinen Servos sind leider zu schwach um die Weiche über den normalen Mechanismus zu stellen und ich will dich Weichen nicht öffnen und bearbeiten.
    Sogar der größere Servo den ich zuhause habe hat das nicht ohne Übersetzung hingebracht - und Übersetzung heißt wieder Häuschen.

    Danke dir auf jeden Fall für deine Ideen, doch Servo oben klappt einfach nicht - zumindest nicht so wie wir die Bahn jetzt haben.

    Gerne würde ich wieder auf den obigen Code zurück kommen. Habt ihr ihn euch angesehen? Die letzten Tage war der Arduino aus und heute beim Einschalten ist auf einmal das Siganl an den nachfolgenden Schieberegistern wieder einwandfrei Das kann doch dann nicht mehr am Code liegen, oder doch ?

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    Die kleinen Servos sind leider zu schwach um die Weiche über den normalen Mechanismus zu stellen ..
    Kann sein, dass Du das Folgende alles weißt und schon längst berücksichtigt hast. Aber ich weiß, dass kleine Servos schon einige KRAFT entwickeln können. Vielleicht . . . Mal ein paar Bemerkungen.

    2tens: ich habe keine Ahnung wie schwergängig ne Weiche von der Legobahn ist oder ob Du vielleicht die Gartenbahnvariante von Lego hast (die gibts ja wohl garnicht).

    1tens: Wir hatten in der Schule in Physik gelernt (zumindest gehört): Drehmoment ist Kraft mal Kraftarm bzw. Drehmoment ist Last mal Lastarm. Ein kurzer Kraft(Servo)arm gibt viel Kraft gegenüber einem langen Kraft(Servo)arm bei gleichem Drehmoment, sprich gleichem Servo, allerdings sind dann die Betätigungswege unterschiedlich.

    Und was sagt uns das? Möglicherweise hängst Du Deine Schubstange vom Servo zur Weichenbetätigung mit zu groß geratenem Lastarm an, sprich: in ein Loch das zu weit weg ist von der Abtriebsachse des Servos. Lastarm ist Abstand Servo-Abtriebsachse zu Schubstangenanlenkung. Und zur Anpassung des Servos an den erforderlichen Betätigungsweg bzw. an die erforderliche Kraft haben viele Servoarme eine ganze Reihe von Betätigungslöchern *ggg* so wie hier (klicken).

    Wenn Du den ganzen Schwenkwinkel des Servos ausnützt, also die Schubstange möglichst nahe an der Abtriebsachse des Servos anlenkst, dann hast Du so etwa die maximal mögliche Kraft die der Servo erzeugt, siehe hier (klick). Vorteil: große Kraft. Nachteil : der erfoderliche Schwenkwinkel für einen erforderlichen (Schub-)Weg ist lang, die Stellzeit ebenfalls. Aber bei üblichen Servos wird der maximal fahrbare Drehwinkel in drei bis sechs Zehntel Sekunden gefahren.

    Hängst Du dagegen die Schubstange weit weg von der Servo-Abtriebsachse ein, siehe hier (nochnklick), dann ist der Stellweg gering. Vorteil : die Stellzeit ist gering, weil der erforderliche Schwenkwinkel gering ist. ABER gering ist dann auch die Kraft.
    Ciao sagt der JoeamBerg

  10. #10
    Neuer Benutzer Öfters hier Avatar von Radom
    Registriert seit
    18.12.2016
    Ort
    Raisting
    Beiträge
    11
    Hallo oberallgeier,

    ja, die physikalischen Zusammenhänge sind mir bekannt. Die Bahn ist eine normale Lego RC (klick).

    Ausprobiert habe ich die verschiedensten Varianten, wie gesagt von den Häuschen inkl. Übersetzung bis hin zu Fischertechnik Pneumatik Zylindern und vom Lego Motor bis eben zu den Servos. Und natürlich auch verschiedene Hebellängen.
    Der interne Widerstand der Legoweichen ist teilweise so schwer, dass man sich sogar als Erwachsener beim ursprünglichen Lego-Handhebel ganz schön anstrengen muss.

    Hab ich meine Frage falsch formuliert? Ich verstehe nicht ganz warum wir jetzt nur noch über die Stellung der Weichen sprechen. Natürlich bin ich euch dankbar für eure Erfahrungen & Tips (wie der Idee mit der Spule), doch ich brauche eure Hilfe bei dem Rechtecksignal und meinem Code und/oder der Hardware.

    Habe ich einen Logikfehler drin?
    Kennt ihr so ein Verhalten, dass es einmal geht und einmal nicht und dann wieder doch - dabei denke ich z.B. an Induktion von zu nah aneinander liegenden Kabeln. ← da bin ich einfach zu wenig Elektroniker um zu wissen ab wann sich so eine Verkabelung selbst stören kann

    (Edit: Rechtschreibung )

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Immer wieder dieses VISTA
    Von Naturp im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 12
    Letzter Beitrag: 16.03.2010, 20:28
  2. immer wieder pwm tiny45
    Von meldano im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 23.04.2007, 03:23
  3. Immer wieder - Labornetzteil...
    Von Vaterssohn im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 15.11.2006, 22:47
  4. Immer wieder....I2C Bus
    Von JensB im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 16.09.2004, 17:26
  5. [ERLEDIGT] Immer wieder LCD Probleme
    Von Bruce im Forum Robby CCRP5
    Antworten: 7
    Letzter Beitrag: 03.08.2004, 13:26

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests