Código de Pesquisa

Lição 102: Usando ZK-5DA para Controlar Dois Motores CC de 4A

Lição 102: Usando ZK-5DA para Controlar Dois Motores CC de 4A

Neste tutorial, exploraremos como usar o módulo controlador de motor ZK-5DA para controlar dois motores CC de 4A. Este módulo é baseado no chip TA6586, que oferece controle de motor eficiente com baixa queda de tensão e dissipação de calor. Ao final deste tutorial, você será capaz de iniciar, parar e controlar efetivamente a velocidade dos motores. Para uma maior clareza, certifique-se de conferir o vídeo (no vídeo às 08:55).

Hardware Explicado

O componente principal deste projeto é o módulo driver de motor ZK-5DA. Ele utiliza o chip TA6586, que permite o controle eficiente de dois motores de corrente contínua. Esse chip é projetado para suportar até 4A de corrente por motor, mantendo uma baixa queda de tensão, o que ajuda a reduzir a geração de calor durante a operação.

Além do driver de motor, você precisará de uma placa Arduino para enviar sinais de controle ao módulo. O Arduino definirá a direção e a velocidade dos motores usando sinais PWM (Modulação por Largura de Pulso). Conectar os motores aos terminais apropriados no módulo do driver permite controle direcional e ajustes de velocidade.

Detalhes da Ficha Técnica

FabricanteRZ Semicondutores
Número da peçaTA6586
Tensão de operação3-14 V
Corrente de pico9 A
Corrente contínua5 A
Corrente de espera< 2 µA
Queda de tensão400 mV a 4 A
Faixa de temperatura-25 a 85 °C
PacotePacote IC padrão
Notas / variantesDesligamento térmico, proteção contra sobrecorrente

  • Garanta a dissipação adequada de calor para operação contínua acima de 3 A.
  • Use pinos habilitados para PWM para controle de velocidade.
  • Verifique as classificações de voltagem antes de conectar os motores.
  • Preste atenção à polaridade da fiação para evitar danos ao motor.
  • Monitore a temperatura durante a operação para evitar o superaquecimento.

Instruções de fiação

ZK-5AD_TA6586_wiring-_mor_tan_5V

Para conectar o módulo driver de motor ZK-5DA, comece ligando a fonte de alimentação. Conecte o terminal positivo da sua fonte ao terminal '+' do driver de motor e o terminal negativo ao terminal '-'. Os dois motores serão conectados aos terminais de saída, que estão rotulados para clareza.

Para as conexões do Arduino, utilize os pinos com suporte a PWM: conecte o pino3para o pino de controle do motor 1, e pino5ao segundo pino de controle para o motor 1. Da mesma forma, conecte o pino6para o pino de controle do motor 2, e pino9para o segundo pino de controle do motor 2. Por fim, assegure-se de que todos os aterramentos estejam conectados.

Exemplos de Código e Tutorial

O código começa definindo os pinos relevantes e inicializando o monitor serial para depuração. As funções de controle do motor, comoM1eM2, lidar com as direções e velocidades do 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

Aqui, os pinos estão configurados para controlar os motores usando sinais PWM. Osetupa função inicializa esses pinos como saídas.

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 trecho mostra o loop principal do programa, onde o motor 2 é configurado para funcionar no sentido horário a 80% da velocidade por 3 segundos antes de aplicar o freio. Obrakea função para o motor quando chamada.

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);
  }
}

OM1função recebe a direção e a velocidade como entradas, mapeia a velocidade para um valor PWM e define os pinos apropriados para controlar a direção de rotação do motor. OdebugPrinta função é chamada para mostrar o estado atual no monitor serial.

Para o código completo, lembre-se de verificar abaixo do artigo (no vídeo às 08:55).

Demonstração / O que Esperar

Ao executar o código, espere que os motores comecem a girar nas direções especificadas nas velocidades definidas. O código inclui frenagem e ajustes de velocidade, permitindo um controle dinâmico. Se os motores não responderem como esperado, verifique suas conexões de fiação e assegure-se de que os pinos corretos estão configurados no código. Além disso, tenha cuidado com o superaquecimento, especialmente ao consumir correntes altas, conforme indicado durante o teste (no vídeo às 23:23).

Marcos de Vídeo

  • 00:00 Introdução
  • 03:16 Folha de dados visualizada
  • 06:34 Explicação da Fiação
  • 08:55 Código Explicado
  • 14:28 Demonstração: Controle Motor
  • 17:22 Demonstração: Teste de corrente máxima
  • Teste de Queda de Tensão a 3A, 4A e 5A
  • 26:28 Considerações finais

Imagens

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); 

}

Coisas que você pode precisar

Recursos e referências

Arquivos📁

Folha de dados (pdf)