Forum: Mikrocontroller und Digitale Elektronik Timelapse Arduino 2.0 Speed setup


von tb (Gast)


Lesenswert?

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));
}

von Stefan F. (Gast)


Lesenswert?

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.

von tb (Gast)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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.

von Tim B. (tb1405)


Lesenswert?

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);
  }

von Stefan F. (Gast)


Lesenswert?

> 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.

von Stefan F. (Gast)


Lesenswert?

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?

von Tim B. (tb1405)


Lesenswert?

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

: Bearbeitet durch User
von Bastian W. (jackfrost)


Lesenswert?

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

von Tim bue (Gast)


Lesenswert?

Das hab ich natürlich bedacht und hab für beide Motoren die gleichen 
Werte eingetragen.Tim bue

von Stefan F. (Gast)


Lesenswert?

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.

von Bastian W. (jackfrost)


Lesenswert?

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
Noch kein Account? Hier anmelden.