InicioHazlo Tu MismoMover motor con la pc (sin integrados)
Hola Taringa!!

Hoy quiero compartirles esto con lo que he estado jugando y que en realidad tiene la intención de hacer con ello algo más interesante, pero mientras tanto.. copiare aquí lo que he publicado en mi blog, pretendiendo que sea lo más directo posible, pero siempre que lo crean necesario pueden acercarse por más información:

Sabemos que para hacer girar un motor PAP Bipolar tenemos que dar pulsos secuenciales en sus 4 cables (Que llamaremos A, B, C y D), pero alternando la polaridad, por lo que la ciruito necesario se complica un poco, mientras que para los Unipolares este problema desaparece, así que empezaremos por jugar con los motores PAP Unipolares.



Unipolares:
Esquema de conexión en el puerto paralelo:

Mover motor con la pc (sin integrados)

Me parece que queda bastante claro, pero vale aclarar que los "pines" del esquema son los correspondientes del puerto paralelo, y que estamos usando el nibble bajo del byte del puerto; además se puede ver como los 2 cables "comunes" del motor unipolar se conectan al positivo de la fuente de alimentación, la cual corresponde con la tensión que requiere nuestro motor (en mi caso 9V), y los cables A,B,C y D serán conectados al negativo de la fuente al saturarse los transistores con la señal del puerto. Gracias a Fernando @Aces_High_87 por la ayuda con el lío que tenia con los transistores.

pap

Aquí se puede apreciar de color Rojo los 8 pines de datos del puerto, de los cuales hemos usado 4 (del pin 2 al 5) es decir 4 bits.

Aquí se pude observar el circuito que yo he montado, y he usado un cable de puerto paralelo de una vieja impresora, lo cual resulta muy practico.


Transistores

puerto paralelo

motor unipolar

Código:
Con el circuito montado lo que necesitamos ahora es el código que saque las señales correctas en el orden correcto por el puerto paralelo para mover nuestro motor, y tomando en cuenta también los distintos modos a los que puede trabajar el motor(Simple Step, Double Step, Half Step).

Las secuencias son:

motor paso a paso

Simple Step: A-B-C-D
Double Step(mayor torque): AB-BC-CD-DA
Half Step(doble precisión al dar medio paso por ves): A-AB-B-BC-C-CD-D-DA

El código no pretende ser un ejemplo de elegancia ni mucho menos, pero funciona... Es solamente una clase la cual usaremos con otro código para controlar el motor



/*
* =====================================================================================
*
* Filename: unipolar.cpp
*
* Description: Clase para mover un motor PAP Unipolar por puerto paralelo
*
* Version: 1.0
* Created: 09/28/12 11:44:21
* Revision: none
* Compiler: g++
* License: GPLv3
*
* Author: Daniel Campoverde CarriÃn
* Organization: Silly Bytes
*
* =====================================================================================
*/

#include <iostream>
#include <sys/io.h>
#include <unistd.h>

#define puerto (0x378) //Puede ser (0x278)

//datos sacados por el nibble bajo del puerto paralelo
//A,B,C,D son los cables del motor PAP
#define A 1
#define B 2
#define C 4
#define D 8
#define AB 3
#define BC 6
#define CD 12
#define DA 9



using namespace std;

class motor_unipolar{

public:


//steps=Numero de pasos del motor,type_step[0=simple,1=double.2=half]

motor_unipolar( int steps, int type_step=1);


int step( int steps = 1, int direction = 0, int rate_step = 25000); ///pasos a dar,direccion[0=horario,1=antihorario],tiempo entre paso y paso(microsegundos)

int rotate( int angle = 1, int direction = 0, int rate_step = 25000);///angulo a rotar (degrees),direccion[0=horario,1=antihorario],tiempo entre paso y paso(microsegundos)


void stop(){ outb(puerto,0);} //poner a 0 el puerto


private:

int motor_steps;
int step_type;
float angle_by_step;
int sequence[8];
int *current_step;
void single_step( int direction);
int forward_sequence();
void backward_sequence();

};


motor_unipolar::motor_unipolar( int steps, int type_step) : motor_steps(steps), step_type(type_step), angle_by_step(360/steps){


if(ioperm(puerto,1,1)){ //Abrir puerto y configurar permisos
cout << "Error de permisos" << endl << flush;

}


switch(step_type){

case 0:
sequence[0] = A; //Secuencia simple_step
sequence[1] = B;
sequence[2] = C;
sequence[3] = D;
sequence[4] = 0;
sequence[5] = 0;
sequence[6] = 0;
sequence[7] = 0;

break;
case 1:
sequence[0] = AB; //Secuencia double_step
sequence[1] = BC;
sequence[2] = CD;
sequence[3] = DA;
sequence[4] = 0;
sequence[5] = 0;
sequence[6] = 0;
sequence[7] = 0;



break;
case 2:
sequence[0] = A; //Secuencia half_step
sequence[1] = AB;
sequence[2] = B;
sequence[3] = BC;
sequence[4] = C;
sequence[5] = CD;
sequence[6] = D;
sequence[7] = DA;

break;

}




current_step = sequence;//colocamos el paso actual al principio de ka secuencia




}



int motor_unipolar::step( int steps, int direction, int rate_step){




while(steps > 0){

single_step(direction);
usleep(rate_step);
steps--;

cout << *current_step << endl << flush;
}

return 0;
}


int motor_unipolar::rotate( int angle, int direction, int rate_step){



int steps = int(angle/angle_by_step);


while(steps > 0){

single_step(direction);
usleep(rate_step);
steps--;

}

return 0;
}


int motor_unipolar::forward_sequence(){

if(current_step==&sequence[7] || *current_step == 0){ current_step = sequence; return 0;} //reiniciamos la secuencia

current_step++; //avanzamos en la secuencia

if(*current_step == 0){ current_step = sequence; return 0;}
return 0;

}

void motor_unipolar::backward_sequence(){

if(current_step==&sequence[0]) current_step = &sequence[7]; //reiniciamos la secuencia


current_step--; //avanzamos en la secuencia

if(*current_step==0) backward_sequence();

}

void motor_unipolar::single_step( int direction){

outb(*current_step,puerto);

if(direction==0){ forward_sequence();}
else{backward_sequence();}

}




Bipolares:

**Como trabajaremos solo con unipolares, no lo pondré aqui, pero de todos modos pueden encontrarlo en


Haciendo girar el motor:
Ahora que tenemos las clases necesarias para mover el motor cuyo circuito ya tenemos montado en el puerto paralelo, usaremos un código que a su vez aproveche dichas clases para jugar con el motor.

Así que ha manera de ejemplo yo he agregado la función main() para el fuente de unipolar.cpp, quedando así (es de lo más simple y tonto):


/*
* =====================================================================================
*
* Filename: unipolar.cpp
*
* Description: Clase para mover un motor PAP Unipolar por puerto paralelo
*
* Version: 1.0
* Created: 09/28/12 11:44:21
* Revision: none
* Compiler: g++
* License: GPLv3
*
* Author: Daniel Campoverde CarriÃn
* Organization: Silly Bytes
*
* =====================================================================================
*/

#include <iostream>
#include <sys/io.h>
#include <unistd.h>

#define puerto (0x378) //Puede ser (0x278)

//datos sacados por el nibble bajo del puerto paralelo
//A,B,C,D son los cables del motor PAP
#define A 1
#define B 2
#define C 4
#define D 8
#define AB 3
#define BC 6
#define CD 12
#define DA 9



using namespace std;

class motor_unipolar{

public:


//steps=Numero de pasos del motor,type_step[0=simple,1=double.2=half]

motor_unipolar( int steps, int type_step=1);


int step( int steps = 1, int direction = 0, int rate_step = 25000); ///pasos a dar,direccion[0=horario,1=antihorario],tiempo entre paso y paso(microsegundos)

int rotate( int angle = 1, int direction = 0, int rate_step = 25000);///angulo a rotar (degrees),direccion[0=horario,1=antihorario],tiempo entre paso y paso(microsegundos)


void stop(){ outb(puerto,0);} //poner a 0 el puerto


private:

int motor_steps;
int step_type;
float angle_by_step;
int sequence[8];
int *current_step;
void single_step( int direction);
int forward_sequence();
void backward_sequence();

};


motor_unipolar::motor_unipolar( int steps, int type_step) : motor_steps(steps), step_type(type_step), angle_by_step(360/steps){


if(ioperm(puerto,1,1)){ //Abrir puerto y configurar permisos
cout << "Error de permisos" << endl << flush;

}


switch(step_type){

case 0:
sequence[0] = A; //Secuencia simple_step
sequence[1] = B;
sequence[2] = C;
sequence[3] = D;
sequence[4] = 0;
sequence[5] = 0;
sequence[6] = 0;
sequence[7] = 0;

break;
case 1:
sequence[0] = AB; //Secuencia double_step
sequence[1] = BC;
sequence[2] = CD;
sequence[3] = DA;
sequence[4] = 0;
sequence[5] = 0;
sequence[6] = 0;
sequence[7] = 0;



break;
case 2:
sequence[0] = A; //Secuencia half_step
sequence[1] = AB;
sequence[2] = B;
sequence[3] = BC;
sequence[4] = C;
sequence[5] = CD;
sequence[6] = D;
sequence[7] = DA;

break;

}




current_step = sequence;//colocamos el paso actual al principio de ka secuencia




}



int motor_unipolar::step( int steps, int direction, int rate_step){




while(steps > 0){

single_step(direction);
usleep(rate_step);
steps--;

cout << *current_step << endl << flush;
}

return 0;
}


int motor_unipolar::rotate( int angle, int direction, int rate_step){



int steps = int(angle/angle_by_step);


while(steps > 0){

single_step(direction);
usleep(rate_step);
steps--;

}

return 0;
}


int motor_unipolar::forward_sequence(){

if(current_step==&sequence[7] || *current_step == 0){ current_step = sequence; return 0;} //reiniciamos la secuencia

current_step++; //avanzamos en la secuencia

if(*current_step == 0){ current_step = sequence; return 0;}
return 0;

}

void motor_unipolar::backward_sequence(){

if(current_step==&sequence[0]) current_step = &sequence[7]; //reiniciamos la secuencia


current_step--; //avanzamos en la secuencia

if(*current_step==0) backward_sequence();

}

void motor_unipolar::single_step( int direction){

outb(*current_step,puerto);

if(direction==0){ forward_sequence();}
else{backward_sequence();}

}



int main(){

int opcion;
motor_unipolar motor(200);
int direccion;
int valor;


for(;{

cout << "nnnAngulo, Pasos, Salir[0,1,2]n >> ";
cin >> opcion;
cout << "Valor (angulo o pasos)n >> ";
cin >> valor;
cout << "Direccion[0,1]n >> ";
cin >> direccion;

if(opcion==0){

cout << "Rotando..." << endl;
motor.rotate(valor,direccion);

}else if(opcion==1){

motor.step(valor,direccion);
cout << "Rotando..." << endl;

}else{ motor.stop(); return 0;}

}
}



Una vez compilado con g++ unipolar.cpp -o rotate lo ejecutamos obteniendo este resultado:





A poco no es tierno :3

Que podemos hacer con todo esto¿?
...Pues... Hay que ser muy falto de imaginación para pensar que esto es inútil... pero en realidad publico esto con la intención de publicar más adelante algo mucho más interesante y para lo cual usaremos todo esto...


Saludos!
Datos archivados del Taringa! original
141puntos
10,483visitas
18comentarios
Actividad nueva en Posteamelo
0puntos
0visitas
0comentarios
Dar puntos:

Posts Relacionados

Dejá tu comentario

0/2000
18 Comentarios archivados
Del Taringa! original
A@Anónimo8/21/2015+1-0
lo acabo de ver, esto esta excelente para controlar los motores de una impresora 3d casera sin comprar ninguna placa extra, o a lo sumo colocarle algun driver. en algun momento estare haciendo algo referente a esto, gracias x compartir.
A@Anónimo11/28/2014+0-0
*"ayudar"
Si lo que necesitas en mover un motor DC con el puerto paralelo solo conecta 1 de los transistores (del diagrama) y el motor funcionará, asegurate que el motor no consuma más de unos 200mA, si es mas grande necesitaras conectar un transistor de potencia y optoacoplar, además si necesitas controlar la dirección de giro necesitaras un "puente H" (puedes googlearlo) o usar un integrado L293D (que también encuentras mucha info en google)
Sa…
A@Anónimo11/28/2014+0-0
Hola @ me podrias colaborar lo que necesito es mover motores de corriente continua. + /-
A@Anónimo6/22/2014+0-0
@ No se si preguntas en serio o en ironia XD

Aqui la cosas es como hacer pan en casa con el horno de la estufa o ir a la tienda a comprarlo, para hacer unos sandwich ... entender a 100 cada detalla es excelente pero vivimos en una epoca que eso tiene poco valor..

Yo entiendo muy bien como funciona el arduino ya que soy ing de sistema y tengo mi experiencia en bajo nivel y electrónica pero como dije hoy dia si alguien me pide ayuda para alg…
A@Anónimo6/21/2014+0-0
Así es... y es precisamente por eso que detesto Arduino, comprendes tu con exactitud y al mínimo detalle como se comunica arduino por usb? o que código genera el compilador de arduino? de forma exacta que instrucciones recibe finalmente el micro? y sobre todo conoces a precisión como realiza la compleja comunicación usb?... por otro lado... hacerlo desde el suelo te permite alcanza un nivel de entendimiento máximo!, existe diferencia entre "poder hacerl…
A@Anónimo6/21/2014+0-0
UHh si por USB + Arduino las cosas mas horrorosas y complejas salen suaves y de bajada XD
A@Anónimo6/20/2014+0-0
buen post
A@Anónimo11/28/2013+0-0
Para controlarlo por usb podes usar una placa Arduino con algun driver pololu, saludos!
A@Anónimo10/1/2012+0-0


No soy ingeniero de sistemas... pero aspiro serlo , cuando me gradué del cole pienso seguir esa carrera; y lo de ponerlo en español tienes toda la razón, es que tengo una tendencia media rara a ponerlo en ingles por que me da la sensación de que queda claro con menos palabras, pero de todos modos es una buena sugerencia
A@Anónimo10/1/2012+1-0
BuenoSimo
A@Anónimo9/30/2012+0-0

Justo lo que voy a necesitar
A@Anónimo9/30/2012+2-1
no entendi una chota
A@Anónimo9/30/2012+3-0
no lo podrias poner en español?? no todos somos ingenieros en sistemas
A@Anónimo9/30/2012+1-0
muy bueno. +10 y a fav
A@Anónimo9/30/2012+1-0
+10, Me gusto!
A@Anónimo9/30/2012+1-1
espectacular aporte, lastima que no es por puerto usb.
A@Anónimo9/30/2012+4-0


Si es verdad... pero estoy pensando en hacer algo con usb, el problema es la complejidad que implica y deja de ser tan sencillo, pero si lo hago de seguro lo publicaré.
A@Anónimo9/30/2012+5-0
Una lastima que no se usen mas ni los puertos serie ni los paralelos :/

Autor del Post

a
alx741🇦🇷
Usuario
Puntos0
Posts35
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.