Timelapse Arduino 2.0 Speed setup

Gast #4550554
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));
}
Gast #4550574
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.
Gast #4550586
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
#4550633
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);
  }
Gast #4550858
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.
Gast #4550859
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?
Gast #4551221
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren