Schrittmotor mit IR Fernbedienung

Hallo zusammen,

ich komme hier bei meinem Projekt nicht weiter;
Projekt in Kurzfassung:
1.SChrittmotor soll zurück bis auf Endschalter fahren, Pos.=0; funktioniert
2.bei Tastendruck Taste 1 soll Schrittmotor xxx Schritte fahren; funktioniert
3.bei Tastendruck Taste 2 soll Schrittmotor zurück auf Null fahren; funktioniert

Das wollte ich jetzt auf Fernbedienung umprogrammieren und hänge seit Tagen fest.

  1. SChrittmotor soll zurück bis auf Endschalter fahren, Pos.=0; funktioniert
  2. Taste 1 auf Fernbedienung: Motor dreht xxx Schritte, funktioniert aber Schrittmotor wird nicht abgeschaltet.
    Die Signal-LED auf dem Motor-Shield leuchten fast dauerhaft. Keine Reaktion mehr. Motor brummt.

Mit Tastern hat das wuderbar funktioniert.
Im Programm habe ich alle Stellen markiert bis wohin es funktioniert damit der Fehler schneller gefunden werden kann. Bis void loop funzt alles.
würde mich über Hilfestellung freuen.

//homing501 für Forum incl. Fernbedienung
/*  Motor Homing code using AccelStepper and the Serial Monitor
 
Created by Yvan / https://Brainy-Bits.com
This code is in the public domain...
You can: copy it, use it, modify it, share it or just plain ignore it!
Thx!

*/

#include "AccelStepper.h" 
//#include <Bounce2.h>
#include "IRremote.h"
// Library created by Mike McCauley at http://www.airspayce.com/mikem/arduino/AccelStepper/
const int pwmA = 3;
const int pwmB = 11;
const int brakeA = 9;
const int brakeB = 8;
const int dirA = 12;
const int dirB = 13;
int RECV_PIN = 6; //empfängerpin fernbedienung

// Define number of steps per revolution:
const int stepsPerRevolution = 400; 

// AccelStepper Setup
#define MotorInterfaceType 2
AccelStepper stepperX = AccelStepper(MotorInterfaceType, dirA, dirB);                                    
                                  
// Define the Pins used
#define home_switch 5 // Pin 5 connected to Home Switch (MicroSwitch)

long TravelX;  // Used to store the X value entered in the Serial Monitor
int move_finished=1;  // Used to check if move is completed
long initial_homing=-1;  // Used to Home Stepper at startup
int oben=400; //Anzahl Schritte  bis oben bzw.Ende
int drehzahl=600; //geschwindigkeit des motors


//für Fernbedienung
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {

   //***
   //zu erst Homig für Nullposition des Schrittmotors; dreht bis auf Taster, dann zurück bis Taster nicht mehr gedrückt ist; Funktioniert
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);
  pinMode(home_switch, INPUT_PULLUP);
  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);
   delay(10);  // Wait for  wake up

   //  Set Max Speed and Acceleration of each Steppers at startup for homing
  stepperX.setMaxSpeed(50.0);      // Set Max Speed of Stepper (Slower to get better accuracy)
  stepperX.setAcceleration(50.0);  // Set Acceleration of Stepper


  while (digitalRead(home_switch)) {  // Make the Stepper move CCW until the switch is activated   
    stepperX.moveTo(initial_homing);  // Set the position to move to
    initial_homing--;  // Decrease by 1 for next move if needed
    stepperX.run();  // Start moving the stepper
    delay(5);
}

  stepperX.setCurrentPosition(0);  // Set the current position as zero for now
  stepperX.setMaxSpeed(100.0);      // Set Max Speed of Stepper (Slower to get better accuracy)
  stepperX.setAcceleration(100.0);  // Set Acceleration of Stepper
  initial_homing=1;

  while (!digitalRead(home_switch)) { // zurück bis knopf nicht mehr gedrückt ist Make the Stepper move CW until the switch is deactivated
    stepperX.moveTo(initial_homing);  
    stepperX.run();
    initial_homing++;
    delay(5);
  }
  
  stepperX.setCurrentPosition(0);
  //Serial.println("Homing Completed");
  //Serial.println("");
  stepperX.setMaxSpeed(600.0);      // Set Max Speed of Stepper (Faster for regular movements)
  stepperX.setAcceleration(600.0);  // Set Acceleration of Stepper

// Print out Instructions on the Serial Monitor at Start
  //Serial.println("Enter Travel distance (Positive for CW / Negative for CCW and Zero for back to Home): ");
   
irrecv.enableIRIn();
}

//bis hier her funktioniert das Programm wie es soll; beim Tasterdrücken bleibt der Motor stehen.

void loop() {
digitalWrite(pwmA, LOW);
 digitalWrite(pwmB, LOW);
if (irrecv.decode(&results)) {
  
if (results.value == 16738455)   //Wenn der Infrarotempfänger die Zahl 
//„16738455“ ausgelesen hat (Entsprechend der Taste“1“ der Fernbedienung)
{
  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  
    while(stepperX.currentPosition() != oben) // fahre von der jetzigen Positino bis "oben" erreicht ist
  {
  stepperX.setSpeed(drehzahl);
  stepperX.runSpeed();
  }
 digitalWrite(pwmA, LOW);
 digitalWrite(pwmB, LOW);
  }
//***
//hier ist das Problem: nach dem Position oben erreicht ist leuchten werden pwmA und B nicht ausgeschaltet
//keine REaktion mehr; Motor brummt;

//bei Taste 2 Soll der Motor wieder zurück auf Null
if (results.value == 16750695 && stepperX.currentPosition() == oben)   //Wenn der Infrarotempfänger die Zahl 
    //„16750695“ ausgelesen hat (Entsprechend der Taste“2“ der Fernbedienung), 

 {
  //bei endposition (oben)
     
  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  
  while(stepperX.currentPosition() != 0)
  {
  stepperX.setSpeed(-drehzahl);
  stepperX.runSpeed();
  }
   digitalWrite(pwmA, LOW);
 digitalWrite(pwmB, LOW);
}

else 
{
 
//stepper.disableOutputs(); // funktioniert bei mir nicht
  digitalWrite(pwmA, LOW);
 digitalWrite(pwmB, LOW);
 }
}
}

Ich habe mir die Ansteuerung jetzt nicht im Detail angeschaut. Aber was mir aufgefallen ist, dass am Ende des Ifblockes

if (irrecv.decode(&results)) {
...
}

das
irrecv.resume(); // Receive the next value fehlt.

P.S. Du solltest mal ctrl-T drücken :wink:

Hey, Sonntag gerettet :slight_smile:

das war das Problem. Ich hinge da dran wie blöd.
Hier der fertige Code, ggf. kann den Code ja jemand gebrauchen.

Vielen Dank!!

//homing501 für Forum incl. Fernbedienung
/*  Motor Homing code using AccelStepper and the Serial Monitor

  Created by Yvan / https://Brainy-Bits.com
  This code is in the public domain...
  You can: copy it, use it, modify it, share it or just plain ignore it!
  Thx!

*/

#include "AccelStepper.h"
//#include <Bounce2.h>
#include "IRremote.h"
// Library created by Mike McCauley at http://www.airspayce.com/mikem/arduino/AccelStepper/
const int pwmA = 3;
const int pwmB = 11;
const int brakeA = 9;
const int brakeB = 8;
const int dirA = 12;
const int dirB = 13;
int RECV_PIN = 6; //empfängerpin fernbedienung

// Define number of steps per revolution:
const int stepsPerRevolution = 400;

// AccelStepper Setup
#define MotorInterfaceType 2
AccelStepper stepperX = AccelStepper(MotorInterfaceType, dirA, dirB);

// Define the Pins used
#define home_switch 5 // Pin 5 connected to Home Switch (MicroSwitch)

long TravelX;  // Used to store the X value entered in the Serial Monitor
int move_finished = 1; // Used to check if move is completed
long initial_homing = -1; // Used to Home Stepper at startup
int oben = 400; //Anzahl Schritte  bis oben bzw.Ende
int drehzahl = 600; //geschwindigkeit des motors


//für Fernbedienung
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {

  //***
  //zu erst Homig für Nullposition des Schrittmotors; dreht bis auf Taster, dann zurück bis Taster nicht mehr gedrückt ist; Funktioniert
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);
  pinMode(home_switch, INPUT_PULLUP);
  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);
  delay(10);  // Wait for  wake up

  //  Set Max Speed and Acceleration of each Steppers at startup for homing
  stepperX.setMaxSpeed(50.0);      // Set Max Speed of Stepper (Slower to get better accuracy)
  stepperX.setAcceleration(50.0);  // Set Acceleration of Stepper


  while (digitalRead(home_switch)) {  // Make the Stepper move CCW until the switch is activated
    stepperX.moveTo(initial_homing);  // Set the position to move to
    initial_homing--;  // Decrease by 1 for next move if needed
    stepperX.run();  // Start moving the stepper
    delay(5);
  }

  stepperX.setCurrentPosition(0);  // Set the current position as zero for now
  stepperX.setMaxSpeed(100.0);      // Set Max Speed of Stepper (Slower to get better accuracy)
  stepperX.setAcceleration(100.0);  // Set Acceleration of Stepper
  initial_homing = 1;

  while (!digitalRead(home_switch)) { // zurück bis knopf nicht mehr gedrückt ist Make the Stepper move CW until the switch is deactivated
    stepperX.moveTo(initial_homing);
    stepperX.run();
    initial_homing++;
    delay(5);
  }

  stepperX.setCurrentPosition(0);
  //Serial.println("Homing Completed");
  //Serial.println("");
  stepperX.setMaxSpeed(600.0);      // Set Max Speed of Stepper (Faster for regular movements)
  stepperX.setAcceleration(600.0);  // Set Acceleration of Stepper

  // Print out Instructions on the Serial Monitor at Start
  //Serial.println("Enter Travel distance (Positive for CW / Negative for CCW and Zero for back to Home): ");

  irrecv.enableIRIn();
}

//bis hier her funktioniert das Programm wie es soll; beim Tasterdrücken bleibt der Motor stehen.

void loop() {
  digitalWrite(pwmA, LOW);
  digitalWrite(pwmB, LOW);
  if (irrecv.decode(&results)) {

    if (results.value == 16738455)   //Wenn der Infrarotempfänger die Zahl
      //„16738455“ ausgelesen hat (Entsprechend der Taste“1“ der Fernbedienung)
    {
      digitalWrite(pwmA, HIGH);
      digitalWrite(pwmB, HIGH);

      while (stepperX.currentPosition() != oben) // fahre von der jetzigen Positino bis "oben" erreicht ist
      {
        stepperX.setSpeed(drehzahl);
        stepperX.runSpeed();
      }
      digitalWrite(pwmA, LOW);
      digitalWrite(pwmB, LOW);

    }
    //***
    //hier ist das Problem: nach dem Position oben erreicht ist leuchten werden pwmA und B nicht ausgeschaltet
    //keine REaktion mehr; Motor brummt;

    //bei Taste 2 Soll der Motor wieder zurück auf Null
    if (results.value == 16750695 && stepperX.currentPosition() == oben)   //Wenn der Infrarotempfänger die Zahl
      //„16750695“ ausgelesen hat (Entsprechend der Taste“2“ der Fernbedienung),

    {
      //bei endposition (oben)

      digitalWrite(pwmA, HIGH);
      digitalWrite(pwmB, HIGH);

      while (stepperX.currentPosition() != 0)
      {
        stepperX.setSpeed(-drehzahl);
        stepperX.runSpeed();
      }
      digitalWrite(pwmA, LOW);
      digitalWrite(pwmB, LOW);

    }

    else
    {

      //stepper.disableOutputs(); // funktioniert bei mir nicht
      digitalWrite(pwmA, LOW);
      digitalWrite(pwmB, LOW);
    }
    irrecv.resume();  //Der nächste Wert soll vom IR-Empfänger eingelesen werden
  }
}

Bitte, gerne. Freut mich, wenn ich deinen Sonntag retten konnte :wink: