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);
}
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
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
Eine eigene Frage?
Dieser Thread ist über 10 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.