Cerca codice

Lezione 102: Utilizzare ZK-5DA per controllare due motori DC da 4A

Lezione 102: Utilizzare ZK-5DA per controllare due motori DC da 4A

In questo tutorial, esploreremo come utilizzare il modulo driver per motori ZK-5DA per controllare due motori CC da 4A. Questo modulo si basa sul chip TA6586, che offre un controllo efficiente del motore con bassa caduta di tensione e dissipazione di calore. Alla fine di questo tutorial, sarai in grado di avviare, fermare e controllare efficacemente la velocità dei motori. Per ulteriori chiarimenti, assicurati di controllare il video a (nel video alle 08:55).

Hardware Spiegato

Il componente principale di questo progetto è il modulo driver per motori ZK-5DA. Utilizza il chip TA6586, che consente un controllo efficiente di due motori CC. Questo chip è progettato per gestire fino a 4A di corrente per motore, mantenendo una bassa caduta di tensione, il che aiuta a ridurre la generazione di calore durante il funzionamento.

Oltre al driver del motore, avrai bisogno di una scheda Arduino per inviare segnali di controllo al modulo. L'Arduino definirà la direzione e la velocità dei motori utilizzando segnali PWM (Modulazione di Larghezza di Impulso). Collegare i motori ai terminali appropriati sul modulo driver consente il controllo direzionale e le regolazioni di velocità.

Dettagli della scheda tecnica

ProduttoreRZ Semiconductor
Numero di parteTA6586
Tensione di esercizio3-14 V
Corrente di picco9 A
Corrente continua5 A
Corrente di standby< 2 µA
Caduta di tensione400 mV a 4 A
Intervallo di temperatura-25 a 85 °C
PacchettoPacchetto IC standard
Note / variantiArresto termico, protezione da sovracorrente

  • Garantire una corretta dissipazione del calore per un funzionamento continuo sopra i 3 A.
  • Utilizza i pin abilitati PWM per il controllo della velocità.
  • Verificare le classificazioni di tensione prima di collegare i motori.
  • Fai attenzione alla polarità del cablaggio per evitare danni al motore.
  • Monitorare la temperatura durante il funzionamento per prevenire surriscaldamenti.

Istruzioni di cablaggio

ZK-5AD_TA6586_wiring-_mor_tan_5V

Per collegare il modulo driver del motore ZK-5DA, inizia collegando l'alimentatore. Collega il terminale positivo della tua fonte di alimentazione al terminale '+' del driver del motore e il terminale negativo al terminale '-'. I due motori saranno collegati ai terminali di uscita, che sono etichettati per una maggiore chiarezza.

Per le connessioni Arduino, utilizza i pin abilitati PWM: collega il pin3al pin di controllo per il motore 1 e pin5al secondo pin di controllo per il motore 1. Allo stesso modo, collegare il pin6al pin di controllo per il motore 2, e pin9al secondo pin di controllo per il motore 2. Infine, assicurati che tutti i terreni siano collegati tra loro.

Esempi di codice e guida passo passo

Il codice inizia definendo i pin rilevanti e inizializzando il monitor seriale per il debug. Le funzioni di controllo del motore, comeM1eM2, gestire le direzioni e le velocità del motore.

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

Qui, i pin sono configurati per controllare i motori utilizzando segnali PWM. Ilsetupla funzione inizializza questi pin come uscite.

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

Questo estratto mostra il ciclo principale del programma, in cui il motore 2 è impostato per funzionare in senso orario al 80% della velocità per 3 secondi prima di applicare il freno.brakeLa funzione ferma il motore quando viene chiamata.

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

IlM1funzione prende la direzione e la velocità come input, mappa la velocità a un valore PWM e imposta i pin appropriati per controllare la direzione di rotazione del motore. IldebugPrintla funzione viene chiamata per mostrare lo stato attuale nel monitor seriale.

Per il codice completo, ricorda di controllare sotto l'articolo (nel video alle 08:55).

Dimostrazione / Cosa Aspettarsi

Quando esegui il codice, aspettati che i motori inizino a ruotare nelle direzioni specificate alle velocità impostate. Il codice include freni e regolazioni della velocità, consentendo un controllo dinamico. Se i motori non rispondono come previsto, controlla di nuovo le tue connessioni elettriche e assicurati che i pin corretti siano configurati nel codice. Inoltre, fai attenzione al surriscaldamento, in particolare quando si estraggono correnti elevate, come indicato durante il test (nel video alle 23:23).

Timestamp video

  • 00:00 Introduzione
  • 03:16 Scheda dati visualizzata
  • 06:34 Spiegazione dei cablaggi
  • 08:55 Codice spiegato
  • 14:28 Dimostrazione: Controllo del Motore
  • 17:22 Dimostrazione: Test di corrente massima
  • 23:23 Test di caduta di tensione a 3A, 4A e 5A
  • 26:28 Osservazioni conclusive

Immagini

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

}

Cose di cui potresti avere bisogno

Risorse e riferimenti

File📁

Scheda tecnica (pdf)