TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Moyin en 19 de Octubre de 2006, 02:12:02

Título: Control Motor PAP
Publicado por: Moyin en 19 de Octubre de 2006, 02:12:02
Hola buenos amigos del foro, estoy tratando de realizar el control de un PAP pero revisando ejemplos con PIC'S encuentro que para invertir la secuencia o giro del motor todos los programas terminan el ciclo antes de invertir el giro, esto hasta cierto punto no es tan grave ya que 4 pasos no son nada para ciertas aplicaciones y es tolerable este pequeño avance, yo he realizado con PLD(Gal) secuencias para steeper y como los manejo por estados puedo invertir el giro en cualquier momento y no tengo qu esperar a que se cunplan todos los estado para que cambie la secuencia, mi duda es como puedo hacer esto con un PIC, imagino que tengo que cargar el paso en alguna memoria para después leerla y ver hacia donde avanzo atrás o adelante, supongo esto, no tengo idea de como llevarlo con PIC, estoy manejando todo con MKB y es como pretendo hacerlo, si me dan una idea de como hacerlo se los agradeceré....Gracias :mrgreen:
Título: Re: Control Motor PAP
Publicado por: navaismo en 19 de Octubre de 2006, 02:28:25
Hola MOYIN, pues podiras usar un driver, aunque no he usado nunca uno, no se si te sirva el L293D, en BASIC  para usar motores paso a paso podrias usar las recomendaciones de amigos del foro como son los vectores, yo alguna vez en PBP use LOW y HIGH aunque si es un desperdicio. Lord me comento esto de los vectores

Hola:

pues efectivamente no puedes hacer eso... pero puedes sustituirlo por un vector y asignar cada secuencia a un indece y luego asignar al puerto el valor coreespondiente del subindice del vector:

Algo asi:

vec var byte [10]
i      var byte

vec[0]=%00000001
vec[1]=%00000010
-
-
-
-

loop:
        for i=0 to 10
             -
             -
             -
             portc=vec[ i ]
             -
             -
             -
        next i 
    goto loop
    end

Algo como eso... o tambien utilizando la funcion LOOKUP....

Suerte....!

O este otro

Hola:

Pues para comandar motores de pasos....

Tambien podrias hacerlo asi

loop:
        PORTC=%01010101
        pause 50
        PORTC=%01010110
        pause 50
        goto loop

Con las secuencias correspondientes y el numero de veces que sea necesario para mover el motor.... yo lo he hecho con vectores como en el ejemplo de arriba para comandar motores PAP....

Lo hacia dentro de un bucle repeat - until... hasta una condicion deseada....

Espero te sirva de algo o que te de una idea



Título: Control Motor PAP
Publicado por: manupri en 23 de Mayo de 2008, 10:43:50
Hola a todos , soy nuevo en el foro, pero lo mejor es que me encanta el mundo de los pic, y me gustaría hacer una pregunta a navaismo si no tiene inconveniente en responderme.
Navaismo estoy haciendo un pequeño esperimento con un motor PaP bipolar, usando un Driver L293B y in PIC 16f84A, y estoy aprendiendo como puedo, entre lo que veo en el foro y algunos manuales de internet a programar con protón, de momento todo me funciona, pero mi problema es que necesito hacer andar dicho motor hacia delante y cuando pulse un Button que el motor gire al contrario pero solo el tiempo que yo le asigne, no se si me explico.
En realidad  mi código lo que hace es poner en funcionamiento el motor haciadelante y cuando pulso el Button lo hace hacia atras, pero no lo puedo parar  aún pulsando de nuevo el Button ,tengo que interrumpir  la animación en proteus.
Te muestro el código a ver que piensas

Es éste:


