Steuerung eines Kamerasliders

Moin Liebes Forum,

ich versuche ja seit geraumer Zeit einen Schrittmotorbetriebenen Kameraslider zu bauen. Wer die anderen Topics gelesen hat, kennt mich als Treiberzerstörer :smiling_imp: . Nun ist der Slider aber technisch fertig und der Motortreiber brennt mir auch nicht mehr ab; Zeit, sich an die Steuerung zu setzen.

Ich probiere seit einigen Tagen, den Motor mit der Accelstepper Library zum laufen zu bringen, doch ich schaffe es noch nicht so richtig, den Motor eine bestimmte Schrittanzahl zu drehen. Kennt jemand eine deutsche Anleitung zur Accelstepper.h?

Ich möchte hier einmal kurz die Schaltung erklären, wie ich sie mir vorstelle:

Beim Einschalten des Arduino sollen zwei Werte (einen für die Schrittanzahl und einen für das Zeitintervall) über einen Drehencoder abgefragt werden. Der Drehencoder verfügt über einen eingebauten Button. Die eingestellten werte sollen auf dem standard LC-Display aus dem Starterkit angezeigt werden. Das Display schalte ich später über einen einfachen schalter aus. Für Links- bzw. Rechtslauf drehe ich den Encoder so lange, bis ich im negativen oder positiven Bereich bin.

Nachdem die Werte feststehen kann der Schlitten entweder sofort fahren, oder ich baue noch einen Start- Stopptaster ein; Je nachdem, was besser ist.

Der Schlitten fährt im 'Shoot - Move - Shoot'-Modus; Das bedeutet, dass die Kamera im Stillstand ausgelöst wird (nach einem eingestellten Zeitintervall). Auf der Schiene werden sich später an beiden Enden Reedkontakte (Öffner) befinden. Hat der Schlitten in eine Richtung die Endlage erreicht, soll der Motor [u]sofort[/u] anhalten, ansonsten wird der Schlitten beschädigt. :blush:

Das auslösen der Kamera geschieht ganz einfach über einen digitalen Pin, welcher auf HIGH geschaltet wird. Über ein Reedrelais und ein Klinkenkabel wird dann die Kamera gesteuert.

Ich hoffe ich habe das gut verständlich aufgeschrieben. Jetzt benötige ich Hilfe mit der Umsetzung.

Ich dachte für die eigentliche Motorsteuerung an zwei if- oder while-Schleifen, in denen sich der Motor so lange in die eine Richtung dreht, solange der zugehörige Endschalter noch HIGH ist (ist ja ein Öffner). Wie stelle ich ein, dass die Variablen nur am Anfang abgefragt werden? Und wie kann ich zwei oder mehr variablen mit nur einem Drehencoder eingeben?

An wichtigster Stelle steht aber, dass ich die Accelstepper.h verstehe, dann kann ich schon gut weiterarbeiten.

Ich bedanke mich schon jetzt für Eure Hilfe!

vG, Tobi

Ja, sowas wollte ich auch schon mehrfach anfangen ... bei mir scheitert's an der Mechanik :confused:

Die Lib bringt doch sicher Beispiele mit - schonmal reingeschaut?

Zur Technik meines Kamerasliders habe ich dir eine PM geschrieben ;)

Mir geht es vorallem darum, zu verstehen, welche Accelstepper Befehle miteinander zusammenhängen und arbeiten. Die einzelnen Befehle verstehe ich einigermaßen, wenn ich mir die Anleitung angucke. Aber ich weiß nicht, wie ich die zusammen in einen Sketch bringe.

Von den Beispielen verstehe ich nur 2

Nimm doch mal die Beispiele aus der IDE, die tun's m.E. für den Slider und sind einfach zu durchschauen. Umswitchen auf die Accelstepper kannste dann immer noch.

Welche Beispiele meinst du genau?

Na die Stepper Beispiele - verwendest Du nicht die arduini IDE?

Hi, so habe ich das Problem gelöst. Ich habe mir den Code von Emotimo geholt und mir meine eigene Platine dazu gemacht. Der Code ist open source und der Rest ergibt sich von selber. Es kommt dann alles in ein eigenes Gehäuse und nur die Motoranschlüsse kommen raus. wenn es fertig ist mache ich ein paar Bilder. Muss die Platine nochmal machen, hatte ein paar sehr wichtige Sachen vergessen. :confused: :confused:

MfG Marco

Hallo, ich würde am Ende der Schiene keine Taster (öffnen) nehmen. Mit einem Umschalter bist Du dort besser bedient. Beispiel: Wenn beide Umschalter geöffnet sind, dann kann der Schlitten nach rechts/links fahren. Ist der rechte Umschalter geschlossen, dann kann der Schlitten nur nach links rausfahren. Ist der linke Umschalter geschlossen, dann kann der Schlitten nur nach rechts rausfahren.

Um rauszubekommen, was die "Accelstepper Library" denn macht, kannst Du die genutzten Variablen auf den seriellen Monitor ausgeben. So kommst Du schnell dahinter, wer denn Deine Schritte zählt. Gruß und Spaß Andreas

