Hola!

Registrándote como bakuno podrás publicar, compartir y comunicarte en privado con otros bakuos :D

Regístrame ya!

Motor a pasos y motor corriente directa C++

miguels188

Bovino maduro
Desde
11 Mar 2008
Mensajes
134
Hola que tal amigos, resulta que tengo un proyecto de programacion en la escuela y tiene que ir enfocado a interactuar con el puerto paralelo, la verdad le entiendo mas o menos bien a esto de programar, pero nunca habia usado esto del puerto, haber si alguien me puede ayudar.

Dispongo de un motor de pasos y otro de corriente directa y lo que tengo que hacer es:

*Prender y apagar el motor de corriente directa.
*Controlar la velocidad (potencia) del motor de corriente directa a como lo guste
el usuario tomando de un 0% a 100% de la capacidad del motor.
*Poner en reversa el motor de corriente directa.
*Controlar el angulo de inclinacion del motor de pasos de +35º hasta -35º.

Creo eso es todo (jejejejeje) y como la verdad no entiendo bien esto del puerto paralelo me puse a investigar y leer en internet, encontre algunos codigos, pero no me han servido bien o yo no los he podido ejecutar.

NOTA: el motor de corriente directa es del vibrador de un control de playstation, el de pasos es de una impresora (creo que es de 6 hilos o 4).
El lenguaje de programacion que debo usar es C++.
El compilador que uso es Borland C++ 3.1

Espero que alguien me pueda ayudar, aqui dejo algunos de los codigos que he encontrado

Código:
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <string.h>
int i, contador=2, paralelo(), para, opci=1, stop=0, araparo=0, sentido=0,  giro(int arraparo1, int velocidad1, int sentido1), sentido1, velocidad1, arraparo1, bit=1, bit2, dato;
double velocidad=1000;
char *mas="+", *menos="-", *paro="2", *arra="8", *derecha="6", *izquierda="4", *salir="5", *letra;
unsigned int _far *puntero_a_direccion;
main()
{
paralelo();
clrscr();
gotoxy(70,1);
if(araparo==0)
 printf("[P]");
else
 printf("[A]");
gotoxy(70,2);
if(sentido==0)
 printf("[i]");
else
 printf("[D]");
gotoxy(70,3);
printf("[MIN] ");
gotoxy(1,1);
printf("1.-Arranque[8] Paro[2]\n2.-Sentido Izquierda[4] Derecha[6]\n3.-Velocidad [+] [-]\n");
printf("4.-Salir [5]");
while(stop==0)
 {
  while (!kbhit())
  {
  dato=inportb(para+1);
  if(dato==88)
   {
   sentido=1;
   gotoxy(70,2);
   printf("[D]");
   }
  if(dato==56)
   {
   sentido=0;
   gotoxy(70,2);
   printf("[i]");
   }
  if(dato==112)
   if(velocidad>19)
    {
    velocidad=velocidad-10;
    gotoxy(70,3);
    printf("[%.0f] ",velocidad);
    }
   else
    {
    gotoxy(70,3);
    printf("[MAX] ",velocidad);
    }
  if(dato==104)
   if(velocidad<900)
    {
    velocidad=velocidad+10;
    gotoxy(70,3);
    printf("[%.0f] ",velocidad);
    }
   else
    {
    gotoxy(70,3);
    printf("[MIN] ");
    }
  if(araparo==0);
  else
   {
   if(sentido==0)
    {
    if(bit==16)
     bit=1;
    outportb(para,bit);
    delay(velocidad);
    bit=bit*2;
    }
   else
    {
    if(bit==16)
     bit=8;
    if(bit==1/2)
     bit=8;
    outportb(para,bit);
    delay(velocidad);
    bit=bit/2;
    }
   }
  }
  *letra=getch();
  opci=strcmp(letra, arra);
  if(opci==0)
   {
   araparo=1;
   gotoxy(70,1);
   printf("[A]");
   }
  opci=strcmp(letra, paro);
  if(opci==0)
   {
   araparo=0;
   gotoxy(70,1);
   printf("[P]");
   }
  opci=strcmp(letra, salir);
  if(opci==0)
   stop=1;
}
}
paralelo()
{
   clrscr();
   busqueda:
   puntero_a_direccion=(unsigned int _far *)0x00000408;
   printf("DIRECCIàN ACTUAL:\t\t\t\t\t[%d]\n",  para);
   printf("Elije el puerto paralelo:\n1.-LPT1\n2.-LPT2\n3.-LPT3\n");
   scanf("%d", &i);
   clrscr();
     if(i>3)
 {
 clrscr();
 printf("Puerto Inv lido");
 getch();
 goto busqueda;
 }
     if(i>1)
 {
 while(contador<=i)
  {
  puntero_a_direccion++;
  contador++;
  }
 }
       i=i-1;
       clrscr();
       if (*puntero_a_direccion == 0)
  {
  printf("No se encontro puerto asignado a LPT%d \n", i+1);
  getch();
  clrscr();
  goto busqueda;
  }
 else
  {
  printf("La direccion asignada a LPT%d es 0x%Xh\n", i+1, *puntero_a_direccion);
  para=*puntero_a_direccion;
  }
 outportb(para, 0);
 getch();
}