DEVICE  16F84a   'PIC que voy a usar
XTAL 4                'frecuencia del crystal

  clear ' si no hay variables despues de esta instrucción aclaro la RAM del PIC

 TRISB=%00000000 ' dirección de datos donde configuro los pin del Puerto B como salida

       inicio:  ' etiqueta donde volvere con goto
 
              if porta.0=0 then 'compruebo si el pin 0 del puerto A es pulsado

                        portb=%00000110 : delayms 25  ____
                        portb=%00000100 : delayms 25        '
                        portb=%00001000 : delayms 25        ----- asignación de pasos y pausas a los pin del port b (salida hacia el motor)
                        portb=%00001010 : delayms 25  ____'
 
             else  ' si no es pulsado ocurre lo siguiente

                       portb=%00001010 : delayms 25  ____
                       portb=%00001001 : delayms 25        '
                       portb=%00000101 : delayms 25        ----- asignación de pasos y pausas a los pin del port b (salida hacia el motor)
                       portb=%00000011 : delayms 25  ____'


            endif ' fin de la instrucción if then
 
  goto inicio ' nos vamos de nuevo ala etiqueta inicio

end. ' y terminamos


 navaismo corrije este desastre porfa, como te dije lo que quiero hacer es que cuando se pulse el button el motor gire al contrario el tiempo que yo determine y luego vuelva  a girar hacia delante hasta una nueva pulsación  y asi sucesivamente.


gracias y un Saludo
 
Título: Re: Control Motor PAP
Publicado por: navaismo en 23 de Mayo de 2008, 14:32:36
Hola segun veo el codigo solo usas un boton, Y supongo que cuando esta en alto quieres que vaya hacia atras, entonces creo que lo que te falta declarar es es TRISA.0=1 asi le dices que ese pin sera entrada y te evaluara sus estados.


Si lo que quieres hacer es usar un solo boton y cada que lo presiones gire en un sentido haz que el boton incremente una variable y despues evalua esta variabla algo como

c=0
If c>=3 then
 c=0
endif

if porta.0 = 1 then
pause 150 'antirebote
if porta.0 = 1 then
c=c+1
endif
endif

select case c
case 1 gosub adelante
case 2 gosub atras
end select


y tus rutinas....


Espero me explique cualquier cosa nos avisas



Título: Re: Control Motor PAP
Publicado por: manupri en 23 de Mayo de 2008, 15:28:13
Hola de nuevo, no sabes la alegria que me da poder entrar en el foro y ver que me responden, de esa manera  me siento participe, aunque  carezco de esperiencia y soy un profano en la programación pero intentare compartir todo lo que este en mis manos ,gracias
Ante todo decirte que tengo declarado el TRISA=%11111 , solo que en el ejemplo anterior no lo inclui, aún no he probado el código que tu expones, lo de incrementar la variable , primero, por que como te he dicho no tengo muy claro lo de la programación y no entra en mis principios hacer algo que no entiendo, de todas formas voy a probar ese trozo de código, y luego te comento.
Ahora comprueba  aver si he comprendido tu código

C=0     ' declaramos c  con el valor de 0
IF C>=3 THEN ' si C es igual o mayor a 3 entonces
C=0     'C sigue teniendo el valor de 0
ENDIF  ' terminamos la comparación

 (no comprendo por que si porta.0=1  que se haga una pausa, sigo)

IF PORTA.0=1 THEN    ' si el pin 0 del PuertoA es igual a entrada( pulsado) entonces
DELAYMS 150  ' pausamos 150 milisegundos, ( nose que quieres decir con antirebote, he leido algo pero no recuerdo)
IF PORTA.0=1 THEN  ' si el pin 0 del PuertoA es igual a entrada(pulsado) entonces
C=C+1  ' el valor de C se incrementa a 1
ENDIF   ' fin del 1º IF  THEN
ENDIF   'fin del 2º IF   THEN


SELEC CASE C  ' no tengo ni idea de su significado

CASE 1 GOSUB ADELANTE '  creo que quiere decir que en caso de que el valor de C sea 1 vaya ha la etiqueta ADELANTE y                   

                                        'ejecute lo que encierre la misma ,en este caso  los PORTB=%XXXXXXXX   de mi código no?


CASE 2 GOSUB ADELANTE '  creo que quiere decir que en caso de que el valor de C sea 2 vaya ha la etiqueta ATRAS y                   

                                        'ejecute lo que encierre la misma ,en este caso  los PORTB=%XXXXXXXX   tambien



END SELECT   ' ni idea me lo tienes que explicar



Vueno  aver  que te parece, no se si  lo he interpretado bien o no me he enterao de na
ya me cuentas luego, quisiera decirte que  lo que necesito es un codigo el cual me haga andar el motor  hacia la derecha y que cuando se presione  un pulsador botón haga que el motor gire hacia la izquierda un intervalo de tiempo por ejemplo (250ms) y transcurrido ese intervalo de tiempo vuelva automaticamente de nuevo a girar hacia la derecha otra vez.

Que cada vez que se pulse gire ala izquierda esos 250ml.
Espero haberme esplicado, no quiero agobiar con tantas preguntas, ahora voy a probar con tu código, en cuestión de minutos te contesto con el resurtado.

Gracias y saludos
Título: Re: Control Motor PAP
Publicado por: manupri en 23 de Mayo de 2008, 16:03:58
hola  , estoy aqui de nuevo hace nada he probado el codigo, asi es como lo interprete,

device 16f84A ' PIC a usar
xtal 4 'frecuencia a usar


 'TRISA.0=1
 TRISB=%00000000
'PORTB=0
dim c as Byte


 c=0
 if c>=3 then
 c=0
 endif


   if porta.0=1 then
   delayms 150
   if porta.0=1 then           
      
      c=c+1
      endif
      endif
   
 select Case c
 
 case 1
 gosub adelante
 case 2
 gosub atras
 end select
      
      adelante:
      portb=%00000110:delayms 25
      portb=%00000101:delayms 25
      portb=%00001001:delayms 25
      portb=%00001010:delayms 25
   return
   
   
    atras:
     portb=%00001010:delayms 25
     portb=%00001001:delayms 25
     portb=%00000101:delayms 25
     portb=%00000110:delayms 25
   
     return 



no se si lo he correcto, el caso es que el motor en la simulación de proteus  solo funciona durante unos segundos y luego se queda completamente parado, e lpulsador queda bloqueado osea no hace nada, cambie el pulsador por un SWITCH (interruptor) pero tampoco responde, que piensas que puede ser  navaismo??
Título: Re: Control Motor PAP
Publicado por: navaismo en 23 de Mayo de 2008, 16:12:04
Bien el antirrebote es para que el pic solo detecte un solo 1 cuando aprietas el switch; los switchs al ser de contactos mecanicos tardan algunos Milisegundos en acloparse lo cual genera rebotes entre los estados 1 y 0 logicos, los PICs son capaces de detectar estos saltos por eso ponemos esas pausas para que efectivamente lea ese estado y no se confunda con ruido.

La instruccion SELECT CASE lo que hace es evaluar la variable o puerto depende lo que quiera que este delante de la instruccion esta se basa en casos los casos como puedes ver pueden tener un valor el que tu quieras incluso una letra ya que tomaria su valor ascii. Puede tener tantos casos quieras -solo no abusar- en cada caso puedes meter las instrucciones que desees, en este caso lo enviamos a esas etiquetas. Y su sintaxis es:

Select case variable
casos...
....
end select

Mas informacion en la ayuda.


Sobre tu programa yo lo que haria seria algo como esto:


Main:

Gosub Adelante

if porta=0 then atras

goto Main:

Adelante:
tus rutinas de manejo de motor
Return 'regresa a la ultima linea despues del gosub

Atras
 for i=0 to 25
 rutina de atras
 pause 100
 next i
goto main ' aqui no usa return ya que no fue un gosub


Algo asi mas o menos seria para mi lo mas practico.
Título: Re: Control Motor PAP
Publicado por: manupri en 23 de Mayo de 2008, 18:27:07
Hola navaismo, ante todo muchas gracias por tu ayuda y ofrecimiento, decirte que he compilado el codigo pero sigue sin responder  a lo que yo realmente deseo con esto me refiero a proteus en la simulación, puesto que la primera reacción del motor ante el código compilado que propusiste es: Un par de vueltas hacia la derecha y luego  vueltas pausadas hacia la izquierda, en las cuales hay en cada ciclo de no se exactamente cuantas vueltas, una nueva vuelta ala derecha y de nuevo otra vez hacia la izquierda, vueltas como ya te digo alternas entre vuelta y pausa.
Luego cuando pulso el botón tarda unos segundos en reaccionar y entonces comienza a girar hacia la derecha, estos si son giros e progresivos y sin pausa alguna, pero vuelvo a pulsar el botón y no ocurre nada, te dejo una imagen del circuito a ver si notas algo  contrario a lo correcto..
Decirte en un momento dado es casi lo que necesito, eso si, que no durara tanto tiempo el giro hacia la izquierda.
saludos de nuevo y gracias.

este es el código por si ves algo anormal:



   device 16f84A
   xtal 4

 TRISA.0=1
 TRISB=&00000000

DIM I AS BYTE

        main:
   
        Gosub adelante

          if porta=0 then atras

        goto main


adelante:
           portb=%00000110 : delayms 25
           portb=%00000100 : delayms 25
           portb=%00001001 : delayms 25
           portb=%00001010 : delayms 25



  return


atras:
          for I=0 to 25


           portb=%00001010 : delayms 25
           portb=%00001001 : delayms 25
           portb=%00000101 : delayms 25
           portb=%00000110 : delayms 25

Delayms 25

Next i


Goto main




     
Título: Re: Control Motor PAP
Publicado por: manupri en 23 de Mayo de 2008, 18:30:50
La imagen no la puedo subir, el motivo es que la salve muy pesada y  no se admiten mayor peso de 250k
Estoy intentando adelgasar la imagen en breve la subo.
Saludos
Título: Re: Control Motor PAP
Publicado por: navaismo en 23 de Mayo de 2008, 18:33:38
A es verdad mete esta parte if porta=0 then atras en la subrutina de Adelante para que se corte sin retardos, Sobre las pausas es por el PAUSE dentro del for esto lo puedes quitar el for esra para darte una idea de como crear una rutina de tiempo.

Y no veo el circuito
Título: Re: Control Motor PAP
Publicado por: navaismo en 23 de Mayo de 2008, 18:39:31
Haber intenta asi:

device 16f84A
   xtal 4

 TRISA.0=1
 TRISB=&00000000

DIM I AS BYTE

main:
   
        Gosub adelante

          if porta=0 then atras

goto main


adelante:

if porta=0 then atras

           portb=%00000110 : delayms 25
           portb=%00000100 : delayms 25
           portb=%00001001 : delayms 25
           portb=%00001010 : delayms 25
  return


atras:
    for I=0 to 250
           portb=%00001010 : delayms 25
           portb=%00001001 : delayms 25
           portb=%00000101 : delayms 25
           portb=%00000110 : delayms 25
Next i
Goto main
Título: Re: Control Motor PAP
Publicado por: manupri en 23 de Mayo de 2008, 19:15:29
Navaismo con estos cambios que efectuo en los IF THEN el motor comienza a girar hacia la derecha y cuando pulso el button lo hace hacia la izquierda, pero no un tiempo determinado como deseo sino que sigue girando sin parar.
Que se puede hacer al respecto.

Este es el código, aver si se logra parar el dichoso motor


device 16f84A
   xtal 4

 TRISA.0=1
 TRISB=&00000000

DIM I AS BYTE

main:
   
        Gosub adelante

          if porta=1 then atras ' en vez de salida 0 un 1 entrada

goto main


adelante:

if porta=1 then atras ' aqui  igual 1 en vez de 0

           portb=%00000110 : delayms 25
           portb=%00000100 : delayms 25
           portb=%00001001 : delayms 25
           portb=%00001010 : delayms 25
  return


atras:
    for I=0 to 3
           portb=%00001010 : delayms 25
           portb=%00001001 : delayms 25
           portb=%00000101 : delayms 25
           portb=%00000110 : delayms 25
