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
| Fabricante | RZ Semicondutores |
|---|---|
| Número da peça | TA6586 |
| Tensão de operação | 3-14 V |
| Corrente de pico | 9 A |
| Corrente contínua | 5 A |
| Corrente de espera | < 2 µA |
| Queda de tensão | 400 mV a 4 A |
| Faixa de temperatura | -25 a 85 °C |
| Pacote | Pacote IC padrão |
| Notas / variantes | Desligamento 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

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
/*
* 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
-
AliExpressCompre ZK-5DA no AliExpresss.click.aliexpress.com
Recursos e referências
-
ExternoCompre o ZK-5DA na Amazon UKamzn.to
-
Externo
-
ExternoCompre ZK-5DA na Amazon Canadáamzn.to
-
ExternoCompre ZK-5DA na Amazon, EUA.amzn.to
-
ExternoCompre ZK-5DA no AliExpresss.click.aliexpress.com
Arquivos📁
Folha de dados (pdf)
-
TA6586 motor Driver datasheet
TA6586_motor_Driver_datasheet.pdf0.22 MB