c++ Arduino UNO + CNC Shield v3 + Python + 4个步进电机,问题=一个步进电机不动

sg3maiej  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(175)

我试图使一个4轮“汽车”与步进电机移动,这是我的代码:

#include <AccelStepper.h>

// Definición de los pines para los controladores de motor
#define motorPin1  2  // X STEP
#define motorPin2  5  // X DIR
#define motorPin3  3  // Y STEP
#define motorPin4  6  // Y DIR
#define motorPin5  4  // Z STEP
#define motorPin6  7  // Z DIR
#define motorPin7  8  // A STEP
#define motorPin8  9  // A DIR

// Creación de instancias de los objetos de motor
AccelStepper motorX1(AccelStepper::DRIVER, motorPin1, motorPin2);
AccelStepper motorY1(AccelStepper::DRIVER, motorPin3, motorPin4);
AccelStepper motorX2(AccelStepper::DRIVER, motorPin5, motorPin6);
AccelStepper motorY2(AccelStepper::DRIVER, motorPin7, motorPin8);

float prevX = 0.0;
float prevY = 0.0;

void setup() {
  // Establecer la velocidad de los motores
  motorX1.setMaxSpeed(300); // Establece una velocidad moderada (puedes ajustar este valor según lo que consideres "suave")
  motorY1.setMaxSpeed(300);
  motorX2.setMaxSpeed(300);
  motorY2.setMaxSpeed(300);
 
  // Establece una aceleración razonable
  motorX1.setAcceleration(600); 
  motorY1.setAcceleration(600);
  motorX2.setAcceleration(600);
  motorY2.setAcceleration(600);

  Serial.begin(9600);
 
}

void moveMotors(long diffX, long diffY) {
  // Configura la distancia que cada motor debe moverse
  motorX1.move(diffX);
  motorY1.move(diffY);
  motorX2.move(-diffX);
  motorY2.move(-diffY);

  // Mueve los motores hasta que alcancen su objetivo
  while (motorX1.distanceToGo() != 0 || motorY1.distanceToGo() != 0 || 
         motorX2.distanceToGo() != 0 || motorY2.distanceToGo() != 0) {
    motorX1.run();
    motorY1.run();
    motorX2.run();
    motorY2.run();
  }

  delay(500); // Espera 0.5 segundos
}

void girar90() {
  motorX1.move(60);
  motorX2.move(60);
  motorY1.move(60);
  motorY2.move(60);

  while (motorX1.distanceToGo() != 0 || motorX2.distanceToGo() != 0 || 
         motorY1.distanceToGo() != 0 || motorY2.distanceToGo() != 0) {
    motorX1.run();
    motorX2.run();
    motorY1.run();
    motorY2.run();
  }

  delay(500); // Puedes ajustar esta pausa según lo necesites
}

void interpretGCode(String code) {
  int xPos = code.indexOf('X');
  int yPos = code.indexOf('Y');
  // ... (otros índices)

  if (xPos != -1 && yPos != -1) { // Verifica si 'X' y 'Y' están presentes
    String xStr = code.substring(xPos + 1, code.indexOf(' ', xPos));
    float xCoord = xStr.toFloat(); // Convierte a float en lugar de int

    String yStr = code.substring(yPos + 1, code.indexOf(' ', yPos));
    float yCoord = yStr.toFloat(); // Convierte a float en lugar de int


    // Calcula las diferencias de coordenadas
    float diffX = xCoord - prevX;
    float diffY = yCoord - prevY;

    //Printa los movimientos
    Serial.print("DIFF:");
    Serial.print(diffX);
    Serial.print(",");
    Serial.println(diffY);

    // Llama a moveMotors con las diferencias (ajusta la multiplicación si es necesario)
    moveMotors(diffX *10, diffY *10); // Si tu motor necesita valores enteros, necesitarás convertir estos valores.

    // Actualiza las coordenadas previas
    prevX = xCoord;
    prevY = yCoord;
  }
}

void loop() {
  if (Serial.available()) {
    String gcode = Serial.readStringUntil('\n');
    interpretGCode(gcode);
    /*Serial.println("OK");*/
  }
}

字符串
正如你所看到的,它需要一些来自解释代码的输入,它可以完美地移动4个轮子中的3个。
CNC Shield V2上的轮子是- X,Y,Z和A -
我不知道为什么第四个轮子A不动了
我更换了控制器芯片,换了电机,除了A轴,一切都正常。
我想这和引脚有关,但我不确定。也许我必须“激活”第四个轴?
我用的是“超时空漫游”

wh6knrhe

wh6knrhe1#

好吧,我解决了它,你需要使用引脚12和13,并把跳线在12-13引脚像在这个链接:https://forum.arduino.cc/t/arduino-uno-cnc-shield-controlling-4-stepper-motors/913742/2

相关问题