Problema con el MONSTER MOTO SHIELD VNH2SP30

Hola,

Tengo dos Shields MONSTER MOTO (VNH2SP30) y los dos no funcionan correctamente,
Estos Shields tienen para controlar dos motores y hacerlos girar al sentido de reloj y contrareloj.
He realizado la conexión y he probado muchos códigos de Arduino, pero el problema persiste (en los dos Shields).

Son dos problemas principalmente:

-Al hacer andar el primer motor todo bien, me gira hacia los dos lados, hasta que activo el segundo motor y solo me gira hacia un lado y el otro lado no se activa.

-Y segundo, Cuando hago el giro de un motor y luego hacia el otro lado hay una perdida de voltaje considerable, por lo tanto el motor gira bien hacia un lado, pero mas lento hacia el otro, tiene una perdida de 2V aprox.

Si alguien pudiera ayudarme se lo agradecería mucho.

Trata de aportar información pq de lo contrario no podremos sugerir mucho.

Me comprendes? Lee tu mensaje y dime cómo crees que alguien que no tiene tu SHIELD pueda colaborar contigo?

Necesito, código, esquema de conexión aunque sea obvio, tutorial que has usado, de donde bajaste las librerías, todo lo que nos permita entender el contexto de tu problema

Ahora lee las normas, y usa las etiquetas. No sabes de qué hablo, mira otros hilos y verás como se postean enlaces, imagenes, códigos.

Hola,

Tengo dos Shields MONSTER MOTO (VNH2SP30) y los dos no funcionan correctamente,
Estos Shields tienen para controlar dos motores y hacerlos girar al sentido de reloj y contrareloj.
He realizado la conexión y he probado muchos códigos de Arduino, pero el problema persiste (en los dos Shields).

La conexion es la siguiente,
monster moto.jpg

Pines 5 y 6 son PWM.
Pines 4 y 9 controlan el giro del primer motor.
Pines 7 y 8 controlan el giro del segundo motor.

Este es el producto MONSTER MOTO de Sparkfun. En documents esta la informacion del Shield.

Son dos problemas principalmente:

-Al hacer andar el primer motor todo bien, me gira hacia los dos lados, hasta que activo el segundo motor y solo me gira hacia un lado y el otro lado no se activa.

-Y segundo, Cuando hago el giro de un motor y luego hacia el otro lado hay una perdida de voltaje considerable, por lo tanto el motor gira bien hacia un lado, pero mas lento hacia el otro, tiene una perdida de 2V aprox.

Uno de los códigos que utilicé:

void setup() 
{
for (int j=4;j<=9;j++)
{
pinMode(j,1);
}
digitalWrite(4,0);
digitalWrite(7,0);
digitalWrite(8,0);
digitalWrite(9,0);

}

void loop() {
// Cambia polaridad en el primer motor cambiando el 0 y 1
digitalWrite(7,0); 
digitalWrite(8,1);
// Cambia polaridad en el segundo motor cambiando el 0 y 1
digitalWrite(4,1);
digitalWrite(9,0);

analogWrite(5,255);
analogWrite(6,255);

}

Y el segundo código:

#define BRAKE 0
#define CW    1
#define CCW   2
#define CS_THRESHOLD 15   // Definition of safety current (Check: "1.3 Monster Shield Example").

//MOTOR 1
#define MOTOR_A1_PIN 7
#define MOTOR_B1_PIN 8

//MOTOR 2
#define MOTOR_A2_PIN 4
#define MOTOR_B2_PIN 9

#define PWM_MOTOR_1 5
#define PWM_MOTOR_2 6

#define CURRENT_SEN_1 A2
#define CURRENT_SEN_2 A3

#define EN_PIN_1 A0
#define EN_PIN_2 A1

#define MOTOR_1 0
#define MOTOR_2 1

short usSpeed = 150;  //default motor speed
unsigned short usMotor_Status = BRAKE;
 
void setup()                         
{
  pinMode(MOTOR_A1_PIN, OUTPUT);
  pinMode(MOTOR_B1_PIN, OUTPUT);

  pinMode(MOTOR_A2_PIN, OUTPUT);
  pinMode(MOTOR_B2_PIN, OUTPUT);

  pinMode(PWM_MOTOR_1, OUTPUT);
  pinMode(PWM_MOTOR_2, OUTPUT);

  pinMode(CURRENT_SEN_1, OUTPUT);
  pinMode(CURRENT_SEN_2, OUTPUT);  

  pinMode(EN_PIN_1, OUTPUT);
  pinMode(EN_PIN_2, OUTPUT);

  Serial.begin(9600);              // Initiates the serial to do the monitoring 
  Serial.println("Begin motor control");
  Serial.println(); //Print function list for user selection
  Serial.println("Enter number for control option:");
  Serial.println("1. STOP");
  Serial.println("2. FORWARD");
  Serial.println("3. REVERSE");
  Serial.println("4. READ CURRENT");
  Serial.println("+. INCREASE SPEED");
  Serial.println("-. DECREASE SPEED");
  Serial.println();

}

void loop() 
{
  char user_input;   

  
  
  while(Serial.available())
  {
    user_input = Serial.read(); //Read user input and trigger appropriate function
    digitalWrite(EN_PIN_1, HIGH);
    digitalWrite(EN_PIN_2, HIGH); 
     
    if (user_input =='1')
    {
       Stop();
    }
    else if(user_input =='2')
    {
      Forward();
    }
    else if(user_input =='3')
    {
      Reverse();
    }
    else if(user_input =='+')
    {
      IncreaseSpeed();
    }
    else if(user_input =='-')
    {
      DecreaseSpeed();
    }
    else
    {
      Serial.println("Invalid option entered.");
    }
      
  }
}

void Stop()
{
  Serial.println("Stop");
  usMotor_Status = BRAKE;
  motorGo(MOTOR_1, usMotor_Status, 0);
  motorGo(MOTOR_2, usMotor_Status, 0);
}

void Forward()
{
  Serial.println("Forward");
  usMotor_Status = CW;
  motorGo(MOTOR_1, usMotor_Status, usSpeed);
  motorGo(MOTOR_2, usMotor_Status, usSpeed);
}

void Reverse()
{
  Serial.println("Reverse");
  usMotor_Status = CCW;
  motorGo(MOTOR_1, usMotor_Status, usSpeed);
  motorGo(MOTOR_2, usMotor_Status, usSpeed);
}

void IncreaseSpeed()
{
  usSpeed = usSpeed + 10;
  if(usSpeed > 255)
  {
    usSpeed = 255;  
  }
  
  Serial.print("Speed +: ");
  Serial.println(usSpeed);

  motorGo(MOTOR_1, usMotor_Status, usSpeed);
  motorGo(MOTOR_2, usMotor_Status, usSpeed);  
}

void DecreaseSpeed()
{
  usSpeed = usSpeed - 10;
  if(usSpeed < 0)
  {
    usSpeed = 0;  
  }
  
  Serial.print("Speed -: ");
  Serial.println(usSpeed);

  motorGo(MOTOR_1, usMotor_Status, usSpeed);
  motorGo(MOTOR_2, usMotor_Status, usSpeed);  
}

void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)         //Function that controls the variables: motor(0 ou 1), direction (cw ou ccw) e pwm (entra 0 e 255);
{
  if(motor == MOTOR_1)
  {
    if(direct == CW)
    {
      digitalWrite(MOTOR_A1_PIN, LOW); 
      digitalWrite(MOTOR_B1_PIN, HIGH);
    }
    else if(direct == CCW)
    {
      digitalWrite(MOTOR_A1_PIN, HIGH);
      digitalWrite(MOTOR_B1_PIN, LOW);      
    }
    else
    {
      digitalWrite(MOTOR_A1_PIN, LOW);
      digitalWrite(MOTOR_B1_PIN, LOW);            
    }
    
    analogWrite(PWM_MOTOR_1, pwm); 
  }
  else if(motor == MOTOR_2)
  {
    if(direct == CW)
    {
      digitalWrite(MOTOR_A2_PIN, LOW);
      digitalWrite(MOTOR_B2_PIN, HIGH);
    }
    else if(direct == CCW)
    {
      digitalWrite(MOTOR_A2_PIN, HIGH);
      digitalWrite(MOTOR_B2_PIN, LOW);      
    }
    else
    {
      digitalWrite(MOTOR_A2_PIN, LOW);
      digitalWrite(MOTOR_B2_PIN, LOW);            
    }
    
    analogWrite(PWM_MOTOR_2, pwm);
  }
}

