Código de búsqueda

Lección 102: Usando ZK-5DA para controlar dos motores de CC de 4A.

Lección 102: Usando ZK-5DA para controlar dos motores de CC de 4A.

En este tutorial, exploraremos cómo usar el módulo controlador de motor ZK-5DA para controlar dos motores de corriente continua de 4A. Este módulo se basa en el chip TA6586, que ofrece un control eficiente del motor con bajo voltaje de caída y disipación de calor. Al final de este tutorial, podrás iniciar, detener y controlar la velocidad de los motores de manera efectiva. Para una mayor aclaración, asegúrate de ver el video en (en el video a :55).

Hardware explicado

El componente principal de este proyecto es el módulo controlador de motor ZK-5DA. Utiliza el chip TA6586, que permite el control eficiente de dos motores de corriente continua. Este chip está diseñado para manejar hasta 4A de corriente por motor, manteniendo una baja caída de tensión, lo que ayuda a reducir la generación de calor durante el funcionamiento.

Además del controlador de motor, necesitarás una placa Arduino para enviar señales de control al módulo. El Arduino definirá la dirección y velocidad de los motores utilizando señales PWM (Modulación por Ancho de Pulsos). Conectar los motores a los terminales apropiados en el módulo del controlador permite el control direccional y ajustes de velocidad.

Detalles de la hoja de datos

FabricanteRZ Semiconductor
Número de parteTA6586
Tensión de operación3-14 V
Corriente máxima9 A
Corriente continua5 A
Corriente en espera< 2 µA
Caída de tensión400 mV a 4 A
Rango de temperatura-25 a 85 °C
PaquetePaquete IC estándar
Notas / variantesApagado térmico, protección contra sobrecorriente

  • Asegure una adecuada disipación de calor para un funcionamiento continuo por encima de 3 A.
  • Utiliza pines habilitados para PWM para el control de velocidad.
  • Verifique las clasificaciones de voltaje antes de conectar los motores.
  • Presta atención a la polaridad del cableado para evitar daños en el motor.
  • Monitore la temperatura durante la operación para prevenir el sobrecalentamiento.

Instrucciones de cableado

ZK-5AD_TA6586_wiring-_mor_tan_5V

Para cablear el módulo controlador de motor ZK-5DA, comienza conectando la fuente de alimentación. Conecta el terminal positivo de tu fuente de poder al terminal '+' en el controlador de motor y el terminal negativo al terminal '-'. Los dos motores se conectarán a los terminales de salida, que están etiquetados para mayor claridad.

Para las conexiones de Arduino, utiliza los pines habilitados para PWM: conecta el pin3al pin de control para el motor 1, y pin5al segundo pin de control para el motor 1. De manera similar, conecta el pin6al pin de control para el motor 2, y el pin9al segundo pin de control para el motor 2. Finalmente, asegúrate de que todas las tierras estén conectadas entre sí.

Ejemplos de Código y Guía Paso a Paso

El código comienza definiendo los pines relevantes e inicializando el monitor serial para depuración. Las funciones de control del motor, comoM1yM2, manejar las direcciones y velocidades del motor.

const int D0=9; // Motor 1 PWM pin
const int D1=6; // Motor 1 direction pin
const int D2=5; // Motor 2 PWM pin
const int D3=3; // Motor 2 direction pin

Aquí, los pines están configurados para controlar los motores utilizando señales PWM. ElsetupLa función inicializa estos pines como salidas.

void loop() {
  M2(CW, 80); // Motor 2 runs clockwise at 80% speed
  delay(3000); // Wait for 3 seconds
  brake(2); // Apply brake to motor 2
  delay(1000); 
}

Este extracto muestra el bucle principal del programa, donde el motor 2 se programa para girar en el sentido de las agujas del reloj al 80% de la velocidad durante 3 segundos antes de aplicar el freno.brakela función detiene el motor cuando se llama.

void M1(bool direction, int speed) {
  int pwm = map(speed, 0, 100, 0, 255); // Map speed to PWM range
  if (direction == CW) {
    analogWrite(D0, pwm);
    analogWrite(D1, LOW);
  } else {
    analogWrite(D1, pwm);
    analogWrite(D0, LOW);
  }
}

ElM1La función toma la dirección y la velocidad como entradas, mapea la velocidad a un valor de PWM y establece los pines apropiados para controlar la dirección de rotación del motor. EldebugPrintse llama a la función para mostrar el estado actual en el monitor serial.

Para el código completo, recuerda revisar debajo del artículo (en el video a las 08:55).

Demostración / Qué Esperar

Al ejecutar el código, espera que los motores comiencen a girar en las direcciones especificadas a las velocidades establecidas. El código incluye frenado y ajustes de velocidad, lo que permite un control dinámico. Si los motores no responden como se esperaba, verifica tus conexiones de cableado y asegúrate de que los pines correctos estén configurados en el código. Además, ten cuidado con el sobrecalentamiento, especialmente al dibujar corrientes altas, como se indicó durante la prueba (en el video a las 23:23).

Tiempos de video

  • 00:00 Introducción
  • 03:16 Hoja de datos vista
  • 06:34 Explicación del cableado
  • 08:55 Código Explicado
  • 14:28 Demostración: Control del Motor
  • 17:22 Demostración: Prueba de corriente máxima
  • Prueba de caída de voltaje a 3A, 4A y 5A
  • 26:28 Observaciones finales

Imágenes