Código:
#include<stdio.h>
#include<conio.h>
#include<dos.h>
#define puerto 0x378
// o 0x278 o 0x3BC  (direccion del puerto)
float i=0;
int cuvu(float vueltas){
i =0.25;
if(i>=vueltas) return 1;
else return 0;
}
void main()
{
int sen;
float vel,vuel,seg;
clrscr();
printf("Control de motor de pasos por el puerto paralelo\n");
printf("\n");
printf("Cuantas vueltas?");  scanf("%f",&vuel);
printf("\nVelocidad (vueltas por segundo)? ");  scanf("%f",&vel);
seg=(1/vel);
printf("\nSentido (1 manecillas el reloj, 2 contrario)?"); scanf("%d",&sen);
outp(puerto, 0x00); //desenergizar bobinas
printf("\nInicio con todas las bobinas desactivadas");
getch();
if (sen==1)
{
 clrscr();
 printf("Sentido de las manecillas del reloj");
 i=0;
 do{
  outp(puerto,0x08);
  delay(seg/4*1000);
  gotoxy(38,12);
  printf("%f ",i);
  if (cuvu(vuel)) break;
  outp(puerto,0x04);
  delay(seg/4*1000);
  gotoxy(38,12);
  printf("%f ",i);
  if (cuvu(vuel)) break;
  outp(puerto,0x02);
  delay(seg/4*1000);
  gotoxy(38,12);
  printf("%f ",i);
  if (cuvu(vuel)) break;
  outp(puerto,0x01);
  delay(seg/4*1000);
  gotoxy(38,12);
  printf("%f ",i);
  if (cuvu(vuel)) break;
 }while(1);
 getch();
}
if(sen==2){
 clrscr();
 printf("Sentido contrario");
 i=0;
 do{
  outp(puerto,0x01);
  delay(seg/4*1000);
  gotoxy(38,12);
  printf("%f ",i);
  if (cuvu(vuel))  break;
  outp(puerto,0x02);
  delay(seg/4*1000);
  gotoxy(38,12);
  printf("%f ",i);
  if (cuvu(vuel))  break;
  outp(puerto,0x04);
  delay(seg/4*1000);
  gotoxy(38,12);
  printf("%f ",i);
  if (cuvu(vuel))  break;
  outp(puerto,0x08); delay(seg/4*1000);
  gotoxy(38,12);
  printf("%f ",i);
  if (cuvu(vuel))  break;
 }while(1);
 getch();
}
}

Código:
#include<iostream.h>
#include<stdlib.h> 
#include<stdio.h> 
#include<dos.h> 
#include<conio.h> 
#define SALIDA 0X378 
int main(void) 
{ 
  int c,pasos,retardo; 
  char respu,dir; 
  clrscr(); 
  do 
    {     clrscr(); 
        cout<<"Ingresar VELOCIDAD DE GIRO: "; 
        cin >>retardo; 
        cout<<"Ingresar SENTIDO DE GIRO (d/i): "; 
        cin >>dir; 
        cout<<"Ingresar NUMERO DE PASOS: "; 
        cin >>pasos; 
        if (dir=='d') { 
            cout<<"GIRO A LA DERECHA"; 
            for(c=1; c<=pasos; c++){ 
                outportb(SALIDA,10); 
  delay(retardo);
                outportb(SALIDA,9); 
                delay(retardo); 
                outportb(SALIDA,5); 
                delay(retardo); 
                outportb(SALIDA,6); 
                delay(retardo); 
            } 
         } 
         else if (dir=='i') { 
            cout<<"GIRO A LA IZQUIERDA"; 
            for(c=1; c<=pasos; c++){ 
                outportb(SALIDA,6); 
                delay(retardo); 
                outportb(SALIDA,5); 
                delay(retardo); 
                outportb(SALIDA,9); 
                delay(retardo); 
                outportb(SALIDA,10); 
                delay(retardo); 
                    } 
         } 
        outportb(SALIDA,0); 
        cout<<"\n\n\t\tdesea continuar (s/n) :"; 
        respu=getch(); 
     } while(respu !='n'); 
     exit (0); 
    }

Código:
#include <conio.h>
#include <dos.h> 
#include <stdio.h> 
#include <string.h>
#include<windows.h>
 
int paralelo(), para, opc=0, contador, estado=0; 
unsigned int _far *puntero_a_direccion; 
char *uno="1", *dos="2", *tres="3", *letra; 
void main() 
{ 
paralelo(); 
outportb(para,0); 
while(opc!=3) 
{ 
    clrscr(); 
    *letra=getch(); 
    opc=strcmp(letra,uno); 
    if(opc==0) 
        { 
        outportb(para,1); 
        estado=1; 
        } 
    else 
        { 
        opc=strcmp(letra,dos); 
        if(opc==0) 
            { 
            outportb(para,0); 
            estado=0; 
            } 
        else 
            { 
            opc=strcmp(letra,tres); 
            if(opc==0) 
                { 
                gotoxy(30,20); 
                printf("Aplicaci¢n Finalizada"); 
  delay(1000);
                opc=3; 
                } 
            else 
                { 
                gotoxy(30,20); 
                printf("Presiona una opci¢n v*lida"); 
                delay(1000); 
                } 
            } 
        } 
} 
outportb(para,0); 
} 
paralelo() 
{ 
   clrscr(); 
   busqueda: 
   puntero_a_direccion=(unsigned int _far *)0x00000408; 
   printf("Rastreando Direcci¢n de Puerto Paralelo"); 
   while(contador<40) 
    { 
    printf("."); 
    contador++; 
    delay(35); 
    } 
   clrscr(); 
   para=*puntero_a_direccion; 
   outportb(para, 0); 
}

Código:
#include<conio.h>
#include<math.h>
#define datos 8
#define control 4
#define captura 6
void main()
{
 int d[datos]={0},d1[control]={0},i=0,j=0,k=0,suma,suma1;
 double r[datos],r1[control];
 char op, d2;
 while(1)
 {
  clrscr();
  printf("\n\n\n Control de Motor\n\n\n");
  printf("¿Qué desea hacer?\n\n");
  printf("1.-Desactivar motor\n");
  printf("2.-Activar motor\n");
  printf("3.-Salir\n\n");
  scanf("%d",&op);
  switch(op)
  {
   case 1:
          clrscr();
          outportb(0x3bc,0);
          outportb(0x3bc,0xb);
          printf("Motor desactivado\n");
          printf("Presiones una tecla para continuar\n");
          getch();
          break;
   case 2:
         {
          clrscr();
          printf("\n¿Qué desea hacer con los motores?");
          printf("\n D.- Desplazamiento hacia adelante");
          printf("\n R.- Desplazamiento en reversa");
          printf("\n I.- Motor inactivo");
          scanf("%c",&d2);
          d2=toupper(d2);
          if(d2!='D')
          if(d2!='R')
          if(d2!='I')
          {
           printf("\n %c no es una opción válida",d2);
           printf("\n Inicie de nuevo el programa");
           getch();
           exit(0);
          }
          else
          continue;
          j=0;
          for(i=0;i<=7;i++)
          {
           j++;
           if(d2=='I')
           {
            d[i]=0;
            d[i+1]=0;
           }
           else if(d2=='D')
           {
            d[i]=1;
            d[i+1]=0;
           }
           else if(d2=='R')
           {
            d[i]=0;
            d[i+1]=1;
           }
           i++;
          }
          k=4;
          for(i=0;i<=3;i++)
          {
           k++;
           if(d2=='I')
           {
            d1[i]=0;
            d1[i+1]=0;
           }
           else if(d2=='D')
           {
            d1[i]=1;
            d1[i+1]=0;
           }
           else if(d2=='R')
           {
            d1[i]=0;
            d1[i+1]=1;
           }
           i++;
          }
          suma=0;
          for(i=0;i<=7;i++)
          {
           r[i]=(pow(2,i)*d[i]);
           suma=(r[i]+suma);
          }
          outportb(0x3bc,suma);
          suma1=0;
          for(i=0;i<=3;i++)
          {
           r1[i]=pow(2,i)*d1[i];
           suma1=r1[i]+suma1;
          }
          suma1=suma1^0xb;
          outportb(0x3be,suma1);
          printf("\n\nDatos enviados\n\n");
          printf("\nPresione una tecla para continuar...");
          getch();
          break;
         }
        }
    }
 }

Mas o menos lo quiero adaptar a esto, es como la simulacion de un submarino, pero muy muy pobremente, espero alguien me pueda apoyar un poco
Código:
#include<stdio.h>
#include<conio.h>
void main()
{
 int x,motor=0,potencia=0,angulo=0;
 while(x!=5)
 {
  printf("\n*****************************************************************************");
  printf("\n*****************************************************************************");
  printf("\n****                                      ****");
  printf("\n****      SIMULADOR DE CONTROL DE SUBMARINO                    ****");
  printf("\n****                        ****");
  printf("\n*****************************************************************************");
  printf("\n*****************************************************************************\n");
  printf("\n¿Qué acción desea realizar?\n\n");
  printf("1.-Ajustar potencia del motor\n");
  printf("2.-Ajustar ángulo de inclinacion\n");
  if(motor==0)
   printf("3.-Encender motor\n");
  else
   printf("3.-Apagar motor\n");
  printf("4.-Mostrar panel de estado\n");
  printf("5.-Salir del programa\n");
  scanf("%d",&x);
  switch(x)
  {
   case 1: 
     printf("La pontencia del motor se encuentra al %d%\n",potencia);
     printf("Asigne la potencia del motor:");
     scanf("%d",&potencia);
     printf("Presiones cualquier tecla para regresar al panel de control\n");
     getch();
     break;
   case 2:
     printf("El ángulo del submarino es de %dº\n",angulo);
     printf("Asigne el ángulo de inclinación:");
     scanf("%d",&angulo);
     while(angulo<-35||angulo>35)
     {
      printf("El ángulo de inclinación no puede ser menor a -35º ni mayor a 35\n"); 
      printf("Asigne el ángulo de inclinación\n");
      scanf("%d",&angulo);
     }
     printf("Presiones cualquier tecla para regresar al panel de control\n");
     getch();
     break;
   case 3:
     if(motor==0)
            {
      motor=1;
      printf("Motor encendido");
            }
     else
            {
      motor=0;
      printf("Motor apagado");
            }
     printf("Presiones cualquier tecla para regresar al panel de control\n");
     getch();
     break;
   case 4:
     printf("\n********************************************************************");
     printf("\n********************************************************************");
     printf("\n****                           ****");
            printf("\n****   PANEL DE CONTROL                      ****");
            printf("\n****             ****");
     printf("\n********************************************************************");
     printf("\n********************************************************************");
     printf("\nPresione cualquier tecla para regresar al panel de control");
            getch();
     break;
  }
 }
}
GRACIAS
 
CReo que ya paso tu proyecto pero ahi va...
Lo del motor a pasos es fácil, tienes que ver cuantos grados da por paso y en base a eso hacer tu programa, esa info viene en pegada al motor. El motor tienes que ver si es bipolar o unipolar, si tiene sólo 4 cables es que es unipolar y para contralarlo tienes que usar un arreglo de puentes H, es un tanto tedioso eso, entonces te recomendaria si puedes usar un motor bipolar mejor :D.

Para prender y apagar el motor CC, basta con mandar un 1 o 0 a la dirección del puerto donde vayas a conectar el motor.
Para controlar el cambio de giro igual con un puente H o sino un par de relevadores.
Para lo de la velocidad mmm ps ahi si no recuerdo muy bien que digamos, con un pwm.

Lo que te digo es muy a grandes rasgos, si te sirve aún, me dices y veo si te puedo echar la mano en el programa, ya qe tiene años uqe no programo en c...
 
Volver
Arriba