Realmente descarto que sea problema del código porque me ha funcionado de igual manera el driver con distintos sketches.

Si alguien pudiera ayudarme se lo agradecería mucho.

monster moto.jpg

Porque dos hilos con el mismo tema?
Eso es doble post y genera que uno de los dos sea cerrado.
Resultó que no editaste el primero como te solicité y en su lugar abriste uno con la intención de agregar la información, asi que junté ambos para que quede mas claro, la explicación inicial del primero y la información e imágenes del segundo

Ya muchas gracias.
Espero encontrar la solución.
He visto videos de gente utilizando este aparato y les funciona correctamente.

Un motor funciona OK, por que? porque tiene la corriente suficiente. Con que lo alimentas?
Danos datos de la fuente, Tensión y corriente
También de los motores que usas.

Porque tienes el #define CS_THRESHOLD 15 tan bajo?

En el ejemplo habla de 100

Bueno lo del motor fue para poder explicarlo mejor, pero solo uso un motor y lo pruebo en las 2 salidas.
Después de eso solo empece a medir con el tester sin conectar el motor en las salidas, ademas, tiene 4 leds que indican a que dirección gira el motor y con eso también puedo darme cuenta que en una salida del motor solo gira hacia un lado y la otra salida si puede hacerse girar hacia los dos lados.
Lo al principio lo alimente con 6V y despues probe con 12V ya que este aguanta hasta 16V.

Cuando lo alimente a 12 V la salida que gira a los dos lados tiene un voltaje de 12V y en la otra direccion el voltaje es de 8V.

Utilice un motorreductor de 12V de 60 RPM.

Y no conozco mucho de programacion de Arduino, como dije los codigos los saque de internet.

Si los códigos los sacas de internet pero yo saco ese CS_THRESHOLD del ejemplo que tu pusiste.
Probaste el ejemplo de la página que tu pusiste?
La prueba debe ser con dos motores.
Si no circula corriente por el 2do motor no se hasta que punto lo que haces vale como una respuesta viable. Si no hay motor no hay corriente, un Tester no es carga, es de alta impedancia asi que no cargas para nada el segundo Puente H.

Pero tiene las luces del Shield que indican el Voltaje.
Aun asi probe con los dos motores y el problema persiste.
He probado muchos codigos incluyendo el de la pagina e incluso los he modificado y nada.

Descubri que la baja de voltaje es porque en un polo del motor quedan 4V y en el otro polo 12V y que por eso anda lento en una direccion, y tambien que el conector B1 del shield (correspondiente al pin 8 del Arduino) se queda pegado en 12V y que por eso no hace el giro hacia la otra direccion.

Ahora no se porque ocurre tal problema.

Saludos amigo... Me paso exactamente lo mismo. Lleve el modulo a cambiar y elque me dieron tenia CASI el mismo inconveniente. Son los modulos. No es de programa el problema. Compre otros modulos (los simples) y se acabo el problema.

Hola Hellsing, pudiste solucionarlo o hiciste como dice Ariel y cambiaste el shield?, use el mismo código que vos y probé con otros y veo el mismo Problema...

Gracias,

Hilo del 2017. Hilo cerrado. Lee las normas del foro y crea un hilo nuevo con tu consulta.
Esta persona no respondió mas desde entonces como el 95% de la gente que llega al foro.