# Controlar 3 motores paso a paso por usb



## FREDDIELUCERO (Mar 16, 2009)

necesito solucionar un problema para un proyecto ........estoy controlando 3 motores paso a paso desde el puerto paralelo del pc.....saco 12 salidas por ese puerto ...que tiene 25 pines.......

pero debo cambiar el sistema y controlar los 3 motores por puerto usb........

mi duda es ..como podre sacar las 12 salidas por el puerto usb?

es posible eso?.....como debo hacerlo?

ojala me respodan..........

muchas gracias de antemano


----------



## FRYCK (Mar 16, 2009)

¿Hola   que  conocimiento de electrónica  tienes?
Conoces  algo  de  microcontroladores. Hay unos que  traen  implementados ese  modulo  ya  podrías  empezar  por buscar  información en  este  foro.


----------



## FREDDIELUCERO (Mar 16, 2009)

gracias por responder..........conozco algo de microcontroladores.he programado algunos............pero es posible  controlar estos 3 motores haciendo algo con micros y por puerto usb?...........

gracias


----------



## FRYCK (Mar 16, 2009)

claro  FREDDIELUCERO que clase de motores  vas  a  utilizar


----------



## FREDDIELUCERO (Mar 16, 2009)

estoy usando 3 motores paso a paso del tipo unipolar..........y para eso necesito 4 señales para moverlos
4 señales por 3 motores son en total 12 señales.....son los 12 pines que son las que uso por puerto paralelo.........

pero debo cambiar el control con el puerto usb...........por eso me interesa este tema.........

sera muy complicado hacerlo?

tengo mi programa de visual basic...que controla estos 3 motores...supongo que tambien debo cambiar este programa

gracias


----------



## FRYCK (Mar 16, 2009)

consulta  esta  paguina   puedes  utilizar  uno  de estos pic,     mira  aqui y  haste  una  idea de que  tan complicado  es:

https://www.forosdeelectronica.com/f24/control-dispositivos-traves-modulo-usb-pic18f2550-17458/

si necesita  mas   pines  puedes  utilizar el  18f4550 que  tiene  40 pines  o otro  que  son similares  a este  pero  con mas  pines


----------



## jokelnice (Mar 16, 2009)

claro colega *FREDDIELUCERO* te recomiendo el foro que menciona ...*fryck_80* ..... es muy bueno alli se hace todo un desarrollo de la comunicacion por usb en todas sus formas , ami me sirvio mucho , y por ahi eh intervenido un poco en algunos comentarios , alli se manejan varios sotware como visual , c++ . c# etc 

pero si quieres innovar con sofware diferente como * labview* que se programa en lenguaje G te recomiendo todo lo que yo eh hecho en este sofware referente a usb en este foro 

https://www.forosdeelectronica.com/f26/usb-labview-entre-otros-18338/

.saludos ............


----------



## FREDDIELUCERO (Mar 16, 2009)

gracias..eso he estado revisando.................mi programa de control de motores esta hecho en visual basic 6.0......desde aqui envio las señales al puerto paralelo que controlan cada motor...........tendre que modificar mi programa en la parte de envio de datos..........

ojala que no sea muy complicado.......  

puedo pedirle ayuda a alguien especializado en programacion de visual basic?........

gracias por su ayuda...ha sido excelente........

gracias


----------



## FREDDIELUCERO (Mar 17, 2009)

al programar el pic 18f2550,que tiene 8 salidas del port b....pero yo necesito 12 salidas........he pensado en tomar 4 del port a..por ejemplo...ra0,ra1,ra2 y ra3..y configurarlas como salida...

es posible esto verdad?

para no tener que gastar mas dinero en un  pic con mas pines....que son mas caros

saludos..........


----------



## Moyano Jonathan (Mar 17, 2009)

Freddielucero, como te va. Mirá tuviste suerte mi proximo proyecto es identico al tuyo osea controlar 3 motores paso a paso por usb. 
El tema por usb te puedo ayudar yo, pero estoy investigando como programar los movimientos. Creería que el fin de semana podría empezar con las pruebas asi que si saco algo en limpio te aviso.


----------



## LIAMNEESON (Mar 17, 2009)

FREDDIELUCERO dijo:
			
		

> al programar el pic 18f2550,que tiene 8 salidas del port b....pero yo necesito 12 salidas........he pensado en tomar 4 del port a..por ejemplo...ra0,ra1,ra2 y ra3..y configurarlas como salida...
> 
> es posible esto verdad?
> 
> ...




