Rotary Encoder y Movimiento del motor

Quiero sacar la posición del encoder a la vez que me mueve la rueda que tengo conectada al motor hacia adelante y hacia atrás. Con lo que tengo, solo me saca la posición del encoder pero no gira el motor, y está comprobado que le llega corriente cuando está en el modo de adelante o atrás.

El código es el siguiente (para Arduino IDE):



#include <Arduino.h>
#include <ESP32Encoder.h>

// Asignación de pines del ESP32
int motor2Pin0 = 27;
int motor2Pin1 = 26;
int enable2Pin = 14;

const int pwmChannel0 = 0;      // Canal 0 PWM
const int pwmChannel1 = 1;      // Canal 1 PWM
const int freq = 30000;  // Frecuencia PWM
const int resolution = 8;  // Resolución PWM en bits

// Definición de los pines para el encoder
#define PIN_IN1 18
#define PIN_IN2 19

// Crear un objeto ESP32Encoder
ESP32Encoder encoder;

int lastPos = 0;
unsigned long lastPrintTime = 0;
const unsigned long printInterval = 5000; // Intervalo de 5 segundos

void setup() {
  // Declaración de los pines como salidas
  pinMode(motor2Pin0, OUTPUT);
  pinMode(motor2Pin1, OUTPUT);
  pinMode(enable2Pin, OUTPUT);

  // Configurar las funcionalidades del PWM
  ledcAttachChannel(motor2Pin0, freq, resolution, pwmChannel0 ); 
  ledcAttachChannel(motor2Pin1, freq, resolution, pwmChannel1 ); 

  Serial.begin(115200);
  Serial.println("Initializing...");

  // Inicializar el encoder
  // ESP32Encoder::useInternalWeakPullResistors = true;
  encoder.attachSingleEdge(PIN_IN1, PIN_IN2);
  encoder.clearCount();
}

void loop() {
  // Leer la posición actual del encoder
  int newPos = encoder.getCount();

  // Imprimir la posición del encoder si ha cambiado o cada 5 segundos
  unsigned long currentTime = millis();
  if (newPos != lastPos || (currentTime - lastPrintTime) >= printInterval) {
    Serial.print("Encoder Position: ");
    Serial.println(newPos);
    lastPos = newPos;
    lastPrintTime = currentTime;
  }

  // Verificar entrada serial para controlar el motor
  if (Serial.available() > 0) {
    String command = Serial.readStringUntil('\n');
    command.trim();  // Elimina espacios en blanco al inicio y al final

    int speed = 0;
    String action;

    if (command.startsWith("FORWARD")) {
      speed = command.substring(8).toInt();
      action = "FORWARD";
    } else if (command.startsWith("BACKWARD")) {
      speed = command.substring(9).toInt();
      action = "BACKWARD";
    } else if (command == "STOP") {
      action = "STOP";
    } else {
      action = "INVALID";
    }

    switch (action.charAt(0)) {
      case 'F':  // FORWARD
        moveMotorForward(speed);
        break;
      case 'B':  // BACKWARD
        moveMotorBackward(speed);
        break;
      case 'S':  // STOP
        stopMotor();
        break;
      default:
        Serial.println("Invalid command");
        break;
    }
  }
  //delay(10);
}

void moveMotorForward(int speed) {
  int dutyCycle = map(speed, 0, 255, 0, 255);
  Serial.print("Moving Forward with speed: ");
  Serial.println(dutyCycle);
  digitalWrite(enable2Pin, HIGH);
  digitalWrite(motor2Pin0, HIGH);
  digitalWrite(motor2Pin1, LOW);
  ledcWrite(pwmChannel0, dutyCycle);  // Set the duty cycle to desired speed
  ledcWrite(pwmChannel1, 0);  // Set the duty cycle to desired speed
}