Sorry, ich hatte gestern leider keine Zeit.

Einen fertigen Sketch möchte ich nicht übernehmen. Zum Üben ist alles okay, aber ich möchte später wissen, was ich programmiert habe und das Programm auch verstehen.

Zu den Endschaltern: Ich wollte nicht beide Endschalter mit einem Pin abfragen, sondern getrennt. Wenn sich der Schlitten nach links bewegt, soll auch nur der linke Endschalter abgefragt werden, damit ein Verfahren nach rechts noch möglich ist.

Ich habe mir nun die Stepper.h angeguckt. Ich bekomme den Motor auch mit einer schnellen Geschwindigkeit zum Laufen, bei langsamen Geschwindigkeiten rattert er sehr laut. Ich finde den Sketch zwar relativ einfach, aber der Motor sollte sich etwas langsamer drehen, ohne so laute Geräusche zu machen. Außerdem brauche ich jetzt (ohne Microstepping) 800 Schritte für eine Umdrehung. Wie kommt das?

Hier der Code, wie ich ihn benutzt habe:

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 3, 2);

void setup() {
  myStepper.setSpeed(600);
}

void loop() {
  // step one revolution  in one direction:
  myStepper.step(800);
  delay(500);
}

P.S.: Gibt es hier im Forum kein Highlighting im Code?

Hallo, wenn mich nicht alles täuscht, dann nutzt Du doch einen gemeinen Schrittmotor. In dem Datenblatt steht doch, was für eine Auflösung der hat. Wenn der bei 800 Schritten eine Umdrehung macht, dann hat der eine Auflösung von ca. 0,45 Grad. Das alles sollte im Datenblatt stehen. Die Schrittzahl, die der Motor für eine Umdrehung braucht, muß im Sketch hinterlegt sein.

Macht er die ratterGeräusche wenn der Motor ausgebaut ist? Dann würde ich sagen, das er falsch angesteurt wird. Normalerweise ist so ein Motor still. Summt vielleicht leise vor sich hin, wenn der Schritt gehalten wird. Gruß und Spaß Andreas

Der Schrittmotor hat 200 steps/rev.

Der läuft ja leise, wenn ich die Geschwindigkeit erhöhe. Ich denke, wenn die Geschwindigkeit zu langsam ist, dann liegt eine zu große Zeit zwischen den einzelnen Steps (der Motor hält quasi immer kurz an und es entsteht keine flüssige Bewegung).

der motor ist noch eingebaut, es hängt aber nur die Gewindestange dran, welche unbelastet ist.

Hallo, wenn es Motorwelle an Gewindestange ist, dann ist es der "falsche" Motor. An der Gewindestange hast Du über einen Mitnehmer (der auf der Gewindestange läuft) Deinen Schlitten verbunden. Dafür nimmt man eigentlich linear Motoren. Wenn Du es mit einem Schrittmotor machst, dann würde ich Zahnriemen nehmen. Aber egal...

Ich würde die Steuerung nur mit ausgebautem Motor testen. Den mit DoppelKleberband befestigen und auf die Welle eine "Zeiger" kleben. So kannst Du prüfen ob alles richtig läuft. Wenn dem so ist, dann einbauen. Alles was dann noch rattert ist deine Mechanik. Hilft Dir aber jetzt auch nicht weiter.

Hast Du zufällig das Arduino Kochbuch? Dort wird ab Seite 317 der Umgang mit Schrittmotoren erklärt. Die Sketche dazu sind völlig "einfach". Auch die ganze Verdrahtung wird sichtbar und man sollte erkenne können, was passiert. Die "Accelstepper.h" kennt wohl keiner, und wenn ich mir die "Example" anschaue, dann halte ich das alles für zu umständlich, nicht einfach zu kapieren...

Wenn Dein Motor echte 200 Schritte für eine Umdrehung braucht, und Du hier:

// step one revolution in one direction: myStepper.step(800);

800 eingetragen hast, dann vermurkst die Lib etwas. Wenn Du dort nur 200 einträgst, läuft er dann nur 50 Schritte? Also ein Viertel Umdrehung? Gruß und Spaß Andreas

SkobyMobil: wenn es Motorwelle an Gewindestange ist, dann ist es der "falsche" Motor. An der Gewindestange hast Du über einen Mitnehmer (der auf der Gewindestange läuft) Deinen Schlittenverbunden. Dafür nimmt man eigentlich linear Motoren.

Sowas geht super mit Schrittmotoren. Auch über lange Strecken. Jedenfalls solange es nicht sehr schnell sein muss.

Ich habe den Sketch benutzt, der weiter oben steht. Dort sind 200 steps/rev. angegeben. Ich brauche dort aber 800 Schritte.

Mit einer anderen Lib oder mit meiner einfachen Steuerung über delays ist das nicht so. Muss also an der Stepper.h liegen.

