Motorschlitten rechts und links stoppen

Hallo zusammen
Versuche mich mit dem Bau eines Sputnikkastens (Kugelfangmaschine). Dazu möchte ich einen Motorslider verwenden, mit dem die Kugelaufgefangen werden soll. Den Code dafür habe ich bereits im Internet gefunden (ich bin absoluter Arduino Neuling, habe aber mal vor vielen Jahren Elektroniker gelernt).
Programmieren ist leider nicht meine Stärke.
Der Slider macht alles einwandfrei (Steuerung mit Joystick), nur eine Sache macht mir Probleme: wie stoppe ich den Motor Links und Rechts automatisch am Ende der Stange. Ich verwende einen Arduino Uno, Einen TB6600 und verwende diesen Code.
Für euch Profis sicher ein kleines mir einen Tipp zu geben wie ich das am einfachsten mit zwei Endschaltern bewerkstelligen kann.
Vielen Dank für Eure Hilfe
Der verwendete Code:

#include <AccelStepper.h> //accelstepper library
AccelStepper stepper(1, 8, 9); // direction Digital 9 (CCW), pulses Digital 8 (CLK)
AccelStepper stepper2(1, 10, 11); // direction Digital 11 (CCW), pulses Digital 10 (CLK)


//Pins
const byte Analog_X_pin = A0; //x-axis readings
const byte Analog_Y_pin = A1; //y-axis readings
const byte Analog_R_pin = A2; //r-axis readings
const byte LED_pin = 3; //PWM output for LED

//Variables
int Analog_X = 0; //x-axis value
int Analog_Y = 0; //y-axis value
int Analog_R = 0; //r-axis value

int Analog_X_AVG = 0; //x-axis value average
int Analog_Y_AVG = 0; //y-axis value average
int Analog_R_AVG = 0; //r-axis value average

int Analog_R_Value = 0; //this is used for the PWM value

void setup()
{

  //SERIAL
  Serial.begin(9600);
  //----------------------------------------------------------------------------    
  //PINS
  pinMode(Analog_X_pin, INPUT);
  pinMode(Analog_Y_pin, INPUT);  
  pinMode(Analog_R_pin, INPUT); 
  pinMode(LED_pin, OUTPUT);
  //----------------------------------------------------------------------------  
  InitialValues(); //averaging the values of the 3 analog pins (values from potmeters)
  //----------------------------------------------------------------------------  
  //Stepper parameters
  //setting up some default values for maximum speed and maximum acceleration
  stepper.setMaxSpeed(5000); //SPEED = Steps / second  
  stepper.setAcceleration(1000); //ACCELERATION = Steps /(second)^2    
  stepper.setSpeed(500);
  delay(500);
  //----------------------------------------------------------------------------
  stepper2.setMaxSpeed(5000); //SPEED = Steps / second  
  stepper2.setAcceleration(1000); //ACCELERATION = Steps /(second)^2    
  stepper2.setSpeed(500);
  delay(500);  

}

void loop()
{
  ReadAnalog();  
  stepper.runSpeed(); //step the motor (this will step the motor by 1 step at each loop indefinitely)
  stepper2.runSpeed();  
}

void ReadAnalog()
{
  //Reading the 3 potentiometers in the joystick: x, y and r.
  Analog_X = analogRead(Analog_X_pin);  
  Analog_Y = analogRead(Analog_Y_pin);    
  Analog_R = analogRead(Analog_R_pin);    

  //if the value is 25 "value away" from the average (midpoint), we allow the update of the speed
  //This is a sort of a filter for the inaccuracy of the reading
  if(abs(Analog_X-Analog_X_AVG)>25) 
  {
  stepper.setSpeed(5*(Analog_X-Analog_X_AVG));    
  }
  else
  {
    stepper.setSpeed(0);
  }
  //----------------------------------------------------------------------------  
  if(abs(Analog_Y-Analog_Y_AVG)>25) 
  {
  stepper2.setSpeed(5*(Analog_Y-Analog_Y_AVG));  
  }
  else
  {
    stepper2.setSpeed(0);
  }
  //----------------------------------------------------------------------------  
  if(abs(Analog_R-Analog_R_AVG)>25) 
  {
    Analog_R_Value = map(Analog_R, 0, 1023, 0, 255); //10 bit ADC (0-1023) and 8 bit PWM (0-255)
    analogWrite(LED_pin, Analog_R_Value); //modify the PWM value     
  }
}

void InitialValues()
{
  //Set the values to zero before averaging
  float tempX = 0;
  float tempY = 0;
  float tempR = 0;
  //----------------------------------------------------------------------------  
  //read the analog 50x, then calculate an average. 
  //they will be the reference values
  for(int i = 0; i<50; i++)
  {
     tempX += analogRead(Analog_X_pin);  
     delay(10); //allowing a little time between two readings
     tempY += analogRead(Analog_Y_pin);        
     delay(10);
     tempR += analogRead(Analog_R_pin);
     delay(10);
  }
  //----------------------------------------------------------------------------  
  Analog_X_AVG = tempX/50; 
  Analog_Y_AVG = tempY/50; 
  Analog_R_AVG = tempR/50; 
  //----------------------------------------------------------------------------  
  Serial.print("AVG_X: ");
  Serial.println(Analog_X_AVG);
  Serial.print("AVG_Y: ");
  Serial.println(Analog_Y_AVG);
  Serial.print("AVG_R: ");
  Serial.println(Analog_R_AVG);
  Serial.println("Calibration finished");  
}

