Motores paso a paso & driver TB6600
Tutorial que describe de forma completa y con vídios ilustrativos el controlador de motores paso a paso TB6600 y su conexión a diferentes microcontroladores y sistemas de desarrollo embebido
SISTEMAS EMBEBIDOS
Biblioman09
5/30/20244 min leer
Introducción al control de motores paso a paso bipolares con el driver TB6600
Hace tiempo publique el siguiente vídeo de como controlar un motor paso a paso bipolar con el driver TB6600:
El código del ejemplo con arduino que utilice en su día es el siguiente:
int PUL = 7; // Pin para la señal de pulso
int DIR = 6; // Pin de dirección del motor
int EN = 5; // Pin Enable (no es imprescindible conectarlo)
void setup(){
pinMode(PUL, OUTPUT);
pinMode(DIR, OUTPUT);
pinMode(EN, OUTPUT);
digitalWrite(EN, HIGH);
}
void loop(){
digitalWrite(DIR, LOW);
for (int i=0; i < 1600; i++) // 1600 pasos sentido horario
{
digitalWrite(PUL, HIGH);
delayMicroseconds(400);
digitalWrite(PUL, LOW);
delayMicroseconds(400);
}
delay(100);
digitalWrite(DIR, HIGH);
for (int i=0; i < 1600; i++) // 1600 pasos sentido anti-horario
{
digitalWrite(PUL, HIGH);
delayMicroseconds(400);
digitalWrite(PUL, LOW);
delayMicroseconds(400);
}
}
Fue uno de los vídeos con mas visitas del canal, el siguiente vídeo es una continuación del anterior:
El vídeo es bastante extenso y trata varios temas, desde los enlaces podréis acceder a la parte en concreto que os interese del vídeo:
El manual del fabricante del TB6600 ¿Que nos dice? ¿nos da suficiente información?..
¿Que lleva internamente el TB6600? ¿mi controlador es un clon?
Ejemplo en Python con la VisionFive 2. Control en remoto a través de SSH desde otro PC.
Control del TB6600 sin microcontrolador con un simple generador de funciones
Esquema de conexiones TB6600 y ESP32
Código ESP32
int PUL=33; //pin para la señal de pulso
int DIR=32; //define pin de dirección
void setup() {
pinMode (PUL, OUTPUT);
pinMode (DIR, OUTPUT);
}
void loop() {
digitalWrite(DIR,LOW);
for (int i=0; i<1600; i++) //1600 pasos sentido horario
{
digitalWrite(PUL,HIGH);
delayMicroseconds(400);
digitalWrite(PUL,LOW);
delayMicroseconds(400);
}
delay(100);
digitalWrite(DIR,HIGH);
for (int i=0; i<1600; i++) //1600 pasos sentido anti horario
{
digitalWrite(PUL,HIGH);
delayMicroseconds(400);
digitalWrite(PUL,LOW);
delayMicroseconds(400);
}
}
Código en Python para la VisiónFive 2
"""
Conexion motor paso a paso
-----------------------------------------
_______Funcion_________Pin Number_____Pin Name
Pulso 22 GPIO50
Dir 40 GPIO44
Masa 34 GND
-----------------------------------------
"""
import time
import VisionFive.gpio as GPIO
dir = 40
pulso = 22
def initMotor():
# Set gpio modo 'BOARD'.
GPIO.setmode(GPIO.BOARD)
# Configuro los pines como salida.
GPIO.setup(pulso, GPIO.OUT)
GPIO.setup(dir, GPIO.OUT)
# Configuro a nivel alto el voltaje de salida.
GPIO.output(pulso, GPIO.HIGH)
# Configuro a nivel alto el pin de dirección.
GPIO.output(dir, GPIO.HIGH)
global p
# Configuro la frecuencia del motor a 500 Hz.
p = GPIO.PWM(pulso, 500)
# Inicializo el duty (Ton) al 50% de la señal
p.start(50)
def variar_velocidad():
dc = input("Introduce el valor de la frecuencia de la señal: ")
p.start(50)
p.ChangeFrequency(float(dc))
time.sleep(1)
print("Cambio de velocidad efectuado")
def giro_sentido_horario():
GPIO.output(dir, GPIO.HIGH)
p.start(50)
p.ChangeFrequency(500)
time.sleep(1)
print("Motor girando en sentido horario")
def giro_sentido_anti_horario():
GPIO.output(dir, GPIO.LOW)
p.start(50)
p.ChangeFrequency(500)
time.sleep(1)
print("Motor girando en sentido horario")
def parar_motor():
p.start(0)
print("Motor detenido")
def mostrar_menu():
print("n--- Menu ---")
print("1) Giro horario")
print("2) Giro anti_horario")
print("3) Variar velocidad")
print("4) Parar motor")
print("5) Salir de la aplicación")
if name == "__main__":
initMotor()
while True:
mostrar_menu()
opcion = input("Elige una opción: ")
if opcion == '1':
giro_sentido_horario()
elif opcion == '2':
giro_sentido_anti_horario()
elif opcion == '3':
variar_velocidad()
elif opcion == '4':
parar_motor()
elif opcion == '5':
print("Saliendo de la aplicación...")
break
else:
print("Opción no valida. Por favor, elige una opción valida.")
Preguntas y respuestas
Mi motor se queda atorado y vibra ¿cual es el motivo?, ¿entre que margen de frecuencia puedo variar la señal de pulso para variar la velocidad del motor? ¿como ajustar los micro-interruptores de corriente para obtener el mayor rendimiento y menor consumo del motor? Estas son algunas de las preguntas que me habéis hecho en los comentarios de los vídeos, he realizado el siguiente vídeo para dar respuesta a todas ellas, espero que sea de utilidad.