INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Motorantrieb für Follow Focus
04.01.2015, 18:06
Beitrag #25
RE: Motorantrieb für Follow Focus
@torsten
Ich hatte mich auf das "zuletzt funktionierende Scetch" bezogen, da ist tempo definiert aber nicht gefüllt.
Wegen den Delays ist meine Annahme, dass hier der Motor dreht und durch das nachfolgende delay ein dabei augelöster Impuls des Encoders verloren gehen kann.

Gruß Rainer
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.01.2015, 21:32 (Dieser Beitrag wurde zuletzt bearbeitet: 04.01.2015 21:44 von Thorsten Pferdekämper.)
Beitrag #26
RE: Motorantrieb für Follow Focus
(04.01.2015 17:01)Plexxart schrieb:  Leider ist es so, daß noch immer der Motor nachläuft. Und um das ganze zu präzisieren; er läuft nicht immer nach sondern halt sporadisch.
Also...
Das mit dem delay dürfte eigentlich egal sein, da die Encoder-Library soweit ich weiß Interrupts verwendet. D.h. es gehen keine Impulse verloren.
Mit Deinem Sketch (mit der 8) müsste es etwa 16ms dauern, bis ein Encoder-Impuls abgearbeitet ist. Ansonsten (mit meinem Vorschlag) etwa 6ms. Nehmen wir mal an, dass Du den Encoder in einer Sekunde zweimal ganz drehen kannst. dann haben wir 128 Impulse pro Sekunde. Das wären etwa 8ms pro Impuls.
Wenn Du den Encoder also schnell drehst, dann kann ich mir schon vorstellen, dass der Motor etwas hinterherhinkt. Das wird aber nicht zu vermeiden sein, wenn Du den Motor mit der Encoder-Stellung synchronisieren willst. In dem Fall dürfte das aber auch egal sein, da ja nur zählt, wo der Motor am Ende ankommt.
Wenn Du es aber so haben willst, dass der Motor sich nur so lange dreht, wie Du auch den Encoder bewegst, dann muss man den Sketch ändern. Willst Du das? Du könntest den Aufruf "myEnc.write(0);" mal nach den Aufruf von "drehen" verschieben und ausprobieren, ob das dann besser aussieht.

Zitat:Vielleicht liegt das Problem auch in der Treiberkarte, ich hänge als Link jetzt das Pdf File dazu an.
http://www.pololu.com/file/0J617/drv8834.pdf
Das Ding ist ja schon komplex, wie ist es denn angeschlossen?

Zitat:Noch eine kleine Frage zur Auflösung der Schrittgeschwindigkeit; ist der Sketch jetzt Vollschritt ? und würde es was bringen z.B. im Halbschritt zu fahren ?
Kleinere Schritte würden wohl wenig bringen, da der Encoder ja eh größere Schritte macht als der Motor. ...aber da bin ich mir überhaupt nicht sicher.

Gruß,
Thorsten

(04.01.2015 18:06)dqb312 schrieb:  Ich hatte mich auf das "zuletzt funktionierende Scetch" bezogen, da ist tempo definiert aber nicht gefüllt.
Hä? "tempo" ist ein Parameter einer Funktion, der wird beim Aufruf der Funktion gefüllt. Der aktuelle Parameter ist immer 1. D.h. tempo ist immer 1.

Zitat:Wegen den Delays ist meine Annahme, dass hier der Motor dreht und durch das nachfolgende delay ein dabei augelöster Impuls des Encoders verloren gehen kann.
Soweit ich weiß arbeitet die Encoder-Library mit Interrupts, da geht nichts verloren. Da dürfte im Zweifelsfall delay() sogar besser sein als irgendwas verhunztes selbstgebasteltes.

Gruß,
Thorsten

(04.01.2015 17:01)Plexxart schrieb:  Leider ist es so, daß noch immer der Motor nachläuft.
Hi,
was mir noch einfällt: Vielleicht stimmt irgendwas mit den Timern nicht. Bau mal am Ende von loop() folgendes ein:
Code:
delay(20000);
Serial.println("Blubb");
...und in setup() das hier:
Code:
Serial.begin(9600);
Starte das ganze und messe mal, wie viel Zweit zwischen zwei "Blubb" im Serial Monitor vergeht. Wenn das nicht jedesmal ziemlich genau 20 Sekunden sind, dann stimmt was nicht.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.01.2015, 14:40
Beitrag #27
RE: Motorantrieb für Follow Focus
Servus Thorsten
Also ich habe den Timer Test jetzt wie von dir verlangt, gemacht und es ist so daß exakt alle 20 Sekunden ein "Blubb" im Serialmonitor erscheint.

Zur Überprüfung der Code:

Code:
#include <Encoder.h>


int pinE2 = 2;
int pinE3 = 3;

Encoder myEnc(pinE2, pinE3);

int pinDir = 8;
int pinStep = 9;

void setup()
{
  pinMode(pinDir, OUTPUT);
  pinMode(pinStep, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  //den Wert einlesen
  int encoderWert = myEnc.read();
  //Wert des Encoders wieder auf 0 stellen
  // Thorsten: Hierher verschoben, damit auch Drehungen
  //                richtig mitgenommen werden waehrend der
  //                Motor neu positioniert
  myEnc.write(0);

  // Thorsten: Die groesser/kleiner 0 Abfrage brauchen wir nicht mehr
  //Motor drehen, Grösse der Schritte und Tempofrei wählbar
  // Thorsten:
  // Das naechste bedeutet "8 Motor-Steps pro Encoder-Step"
  // ...und ein Motor-Step dauert 20ms (10ms jeweils fuer LOW und HIGH)
  drehen(encoderWert * 3.125 , 1);
}


//Drehfunktion für Schrittmotor
void drehen(int schritte, int tempo)
{


  if(schritte > 0)
    digitalWrite(pinDir,HIGH);
  else
    digitalWrite(pinDir,LOW);

  schritte = abs(schritte);

  for(int i=0; i < schritte; i++)
  {
    digitalWrite(pinStep, HIGH);
    delay(tempo);
    digitalWrite(pinStep, LOW);
    delay(tempo);
    delay(20000);
    Serial.println("Blubb");
  }
}

Deinen anderen Vorschlag habe ich auch probiert

Zitat:Wenn Du es aber so haben willst, dass der Motor sich nur so lange dreht, wie Du auch den Encoder bewegst, dann muss man den Sketch ändern. Willst Du das? Du könntest den Aufruf "myEnc.write(0);" mal nach den Aufruf von "drehen" verschieben und ausprobieren, ob das dann besser aussieht.
Ja genau das hätte ich gerne !

Leider ist bei deinem Vorschlag keine Besserung eingetroffen.
Der Motor fährt noch immer Extrarunden.


Ich danke dir Thorsten (und euch) trotzdem vielmals für die Hilfestellung !!

Gruß
Walter
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.01.2015, 15:44
Beitrag #28
RE: Motorantrieb für Follow Focus
(05.01.2015 14:40)Plexxart schrieb:  Also ich habe den Timer Test jetzt wie von dir verlangt, gemacht und es ist so daß exakt alle 20 Sekunden ein "Blubb" im Serialmonitor erscheint.
Ok, dann ist der Timer zumindest mal in Ordnung.

Zitat:Ja genau das hätte ich gerne !
Leider ist bei deinem Vorschlag keine Besserung eingetroffen.
Tja...
Versuch mal das hier:
Code:
void loop()
{
  int encoderWert = myEnc.read();
  myEnc.write(0);
  if(encoderWert) drehen(3,1);
}
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.01.2015, 21:06
Beitrag #29
RE: Motorantrieb für Follow Focus
(05.01.2015 15:44)Thorsten Pferdekämper schrieb:  Versuch mal das hier:
Code:
void loop()
{
  int encoderWert = myEnc.read();
  myEnc.write(0);
  if(encoderWert) drehen(3,1);
}
Gruß,
Thorsten

Servus Thorsten

Das habe ich jetzt ausprobiert und es ist so, daß in welche Richtung auch immer den Encoder drehe, der Motor sich immer nur in eine Richtung dreht.

Das hatten wir schon besser hingebracht. Wink Aber grundsätzlich glaube ich, daß wir auf der richtigen Spur sind !.

Zur Sicherheit der ganze Code

Code:
#include <Encoder.h>


int pinE2 = 2;
int pinE3 = 3;

Encoder myEnc(pinE2, pinE3);

int pinDir = 8;
int pinStep = 9;

void setup()
{
  pinMode(pinDir, OUTPUT);
  pinMode(pinStep, OUTPUT);
}

void loop()
{
  int encoderWert = myEnc.read();
  myEnc.write(0);
  if(encoderWert) drehen(3,1);
}
//Drehfunktion für Schrittmotor
void drehen(int schritte, int tempo)
{
  if(schritte > 0)
    digitalWrite(pinDir,HIGH);
  else
    digitalWrite(pinDir,LOW);

  schritte = abs(schritte);

  for(int i=0; i < schritte; i++)
  {
    digitalWrite(pinStep, HIGH);
    delay(tempo);
    digitalWrite(pinStep, LOW);
    delay(tempo);
  }
}


Gruß
Walter
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.01.2015, 21:13
Beitrag #30
RE: Motorantrieb für Follow Focus
(05.01.2015 21:06)Plexxart schrieb:  Das habe ich jetzt ausprobiert und es ist so, daß in welche Richtung auch immer den Encoder drehe, der Motor sich immer nur in eine Richtung dreht.
Ja, klar... Das Vorzeichen muss noch irgendwie mit rein.
Code:
void loop()
{
   int encoderWert = myEnc.read();
   myEnc.write(0);
   if(encoderWert > 0) drehen( 3 , 1);
   if(encoderWert < 0) drehen( -3 , 1);
}
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.01.2015, 21:33 (Dieser Beitrag wurde zuletzt bearbeitet: 05.01.2015 21:35 von Plexxart.)
Beitrag #31
RE: Motorantrieb für Follow Focus
Servus Thorsten

Und vielen Dank für deine Hilfe !

Das schaut jetzt alles gut fürs Erste aus, der Motor läuft genau dorthin wo ich ihn haben will. Nach 5 Minuten Tests habe ich auch kein Nachlaufen bemerkt. Jetzt ist es endlich so wie ich es vom Anfang an haben wollte.

Für euch und auch für in Zukunft Hilfe suchende, das komplette Skript zur Archivierung:

Code:
#include <Encoder.h>

int pinE2 = 2;
int pinE3 = 3;

Encoder myEnc(pinE2, pinE3);

int pinDir = 8;
int pinStep = 9;

void setup()
{
pinMode(pinDir, OUTPUT);
pinMode(pinStep, OUTPUT);
}

void loop()
{
   int encoderWert = myEnc.read();
   myEnc.write(0);
   if(encoderWert > 0) drehen( 3 , 1);
   if(encoderWert < 0) drehen( -3 , 1);
}


//Drehfunktion für Schrittmotor
void drehen(int schritte, int tempo)
{

  
    if(schritte > 0)
    digitalWrite(pinDir,HIGH);
    else
    digitalWrite(pinDir,LOW);
    
    schritte = abs(schritte);
    
    for(int i=0; i < schritte; i++)
    {
      digitalWrite(pinStep, HIGH);
      delay(tempo);
      digitalWrite(pinStep, LOW);
      delay(tempo);
    }
}


Beim Code:
Code:
if(encoderWert > 0) drehen( 3 , 1);
if(encoderWert < 0) drehen( -3 , 1);
Kann man noch die Auflösung und Geschwindigkeit geringfügig ändern.

Vielen Dank an alle die mitgewirkt haben, jetzt wird mal das ganze unter Last getestet. Mal schauen wie sich das ganze dann tut !

Gruß
Walter
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste