Arduino Steuerung eines Schrittmotors mittels IR Empfänger und Endstop

Hallo zusammen

Erst mal möchte ich mich begrüssen, ich bin neu in dieser Community :slight_smile:

Ich bin noch relativ neu in Sachen Arduino-Programmierung und habe leider trotz intensiver Suche im Internet bisher zu keiner Lösung gefunden...

Ich realisiere momentan folgendes Projekt: geplant ist die Steuerung meines Teleskop-Okulars mittels eines Schrittmotors (durch IR-Receiver).

Da die Okulare relativ empfindlich sind, möchte ich den Auszug jedoch mit einem Endstop begrenzen.

Ich möchte, dass bei einem Tastendruck (0-9) die 0 maximaler Auszug bedeutet (1024 Schritte) die Tasten 1-9 jeweils 1/10 des Auszugs bewerkstelligen, die Richtung habe ich mit den Cases "+" & "-" eingearbeitet.

Bisher habe ich die Steuerung relativ gut hinbekommen (jedenfalls funktionieren die Steuertasten...) indem ich folgenden Code gefunden und meinen Bedürfnissen angepasst habe:

#include <IRremote.h>
int END_PIN = 7;
int IR_RECEIVE_PIN = 8;//The definition of the infrared receiver pin 8
int Pin0 = 9;//definition digital 8 pins as pin to control the IN1 (ULN24L01)
int Pin1 = 10;//definition digital 9 pins as pin to control the IN2 (ULN24L01)
int Pin2 = 11;//definition digital 10 pins as pin to control the IN3 (ULN24L01)
int Pin3 = 12;//definition digital 11 pins as pin to control the IN4 (ULN24L01)

int _step = 512;
int _speed = 1;
int dir;
void setup()
{
  Serial.begin(38400);
  pinMode(Pin0, OUTPUT);//Set digital 8 port mode, the OUTPUT for the output
  pinMode(Pin1, OUTPUT);//Set digital 9 port mode, the OUTPUT for the output
  pinMode(Pin2, OUTPUT);//Set digital 10 port mode, the OUTPUT for the output
  pinMode(Pin3, OUTPUT);//Set digital 11 port mode, the OUTPUT for the output
  IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK); //Initialization infrared receiver
  pinMode(END_PIN, INPUT);
}

void loop()
{
  if (IrReceiver.decode()) {
    switch (IrReceiver.decodedIRData.decodedRawData) {
      case 4144561920/*-*/:
        dir = 1;
        break;
      case 2774204160/*+*/:
        dir = 0;
        break;
      case 3860463360/*0*/:
        Speed(15);
        if (dir == 0) {
          Step(1024);//Full out
        } else {
          Step(-1024);//Full in
        }
        break;
      case 3125149440/*1*/:
        Speed(15);//Stepper motor speed = 15 fast
        if (dir == 0) {
          Step(102);//1/10 out
        } else {
          Step(-102);//1/10 in
        }
        break;
      case 3108437760/*2*/:
        Speed(15);//Stepper motor speed = 15 fast
        if (dir == 0) {
          Step(204);//2/10 out
        } else {
          Step(-204);//2/10 in
        }
        break;
      case 3091726080/*3*/:
        Speed(15);//Stepper motor speed = 15 fast
        if (dir == 0) {
          Step(306);//3/10 out
        } else {
          Step(-306);//3/10 in
        }
        break;
      case 3141861120/*4*/:
        Speed(15);//Stepper motor speed = 15 fast
        if (dir == 0) {
          Step(408);//4/10 out
        } else {
          Step(-408);//4/10 in
        }
        break;
      case 3208707840/*5*/:
        Speed(15);//Stepper motor speed = 15 fast
        if (dir == 0) {
          Step(510);//5/10 out
        } else {
          Step(-510);//5/10 in
        }
        break;
      case 3158572800/*6*/:
        Speed(15);//Stepper motor speed = 15 fast
        if (dir == 0) {
          Step(612);//6/10 out
        } else {
          Step(-612);//6/10 in
        }
        break;
      case 4161273600/*7*/:
        Speed(15);//Stepper motor speed = 15 fast
        if (dir == 0) {
          Step(714);//7/10 out
        } else {
          Step(-714);//7/10 in
        }
        break;
      case 3927310080/*8*/:
        Speed(15);//Stepper motor speed = 15 fast
        if (dir) {
          Step(816);//8/10 out
        } else {
          Step(-816);//8/10 in
        }
        break;
      case 4127850240/*9*/:
        Speed(15);//Stepper motor speed = 15 fast
        if (dir == 0) {
          Step(918);//9/10 out
        } else {
          Step(-918);//9/10 in
        }
        break;
      default :
        Step(0);   //Stepper motor stop
        break;
    }
    Serial.println(IrReceiver.decodedIRData.decodedRawData);
    IrReceiver.resume(); // Receiving the next value
  }
}
void Speed(int stepperspeed)//set Stepper speed
{
  _speed = 15 - stepperspeed;
  if ( _speed < 1) {
    _speed = 1;
  }
  if ( _speed > 15) {
    _speed = 15;
  }
}
void Step(int _step)//Stepper motor rotation
{
  if (_step >= 0) { // Stepper motor forward
    for (int i = 0; i < _step; i++) {
      setStep(1, 0, 0, 1);
      delay(_speed);
      setStep(1, 0, 0, 0);
      delay(_speed);
      setStep(1, 1, 0, 0);
      delay(_speed);
      setStep(0, 1, 0, 0);
      delay(_speed);
      setStep(0, 1, 1, 0);
      delay(_speed);
      setStep(0, 0, 1, 0);
      delay(_speed);
      setStep(0, 0, 1, 1);
      delay(_speed);
      setStep(0, 0, 0, 1);
      delay(_speed);
    }
  } else { // Stepper motor backward
    for (int i = _step; i < 0; i++) {
      setStep(0, 0, 0, 1);
      delay(_speed);
      setStep(0, 0, 1, 1);
      delay(_speed);
      setStep(0, 0, 1, 0);
      delay(_speed);
      setStep(0, 1, 1, 0);
      delay(_speed);
      setStep(0, 1, 0, 0);
      delay(_speed);
      setStep(1, 1, 0, 0);
      delay(_speed);
      setStep(1, 0, 0, 0);
      delay(_speed);
      setStep(1, 0, 0, 1);
      delay(_speed);
    }
  }
}
void setStep(int a, int b, int c, int d)
{
  digitalWrite(Pin0, a);
  digitalWrite(Pin1, b);
  digitalWrite(Pin2, c);
  digitalWrite(Pin3, d);
}

Ich möchte jedoch, dass bei jedem Tastendruck für die Grobeinstellung (0-9) der Stepper zuerst soweit zurückfährt, bis der Endschalter (der an Pin 7 liegt) die Nullposition anzeigt (dies um eine Überlast der Mechanik zu verhindern) und erst dann die entsprechenden Stepps ausfährt...

Ich hoffe, ich konnte meine Problematik einigermassen plausibel schildern und mir kann jemand etwas weiterhelfen :wink:

Liebe Grüsse
Dave

Hallo,
ich denke Du solltest für den Stepper eine geeignete lib verwenden. Mobatools oder AccelStepper. Mit beiden kannst Du vernünfitg Positionieren. Am Anfang machst Du mal ein Refferenzfahren bis zu einem Endschalter und ab dann gibst Du nur die neuen Positionen und Geschwindigkeiten an. Die aktuelle Position verwaltete die Lib für Dich. Rampen zum anfahren gehen ebenso damit minimierst Du das beim Anfahren schritte verloren gehen. Zudem arbeiten die Libs blockade frei.
Heinz