Endschalter abfragen?

Blöde Frage: Waum nimmst du nicht einen Bürstenmotor + Getriebe und 2 Dioden an den Endschaltern, dann braucht du gar keinen Arduino.

Gute Antwort :slight_smile:
weil ich das ganze mit diesem Motor aufgebaut habe (Hatte ich noch aus einem anderen Projekt, und das Teil ja eigentlich alles macht was es soll. Nur stoppt
es nicht an den beiden Enden. ich denke das ist für einen Arduino Profi relativ leicht zu lösen. Leider habe ich nichts, für mich brauchbar, im Internet gefunden.
grüessli (aus der Schweiz)

Dir fehlt:

  • Homing Sequence
  • Konfiguration der Sliderlänge oder ein automatischens Äquvalent
  • beide Endschalter

Alternative:

  • Längenmessung, und immer von der Mitte starten (manuell Mitte anfahren)

Alternative II:

  • GRBL installieren
  • Jog-Commands auf 2 Pins legen

Hallo zusammen
also mittlerweile läuft das mit dem Motorschlitten einwandfrei. folgenden Code verwende ich:

// if ENA is LOW motor is locked at last position
// this can lead to overheating of motor
// program assumes common cathode connection

#define SW1 2
#define SW2 3
#define SW3 4
#define DIR 5
#define PUL 6
#define ENA 7 // HIGH disables motor power

#define CW 1
#define CCW 0

// indicates motor is on
// this is built in LED on DP13.
#define motorOn 13

// sets how many pulses for 360 degrees
#define rot360 200

// HIGH on PUL will keep motor locked in position
// note motor will get hot after some time.

int x, y;

// this sets the motor speed
int pulseDelay = 300; // in uSec.

void setup() {
  // DP13 LED
  pinMode(motorOn, OUTPUT);
  digitalWrite(motorOn, LOW);

  pinMode(SW1, INPUT_PULLUP);
  pinMode(SW2, INPUT_PULLUP);
  pinMode(SW3, INPUT_PULLUP);
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW);
  pinMode(PUL, OUTPUT);
  digitalWrite(PUL, LOW);
  pinMode(ENA, OUTPUT);
  digitalWrite(ENA, HIGH); 

}

void loop() {


  // manual CW when pushed
  while (digitalRead(SW1) == 0) {
    digitalWrite(motorOn, HIGH); // motor LED On
    digitalWrite(ENA, LOW); // enable motor power
    digitalWrite(DIR, CW);
    digitalWrite(PUL, 1);
    digitalWrite(PUL, 0);
    delayMicroseconds(pulseDelay * 2);
  } // end while

  // manual CCW when pushed
  while (digitalRead(SW2) == 0) {
    digitalWrite(motorOn, HIGH); // motor LED On
    digitalWrite(ENA, LOW); // enable motor power
    digitalWrite(DIR, CCW);
    digitalWrite(PUL, 1);
    digitalWrite(PUL, 0);
    delayMicroseconds(pulseDelay * 2);
  } // end while

  if (digitalRead(SW1) && digitalRead(SW2)) digitalWrite(motorOn, LOW);

  if (digitalRead(SW3) == 0) {
    lockMotor();
  }
  else {
    unlockMotor();
  }
  delay(100);

} // end loop

void motorRun(int count, byte dir_local )   {
  digitalWrite(motorOn, HIGH); // DP13 LED
  digitalWrite(ENA, LOW); // motor power ON
  digitalWrite(DIR, dir_local);
  count = count * rot360;
  for (int x = 0; x < count; x++)   {
    digitalWrite(PUL, 1);
    digitalWrite(PUL, 0);
    delayMicroseconds(pulseDelay);
  } // end for
  digitalWrite(ENA, HIGH); // motor power OFF
  digitalWrite(motorOn, LOW);
}

void lockMotor(void) {
  digitalWrite(motorOn, HIGH);
  digitalWrite(ENA, LOW);
}

void unlockMotor(void) {
  digitalWrite(ENA, HIGH);
}

/*
Ex.
motorRun(10, CW);
motorRun(10, CCW);
motorRun(100, CW);
motorRun(50, CCW);
motorRun(50, CCW);

*/

der Schlitten läuft ziemlich zügig hin und her wenn ich den Joystick bewege. Ich möchte mit einem Taster die Geschwindigkeit halbieren, d.h. wenn ich den Taster drücke fährt er nur halb so schnell. dh. dieser Eintag müsste ich ändern von:

// this sets the motor speed
int pulseDelay = 300; // in uSec.   
auf 
int pulseDelay = 600; // in uSec.

leider kriege ich das mit meinen Kenntnissen nicht hin. Vielleicht könnt ihr mir dabei helfen mit einem Tipp.
Vielen Dank und schönes Weekend
Marcel

Ich empfehle Dir die Bibliothek MobaTools, die Du über die Arduino-IDE installieren kannst. Dort findest Du eine Beschreibung in einer uns geläufigen Sprache und viele Beispiele.

Für Schrittmotoren bietet diese Bibliothek Beschleunigungs- und Bremsrampen, außerdem kannst Du die Geschwindigkeit einstellen. Da die Bibliothek die Schritte mitzählt, kannst Du den Aktionsbereich festlegen, innerhalb dessen sich der Schlitten bewegen soll.

Jede Bibliothek benötigt Einarbeitung, aber ich finde, es lohnt sich :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.