Endschalter bei Schrittmotor

Hallo,
ich bins nochmal. Ich habe vor einen Cameraslider mit zwei Endschaltern zu bauen, nur leider finde ich nirgends etwas wie man bei Schrittmotoren (ich verwende den Schrittmotor 28BYJ48) ohne eine feste Schrittanzahl einen Endschalter einbauen kann. Der Slider sollte folgendermaßen funktionieren:
Man drückt einen Knopf, der Slider fährt bis zum Endschalter und wenn man den Knopf erneut drückt fährt er halt zum anderen Endschalter zurück.
Um den Motor allgemein anzusteuern nutze ich zur Zeit dieses Programm, da es mit dem Schrittmotor 28BYJ48 im allgemeinen ein paar Ansteuerungsprobleme gibt.

/*
 Stepper Motor Control - one revolution
 This is the examply by Tom Igoe delivered with th Arduino IDE.

 Adapted by Stefan Thesen for 28BYJ-48 stepper motor
 https://blog.thesen.eu
 */

#include <Stepper.h>

// Get steps per turn and RPM out of datasheet:
// ============================================
// 5.625/64 deg per step --> 4096 steps for 360 deg
// step relates to half-step sequencing, which means 8 steps
// We use 4 full steps ==> 2048 steps per turn
//
// recommended frequency range 600-1000Hz for 8 half-steps
// 1000Hz/4096 half-steps --> approx 4sec per turn is max speed 
// ==> 15rpm
// Note: actually we will use ~500Hz using the 4 step approach
// but motor will not be able to turn faster.

// Get stepping sequence out of datasheet:
// =======================================
// Stepping sequence as given in datasheet
// this is an 8-step half-step approach
//         Steps
// Wire  1  2  3  4  5  6  7  8
// 1                    x  x  x
// 2              x  x  x 
// 3        x  x  x
// 4     x  x                 x
// 
// We use only even / full steps thus:
//         Steps
// Wire  2  4  6  8
//   1         x  x
//   2      x  x 
//   3   x  x 
//   4   x        x
// 
// Code of Arduino Stepper Lib has implemented:
//         Steps
// Wire  1  2  3  4
//   1         x  x
//   2   x  x      
//   3      x  x 
//   4   x        x
//
// ==> Simple Solution: exchange wire 2&3


const int stepsPerRevolution = 2048;  // here go the 2048 steps
// for your motor

// initialize the stepper library on pins 8 through 11 -> IN1, IN2, IN3, IN4
// as shown above, we need to exchange wire 2&3, which we do in the constructor
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

void setup() 
{
  // set the speed at 15 rpm:
  myStepper.setSpeed(15);
  // initialize the serial port:
  Serial.begin(9600);
}

void loop() 
{
  // step one revolution  in one direction:
  Serial.println("clockwise");
  myStepper.step(5000);
  delay(1500);

  // step one revolution in the other direction:
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(50);
}

Wie schon der Name Endschalter sagt, brauchst Du je einen Schalter für jede Endposition. Dann fährst Du so lange in eine Richtung, bis der zugehörige Endschalter anspricht.

Hi DrDiettrich,
mir ist schon klar auf, dass der Motor stoppen soll wenn der Endschalter gedrückt wurde, aber ich weiß nicht wie ichihm das "sagen" soll, da ich beim Motorstart ja zur Zeit immer eine feste Schrittzahl angeben muss. Kann ich den Motor auch schon vor der angegebenen Schrittzahl stoppen oder muss ich in das feld für die Schrittzahl auch einfach sowas wie "dreh solange der Taster aus ist" angeben?
Liebe Grüße Marius

Richtig erkannt, der Motor muß steppen bis der Schalter schließt. Dafür in einer Schleife 1 Schritt machen und dann den Endschalter abfragen, so lange bis der Schalter aktiviert ist.

Du lässt ihn immer einen Schritt drehen und prüfst, ob er auf dem Endschalter angelangt ist.
Ja = Stop, nein = nächster Schritt.

Gruß Tommy

Edit: DrDiettrich war schneller.

Hi

Dafür brauchst Du aber nicht wirklich die Stepper-Lib - auch, weil der 28BYJ48 nicht wirklich 'drehfreudig' ist.
Weder Geschwindigkeit noch Kraft sind von dem kleinen Motor groß zu erwarten - wenn's reicht soll Das aber egal gewesen sein!

Du hast in den Kommentaren, in welcher Reihenfolge die Signale zum ULN geschickt werden müssen - genau Das verpackst Du in eine State-Maschine, welche Dir

  • auf Tastendruck 'Start' warten
  • wenn Endschalter PLUS betätigt, Richtung MINUS, sonst PLUS
  • alle x ms einen Schritt in die zuvor gewählte Richtung, bis Endschalter PLUS bei Richtung==Minus oder MINUS bei Richtung Plus erreicht

Diese Schritte alle x ms kann man ebenfalls als verschiedene Status behandeln, eben mit der Abbruch-Bedingung um dann auf den Status 'Warte auf Tastendruck Start' zu springen.
(oder doch mit der LIB jeweils einen Step raus hauen)

MfG