Si es posible, te recomiendo que lo hagas con USB CDC bueno a mi me resulta más fácil, actualmente estoy haciendo algo parecido.


----------



## FREDDIELUCERO (Mar 17, 2009)

muchas gracias por tu respuesta........yo puedo controlar los 3 motores con un programa de visual basic........eso lo tengo listo..........lo que pasa es que mi programa mueve los motores por puerto paralelo,envia los datos simultaneamente por los bits 2-3-4-5-6-7-8-9.........del puerto paralelo...es decir envia 8 bit,simultaneamente....eso necesito cambiarlo y que ahora me envie esos datos por usb y que lleguen a las salidoas rb0.....hasta rb8 del pic.........tengo un programa para el pic...para eso.......lo que me falta es la parte de programacion de visual basic 6.0.....

para eviar esos datos simultaneamente y que lleguen a las salidas del pic.........

que funcion debo usar?

muchas gracias por todas las respuestas..

saludos


----------



## Moyano Jonathan (Mar 17, 2009)

La propuesta de LIAMNEESON es valida, ya que el paso del puerto paralelo al puerto serie en VB6.0 no es critico.


----------



## FREDDIELUCERO (Mar 17, 2009)

que significa usb cdc....?

no encuentro información respecto a eso.........

gracias


----------



## FREDDIELUCERO (Mar 17, 2009)

aca encontre la respuesta...........


pero tengo una consulta..¿es posible enviar 12 bit simultaneamente por el puerto usb y que prendan por ejemplo 12 leds al mismo tiempo?......

ya que en mi caso necesito enviar 8 señales por el puerto paralelo....pero cuando el tercer motor entre en funcionamiento..debere enviar 12 señales hacia afuera por el usb.............

muchas gracias


----------



## LIAMNEESON (Mar 17, 2009)

USB CDC es communication device class, y consiste en una emulación de puerto serie virtual. Lo que significa que cuando conectas el micro a la PC, se crea un puerto serie virtual al cual puedes acceder desde cualquier programa con soporte para puerto serie.

Haciéndolo con CDC para mandar 12 bits, tendrías que mandar 2 bytes e interpretarlos en el micro.


----------



## Moyano Jonathan (Mar 17, 2009)

Freddilucero tu programa de control en VB 6.0 la podes postear para ver como has hecho el control. Me gustaría comenzar con una idea de como hacerlo y despues le meto USB y wala......tenés tu control de motores PAP USB.


----------



## FREDDIELUCERO (Mar 17, 2009)

```
Option Explicit

Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte)
'variables para lectura de código
Dim cCadena As String
Dim cLetra As String * 1
Dim cCodigoP As String * 2
Dim cX As String, cY As String
Dim nComa As Integer, nLargoCad As Integer
Dim n As Integer, nFin As Integer, Rta As Integer
Dim xi As Single, yi As Single

Dim bArriba As Boolean, bSubir As Boolean 'variables para el taladro
'matrices para motores(8 pasos para cada motor)
Dim BitEjeZ(8) As Byte, BitEjeX(8) As Byte, BitEjeY(8) As Byte
'datos para cada elemento de las matrices
Dim nBitx As Integer, nBity As Integer, nBitz As Integer
'variables para retardos
Dim VelocDesp As Integer
Dim VelocPerf As Integer
Dim TT As Integer, T As Integer
'variables para cálculo de desplazamiento
Dim nNewX As Single, nNewY As Single, nNewZ As Integer
Dim nPlusx As Single, nPlusy As Single, nPrevx As Single, nPrevy As Single
Dim Profund As Integer, nEscala As Integer, nPrevz As Integer

Private Sub cmdCargar_Click()
    Timer1.Enabled = False
    ' CancelError es True.
    On Error GoTo solucion
    ' Establece los filtros.
    CommonDialog1.Filter = "All Files (*.*)|*.*|Ploter (*.cnc)|*.cnc"
    ' Especifica el filtro predeterminado.
    CommonDialog1.FilterIndex = 2
    ' Presenta el cuadro de diálogo Abrir.
    CommonDialog1.ShowOpen
    Dim lineareg As String
    Open CommonDialog1.FileName For Input As #2
    n = 0
    ' Carga el archivo plt en un list
    While Not EOF(2) ' lee mientras el archivo no termine
        Line Input #2, lineareg ' lee desde la primera linea
        lineareg = Trim(lineareg)
        lstCodigo.AddItem lineareg, n
        n = n + 1
        lstCodigo.Refresh
    Wend
    Close #2
    n = 0
solucion:
    Exit Sub
End Sub

Private Sub cmdContinuar_Click()
    Timer1.Enabled = True
End Sub

Private Sub cmdDetener_Click()
    Timer1.Enabled = False
End Sub

Private Sub cmdLimpiar_Click()
'limpia el list para cargar un nuevo archivo
    nFin = lstCodigo.ListCount
    lstCodigo.ListIndex = 0
    For n = 0 To nFin - 1
        lstCodigo.RemoveItem 0
    Next
    lstCodigo.Refresh
    Picture1.BackColor = &H0
End Sub

Private Sub cmdTrazar_Click()
    nPrevz = 0
    nPrevx = 0
    nPrevy = 0
    bSubir = True
    nNewZ = Val(txtProfundidad.Text)
    Timer1.Enabled = True
End Sub

Private Sub Form_Load()
    'apaga el puerto
    Call PortOut(888, 0)
    Call PortOut(890, 11)
    'carga valores iniciales para la velocidad de motores
    hscPerforacion.Value = 6
    hscDesplazamiento.Value = 8
End Sub

Private Sub Form_Resize()
' si se modifica la ventana y no está minimizado entonces
If WindowState <> 1 Then
    'se desplazan el picture y el frame con sus controles
    Picture1.Width = Form1.Width - 3210
    Picture1.Height = Form1.Height - 960
    Frame1.Left = Form1.Width - 2790
    Frame2.Left = Form1.Width - 2790
    'aquí se mantendran la coordenada de origen de y
    'en la parte inferior de picture aunque este cambie de tamaño
    Picture1.ScaleTop = -Picture1.Height
End If
End Sub

Private Sub hscDesplazamiento_Change()
    'muestra el valor de la velocidad en los ejes x,y
    Label9.Caption = hscDesplazamiento.Value
End Sub

Private Sub hscPerforacion_Change()
    'muestra el valor de la velocidad en el eje z
    Label8.Caption = hscPerforacion.Value
End Sub

Private Sub Timer1_Timer()
    nEscala = Val(txtEscala.Text)           'carga la escala
    cCadena = ""                            'limpia la variable que carga la 1º linea
    cCadena = lstCodigo.Text                'lee la primer línea de código
    nLargoCad = Len(cCadena)                'calcula longitud del código
    cCodigoP = Left(cCadena, 2)             'toma las dos primeras letras de la línea
    On Error GoTo Solutions                 'por si surge algún error
        
    If cCodigoP = "SP" Then                 'si se lee la última línea de código
        Timer1.Enabled = False              'detiene el timer
        Rta = MsgBox("Grafico Finalizado", vbInformation, "Graficadora CNC") 'y muestra un mensaje de finde trazado
        Call PortOut(888, 0)
        Call PortOut(890, 11)
    End If
    'ahora se incrementa el puntero en el list
    lstCodigo.ListIndex = lstCodigo.ListIndex + 1
    'Aquí se buscan los valores para x y para y
    If nLargoCad > 3 Then
        nComa = InStr(cCadena, ",")         'busca la ubicación de la coma
        cX = Mid(cCadena, 3, nComa - 3)     'carga el valor para el eje x
        nNewX = Val(cX) * nEscala           'lo multiplica por el valor de la escala
        cY = Mid(cCadena, nComa + 1, nLargoCad - Len(cX) - 1) 'carga el valor para el eje y
        nNewY = Val(cY) * nEscala           'lo multiplica por la escala
    End If
    Timer1.Enabled = False
    Mover
Solutions:
    Exit Sub
End Sub

Private Sub cmdSalir_Click()
    Call PortOut(890, 11)
    Call PortOut(888, 0)
    End
End Sub

Private Sub Mover()
    BitEjeZ(0) = 10
    BitEjeZ(1) = 8
    BitEjeZ(2) = 9
    BitEjeZ(3) = 13
    BitEjeZ(4) = 15
    BitEjeZ(5) = 7
    BitEjeZ(6) = 3
    BitEjeZ(7) = 2
    
    BitEjeX(0) = 1
    BitEjeX(1) = 3
    BitEjeX(2) = 2
    BitEjeX(3) = 6
    BitEjeX(4) = 4
    BitEjeX(5) = 12
    BitEjeX(6) = 8
    BitEjeX(7) = 9
    
    BitEjeY(0) = 16
    BitEjeY(1) = 48
    BitEjeY(2) = 32
    BitEjeY(3) = 96
    BitEjeY(4) = 64
    BitEjeY(5) = 192
    BitEjeY(6) = 128
    BitEjeY(7) = 144
'************************************************************
'Desplazamiento para el eje z
    '-----------si el taladro está abajo debe subir-------------
    If cCodigoP = "PU" Then
    nBitz = 0
Subir:
        VelocPerf = (15 - hscPerforacion.Value) * 10    'velocidad para subir
        If nPrevz > 0 Then          'sube hasta la posición 0
            nPrevz = nPrevz - 1
            nBitz = Int(nPrevz) Mod 8
            Call PortOut(890, BitEjeZ(nBitz)) 'aquí se manda el dato al puerto
            'Retardo
            For TT = 1 To VelocPerf
                For T = 1 To 10000: Next T
            Next TT
            GoTo Subir
        End If
        'de ahora en más el taladro permanece arriba
    End If
    '-----------si el taladro está arriba debe bajar------------
    If cCodigoP = "PD" Then
    nBitz = 0
Bajar:
        VelocPerf = (15 - hscPerforacion.Value) * 10    'velocidad para bajar
        If nPrevz < nNewZ Then 'baja hasta la posicion indicada en nNewZ
            nPrevz = nPrevz + 1
            nBitz = Int(nPrevz) Mod 8
            Call PortOut(890, BitEjeZ(nBitz)) 'aquí se manda el dato al puerto
            'Retardo
            For TT = 1 To VelocPerf
                For T = 1 To 10000: Next T
            Next TT
            GoTo Bajar
        End If
        'de ahora en más el taladro permanece abajo
    End If
    Call PortOut(890, 11)
'************************************************************
'Desplazamiento para los ejes x-y

    '****************************************************
    If cCodigoP = "PU" Then bArriba = False 'sube lápiz
    If cCodigoP = "PD" Then bArriba = True 'baja lápiz
    '****************************************************
graficar:
    VelocDesp = (15 - hscDesplazamiento.Value) * 10
    'busca diferencias entre origen y destino
    If nNewX <> nPrevx Then xi = Abs(nNewX - nPrevx)
    If nNewY <> nPrevy Then yi = Abs(nPrevy - nNewY)
    'según la diferemcia que exista entre x,y
    'hay tres posibilidades
    'incrementará el eje x, luego calculará el de y
    If xi > yi Then
        nPlusx = 1
        nPlusy = yi / xi
    End If
    'incrementará eje y, luego calculará el de x
    If xi < yi Then
        nPlusx = xi / yi
        nPlusy = 1
    End If
    'incrementará los dos por igual
    If xi = yi Then
        nPlusx = 1
        nPlusy = 1
    End If
    'se actualizan las coordenadas mientras avanza
    If nPrevx < nNewX Then nPrevx = nPrevx + nPlusx
    If nPrevx > nNewX Then nPrevx = nPrevx - nPlusx
    If nPrevy < nNewY Then nPrevy = nPrevy + nPlusy
    If nPrevy > nNewY Then nPrevy = nPrevy - nPlusy
    
    nBitx = Int(nPrevx) Mod 8
    nBity = Int(nPrevy) Mod 8
    Call PortOut(888, BitEjeX(nBitx) + BitEjeY(nBity))
    'pixeliza la línea en el Picture1 (color rojo)
    If bArriba = True Then Picture1.PSet (nPrevx, -nPrevy), RGB(255, 0, 0)
    'Retardo
    For TT = 1 To VelocDesp
        For T = 1 To 10000: Next T
    Next TT
    'si termina de dibujar detiene el timer
    If nPrevy = nNewY And nPrevx = nNewX Then
        Timer1.Enabled = True
    Else
        GoTo graficar 'Si no terminó, sigue graficando
    End If
End Sub
```


ese es el programa para visual basic........este programa toma un codigo que abre este mismo programa y lo lee,segun esas instrucciones mueve los motores........

  Call PortOut(890, 11)...................con esta instruccion manda  el dato al puerto.......el tema es que aqui manda el numero 11 que en binario es 1011..es decir envia 4 bit..por 4 pines del puerto db25.

esto es lo que necesito cambiar.........enviar ese numero 11 por el puerto usb.....y que llegue a por ejemplo rb0...rb4.es decir 4 pines del pic.......el resto lo hace la electronica que yo manejo en mi proyecto.........

ojala me entiendan aca.y me ayuden a lograrlo

estare atento 

saludos

muchas gracias..


----------



## fernandoae (Mar 18, 2009)

Otra alternativa es usar algunos de los convertidores de FTDI

http://www.ftdichip.com/FTProducts.htm


----------



## FREDDIELUCERO (Mar 18, 2009)

esto viene listo?..de igual manera quiero lograrlo desarrollando todo la circuiteria ....

hoy compro el pic 18f2550 ,porque quiero comenzar a realizar las pruebas.....

me interesa realizar ese proyecto de comandar mis motores por el usb.......

cualquier cosa que logre..aviso resultados.......

saludos


----------



## molocas (Mar 26, 2009)

puedes usar 3 ttl 7475 latch con pin C (enable chip) , de este modo solo ocupas 7 lines de datos 
para los tres motores.


----------



## Moyano Jonathan (Mar 29, 2009)

Yo estoy usando un 74LS164 para manejar los motores con un L293B como driver y funciona muy bien solo utilizo 3 lineas del pic para controlar el motor.


----------



## aurex (Abr 16, 2009)

Moyano Jonathan dijo:
			
		

> Yo estoy usando un 74LS164 para manejar los motores con un L293B como driver y funciona muy bien solo utilizo 3 lineas del pic para controlar el motor.



Hola que tal, podrias postear el esquema que utilizas? o alguna pagina con esa información? 

Me suena interesante tu solución.
gracias!


----------



## Moyano Jonathan (Abr 18, 2009)

El diseño es mio , luego te paso los esquematicos y el código fuente.


----------



## aurex (Abr 24, 2009)

Ok los esperare muchas gracias de nuevo


----------



## Moyano Jonathan (Abr 24, 2009)

Perdón no te postee lo que pediste por que no lo tenía al esquemático lo había hecho en una hoja de papel así nomás. Pero aguantame y más tarde veo como te lo paso.


----------



## Amaro (Jun 28, 2009)

mira si te sirve de algo, este compadre polaco armo un adapador usb para un programa llamado discolitez

este prog usa los pines del 2 a9 del lpt 

acabo de verlo y me parece interesante


----------



## ketronica (Sep 14, 2009)

Hola a todos estoy interezado en el tema de control por USB, hace tiempo descargue un ejemplo de sixca y lo he simulado en proteus y funciona bien el sofware esta en delphi6 y el harware del pic 18F4550 en C de microchip


----------



## Daniel81 (Jun 4, 2010)

Sera posible programar en .asm con tasm o masm para controlar el puerto usb sin microcontroladores o sin interface? Encontre esta pagina con un codigo para controlar hid's con un pic P16C745 talvez se pueda modificar para controlar motores. 
http://www.alanmacek.com/usb/hidclass.asm


----------



## ketronica (Jun 13, 2010)

el software de r-luis que es para una graficadora ppuerto paralelo. lo modifique y lo converti a puerto serial RS232 los datos los recive el pic16F877 Modulo USART, en CCS Pic y recibe el dato pero en caractere se declara una variable array para recivir los caracteres el CCS Pic rae una funcion para convertilos, leo el USART por interupcion lo guardo en el array luego comparo el ultimo caracter este indicara que hacer con los datos anteriores, por ejemplo el sofware en visual basic envia d1000X Si el ultimo caracter es X movera el motor X el inputbufer[0] que es el caracter "i" o "d" sera la direccion ejemplo:

inputbufer[0] si es i poasos a la izquierda si es d pasos a la derecha
inputbufer[1] se suman los caracteres se hace una cadena y luego se conviete a enteros
inputbufer[2] y se guarda en la cantidad de pasos
inputbufer[3]
inputbufer[4]
inputbufer[5] Si es X llama la rutina mover X , Y o Z igual

por el puerto USB creo que es igual tengo un ejemplo que baje de NeoTeo y lo simule y funciona, estoy trabajando en mi rotuladora de PBC la hice de madera PDF y correderas de gabetas de cocina aqui unas fotos

Las fotos las tome en Mayo del 2010

No ajuste la fecha de la camara y por defecto salen del 2006

Aqui hay un proyecto bueno CNC USB
http://www.mycncuk.com/forums/showthread.php?435-USB-TO-Parallel-Port-DIY-Interface


----------

