He realizado el código 2 para manejo de un motor paso a paso con driver BT6600 a partir de datos provenientes de un transductor de presión, sin embargo, no he logrado hacer mover el motor a pesar de que he probado que el motor funciona con el código 1, ingresando los datos para accionarlo desde el monitor serial.
Agradezco una orientación, saludos!
Código 1:
#include <AccelStepper.h>
// Pines de conexión al driver BT6600
const int STEP_PIN = 3;
const int DIR_PIN = 2;
// Crear una instancia de AccelStepper
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
void setup() {
Serial.begin(9600);
Serial.println("Control de Motor Paso a Paso con BT6600");
// Configuración de la velocidad y aceleración del motor
stepper.setMaxSpeed(1000); // Ajusta según sea necesario
stepper.setAcceleration(500); // Ajusta según sea necesario
}
void loop() {
// Verificar si hay datos disponibles en el monitor serial
if (Serial.available() > 0) {
// Leer los datos de paso y velocidad desde el monitor serial
int steps = Serial.parseInt();
int speed = Serial.parseInt();
// Mover el motor con los valores ingresados
Serial.print("Moviendo ");
Serial.print(steps);
Serial.print(" pasos a ");
Serial.print(speed);
Serial.println(" pasos/segundo");
moverMotor(steps, speed);
}
}
void moverMotor(int steps, int speed) {
// Establecer la velocidad y dirección del motor
stepper.setSpeed(speed);
// Habilitar el motor y mover la cantidad de pasos especificada
stepper.enableOutputs();
stepper.move(steps);
// Realizar pasos hasta alcanzar la posición deseada
while (stepper.distanceToGo() != 0) {
stepper.run();
}
// Deshabilitar el motor
stepper.disableOutputs();
}
Código 2:
#include <Arduino.h>
#include <AccelStepper.h>
AccelStepper stepper(1, 2, 3); // Pines 2 y 3 son los pines de dirección y pulso, respectivamente
// Define el pin de entrada analógica para la presión
const int pinPresion = A0;
// Declara las variables
float kpa; // Variable para almacenar la presión analógica
float Pres_req; // Variable para almacenar la presión requerida
void setup() {
// Inicialización del puerto serie a una velocidad de 9600 baudios
Serial.begin(9600);
Serial.println("Control de Motor Paso a Paso con Presión");
// Configura el pin de entrada analógica
pinMode(pinPresion, INPUT);
// Configuración de la velocidad y aceleración del motor
stepper.setMaxSpeed(1000); // Ajusta según sea necesario
stepper.setAcceleration(500); // Ajusta según sea necesario
}
void moverMotor(int steps, int speed) {
// Establecer la velocidad y dirección del motor
stepper.setSpeed(speed);
// Habilitar el motor y mover la cantidad de pasos especificada
stepper.enableOutputs();
stepper.move(steps);
// Realizar pasos hasta alcanzar la posición deseada
while (stepper.distanceToGo() != 0) {
stepper.run();
delay(1); // Agrega una breve pausa para permitir que el motor realice los pasos
}
// Deshabilitar el motor
stepper.disableOutputs();
}
void loop() {
// Lee la presión analógica desde el pin A0
kpa = analogRead(pinPresion) * 0.0048828125; // Convierte el valor analógico a voltaje (0-5V)
// Pide al usuario que ingrese la presión requerida a través del puerto serie
Serial.print("Ingrese la presion requerida (kPa): ");
// Espera hasta que se ingrese algo y se presione Enter
while (!Serial.available() || Serial.peek() == '\n') {
delay(10);
}
// Lee la línea completa y la almacena en una cadena
String input = Serial.readStringUntil('\n');
// Convierte la cadena a un número
Pres_req = input.toFloat();
// Verifica si la conversión fue exitosa
if (!isnan(Pres_req)) {
// Calcula los dos números según la fórmula dada
float num1 = round((Pres_req - kpa) / 2.0); // Redondea num1 a la unidad más cercana
float num2 = 200.0;
// Imprime el resultado por el puerto serie
Serial.print("Resultado: ");
Serial.print(num1);
Serial.print(" ");
Serial.println(num2);
// Convierte la cadena a números utilizando strtok
int steps = int(num1);
int speeds = int(num2);
// Muestra información de depuración
Serial.print("Steps: ");
Serial.print(steps);
Serial.print(", Speeds: ");
Serial.println(speeds);
// Configura y mueve el motor solo si es necesario
if (steps != 0 || speeds != 0) {
moverMotor(steps, speeds);
}
} else {
// Mensaje de error si la conversión no fue exitosa
Serial.println("Error: Valor no válido ingresado.");
}
// Puedes agregar más código aquí según sea necesario para tu aplicación
delay(1000); // Pausa de 1 segundo
}