我试图使一个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轴,一切都正常。
我想这和引脚有关,但我不确定。也许我必须“激活”第四个轴?
我用的是“超时空漫游”
1条答案
按热度按时间wh6knrhe1#
好吧,我解决了它,你需要使用引脚12和13,并把跳线在12-13引脚像在这个链接:https://forum.arduino.cc/t/arduino-uno-cnc-shield-controlling-4-stepper-motors/913742/2