Next i
Goto main
Título: Re: Control Motor PAP
Publicado por: navaismo en 23 de Mayo de 2008, 19:21:02
mira el tiempo depende de los ciclos del for sumados a las pausas que esten dentro de este mismo. Por ejemplo en tu codigo tienes un for que se repite 4 veces y cada ciclo por las pausas dura 100mS por los delay de 25mS por lo que yo deduzco que girara durante 400mS o lo que seria lo mismo 4 pasos. Me captas?
Título: Re: Control Motor PAP
Publicado por: manupri en 23 de Mayo de 2008, 19:21:52
No quiero ser pesaito, pero incluso si lo fuese es algo emocionante descubrir que algo  comienza a funcionar
Siento las molestias que te causo, pero eres mi unica salvación, estoy ilusionado con esta web, mi proyecto y tus conocimiento de manera que te agradezco todo el esfuerzo, a ver si se bate el record  i se consigue parar el motor y que despues de unos instante vuelva a girar en el sentido en que comienza.
Título: Re: Control Motor PAP
Publicado por: manupri en 23 de Mayo de 2008, 19:28:54
Osea 25 milisegundos del delay por 4 del FOR asi por 4 veces  correcto??
Quieres decir que transcurrido ese tiempo devería de parar???.
¡ha estoy ejecutando paso a paso el codigo en proteus y veo que cuando se termina el ciclo d 4 veces del FOR salta al GOSUB empezar, en vez de pasar por el GOTO main que va despues del NEXT, no lo entiendo,  pienso que si no se fuese al GOSUB y pasara por el GOTO comenzaría a girar basado en la subrutina ADELANTE, no se si me explico?
Título: Re: Control Motor PAP
Publicado por: navaismo en 23 de Mayo de 2008, 19:35:16
No te preocupes todos empezamos desde cero o al menos yo empece igual, nunca hay preguntas tontas ni desesperantes, creo que la ignorancia es un derecho que se puede corregir y veo con agrado que eres de esos que lo intentan hasta que queda eso es muy bueno.

Con respecto al FOR casi le atinas son 100 porque dentro del for existen 4 pausas de 25mS si agregas una mas ya serian 125mS eso dura cada ciclo, lo que un FOR hace es repetir el codigo dentro de el las veces indicadas en los pasos indicados, en tu ejemplo el FOR hace 4 ciclos pues va de 0 a 3 el primer paso la i es igual a 0 ahi hara lo que tiene dentro osea tus pasos y lo repetira hasta que i tenga el valor de 3 una vez que se cumple el ciclo de 3 se sale y continua con el programa en este caso salta a MAIN.

Y si todo lo que se te imagine hacer con tu motor es posible, solo ayudanos a aterrizarlo.
Título: Re: Control Motor PAP
Publicado por: manupri en 23 de Mayo de 2008, 19:43:02
Gracias por tus palabras avaismo, quería decirte que he observado lo siguiente
estoy ejecutando paso a paso el codigo en proteus y veo que cuando se termina el ciclo d 4 veces del FOR salta al GOSUB ADELANTE, en vez de pasar por el GOTO main que va despues del NEXT, no lo entiendo,  pienso que si no se fuese al GOSUB y pasara por el GOTO el problema estaría resuelto, que puede suceder para que salte al gosub??
Título: Re: Control Motor PAP
Publicado por: navaismo en 23 de Mayo de 2008, 19:47:37
A cual Gosub Salta??? Al de adelante si hace eso es que esta bien, creo que no se ve las etiquetas o mas bien el debuggeo de las etiquetas en la depuracion.
Título: Re: Control Motor PAP
Publicado por: manupri en 23 de Mayo de 2008, 20:12:41
SI salta al ( GOSUB adelante ) pero luego se detiene  en  la comparación del  (IF porta=1 then atras ) y al comprobar que el botón sigue pulsado vuelve a saltar ala etiqueta( atras: ) asi sucesivamente.
Creo que el problema radica en el botón  no entiende cuando esta activado y cuando no lo está
Título: Re: Control Motor PAP
Publicado por: manupri en 23 de Mayo de 2008, 20:27:43
Bueno voy a descansar un poco mañana te seguire dando el coñazo, al meno se ha descubierto que el salto es erroneo ya que comprueba con IF THEN y en dicha comprobación  el button esta pulsado lo que obliga a saltar ala subrutina de la etiqueta atras:.
no se si me explico, de todas formas mañana si dios quiere seguimos con el tema, vuelvo a agradecer tu paciencia.
hasta mañana y un cordial saludo.
Título: Re: Control Motor PAP
Publicado por: navaismo en 23 de Mayo de 2008, 20:54:42
Oye el error esta en que no definimos que porta es solo tenemos PORTA=1 eso evalua todo el PORTA creo que era el RA0 no?? ups es lo mismo pero por si las dudas pon porta.0=1.

Esperemos que sea eso.
Título: Re: Control Motor PAP
Publicado por: todopic en 23 de Mayo de 2008, 21:01:26
Hola Amigos!  Manupri, reemplaza el ultimo goto main por RETURN
creo que alli esta el error, luego nos comentas...

Suerte!

Norberto
Título: Re: Control Motor PAP
Publicado por: manupri en 16 de Junio de 2008, 12:09:30
Hola de nuevo y gracias tanto a navaismo como Norberto.
Siento mucho no haber contestado antes estube de vacaciones y no pude entrar al foro, solo decir que efectivamente el motor si que realiza la función deseada, pero encuentro un pequeño inconveniente , y es que el motor cuando esta haciendo el giro normal hacia la derecha antes de pulsar el button, me gira como tartamudeando, osea dos vueltas un pequeño giro hacia detras, dos vueltas, un pequeño giro hacia detras etc.. y asi sucesivamente, que creeis que pueda ser??
a! si soys tan amable me gustaría que me pasaseis un esquema para un detector de obstaculos  que no fuese tan complejo, tengo el emisor y receptor, un tip 41 ,resistencias, etc, bueno mejor os muestro un esquema que baje de la red el cual no logro hacer funcionar comentadme algo al respecto porfa
un cordial saludo
Título: Re: Control Motor PAP
Publicado por: manupri en 16 de Junio de 2008, 12:36:54
Hola , he rectificado  según vuestras observaciones, como bien decia Norberto cambiando el goto por return iría mejor, pero he comprobado que me da errores en proteus..( Stack underflow  executing RETURN intstruction ), y con el goto no los da, de manera que he dejao el goto main, lo de los saltos del motor eso que comente anteriormente sobre el tartamudeo del motor lo he soluciondado , se devia a las demoras, unas eran más cortas que otra de ahí el problema, quiero decir los pause o delayms dentro de la variable adelante: tenian un valor distinto que los que están dentro de la variable atras:.
Y bueno ese era el error del motorcillo, otra cosita? existe alguna forma de  conectar en el L293B dos motores bipolares???, o tengo que usar obligatoriamente dos L293B? ydos L293B?? puedo conectarlos a un pic? o tengo que usar dos pic pa dicho cometido?? gracias de antemano maestros y un cordial saludo, !! no olvideis lo del esquemita para dectectar obstaculos porfa..
Título: Re: Control Motor PAP
Publicado por: navaismo en 16 de Junio de 2008, 13:25:39
Hola Manupri, sobre lo que comentas del RETURN y GOTO te explico porque: Cuando usas un RETURN estas obligado a usar previo a este un GOSUB para que el return sepa a donde regresar, como en el programa usas directamente el salto condicional del IF el return hace que se trabe el programa por ello use el GOTO que te manda de regreso ya que no usamos un GOSUB.

Sobre los L293 que yo sepa sopoortaban 2 motores y si estos los puedes conectar a un PIC, usa el buscador y notaras la cantidad de post sobre ese integrado y sobre sus conexiones.

Para un detector de obstaculos puedes usar el sensor IS471F

Cita de: Robodacta
SENSOR INFRAROJO SHARP IS471F.

Este sensor da a los robots la capacidad de detectar objetos que se encuentren en un rango aproximado de 1 a 15 cm.
Es parecido al PNA4602 en que recibe solamente luz infraroja modulada a 38khz rechazando cualquier otra fuente de luz externa, pero con la ventaja de que ya tiene intregrado el oscilador, simplemente tenemos que conectarle un diodo infrarojo de 940NM en uno de sus pines, una resistencia de 280ohms y un capacitor de 0.33uf.

Cuando detecte un objeto la salida tendrá un estado bajo "0", en caso contrario un estado alto "1". Esta salida puedes enviarla directamente a la entrada de algún micro, circuito integrado o transistor.

Puede ser utilizado en robots evasores de obstáculos mediante infrarojo, robots sumo para detectar oponentes,etc.