TA6586_ZK5Ad_image
TA6586_ZK5Ad_image
ZK-5AD_TA6586_wiring-_mor_tan_5V
ZK-5AD_TA6586_wiring-_mor_tan_5V
power_adapter
power_adapter
408-Lesson 102: Using ZK-5DA to control two DC motors, each 4A
Idioma: C++
/*
 * Lesson 102: Using ZK-5DA to control 2 DC motors, each 4A
 * 
 * Full video details: https://youtu.be/W_Wm28nQAYA
 * Video timing:
00:00 Introduction
03:16 Datasheet viewed
06:34 Wiring explained
08:55 Code explained
14:28 Demonstration: Motor control
17:22 Demonstration: Maximum current test
23:23 Voltage drop test at 3A, 4A, and 5A
26:28 Conclusion remarks

 * Written by Ahmad Shamshiri for Arduino Step by Step Course by Robojax
 * www.Robojax.com
 * on Mar 22, 2022 

 * 
 * This code is part of Arduino Step by Step Course which starts here:  https://youtu.be/-6qSrDUA5a8
 * 
 * For the library for this code, visit http://robojax.com/
 * 
If you found this tutorial helpful, please support me so I can continue creating 
content like this. Make a donation using PayPal or a credit card: https://bit.ly/donate-robojax 
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

 
 //all pins must be PWM enabled pins with ~ printed beside them
const int D0=9;//~
const int D1=6;
const int D2=5;
const int D3=3;

bool CW = true;
bool CCW = false;


bool debug = false;

void setup() {
  Serial.begin(9600);
  Serial.println("Robojax TA6586 Motor Control");
 pinMode(D0, OUTPUT);
 pinMode(D1, OUTPUT);
 pinMode(D2, OUTPUT);
 pinMode(D3, OUTPUT);  
 
 
}

void loop() {
  // * Full video details: https://youtu.be/W_Wm28nQAYA
  M2(CW, 80);//motor 1 runs CW at 80% speed
  M1(CW, 100); //motor 1 runs CW at 100% speed
  delay(3000);//wait for 3 seconds
  brake (2);//apply brake to motor 2
  delay(1000);  
  
  M2(CCW, 60);//motor 2 runs CCW at 60% speed
  delay(3000);//wait for 3 seconds
  brake (2);//apply brake to motor 2
  brake (1);//apply brake to motor 1
  delay(3000);//wait for 3 seconds
  for(int i=0; i<=100; i++)
  {
    M1(CCW, i);//run motor 1 to CCW direction with i% speed
    delay(100);
  }
  delay(2000);
  brake (2);//apply brake to motor 2
  delay(3000); delay(3000);//wait for 3 seconds}
}//loop ends

/*
 *  M1(bool direction,int speed)
 * @brief runs motor 1 
 * @param direction is CW or CCW, 
 * @param speed is an integer between 0 to 100

 * @return returns none
 * Written by Ahmad Shamshiri for robojax.com
 * on Mar 22, 2022 
 * Full video details: https://youtu.be/W_Wm28nQAYA
 */
void M1(bool direction,int speed)
{
  int pwm=map(speed, 0, 100, 0, 255);
  if(direction == CW)
  {
   analogWrite(D0,pwm);
   analogWrite(D1,LOW);   
  }else{
   analogWrite(D1,pwm);
   analogWrite(D0,LOW);     
  }
  debugPrint(1, direction, speed, false); 
}//M1 end


/*
 *  M2(bool direction,int speed)
 * @brief runs motor 2 
 * @param direction is CW or CCW, 
 * @param speed is an integer between 0 to 100

 * @return returns none
 * Written by Ahmad Shamshiri for robojax.com
 * on Mar 22, 2022 
 * Full video details: https://youtu.be/W_Wm28nQAYA
 */
void M2(bool direction,int speed)
{
  int pwm=map(speed, 0, 100, 0, 255);
  if(direction == CW)
  {
   analogWrite(D2,pwm);
   analogWrite(D3,LOW);   
  }else{
   analogWrite(D3,pwm);
   analogWrite(D2,LOW);     
  } 
  debugPrint(2, direction, speed, false);    
}//M2 ends


/*
 *  brake(int motor)
 * @brief applies brake to a motor
 * @param motor is an integer (1 or 2)

 * @return returns none
 * Written by Ahmad Shamshiri for robojax.com
 * on Mar 22, 2022 
 * Full video details: https://youtu.be/W_Wm28nQAYA
 */
void brake(int motor)
{
   if(motor == 1)
  {
   analogWrite(D0,HIGH);
   analogWrite(D1,HIGH);   
  }else{
   analogWrite(D2,HIGH);
   analogWrite(D3,HIGH);     
  }
  debugPrint(motor, true,  0, true);  
}//brake ends


/*
 * debugPrint(int motor, bool direction, int speed, bool stop)
 * @brief prints debugging information
 * @param motor is an integer (1 or 2)
 * @param direction is CW or CCW
 * @param speed is an integer from 0 to 100
 * @param stop is true or false; if true, the word "stop" is printed

 * @return returns none
 * Written by Ahmad Shamshiri for robojax.com
 * on Mar 22, 2022 
 * Full video details: https://youtu.be/W_Wm28nQAYA
 */
void debugPrint(int motor, bool direction, int speed, bool stop)
{
  if(debug)
  {
      Serial.print("Motor: ");
      Serial.print(motor);
    if(stop && motor>0)
    {
      Serial.println(" Stopped");
    }else{
      if(direction)
      {
      Serial.print(" CW at ");
      }else{
       Serial.print(" CCW at ");     
      }
      Serial.print(speed);       
      Serial.println(" %");    
    }
  }//debug
  
}

//not used but can be used to apply brake on both motors
void fullBrake()
{
 brake(1);
 brake(2); 

}

Cosas que podrías necesitar

Recursos y referencias

Archivos📁

Hoja de datos (pdf)