Ich möchte die Steuerung erstmal fertig machen, ob Gewindestange oder Zahnriemen ist dafür erstmal egal. Langfristig werde ich aber wohl auf einen Zahnriemen umrüsten, da der Motor dort weniger Energie für eine Fahrt braucht, und man auch schnellere Kamerafahrten machen könnte.

Kannst du das Buch für Anfänger empfehlen? Ich dachte man lernt heutzutage alles im Internet :-[

Wenn der Stepper-Motor mehr Steps braucht als eigentlich notwendig, dann ist er überlastet. Entweder ist er überhaupt zu schwach, oder das Netzteil, oder er wird zu schnell oder zu hoch beschleunigt. Wie sieht es denn aus, wenn Du die Geschwindigkeit deutlich (4 mal) reduzierst? Erst wenn die Schrittzahl stimmt, kann die Beschleunigung und maximale Steprate optimiert werden.

Hallo, "Kannst du das Buch für Anfänger empfehlen?"

Wenn Du in Elektronik ein wenig fit bist, und auch schon ein wenig Kenntnisse im Programmieren hast, dann geht das.

Ich habe von Arduino keine Ahnung gehabt, habe mir einen Mega 2560 und diese Buch gekauft. Erfolg kam sofort…

Die Grundlagen werden im Buch fast nicht erklärt, es geht sofort zur Sache. Die Sketche laufen Fehlerfrei und man bekommt eine Menge Anregungen. Es ist so erklärt, das man es verstehen kann. Ich habe bis heute jede Idee damit erschlagen können. Die Sketche kann man alle downloaden.

Wenn mir heute etwas einfällt, dann schaue ich erst einmal ins Buch. Ich finde dort immer etwas ähnliches. "Genau! So könnte es gehen"

Es hat den Vorteil, das du diesen ganzen "InternetScheiss" nicht probieren mußt. Wenn es Probleme gibt, dann kannst Du hier im Forum Hilfe bekommen. Und wenn du Glück hast, dann verfeinern dir die Profis den Sketch. Mit dem Buch und diesem Forum kommst Du dann schon verdammt weit- du mußt aber auch bereit sein, dich damit zu beschäftigen… Gruß und Spaß Andreas P.S. bei googlebooks? kann man es anlesen, mußt mal schau´n, suchen

Wie soll der Motor überlastet sein, wenn keine Last dranhängt? Das ist einfach die Stepper Lib, welche genau 4x Mehr schritte Braucht. Komisch: Wenn ich den StepPin und den DirPin tausche, macht der Motor genau das Selbe.

Aber ich versuche ja auch Accelstepper zu verstehen und nicht die Arduino Stepper Lib.

Hallo,
dann komme doch mal mit etwas mehr Info rüber…
Was ist es denn für ein Motor, bipolar oder unipolar?
Wie wird der denn angesteuert?
Ein geheimnisvolles Shield- oder direkt über einen ULN2003A, EasyDriver-Board,
L298 oder L293?

hier schon mal geschaut:
http://www.arduino.cc/en/Reference/Stepper

oder hier:

http://techref.massmind.org/techref/io/stepper/wires.asp

normalerweise braucht es nicht mehr als die Stepper.h. Die steckt mit
Beispielen in der IDE.

Der Sketch ist ziemlich einfach:

/*
 * Stepper sketch
 *
 * stepper is controlled from the serial port.
 * a numeric value followed by '+' or '-' steps the motor
 *
 *
 * http://www.arduino.cc/en/Reference/Stepper
 */

#include <Stepper.h>

// change this to the number of steps on your motor
#define STEPS 24

// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper stepper(STEPS, 2, 3, 4, 5);

int steps = 0;


void setup()
{
  stepper.setSpeed(30);    // set the speed of the motor to 30 RPMs
  Serial.begin(9600);
}

void loop()
{
  if ( Serial.available()) {
    char ch = Serial.read();

    if(ch >= '0' && ch <= '9'){             // is ch a number?
      steps = steps * 10 + ch - '0';        // yes, accumulate the value
    }
    else if(ch == '+'){
      stepper.step(steps);
      steps = 0;
    }
    else if(ch == '-'){
      stepper.step(steps * -1);
      steps = 0;
    }
    else if(ch == 's'){
      stepper.setSpeed(steps);
      Serial.print("Setting speed to ");
      Serial.println(steps);
      steps = 0;
    }
  }
}

Gruß und Spaß
Andreas
P.S. hat dein Motor zufällig ein Getriebe- dann wär´s kein Wunder…

Ich habe ganz vergessen, die Infos zum Motor dazu zu schreiben. Mein Fehler :-[

Es ist ein Bipolarer 12V Schrittmotor mit 200 Schritten pro Umdrehung (Emis 547). Betrieben wird er über einen DRV8825, dort brauche ich nur signale für Step, Dir und später noch Enable.

Hallo, wenn es dieser Motor ist, dann muß dein Schlitten ziemlich klein sein. Das Ding hat keine Kraft, es sei denn, es hängt ein Getriebe an der Welle. Das würde auch Deine falschen Schritte erklären.

Hast du das StepperDriver probiert. Hier wäre auch noch eine Spielerei Gruß und Spaß Andreas