TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: db25. 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
-
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
-
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
-
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 '________________
-
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.
-
Hola, me puedes indicar el hilo, pues no lo encuentro Gracias dogflu66, lo mirare para ver si me sirve.
-
Aqui tienes dos entradas, elige en la que mas facil te sea:
http://www.todopic.com.ar/foros/index.php?topic=14917.0
http://www.todopic.com.ar/foros/index.php?topic=16951.0
-
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
-
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
-
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.
-
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...
-
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
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
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
-
Este si funciona:
'--------------------------------
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
-
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:
-
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
-
Hola LordLafebre, a qui tienes la libreria, no recuedo de donde la descargue, ya me comentaras si te funciona¡, Un saludo
-
Hola:
Muchas gracias, ya lo probaré.
-
Bueno ya estoy otra vez aqui. Empecemos de nuevo xD. El comando serin y serout ¿permiten hacer varias cosas a la vez no? me refiero a mandar mas de una orden es que lo digo porque en uno de los intentos solo podia encender un led y ya no podia hacer mas (puede ser por el progrma), segundo es mejor utilizar un cristal de 20mhz por el tema de los tiempos y todo eso no.
Gracias y un saludo.
-
Serin Serout son comandos para comunicarte via serie pero por software por ende hasta que termines la rutina serin o serout podras hacer algo mas. Para poder hacer otras cosas y seguir mandando datos seriales deberas usar la UART del PIC si es que dispone. para ello en PBP se usa HSERIN y HSEROUT
-
Bueno... mas comandos xD xD y en este caso ¿como funcionarian? ¿de esta forma por ejemplo ¿podria indicar que encienda las luces e indicarle que avance (sin que tenga que apagar las luces)
Gracias y perdonar por lo pesado que soy. Un saludo
-
Hola estoy enredando con el comando pero no me hago con el
¿esto estaria bien?
emisor
DEVICE 16F877
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_BAUD 2400
loop:
if porta.1=0 then
gosub led_on
endif
goto loop
led_on:
hserout [3]
goto loop
end
receptor
DEVICE 16F877
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_BAUD 2400
datos var byte
loop:
hserin [datos]
if datos=3 then
gosub led_on
endif
goto loop
Led_on:
High porta.1
goto loop
end
estar estar bien fijo que no, pues esta todo el rato el led encendido.
ya me comentareis. Gracias un saludo
-
Bueno he jugueteado un poco mas y he conseguido que encienda y apague un led con un pulsador :mrgreen: (se pulsa una vez y se enciende y si se pulsa de nuevo se apaga), pero no consigo encender dos led con sus correrpondientes pulsadores. Os dejo el programa.
EMISOR
DEVICE 16F877
define OSC 20
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_BAUD 9600
Cont var bit
TRISB.0=1
C VAR BYTE
CONT=0
loop:
IF PORTB.0 = 0 THEN
while PORTB.0=0
wend
cont=cont+1
if cont > 1 then
cont=0
endif
endif
select case cont
case 0
hserout [1]
case 1
hserout [2]
end select
IF PORTB.1 = 0 THEN
while PORTB.1=0
wend
cont=cont+1
if cont > 1 then
cont=0
endif
endif
select case cont
case 1
hserout [3]
case 0
hserout [4]
end select
goto loop
end
RECPTOR
DEVICE 16F877
define OSC 20
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_BAUD 9600
datos var byte
datos2 var byte
loop:
hserin [datos]
if datos=1 then eldc
if datos=2 then aldc
hserin [datos2]
if datos2=3 then ecv
if datos2=4 then acv
goto loop
eldc:
high porta.1
goto loop
aldc:
low porta.1
goto loop
ecv:
high porta.2
goto loop
acv:
low porta.2
goto loop
end
Ya comentareis que puede ser, gracias de antemano y un saludo
-
Rapidamente solo declaras como entrada el PORTB.0 el PORTB.1 nunca lo pones quizas por ahi este el problema. Por otro lado veo un poco raro tu codigo. con eso de los While's si quieres que una sentencia se repita puedes usar el while el if o el repeat solo no necesitas meter uno dentro de otro. Aunque quizas no he entendido bien tu codigo saludos.