Hallo ich habe mir aus 2 StepperMotoren 28BYJ-48 mit Antrieb Modulplatine ULN2003 eine 2 Achsen Timelapse Vorrichtung gebaut und konnte diese im letzten Urlaub auch schon ausgiebig testen. Wer nicht weiß was das ist hier ein schneller Link. Youtube-Video https://www.youtube.com/watch?v=2U5tpWPP6F4 Ich möchte das ganze jetzt ein wenig erweitern und zwar das man die Geschwindigkeit über ein Poti einstellen kann. Allerdings muss ich zugeben das ich das Programm nicht selbst geschrieben habe sondern ein netter User von hier hat es mir zu Verfügung gestellt. Naja meine Idee war das ganz einfach über ein analogRead machen und dann bei der Geschwindigkeit einfügen das funktioniert allerdings nicht Jemand eine Idee ? struct toyStepper_t{ byte bluePin; byte pinkPin; byte yellowPin; byte orangePin; unsigned long stepDelay; bool clockwise; byte curState; unsigned int steps2go; unsigned long lastStepMicros; }; toyStepper_t stepper[2]={ {2,3,4,5, 1000L*10, true, 0, 0, 0 }, //Motor 1 Tilt 50-120° drehen {8,9,10,11, 3000L*14, true, 0, 0, 0 }, //Motor 2 PAN (360° drehen) //Hier wollte ich enfach das *10 durch valsens ersetzen das will er aber nicht..... }; const int Taster=7; /Ein AusTaster const int LEDPin=13;//Standby LED const int sens=A0; //poti an A0 int valsens=0; int Tasterstellung = LOW; const int NUMSTEPPERS= sizeof(stepper)/sizeof(toyStepper_t); const byte lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001}; void updateStepper(byte index, long nowMicros) { if (stepper[index].steps2go==0) return; if (nowMicros-stepper[index].lastStepMicros >= stepper[index].stepDelay) { stepper[index].lastStepMicros= nowMicros; stepper[index].steps2go--; if (stepper[index].clockwise) { if (stepper[index].curState>0) stepper[index].curState--; else stepper[index].curState=7; } else { if (stepper[index].curState<7) stepper[index].curState++; else stepper[index].curState=0; } setOutput(index, stepper[index].curState); } } void setup() { }; //declare the motor pins as outputs for (int i=0; i<NUMSTEPPERS; i++) { pinMode(stepper[i].bluePin, OUTPUT); pinMode(stepper[i].pinkPin, OUTPUT); pinMode(stepper[i].yellowPin, OUTPUT); pinMode(stepper[i].orangePin, OUTPUT); setOutput(i, stepper[i].curState); pinMode(Taster,INPUT); // Taster INPUT pinMode(LEDPin,OUTPUT); //LED output pinMode(sens,INPUT); //Poti input } Serial.begin(9600); Serial.println("Stepper demo"); } const unsigned int stepsPerRevolution= 2200; void loop(){ Tasterstellung=digitalRead(Taster); valsens=analogRead(sens); long now=micros(); if (Tasterstellung==HIGH){ digitalWrite(LEDPin,LOW); for (int i=0; i<NUMSTEPPERS; i++) { updateStepper(i, now); if (stepper[i].steps2go==0) { stepper[i].clockwise= !stepper[i].clockwise; stepper[i].steps2go= stepsPerRevolution; } } } else{ digitalWrite(LEDPin,HIGH); } } void setOutput(byte index, byte state) { digitalWrite(stepper[index].bluePin, bitRead(lookup[state], 1)); digitalWrite(stepper[index].pinkPin, bitRead(lookup[state], 0)); digitalWrite(stepper[index].yellowPin, bitRead(lookup[state], 3)); digitalWrite(stepper[index].orangePin, bitRead(lookup[state], 2)); }
Ich kenne mich mit der Arduino IDE nicht aus. Aber ich würde es mal so versuchen: void loop() { ... valsens=analogRead(sens); stepper[0].stepDelay=10L*valsens; ... } Ich nehme mal an, dass valsens Werte von 0 bis 1023 haben kann. Dann ergibt 10L*valsens ungefähr den ursprünglichen Verzögerungswert, wenn das Potentiometer auf maximale Spannung gedreht wird.
Stefan U. schrieb: > Ich kenne mich mit der Arduino IDE nicht aus. Aber ich würde es mal so > versuchen: > > void loop() > { > ... > valsens=analogRead(sens); > stepper[0].stepDelay=10L*valsens; > ... > } > > Ich nehme mal an, dass valsens Werte von 0 bis 1023 haben kann. Dann > ergibt 10L*valsens ungefähr den ursprünglichen Verzögerungswert, wenn > das Potentiometer auf maximale Spannung gedreht wird. hab es eingefügt und gleich probiert allerdings bewegt er sich dann gar nicht mehr sondern vibriert nur.. genau 0-1023
Wie kann das sein? Der Wert war vorher 1000L*10. Drehe das Poti so, dass der valsens den Wet 1000 liefert. Dann müsste das Ergebnis exakt das selbe sein, wie vor der Änderung.
ich glaube ihm fehlt der bezug zu der Zeile {2,3,4,5, 1000L*10, true, 0, 0, 0 }, //Motor 1 Tilt 50-120° drehen ich habe das einfach so eingefügt void loop(){ Tasterstellung=digitalRead(Taster); valsens=analogRead(sens); long now=micros(); valsens=analogRead(sens); stepper[0].stepDelay=10L*valsens; if (Tasterstellung==HIGH){ digitalWrite(LEDPin,LOW); for (int i=0; i<NUMSTEPPERS; i++) { updateStepper(i, now); if (stepper[i].steps2go==0) { stepper[i].clockwise= !stepper[i].clockwise; stepper[i].steps2go= stepsPerRevolution; } } } else{ digitalWrite(LEDPin,HIGH); }
> ich glaube ihm fehlt der bezug zu der Zeile
Sicher nicht. stepper[0] verweist genau auf diese Zeile. Wenn das nicht
so wäre, hätte die Zeile
1 | stepper[0].stepDelay=10L*valsens; |
gar keine Auswirkung.
Um jetzt mal auszuschließen, dass dein ADC unerwartete Werte liefert, mach mal das:
1 | stepper[0].stepDelay=10L*1023; |
Läuft der Motor dann richtig?
1 | stepper[0].stepDelay=10L*500; |
Läuft der Motor dann schneller? Welche Werte liefert denn analogRead(sens) bei dir?
ich hab es jetzt so gemacht
1 | stepper[0].stepDelay=10L*500; |
2 | stepper[1].stepDelay=10L*1023; |
dann sollten sie sich ja eigentlich unterschiedlich schnell drehen. ist aber nicht der Fall.... analogSens: 0-1023
Die beiden Motoren müssten eh unterschiedlich schnell laufen. Motor 0 macht alle ~10 ms einen Schritt und Motor 1 alle ~42 ms. Du Solltest das mit den beiden Werten ja nur bei einem Motor probieren und schauen ob er mit dem niedrigeren Wert schneller läuft. Gruß JackFrost
Das hab ich natürlich bedacht und hab für beide Motoren die gleichen Werte eingetragen.Tim bue
Es scheint mir so, als ob das Programm irgendwo einen anderen Fehler hat, so dass es nicht tut, was es tun sollte. Ich würde Dir dazu raten, ganz viele Debug Meldungen auszugeben und schritweise analysieren, ob das Programm tatsächlich so abläuft, wie es vorgesehen war.
Miss mal die Zeit zwischen zwei Todpunkten von Motor 1 Tilt wenn du den Wert wieder auf 1000L*10 gestellt hast. Wenn das länger als 22s dauert dann braucht deine Loop-Schleife zu lang. Und du kannst nur langsamer aber nicht mehr schneller werden. Gruß JackFrost
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.