Buenos días a todos los miembros del foro en español, hoy les quería compartir mi pequeño proyecto. Se trata de un driver para el control de motores/servos de corriente continua.
Diseño 3D
Características del proyecto:
- Con el driver podemos hacer un reemplazo de forma plana al driver PaP
- El corazón del sistema es el chip ATMEGA328p
- Se utiliza ICSP para el flasheo del firmware
- Se puede controlar uno o dos motores simultáneamente
- El Driver tiene cuatro señales de control: DIR, STEP, ENABLE y RESET
- Cada motor puede ser controlado de forma independiente por medio de DIR y STEP
- El sistema de control esta basado en un sistema PID
- El PWM trabaja a una frecuencia de 31.25KHz, imperceptible al oído humano
- Cuenta con un salida por puerto serie para su posterior depuración
- Tanto las señales de entrada de los STEPs como las de los encoders, utilizan interrupciones del tipo PIN CHANGE (PCI)
- El diseño del PCB fue realizado en KiCAD
- La etapa de potencia de los motores fue realizada con un puente H, un ic L293
Un poco de historia
La idea principal surgió al querer querer hacer un CNC y luego de conseguir varias impresoras HP para ser desguazadas, me doy cuenta que no utiliza los clasicos Motores Paso a Paso, si no que tenían simples Motores CC realimentados mediante la suma de un encoder de cuadratura mas una cinta ranurada.
A partir de ese momento me puse a investigar y logre hacer funcionar a dicho sistema sin mucho inconveniente gracias a la información que hay en la red. Pero esto asi por asi no se podía utilizar directamente con GRBL o Mach, osea que tendría que hacer un driver compatible con los controladores que tienen pines STEP / DIR para su control. Por tal, me decidí a encarar este proyecto.
Tras lograr el control en posicion de UN motor/servo por medio de un PID provista por la librería Arduino-PID-Library, veo que el sistema no esta muy sobrecargado y como me quedaban muchísimos puertos libres en mi Arduino UNO (para el control de un motor/servo solo se utilizo 5 puertos) , me dije podría controlar tranquilamente dos o mas motores simultaneamente.
Pins utilizados para el control en posicion de un motor CC
- M1: Salida digital para designar la dirección del motor/servo
- M2: Salida digital para designar la dirección del motor/servo
- PWM: saida digital con PWM para el control de velocidad del motor/servo
- PDA: Entrada digital A que cuente con interrupción externa por hardware, proveniente del encoder
- PDB: Entrada digital B que cuente con interrupción externa por hardware, proveniente del encoder
Como vemos, el motor/servo necesita de dos puertos digitales comunes, mas dos que cuenten con interrupciones externas y uno con salida pwm. Pero mi ATMEGA328p solo cuenta con 2 interrupciones externas... :o
listo, no se puede, me dije
Luego de pasada la etapa de confusión, me puse a investigar mas a fondo el datasheet del ATMEGA328 y en la hoja de datos leo algo que me levanto las ganas. Había algo llamado PIN CHANGE INTERRUPT (PCI) el cual es una interrupción similar a las externas, con la salvedad de que solo hay TRES vectores de interrupciones para cubrir las n cantidades disponibles del tipo PCI (ARDUINO UNO, ATMEGA328p, cuenta con 23), por lo que llegada una interrupción, por software nosotros tenemos que ver que pin es el que realmente cambio. Por suerte encontré una librería encargada de esto mismo llamada EnableInterrupt, el cual se encarga de vincular el PIN con nuestra ISR del mismo modo que lo hacemos con attachInterrupt.
Entonces con esto ya tenia todo para probar, por lo que duplico el código para los dos motores, hago el circuito electrónico, PCB, y por ultimo flasheo el firmware en dicha placa y vualá....
Después de depurar un poco el código el mismo ya quedo funcional, asi que si quieren probarlo, aquí esta todo para hacerlo (PCB + firmware).
Circuito electrónico
El controloador es compatible con GRBL y similares, por lo que se puede controlar mediante STEP/DIR, ademas cuenta con un pin para ENABLE para activar/desactivarlo(activo en nivel bajo) y un pin RESET.
Para controlar uno o dos motores, habrá de definir o comentar dentro de motor.h, MOTOR1 y/o MOTOR2
Del mismo modo, si quisiéramos ver la salida por puerto serie para depuración, debemos definir DEBUG dentro de dicho archivo motor.h.
Los parámetros PID están seteados para mi motor, por lo que es probable que tengas que modificarlos.
Bueno eso es todo por ahora, espero que les sea de utilidad y estaré al pendiente de sus sugerencias y/o comentario.
Saludos y Gracias por su lectura
Proyecto en GitHub: GitHub - kr4fty/DCMotorController: Closed Loop Position Control for DC Servo Motors. STEP / DIR compatible Driver