void moveMotorBackward(int speed) {
  int dutyCycle = map(speed, 0, 255, 0, 255);
  Serial.print("Moving Backwards with speed: ");
  Serial.println(dutyCycle);
  digitalWrite(enable2Pin, HIGH);
  digitalWrite(motor2Pin0, LOW);
  digitalWrite(motor2Pin1, HIGH);
  ledcWrite(pwmChannel0, 0);  // Set the duty cycle to desired speed
  ledcWrite(pwmChannel1, dutyCycle);  // Set the duty cycle to desired speed
}

void stopMotor() {
  Serial.println("Motor stopped");
  digitalWrite(enable2Pin, LOW);
  digitalWrite(motor2Pin0, LOW);
  digitalWrite(motor2Pin1, LOW);
  ledcWrite(pwmChannel0, 0);  // Set the duty cycle to desired speed
  ledcWrite(pwmChannel1, 0);  // Set the duty cycle to desired speed
}

Saca la posición del encoder pero no mueve el motor, está comprobado que le llega corriente y bien cableado. Llevo varias semanas intentando otros códigos pero no consigo resolverlo. Si alguien tiene alguna idea de esto y me pudiera ayudar, estaría realmente agradecido.

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @marcosvergara .

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

¿Has probado

       speed = command.substring(7).toInt();

Lo acabo de probar, pero me sigue ocurriendo lo mismo.
Me devuelve lo siguiente:
Captura de pantalla 2024-10-07 a las 18.52.06
Tengo que mover yo la rueda manualmente. En cambio, si quito el código que me saca la posición del encoder, sí que se mueve.
Gracias!

[quote="marcosvergara, post:1, topic:1308827"] ``` case 'F': // FORWARD moveMotorForward(speed); break; case 'B': // BACKWARD moveMotorBackward(speed); break; case 'S': // STOP stopMotor(); break; ``` [/quote] ¿Deberían ser 'FORWARD', 'BACKWARD', 'STOP' (no "F", "B", "S")? no.

¿Por qué todos los movimientos motores son valores negativos?

Porque he girado la rueda en sentido contrario

Prueba con números positivos.

Sí, han salido negativos porque la he orientado yo hacia la izquierda, si la giro en sentido horario, salen los números positivos. Pero la cosa del código es que no tenga que moverla yo manualmente, sino con el código implementado. Que la rueda vaya hacia adelante (sentido horario), pare, hacia atrás (sentido antihorario), pare y se repita el proceso.

Ahora funciona.

Captura de pantalla 2024-10-07 a las 20.07.19
Perdona, me había explicado mal antes.
La posición del encoder la saca cada 5s (si no tiene movimientos), si tiene, la saca cuando el motor varíe.

Para que el motor se mueva, tengo que indicarle FORWARD o BACKWARD, seguido de la velocidad que quiero que gire. Y para pararlo, solo tengo que poner STOP.

Me procesa los datos que le introduzco, pero el motor no realiza ninguna variación, está todo el rato parado.

Te pongo la captura para ver si lo puedes entender mejor.

Gracias!

El valor "0" significa "STOP"

Muestre un diagrama de cableado de su proyecto. El código original podría funcionar. ¿Tienes ese código?

Sería así, sin contar el GY-NEO6MV2, que es un módulo GPS

Probablemente la fuente de alimentación.

Cambie el dibujo para mostrar SOLO los dispositivos de su proyecto.

Así es el proyecto.




Esa batería es de 9vdc pero no la corriente (amperios) necesaria. Utilice 6 pilas AA (6 x 1,5 = 9 V CC) que tengan suficiente corriente para mover los motores.

Pero si en el código quito la parte de que me saque la posición del encoder, y solo se queda el movimiento del motor, sí me funciona, pero ambas cosas juntas no.

El problema creo que está en el código.

Gracias!

Entiendo.

Pruebe un ejemplo de la biblioteca.

Vale, probaré y te digo.

Muchas gracias!

Es la misma librería que utilizo en mi código.