Projekte und Tutorials für Arduino › Foren › StartHardware-Forum › Servomotor und ws2812 RGB stripe
Schlagwörter: sERVO NICHT VERSTELLEN K
- Dieses Thema hat 12 Antworten und 3 Teilnehmer, und wurde zuletzt aktualisiert vor 9 Monaten, 2 Wochen von Thorsten.
-
AutorBeiträge
-
ThorstenTeilnehmer
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); }
Franz-PeterTeilnehmerHallo 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.ThorstenTeilnehmerHi..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…
ThorstenTeilnehmerOder 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
Stefan HermannVerwalterHi 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
Franz-PeterTeilnehmerDie 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’.
ThorstenTeilnehmerHmm….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!!!!!
Franz-PeterTeilnehmerIst 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.
ThorstenTeilnehmerDer 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…..
Franz-PeterTeilnehmerWenn 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 …ThorstenTeilnehmerHi….
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…
Franz-PeterTeilnehmerDann bin ich mal gespannt, ob es so funktioniert, und der Range Finder ‘leichtgewichtig’ genug ist.
ThorstenTeilnehmerDas 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
-
AutorBeiträge