Motores 28byj-48 casi sin torque

Hola a todos.

Quiero utilizar dos de estos motores para mover un pequeño tripode desde un controlador de PS4. El tema de la conexion por bluetooh funciona perfectamente, consigo mover los motores con los joystick del mando de PS4 , lo malo es que se mueven casi sin fuerza, si agarro con los dedos, paro el giro del motor sin hacer nada de fuerza.

Se que no se le puede exigir mucho a estos motores, pero los he utilizado en otras ocasiones y recuerdo que es posible hacer que tengan mas torque segun el codigo que se utilice.

Este es el codigo que estoy haciendo (pongo solo la parte de los motores para que sea mas entendible):

float izqVel, derVel;

#define motorPin1  2
#define motorPin2  3
#define motorPin3  4
#define motorPin4  5

#define motorPin5  6
#define motorPin6  7
#define motorPin7  8
#define motorPin8  10

#define HALFSTEP 8

AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(HALFSTEP, motorPin5, motorPin7, motorPin6, motorPin8);

void setup() {
  stepper1.setMaxSpeed(400.0);
  stepper1.setAcceleration(100.0);
  stepper1.setSpeed(0);
  stepper2.setMaxSpeed(400.0);
  stepper2.setAcceleration(100.0);
  stepper2.setSpeed(0);
}

void loop() {

    //Recibe los valores del jostick derecho
     int val2 = PS4.getAnalogHat(RightHatY);
    derVel = map(val2, 0, 255, -400, 400);
    stepper2.setSpeed(derVel);
    stepper2.runSpeed();
  

    //Recibe los valores del jostick izquierdo
    int val1 = PS4.getAnalogHat(LeftHatX);
    izqVel = map(val1, 0, 255, -400, 400);
    stepper1.setSpeed(izqVel);
    stepper1.runSpeed();
 }
   

Para la alimentacion estoy utilizando una fuente de alimentacion externa de 5v 3a, por lo que no creo que sea falta de corriente..

La fuente es de 5A 3A pero no dices como esta todo cableado?
Puedes poner un esquema?

Moderador:
Por cierto si hablas de Torque como posteas en Software?
Movido a Hardware

Finalmente descarte los motores 28byj-48 ya que no tienen la suficiente fuerza para este proyecto. Ahora estoy utuizando unos motores NEMA 17 de 1,2A, pero despues de montar todo me ha surgido un problema que no se resolver, llevo toda la tarde probando distintas velocidades y configuraciones de micropasos pero no consigo que los motores giren con movimientos fluidos.

Pongo estos dos gif animados para que se entienda lo que digo:

Como se puede apreciar, los movimientos son como a golpes tanto en el eje Y como en el X.

Estoy utlizando dos de estos modulos con drivers DRV8825:

He regulado el voltaje de referencia en 0.6 que es lo que necesito para motores de 1,2A y lo he configurado para obtener 32 micropasos poniendo en "ON" MS1, MS2 Y MS3.

Tambien utilizo dos de estos modulos para convertir de 12 a 5 voltios para la alimentacion de Arduino y la parte logica de los drivers:

Este es el codigo completo que estoy utilizando:

#include <PS4BT.h>
#include <usbhub.h>
#include <AccelStepper.h>
#include <Wire.h>

#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif

USB Usb;
BTD Btd(&Usb);
PS4BT PS4(&Btd, PAIR);

#define StepVertDir 2
#define StepVertPul 3

#define StepHorDir 4
#define StepHorPul 5

AccelStepper StepVert(AccelStepper::DRIVER, StepVertPul, StepVertDir);
AccelStepper StepHor(AccelStepper::DRIVER, StepHorPul, StepHorDir);

#define MaxSpeedGlobal 300
float ActualSpeed = 70;
#define MinSpeed 0

int MovVert, MovHor;
float VertSpeed, HorSpeed;
float VertAuto, HorAuto;

bool ModoRapido = false;
bool ModoLuna = false;


void setup() {

  Serial.begin(115200);
#if !defined(__MIPSEL__)
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
  if (Usb.Init() == -1) {
    //Serial.print(F("\r\nOSC did not start"));
    while (1); // Halt
  }
  //Serial.print(F("Conectado a Arduino!"));

  StepVert.setMaxSpeed(MaxSpeedGlobal);
  StepVert.setAcceleration(10.0);
  StepVert.setMinPulseWidth(10.0);
  StepVert.setSpeed(MinSpeed); // lo pongo a 0

  StepHor.setMaxSpeed(MaxSpeedGlobal);
  StepHor.setAcceleration(10.0);
  StepHor.setMinPulseWidth(10.0);
  StepHor.setSpeed(MinSpeed); // lo pongo a 0

}

void loop() {

  Usb.Task();

  if (PS4.connected()) {
    //if (!autoMode) {

    //Recibe los valores del jostick derecho (movimiento vertical)
    MovVert = PS4.getAnalogHat(RightHatY);
    VertSpeed = map(MovVert, 0, 255, ActualSpeed, -ActualSpeed);
    if (ModoLuna) {
      StepVert.setSpeed(VertAuto);
      StepVert.runSpeed();
    } else {
      if (MovVert > 140 || MovVert < 110) {
        StepVert.setSpeed(VertSpeed);
        StepVert.runSpeed();
      }
    }

    //Recibe los valores del jostick izquierdo (movimiento horizontal)
    MovHor = PS4.getAnalogHat(LeftHatX);
    HorSpeed = map(MovHor, 0, 255, -ActualSpeed, ActualSpeed);
    if (ModoLuna) {
      StepHor.setSpeed(HorAuto);
      StepHor.runSpeed();
    } else {
      if (MovHor > 140 || MovHor < 110) {
        StepHor.setSpeed(HorSpeed);
        StepHor.runSpeed();
      }
    }

    //}
  }


  //Funcion para activar o desactivar el modo Luna
  if (PS4.getButtonClick(L1)) {
    if (!ModoLuna) {
      ModoLuna = true;
      VertAuto = VertSpeed;
      HorAuto = HorSpeed;
    } else {
      ModoLuna = false;
    }
  }



  //Aumenta o disminuye la velocidad general
  if (PS4.getButtonClick(R1)) {
    if (!ModoRapido) {
      ModoRapido = true;
      ActualSpeed = float(300);
    } else {
      ActualSpeed = float(70);
      ModoRapido = false;
    }
  }

  //Serial.println(ActualSpeed);


  //Desactiva la conexion con el mando
  if (PS4.getButtonClick(PS)) {
    PS4.disconnect();
  }

}

Y este es el esquema, espero que se entienda bien, no se hacerlo de otra forma (no pongo los cables de los motores ya que es obvio donde van y se liaria mucho el esquema):

La fuente de alimentecion es de 12v 100w, mas que suficiente para este proyecto. Y los rodamientos y alineaciones no son el problema, esta todo bien alineado ya que manualmente se mueven bien los ejes y esta bien equilibrado ya que puse una contrapesa. Y por supuesto los motores estan bien conectados, 1A y 1B a un bobinado y 2A y 2B al otro bobinado.. No se, llevo bastante tiempo trasteando con motores paso a paso, arduino y demas y nunca me habia pasado esto..

A ver si alguien sabe cual es el problema...

Un saludo!

Los drivers estan bien ajustados, da la impresion que te estan limitando por corriente.

Puede ser que el vref no este bien ajustado y por eso dan esos saltos los motores? donde los compre (Amazon) pone que son de 1,2A, pero mirando en otras webs, en unos sitios pone que son de 1,5 e incluso en otros sitios de 1,7A. Como puedo saber de cuantos amperios son los motores realmente?

Son el siguiente modelo: 17hd34008-22b

La mayoría dice 1.5 A.
Tu Driver DRV8825
Segun Luis Llamas con 0.6V obtines un limite de 1.2A
DRV8825 RS = 100 I_max = 2 * V_ref
tendrias una corriente de 1.2A o sea no toda la que pide el motor.
Debería ser 0.75V la Vref.
Prueba a ver si eso es lo que genera el problema.

Gracias por tu ayuda Surbyte.

He regulado el Vref a 0.750 pero sigue igual. He cambiado los DRV8825 por otros iguales por si es que estaban rotos o algo raro pero hacia lo mismo, asi que he probado con dos driver TB6600 y ha funcionado perfectamente a la primera, ahora los movimientos son fluidos incluso a la minima velocidad..

Conclusion: los DRV8825 son basura!

Dejo unas fotos del tripode ya terminado:

Un saludo!

Si era un problema de corriente y evidentemente el DRV8825 esta al limite.
Pero debe haber alguna otra cosa que se nos escapa. Tienen que funcionar bien aún a 1.5A de fase.

No que va, no estaba al limite ni mucho menos. Los DRV8825 soportan hasta 2.5A con disipador como era mi caso, aun faltaba 1 A para llegar al limite..

El caso es que en las pruebas que estuve haciendo, cambie "float ActualSpeed = 70;" y lo puse a 500 y parecia funcionar bien a media y alta velocidad, pero es a bajas revoluciones cuando hacia ese comportamiento erratico. Parece que este driver no gestiona bien los pulsos a bajas revoluciones.

Ahh eso no lo habías comentado.

Cierto, fueron muchas cosas las que probe y se me paso por alto..

Ahora me ha surgido otro problema. Para accionar algunas funciones del visor nocturno que se ve en las fotos anteriores, si voy a utilizar dos motores 28byj-48 ya que pulsar esos botones no requieren casi fuerza..

Necesito que se muevan dos motores a la vez, pero no lo consigo, primero se mueve uno y cuando termina el movimiento, se mueve el otro.

Este es el codigo que estoy utilizando:

unsigned long interval = 500UL;
unsigned long previousMillis = 0;
unsigned long currentMillis = 0;

void loop() {

  unsigned long currentMillis = millis();

  //Inicia o detiene la grabacion
  if (PS4.getButtonClick(CROSS)) {

    if ((unsigned long)(currentMillis - previousMillis) >= interval) {

      StepGrabacionBusc.setSpeed(500);
      StepGrabacionBusc.setCurrentPosition(0);
      StepGrabacionBusc.runToNewPosition(500);

      StepGrabacionTeles.setSpeed(500);
      StepGrabacionTeles.setCurrentPosition(0);
      StepGrabacionTeles.runToNewPosition(500);

      previousMillis = millis();

    }
  }
}

De este hilo sale tu solución.

Mismo problema y solución al mismo.

Gracias surbyte, ya probe ese codigo y otros 50 codigos con mismo resultado, o no se mueven los motores o lo hacen de uno en uno, nunca los dos a la vez, incluso probe con la libreria Multistepper.h y nada. Ya he dejado el tema por imposible. Lo dejare asi, que se mueva primero uno y luego el otro.

Ahora ha surgido otro problema (como no).. cuando lleva un rato encendido el arduino, se bloquea y ya no responde a los botones del mando de ps4, tengo que reiniciar pero al minuto o asi vuelve a colgarse.

En mi proyecto estoy utilizando 2 motores NEMA17 con reductora, 2 driver tb6600, 6 motores 28byj-48 con su correspondiente driver, un Arduino Mega ADK, una fuente de alimentacion de 12v 25A y 4 reguladores de voltaje para pasar de 12v a 5v para alimentar Arduino y los driver de los 28byj-48. Todo funcionan correctamente, pero como digo, llega un momento que Arduino se bloquea y ya no responde a nada. Incluso sin yo tocar nada ni usar ninguna funcion se bloquea al minuto..

Edito:

Si alimento a Arduino por la salida de 5v en vez de por Vin ya no se bloquea.. WTF!!

Alguien sabria decirme el motivo??

Pero probaste el código que esta al final? Ese se supone es la solución. No tengo forma de probarlo.
El TB6600 es este?
image
Si lo es, entonces hay un problema y justamente se debe a que hay que crear una máquina de estados porque este driver requiere que se le envien pulsos constantemente y hasta terminar de hacerlo no completas lo que deseas.

En el código que posteas no hay manejo del TB6600 pero lo que no se si luego lo incorporas a tu sketch y este conspira con lo que pretendes hacer.
Así que resolvamos esto de algún modo.
Si de algo se caracteriza AccelStepper es que permite trabajar con stepper en forma simultánea así que debes buscar donde se comete el error.
Entiendo que el hilo que te propuse resolvió el problema que era de naturaleza similar al tuyo. Dices que no?

La parte de los driver tb6600 con los motores nema 17 funciona perfectamente, controlo los movimientos tanto verticales como horizontales desde los joystick del mando de ps4. Es la parte de los motores 28byj-48 la que me esta dando problemas.

Yo creo que Accelstepper no gestiona igual el codigo dependiendo del tipo de driver. Por ejemplo, para el tb6600 solo se utilizan dos pines, PUL y DIR y se declara asi:

#define StepVertDir  11
#define StepVertPul 10

AccelStepper StepVert(AccelStepper::DRIVER, StepVertPul, StepVertDir);

Pero para los motores 28byj-48 se utilizan 4 pines y se declara asi:

#define motorPin1  22
#define motorPin2  24
#define motorPin3  26
#define motorPin4  28

#define HALFSTEP 8

AccelStepper StepEnfoqueTeles(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);

Entonces por lo que sea, Accelstepper no funciona igual con un metodo que con el otro. Ya te digo que he probado de todas las formas posibles pero no consigo que se muevan al unisono. He estado dos dias probando sin conseguirlo. Y si, probe tambien todos los metodos del hilo que pusiste con resultado negativo.

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