Zum Inhalt springen

Servomotor und ws2812 RGB stripe

Projekte und Tutorials für Arduino Foren StartHardware-Forum Servomotor und ws2812 RGB stripe

Schlagwörter: 

  • Dieses Thema hat 12 Antworten und 3 Teilnehmer, und wurde zuletzt aktualisiert vor 1 Monat, 2 Wochen von Thorsten.
Ansicht von 13 Beiträgen - 1 bis 13 (von insgesamt 13)
  • Autor
    Beiträge
  • #7131 Antworten
    Thorsten
    Teilnehmer

    So…hallo da bin ich wieder…..

    hab den Kollegen umgepolt und der macht jetzt auf Servo….
    ich hab jetzt einen kleinen Sketch geschrieben, der im Prinzip der gleiche wie der Steppersketch lautet…

    mein Problem ist nun jenes, das der Motor richtig zittert während die leds faden….woran kann das bitte liegen…

    bin wieder mal für jede Antwort und Berichtigung dankbar!!

    Euer Thorsten

    #include <Servo.h>
    #include <Adafruit_NeoPixel.h>
    
    #define PIN 7
    #define BRIGHTNESS 50
    
    const int rfdown = 2;
    const int rfup = 3;
    const int servo = 9;
    
    int pos = 0;
    int i = 0;
    Servo rfServo;
    
    Adafruit_NeoPixel strip = Adafruit_NeoPixel (18, PIN, NEO_GRB + NEO_KHZ800);
     
    
    void setup() {
      // put your setup code here, to run once:
      strip.begin();
      strip.show();
      strip.setBrightness(BRIGHTNESS);
    
      pinMode(rfdown, INPUT);
      pinMode(rfup, INPUT);
    
      rfServo.attach(servo);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      if(digitalRead(rfdown)==HIGH){
        redfade();
        delay(10);
      for(pos = 95; pos >= 0; pos -= 1){
        rfServo.write(pos);
        delay(30);
      }
          for(i=0;i <strip.numPixels(); i++){
          strip.setPixelColor(i,255,0,0);
        }
        strip.show();
        delay(2);
      
    }
    
      if(digitalRead(rfup)==HIGH){
        redfade();
        delay(10);
        for(pos = 0; pos <= 95; pos +=1){
          rfServo.write(pos);
          delay(30);
        }
            for(i=0;i <strip.numPixels(); i++){
          strip.setPixelColor(i,255,0,0);
        }
        strip.show();
        delay(2);
      }
    }
    
    void redfade(){
      uint16_t i,j;
      for (j=15;j<255;j++){
        for(i=0;i <strip.numPixels(); i++){
          strip.setPixelColor(i,j,0,0);
        }
        strip.show();
        delay(2);
      }
      delay(50);
      
        for(j=255;j>15;j--){
        for(i=0;i<strip.numPixels(); i++){
          strip.setPixelColor(i,j,0,0);
        }
        strip.show();
        delay(2);
      }
      delay(50);
    
        for (j=15;j<255;j++){
        for(i=0;i <strip.numPixels(); i++){
          strip.setPixelColor(i,j,0,0);
        }
        strip.show();
        delay(2);
      }
      delay(50);
      
        for(j=255;j>15;j--){
        for(i=0;i<strip.numPixels(); i++){
          strip.setPixelColor(i,j,0,0);
        }
        strip.show();
        delay(2);
      }
      delay(50);
    }
    #7132 Antworten
    Franz-Peter
    Teilnehmer

    Hallo Thorsten,
    wie ich dir schon im anderen Thrad geschrieben habe, sind die Neopixel da etwas kritisch, weil die Lib während des Updates die Interrupts abschaltet. Da die Servo-Lib die Pulse für das Servo per Interrupt erzeugt, wird sie davon massiv gestört.

    #7133 Antworten
    Thorsten
    Teilnehmer

    Hi..jup…das hast du gesagt….also…welche Lösung wäre möglich…da die LED bereits in den Helm schon verbaut sind…….ich sehe hier im Moment nur eine Lösung…2 arduinos…einer für den Servo und einen für die stripes….das beide einen Button auslesen ist ja möglich….und wegen dem platz könnte man sogar 2 ATtiny85 nehmen…

    #7134 Antworten
    Thorsten
    Teilnehmer

    Oder gibt es die Möglichkeit das abschalten der interrupts zu umgehen….da ja so gesehen ein paralleles laufen beider Komponenten ja ohnehin eigentlich nicht machbar ist

    #7137 Antworten
    Stefan Hermann
    Verwalter

    Hi Thorsten, zwei Arduinos oder vielleicht kannst du die Stromzufuhr des Servos durch einen digitalen Pin unterbrechen? Z. B. könnte ich mir vorstellen, dass du den Servo über einen Mos-Fet-Transistor mit Strom versorgst und den nur einschaltest, wenn du den Servo verwenden willst. Ob das klappt weiß ich nicht, da ich das noch nicht versucht habe. Vielleicht hilft auch schon ein Servo.detach() Viel Erfolg und liebe Grüße

    #7138 Antworten
    Franz-Peter
    Teilnehmer

    Die ws2812 sind sehr kritisch, was das Timing der Signale angeht. Das bekommt man ohne abgeschaltete Interrupts nicht hin.
    Wenn – wie beim Stepper – die Bewegung des Servo und die LED-Animation immer nur abwechselnd laufen, könntest Du versuchen, den Stepper nach der Bewegung jeweils mit ‘detach’ ganz abzuschalten und bei der nächsten Bewegung dann wieder mit attach einzuschalten. Dann werden dazwischen keine Servo-Impulse erzeugt und dann können die auch nicht gestört werden. Das Servo bleibt dann einfach an der letzten angefahrenen Position stehen ( hält die aber auch nicht mehr aktiv ).

    P.S. Stromzufuhr unterbrechen würde ich eher nicht, da die meisten Servos beim Einschalten der Spannung etwas unkontrolliert ‘zucken’.

    #7140 Antworten
    Thorsten
    Teilnehmer

    Hmm….da wäre dann das Problem….wenn der Servo keinen Strom mehr halt hält er den Rangefinder auch nicht auf Position, wie Franz-Peter sagt….dann wäre es wirklich einfacher 2 ATtiny85…die reichen da aus….das werde ich mal versuchen….

    Danke für die Rückmeldungen….

    Ihr seid Klasse!!!!!

    #7141 Antworten
    Franz-Peter
    Teilnehmer

    Ist der Rangefinder so schwer, dass er das Servo verstellt? Hast Du das probiert? Durch die hohe Getriebübersetzung in den Servos braucht es auch ohne Strom oder Impulse schon einige Kraft um das Servo zu verstellen.

    #7143 Antworten
    Thorsten
    Teilnehmer

    Der Rangefinder wiegt nicht viel…ich hab da schon ein paar gemacht…aber eben nie mit den stripes…darum hatte ich nie Probleme…ich benutze servos mit min 30ncm Drehmoment…die packen das….
    Ich hab jetzt das Problem eben nur wegen den ws2812….

    Ich werde dem Kollegen eine kleine Platine bauen mit 2 ATtiny85….

    Damit sollte das Problem gelöst sein und ich hab wieder was gelernt….

    Bin froh hier im Forum zu sein….fühle mich wohl hier…..

    #7144 Antworten
    Franz-Peter
    Teilnehmer

    Wenn der nicht viel wiegt, sollte der auch einen nicht angesteuerten Servo nicht verstellen können. Dann kannst Du das mit detach/attach lösen.
    Aber wenn’s mit 2 ATtiny auch geht …

    #7145 Antworten
    Thorsten
    Teilnehmer

    Hi….

    ich hab das jetzt erstmal so umgesetzt….und es funktioniert…..

    #include <Servo.h>
    #include <Adafruit_NeoPixel.h>
    
    #define PIN 7
    #define BRIGHTNESS 50
    
    const int rfdown = 2;
    const int rfup = 3;
    const int servo = 9;
    
    int pos = 0;
    int i = 0;
    Servo rfServo;
    
    Adafruit_NeoPixel strip = Adafruit_NeoPixel (18, PIN, NEO_GRB + NEO_KHZ800);
     
    
    void setup() {
      // put your setup code here, to run once:
      strip.begin();
      strip.show();
      strip.setBrightness(BRIGHTNESS);
    
      pinMode(rfdown, INPUT);
      pinMode(rfup, INPUT);
    
      for(i=0;i <strip.numPixels(); i++){
        strip.setPixelColor(i,255,0,0);
        }
        strip.show();
        delay(2);
        
    
      rfServo.attach(servo);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      if(digitalRead(rfdown)==HIGH){
        rfServo.detach();
        redfade();
        delay(1);
        rfServo.attach(servo);
      for(pos = 95; pos >= 0; pos -= 1){
        rfServo.write(pos);
        delay(30);
      }
          for(i=0;i <strip.numPixels(); i++){
          strip.setPixelColor(i,255,0,0);
        }
        strip.show();
        delay(2);
      
    }
    
      if(digitalRead(rfup)==HIGH){
        rfServo.detach();
        redfade();
        delay(1);
        rfServo.attach(servo);
        for(pos = 0; pos <= 95; pos +=1){
          rfServo.write(pos);
          delay(30);
        }
            for(i=0;i <strip.numPixels(); i++){
          strip.setPixelColor(i,255,0,0);
        }
        strip.show();
        delay(2);
      }
    }
    
    void redfade(){
      uint16_t i,j;
      for (j=15;j<255;j++){
        for(i=0;i <strip.numPixels(); i++){
          strip.setPixelColor(i,j,0,0);
        }
        strip.show();
        delay(2);
      }
      delay(50);
      
        for(j=255;j>15;j--){
        for(i=0;i<strip.numPixels(); i++){
          strip.setPixelColor(i,j,0,0);
        }
        strip.show();
        delay(2);
      }
      delay(50);
    
        for (j=15;j<255;j++){
        for(i=0;i <strip.numPixels(); i++){
          strip.setPixelColor(i,j,0,0);
        }
        strip.show();
        delay(2);
      }
      delay(50);
      
        for(j=255;j>15;j--){
        for(i=0;i<strip.numPixels(); i++){
          strip.setPixelColor(i,j,0,0);
        }
        strip.show();
        delay(2);
      }
      delay(50);
    }

    Der Kollege soll das mal testen….ob der Rangefinder für die paar sec. oben hält die das Licht fadet….da ich den Servo wieder auf attached setzte nachdem er die Position erreicht hat hält er die ja dann auch…geht nur um die Blinksequenz…

    #7146 Antworten
    Franz-Peter
    Teilnehmer

    Dann bin ich mal gespannt, ob es so funktioniert, und der Range Finder ‘leichtgewichtig’ genug ist.

    #7147 Antworten
    Thorsten
    Teilnehmer

    Das hoffe ich jetzt auch mal…..ich hab das Problem dem Kollegen geschildert…er weiss also bescheid…..wenn es so nicht klappt brauchen wir 2 Controller

Ansicht von 13 Beiträgen - 1 bis 13 (von insgesamt 13)
Antwort auf: Servomotor und ws2812 RGB stripe
Deine Information: