Autor Tema: Otra de servos  (Leído 6355 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado db25.

  • PIC10
  • *
  • Mensajes: 24
Otra de servos
« en: 26 de Mayo de 2007, 17:43:44 »
ya estoy otra vez. he estado mirando algunos post sobre el manejo de servos y he hecho este programa cristal de 4mhz:



inicio:


if porta.1=1 then
gosub der
endif

if porta.0=1 then
gosub izq
else
gosub cen
endif
goto inicio

cen:
     High porta.2   
     pauseus 1495
     low porta.2
     goto inicio


izq:
     High porta.2   
     pauseus 2000
     low porta.2
     goto inicio
   
der:
   high porta.2
   pauseus 980
   low porta.2
   goto inicio
   
        end

Al conectarlo el servo se queda centrado en 0 grados, si  mando a porta.1 un 1 gira a la derecha 90 grados, pero si sulto el pulsador seguidamente se va al centro y ocurre exactamente lo mismo cuando pulsamos porta.0. Hay alguna forma de que funcione cuando lo pulse y se quede en esa posicion o siempre se ira al centro. No se si el programa estara bien ya que por otra parte le estas diciendo que si no detecta un 1 en cualquiera de las entradas se quede en el centro.

Gracias y un saludo



« Última modificación: 26 de Mayo de 2007, 18:32:53 por db25. »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Otra de servos
« Respuesta #1 en: 27 de Mayo de 2007, 02:36:35 »
Tienes que definir bien lo que quieres hacer. ¿Que se mantenga a un lado hasta que pulses de nuevo?, ¿que se mantenga un tiempo?
Efectivamente, un tu programa el servo vuelve al centro cuando sueltas la tecla, pero está expresamente indicado así:
else
gosub cen



Desconectado db25.

  • PIC10
  • *
  • Mensajes: 24
Re: Otra de servos
« Respuesta #2 en: 27 de Mayo de 2007, 06:50:04 »
Hola Nocturno en un principio este programa me sirve pero como comprenderas para el manejo de una camara es un poco peñazo el que no se quede en una posicion fija.
Te comento lo que quiero hacer:
pulsar "izquierda" y que el servo se gire a la izquierda y en el momento que se sulete el pulsador se quede fijo indefinidamente hasta que no se pulse de nuevo por si quieres girar mas la vision hacia la izquierda. Si pulsas "derecha" que haga lo mismo osea gire a la derecha hasta que suelte el pulsador, en ese momento se quedara fijo en esa posicion  de forma indefinida.

Lo que quiero hacer es eso un contro para una camara arriba, abajo, izquierda, derecha.
Gracias y espero que con esto me entiendas. Un saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Otra de servos
« Respuesta #3 en: 27 de Mayo de 2007, 07:17:02 »
  gosub cen 'Primero al centro

inicio:'___________________

 if porta.1=1 then
  gosub der
 endif

 if porta.0=1 then
  gosub izq
 endif

 if porta.x=1 then 'otra entrada "x" del puerto A
  gosub cen
 endif

goto inicio

cen:
     High porta.2   
     pauseus 1495
     low porta.2
     goto inicio


izq:
     High porta.2   
     pauseus 2000
     low porta.2
     goto inicio
   
der:
   high porta.2
   pauseus 980
   low porta.2
   goto inicio
   
end '________________
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Otra de servos
« Respuesta #4 en: 27 de Mayo de 2007, 07:27:33 »
De todas formas el programa tiene un fallo de concepto y es que los servos para que mantenga la posición frente a la carga "peso" tienen que ser refrescados en la posicion que se desea de continuo, si no la gravedad los vence.

Si el peso es vertical y el eje del servo esta en horizontal en principio no se produce este efecto siempre que se trabaje en el interior ya que la fuerza del viento sobre la superficie del objeto tambien podria hacer que este girara solo, efecto veleta.

en el hilo de la Ebasic tienes dos sencillos algoritmos de como mantener pwm constante, segun los valores de entrada, uno es para controlar la iluminacion de un LCD y otro para controlar la posicion de un servo, es cuestion de que los incorpores a tu código.
Saludos desde Granada, España.

Desconectado db25.

  • PIC10
  • *
  • Mensajes: 24
Re: Otra de servos
« Respuesta #5 en: 27 de Mayo de 2007, 08:01:54 »
Hola, me puedes indicar el hilo, pues no lo encuentro Gracias dogflu66, lo mirare para ver si me sirve.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Otra de servos
« Respuesta #6 en: 27 de Mayo de 2007, 08:10:35 »
Saludos desde Granada, España.

Desconectado db25.

  • PIC10
  • *
  • Mensajes: 24
Re: Otra de servos
« Respuesta #7 en: 27 de Mayo de 2007, 08:36:40 »
Hola, gracias por poner los enlaces, el primer enlace no creo que me sirva pero el segundo ya lo vi ace un par de dias, pero el problema es que utiliza resistencias, lo unico que se me ocurre es cambiar esas resistencias por unos potenciomentro digitales  DS1869 de 10k, sera cuestion de buscarlo e intentar combinar el software de el con el que quiero hacer, ya que no me hace falta nada de visualizacion de datos por LCD.

Gracias y voy a seguir un saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Otra de servos
« Respuesta #8 en: 27 de Mayo de 2007, 13:39:42 »
El primer enlace seria el acertado ya que trata el control del servo como una tarea de fondo, por lo que podrias ampliar tu programa como quisieras y el control del servo al ser considerado como una tarea independiente seguiria siendo controlado sin problemas por muy largo que hicieras el programa principal. En realidad el programa del primer hilo lo que intenta es simular la multitarea.
Sin embargo tu programa es un programa totalmente lineal esto es en lo que quedaria tu programa intentando ajustarme al modo de trabajo lineal (para mi es muy dificil esta forma de programar).

AllDigital
PORTA = 0xff  'como entradas
PORTA.2 = 0  'como salida

Dim posicion As Word  'duty cycle, señal de control servo a on
Dim periodo As Word  'frecuencia de trabajo de la señal del servo
Dim resto As Word  'señal de cotnrol del servo que tiene que estar a OFF

periodo = 20000  'periodo de la señal del servo
posicion = 1495  'posicion central, duty cycle, señal de control del servo a ON

Gosub pwm_servo  'Primero al centro
main:  '___________________
   If PORTA.1 = 1 Then  '__________Nueva posicion y sus limites y tecla
      If posicion > 450 Then posicion = posicion - 1
   Endif  '__________________________________________
   If PORTA.0 = 1 Then  '___________Nueva posicion y sus limites y tecla
      If posicion < 2300 Then posicion = posicion + 1
   Endif  '___________________________________________
   Gosub pwm_servo
Goto main
End                                               
pwm_servo:  '_____________Genera la señal PWM, para controlar el servo
   High PORTA.2
   WaitUs posicion  'duty cycle, señal del servo a ON
   Low PORTA.2
   resto = periodo - posicion  'tiempo en que la señal del servo tiene que estar a OFF
   WaitUs resto
Return                                           
End                                               
Saludos desde Granada, España.

Desconectado db25.

  • PIC10
  • *
  • Mensajes: 24
Re: Otra de servos
« Respuesta #9 en: 27 de Mayo de 2007, 14:08:51 »
Este post esta relacionado con este otro http://www.todopic.com.ar/foros/index.php?topic=17397.0 ya que esto lo quiero para controlar una camara a distancia.

Segun tu de que forma seria la mejor para hacer esto. el resultado que quiero tener al final es este: una camara que puede moverse en 4 direcciones (2 servos) y x canales que en un principio seran simplemente ON/OFF para alguna funcion (encendido luz, tomar una foto.....)

La forma que lo estoy enfocando es esta estoy enredando con la comunicacion entre los dos pic y en este post con el manejo de los servos una vez lo tenga todo funcionando por separado lo que hare sera "unir" los progrmas para hacer uno solo (no se si sera posible).

En resumen eso es lo que quiero hacer, que no se si sera factible de esa forma.
Gracias y un saludo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Otra de servos
« Respuesta #10 en: 27 de Mayo de 2007, 15:15:16 »
Pues la gestion de dos servos y la comunicacion serial entre dos pic, no es una cosa muy excesiva para un pic, lo que ocurre es que cuando trabajas con programas totalmente lineales y que a de mas tienen que controlar tiempo pues se pueden producir cosas raras, mientras lees el puerto serie no puedes refrescar los servos y al reves.. pero es posible que los tiempos te lleguen y funcione correctamente, y recuerda que siempre puedes acelerar el proceso con un cristal mayor... en el indice del foro de robotica hay varios proyectos como el que quieres incluyendo bot con camara orientable... asi que suerte...
Saludos desde Granada, España.

Desconectado db25.

  • PIC10
  • *
  • Mensajes: 24
Re: Otra de servos
« Respuesta #11 en: 27 de Mayo de 2007, 18:48:48 »
Hola, hos comento he creado el circuito y el programa par controlar el servo, pero no funciona bien. Si pongo el programa del servo solo en otro circuito si que se mueve pero si lo pongo todo junto no funciona. Os pogo el programa del emisor y del receptor (lo mas seguro que sera alguna tontada pero para un aficionado aprendiz...)

emisor

Código: [Seleccionar]
      include "modedefs.bas"
 
      C VAR BYTE
       PAUSE 300

      loop:
  if porta.1=0 then
  gosub der
  endif
 
  if porta.0=0 then
  gosub izq
  endif
  goto loop

 
      izq:
    FOR C=0 TO 16
      serout  portb.2,T300,[6,6,"OK",1]
      PAUSE 3000
      NEXT C
      goto loop
       

      der:
      FOR C=0 TO 16
      serout portb.2,T300,[6,6,"OK",2]
      PAUSE 3000
      NEXT C
      goto loop
      end

receptor
Código: [Seleccionar]
include "modedefs.bas"
 

datos var byte
DEVICE 16F628
DIM Pos as WORD
SYMBOL Pin = PORTA.3
CMCON = 7
Pos = 1500
PORTA = 0

TRISA = %00000111
 
PAUSE 300

Loop:
serin portb.2,T300,[datos]
If datos=1 Then IF Pos < 3000 Then Pos = Pos + 1
If datos=2 Then Pos = 1500
If datos=3 Then IF Pos > 0 Then Pos = Pos - 1
SERVO Pin , Pos
DELAYMS 5
PRINT AT 1 , 1 , "Position=" , @Pos , " "
goto Loop
 
end

os adjunto el circuito, no se que mas deciros. Graicas

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Otra de servos
« Respuesta #12 en: 27 de Mayo de 2007, 20:38:23 »

Este si funciona:


Código: [Seleccionar]
'--------------------------------
Symbol pin = PORTB.4
'--------------------------------
Dim datos As Byte
Dim pos As Byte
'--------------------------------
datos = "2"
pos = 135
'--------------------------------
AllDigital
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff
TRISB = 0xff
TRISB.4 = 0
'---------------------------------
WaitMs 300
main:
Serin PORTB.2, 300, datos
If datos = "1" Then
If pos < 230 Then pos = pos + 1
Endif
If datos = "2" Then pos = 135
If datos = "3" Then
If pos > 45 Then pos = pos - 1
Endif
ServoOut pin, pos  'declaracion para el control de servo motores, resolucion de 10uSeg.
WaitMs 5
datos = 0
Goto main
End                 
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Otra de servos
« Respuesta #13 en: 27 de Mayo de 2007, 20:42:37 »
Tambien lo he probado en la Pic EBasic, enviando los "datos" por el Hyperterminal y el servo funciona.
Lo que ocurre es que a 300 baudios va muuuuuy lento mejor a 2400... :mrgreen:
Saludos desde Granada, España.

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Otra de servos
« Respuesta #14 en: 28 de Mayo de 2007, 00:25:51 »
Hola:

Quería hacerte una pregunta db25, la librería del servo la sacaste de algún lado o te vino con el proteus? porque no he podido encontrarla en mi versión 7.1 SP2