servomotor y pic 16f84a

buenas gente del foro
quiero controlar un servo con el pic16f84A usando el pin0 del puerto b y un pulsador en el puerto a pin 0 , el servo es un futaba s3004 estuve buscando en internet pero no logro entender mucho quiero usar el picbasicpro el osc es de 4mhz
el tema es el siguiente tengo una microcamara montado sobre ese servo, quiero controlar un giro de 0 a 180° con el fin de indentificar el alrededor con 1 solo pulso(sin dejar el boton precionado) ,al iniciar el programa el servo se posiciona automaticamente en 90° sin importar en que lugar se encuente, se envia envio el pulso y el servo debe llegar a 0° , sigue hasta 90° y luego sigue hasta 180° ,al finalizar el trayecto se devuelve a 90° el problema es que no tengo mucha idea de como hacerlo segun lei se necesita un ancho de 150 a 1ms de intervalo para sentrar pero no se bien como hacer el codigo

estuve viendo ejemplos en internet y lo unico que logre fue

@ DEVICE PIC16F84A
@ DEVICE PROTECT_OFF,WDT_OFF,PWRT_On,xt_osc
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
i var byte
pul VAR porta.0
servo var portb.0
i=150
inicio
servo=1
if PUL=1 THEN mov1

GOTO INICIO

mov1
PULSOUT SERVO,150
PAUSE 1
goto inicio
END
solo logro que el servo se pocisione al centro, pero no desde cualquier angulo
no se que hacer estuve toda la tarde intentando el codigo y probandolo en la placa pero nada:cry: :cry:
PDD use el buscador
 
Hola

Yo tambien estoy trabajando con servos.

Ahora en cuanto a tu codigo tienes que hacer que tu programa vaya cambiando el ancho del pulso para lograr lo que quieres, dame un poco de tiempo y te pongo un ejemplo.
Si tienes el datasheet ponlo, asi sabremos bien que pulsos mandar al servo.

Saludos,
 
Última edición:
Hola

Yo tambien estoy trabajando con servos.

Ahora en cuanto a tu codigo tienes que hacer que tu programa vaya cambiando el ancho del pulso para lograr lo que quieres, dame un poco de tiempo y te pongo un ejemplo.
Si tienes el datasheet ponlo, asi sabremos bien que pulsos mandar al servo.

Saludos,
hola, http://servocity.com/html/s3004_standard_ball_bearing.html
el datasheet no lo encuentro
gracias de antemano



algo como asi para variar el ancho del pulso?

@ DEVICE PIC16F84A
@ DEVICE PROTECT_OFF,WDT_OFF,PWRT_On,xt_osc
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
i var byte
pul VAR porta.0
PUL2 VAR porta.1
servo var portb.0
inicio
servo=1
if PUL=1 THEN mov1

GOTO INICIO

mov1
for i=1 to 10 step 1
PULSOUT SERVO,150
PAUSE 1
next i
goto inicio
 
Última edición:
,
@ DEVICE PROTECT_OFF,WDT_OFF,PWRT_On,xt_osc
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
i var byte
pul VAR porta.0
PUL2 VAR porta.1
servo var portb.0
inicio
servo=1
if PUL=1 THEN mov1

GOTO INICIO

mov1
for i=1 to 10 step 1
PULSOUT SERVO,150
PAUSE 1
next i
goto inicio
ahi solo logro que medio se centre y no lo hace del todo tengo que dejar el boton precionado para que llegue al centro, como hago para que hago para seguir al siguiente movimiento? tampoco logro hacerlo el servo se me blokea simplemente :cry:
PDD:es la primera vez que trabajo con un servo
 
Te recomiendo trabajar el servo con una fuente diferente a la del pic ya que genera ruido y consume al menos unos 500mA, por otro lado para un mejor control de los servos yo lo hice por interrupcion de tiempo el cual me permite hacer cualquier otra cosa con el pic mientras el mantiene la posición del servo hasta que cambie de posición, y las posiciones van de pause 50 hasta pause 250 mas o menos...saludoss
 
Te recomiendo trabajar el servo con una fuente diferente a la del pic ya que genera ruido y consume al menos unos 500mA, por otro lado para un mejor control de los servos yo lo hice por interrupcion de tiempo el cual me permite hacer cualquier otra cosa con el pic mientras el mantiene la posición del servo hasta que cambie de posición, y las posiciones van de pause 50 hasta pause 250 mas o menos...saludoss
Hola gracias por tu respuesta, el pic esta conectado a un 7805 (5v) en una bateria de 9v
el servo esta con una bateria aparte , obiamente con el negativo comun entre las fuentes, inicias el pulso del pin en la posicion centro del servo?
Saludos
 
varia un poco entre servo y servo por características mecánicas, pero el centro seria 125 mili segundos aproximadamente, ahora normalmente los servos se alimentan entre 4.5v y 6.8v por lo que estarías matando el servo con 9v, de echo en la paginas que colocas te dan las características y para tu servo el máximo es de 6v pendiente con eso, revisa y me avisas

PD: Corrijo es de 150 mili segundos.
 
Última edición:
varia un poco entre servo y servo por características mecánicas, pero el centro seria 125 mili segundos aproximadamente, ahora normalmente los servos se alimentan entre 4.5v y 6.8v por lo que estarías matando el servo con 9v, de echo en la paginas que colocas te dan las características y para tu servo el máximo es de 6v pendiente con eso, revisa y me avisas

PD: Corrijo es de 150 mili segundos.
disculpa entendiste mal o yo no me exprese bien, la bateria de 9v esta conectada a un 7805 que alimenta el pic, otra bateria aparte solo para el servo con negativo comun a el del pic , y si eso mas o menos estuve leyendo pero, si quiero que gire a la izquierda luego al centro y luego a la derecha , se que hay que variar los milisegundos pero como se hace osea el programa ?
Saludos
 
si quiero que gire a la izquierda luego al centro y luego a la derecha , se que hay que variar los milisegundos pero como se hace osea el programa ?
Saludos.
Este es un código sencillo para mover un servomotor.
Código:
x VAR BYTE 
TRISB = %110
PORTB = 0
x = 150

MainLoop:
    PULSOUT PORTB.0,x 
    GOSUB Buttons 
    GOTO MainLoop

Buttons:
    IF PORTB.1 = 1 THEN GOSUB Incrementa 
    IF PORTB.2 = 1 THEN GOSUB Decrementa 
    RETURN

Incrementa: 
    PAUSE 10
    x = x + 1 
    IF x > 200 THEN x = 200 
    RETURN

Decrementa: 
    PAUSE 10
    x = x - 1 
    IF x < 100 THEN x = 100 
    RETURN
    END
Usalo para que tengas una idea de como va girando, conforme se incrementa o decrementa la variable x

Suerte.
 
Última edición:
Saludos.
Este es un código sencillo para mover un servomotor.
Código:
x VAR BYTE 
TRISB = %110
PORTB = 0
x = 150

MainLoop:
    PULSOUT PORTB.0,x 
    GOSUB Buttons 
    GOTO MainLoop

Buttons:
    IF PORTB.1 = 1 THEN GOSUB Incrementa 
    IF PORTB.2 = 1 THEN GOSUB Decrementa 
    RETURN

Incrementa: 
    PAUSE 10
    x = x + 1 
    IF x > 200 THEN x = 200 
    RETURN

Decrementa: 
    PAUSE 10
    x = x - 1 
    IF x < 100 THEN x = 100 
    RETURN
    END
Usalo para que tengas una idea de como va girando, conforme se incrementa o decrementa la variable x

Suerte.
gracias eso ya lo tengo claro.
pero no es lo que quiero lograr , solo quiero hacer una simple secuencia pulsador =0 servo centrado, pulsador presionado 1 vez(sin dejar precionado) servo gira 0°, siguiente paso servo gira a 90°, siguiente paso, servo gira a 180°. servo vuelve a centrarse ,
no se como hacerlo no logro ni mantener el servo centrado
he encontrado unos datos en internet sobre el servo
21.jpg

Como se muestra en la figurael servo tiene una movilidad de 180° y funciona con lo que se conoce como modulación por ancho de pulsos o PWM. Osea este servo que es de la marca FUTABA de Radio-Control, funciona a 50Hz, o sea en un segundo le son enviados 50 pulsos, y con un simple calculo se puede dividir 1/50 y nos dará 20miliseg el ancho de pulso se utilizara para el trabajo del movimiento de este: Osea trabajando en este pequeño intervalo, podemos poner en un ángulo a nuestro antojo el servomotor y que se quede allí hasta que cambiemos ese pulso por otro. Para 0° tenemos que tener un pulso de 0,2 mili segundos y el resto un pulso bajo hasta los 20 mili-segundos, esto repetidamente 50 veces nos da los 50 Hz y por consecuencia el servo en la posición 0° como se muestra en la figura. Para 90° tenemos que aplicar un pulso de 1,5 mili segundos y el resto en pulso bajo hasta los 20 mili-segundos, esto repetidamente por 50 Hz nos dará la posición 90°, también mostrado en la figura. Y para 180 ° tenemos que aplicar un pulso de 2,2 mili segundos y el resto en pulso bajo hasta los 20 mili-segundos, esto repetidamente por 50 Hz nos dará la posición 180°
la teoria la tengo bastante clara el problema es como realizar el programa ya me tiene como loco
muchisimas gracias a todos por las respuestas
Saludos
Edit1: gracias D@rkbytes me haz aclarado algo con ese codigo ejemplo



corrijanme en que estoy mal porfavor ya no se que hacer

@ DEVICE PIC16F84A
@ DEVICE PROTECT_OFF,WDT_OFF,PWRT_On,xt_osc
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
x var byte
i var byte
j var byte
k var byte
pul VAR porta.0
servo var portb.0
PORTB.0 = 0
x = 150

MainLoop:
PULSOUT PORTB.0,x
if x=210 then x=150
GOSUB Buttons
GOTO MainLoop
Buttons:
IF servo = 1 THEN GOSUB Incrementa
RETURN

Incrementa:
for i=140 to 10 step -1
PAUSE 10
x = x - 1
next i
if x=10 then decrementa
RETURN

Decrementa:
for j=10 to 150 step 1
PAUSE 10
x = x + 1
next j
IF x=150 THEN decrementa2
RETURN
Decrementa2:
for k=150 to 210 step 1
PAUSE 10
x = x + 1
next k
RETURN


END
 
Última edición:
despues de muchos intentos pense en no usar el servo y usar un motor dc, pero hoy en la mañana se me ilumino la mente y escribi este codigo que dio resultado con mi servo :D

@ DEVICE PIC16F84A
@ DEVICE PROTECT_OFF,WDT_OFF,PWRT_On,xt_osc
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
i var byte
servo var portb.0
PORTB.0=0
inicio
for i=150 to 250 step 1
pulsout servo,i
pause 10
next i
pause 500
for i=250 to 150 step -1
pulsout servo,i
pause 10
next i
pause 500
for i=150 to 20 step -1
pulsout servo,i
pause 10
next i
pause 500
for i=20 to 150 step 1
pulsout servo,i
pause 10
next i

END
ya logre el giro que deseaba y al tiempo que lo deseaba , ahora falta solamente agregar el boton que realiza la accion
:D
 
Hola aquí te dejo un ejemplo que realice hace un tiempo, con 6 servos lo adapte a uno solo con 2 botones espero te sirva saludos:apreton:
 

Adjuntos

  • fife89.rar
    31.6 KB · Visitas: 63
gracias lo voy a revisar aver que tal :D
Saludos

nuevamente me quede atrapado en el codigo
tengo en el 16f84a un servo
este servo cumple la funcion de cabeza y dentro tiene un sensor infrarojo el sensor infrarojo esta conectado al 16f877a
el 16f877a envia un 1 para el control de el movimiento de la cabeza
con el siguiente codigo "funcionando perfectamente"

control
if cservo=1 then movimiento
pulsout servo,150
pause 10
goto control
movimiento
for i=150 to 250 step 1
pulsout servo,i
pause 10
next i
pause 700
for i=250 to 150 step -1
pulsout servo,i
pause 10
next i
pause 700
for i=150 to 70 step -1
pulsout servo,i
pause 10
next i
pause 700
goto control
siempre a la espera de el 16f877a

hace el giro de la cabeza para detectar ciertos obstáculos
aahora , en el 16f877a tengo 3 sensores infrarojos en el frente, 1 a la derecha 1 a la izquierda y el otro de frente
la idea es cabeza siempre manteniendose centrada hasta enviar el 1 del 16f877a
necesito comprobar los 4 sensores con el 16f877a
robot andando hacia adelante, pendiente de obstáculos si el sensor izquierda y derecha activan , robot se detiene , retrocede 300ms comprueba con la cabeza , y e ahi el problema no se como comprobar , gira hacia a la izquierda en ese trayecto intenta detectar obstaculos la cabeza luego al centro y lo mismo comprueba en el trayecto y luego a la derecha y comprueba en el trayecto, todo esto teniendo en cuenta el tiempo que el servo hace los movimientos
paso el codigo completo con los otros sensores
Código:
@ DEVICE PIC16F877A   ;Seleccion del Microcontrolador PIC16F877A
@ DEVICE xt_OSC       ;Seleccion del Tipo de oscilador XT de Cristal
@ DEVICE WDT_Off      ;Seleccion del Watchdog Timer Apagado
@ DEVICE PWRT_On     ;Seleccion del Power-on Reset Apagado
@ DEVICE BOD_Off      ;Seleccion del Brown-out Reset Apagado
@ DEVICE LVP_OFF      ;Seleccion del Low-Voltage Programming Apagado
@ DEVICE WRT_OFF      ;Seleccion del Flash Program Memory Write Apagado
@ DEVICE DEBUG_OFF    ;Seleccion del In-Circuit Debugger Apagado
@ DEVICE CPD_OFF      ;Seleccion del Data EEPROM Memory Code Protection Apagado
@ DEVICE PROTECT_Off  ;Seleccion del Flash Program Memory Code Protection Apagado
x var byte
i var byte
y var byte
ADCON1 = %000110
Define OSC 4  'Definicion de oscilador a 4MHZ
c1         var porta.0;control de ubicacion
c2         var porta.1;control de seguidor de luz
c3         var porta.2;control de seguidor de linea negra
c4         var porta.3;control por radiofrecuencia
cservo     var porta.4;control de servo
cl1        var portc.0;luz1
cl2        var portc.1;luz2
cl3        var portc.2;luz3
cid1       var portc.3;infrarojo derecha
cii2       var portc.4;infrarojo izquierda
cis3       var portc.5;infrarojo suelo derecha
cis4       var portc.6;infrarojo suelo izquierda
ct         var portc.7;enable luz
m1         var portd.0;motor1 adelante
m2         var portd.1;motor1 atras
m3         var portd.2;motor2 adelante
m4         var portd.3;motor2 atras
cif        var portd.5;infrarojo frente
cih        var portd.6;infrarojo cabeza
ens        var portd.7;habilitar suelo
cn1        var portb.5;cny izquierda
cn2        var portb.4;cny derecha
radio1     var portb.3;radiocontrol1
radio2     var portb.2;radiocontrol2
radio3     var portb.1;radiocontrol3
radio4     var portd.0;radiocontrol4

;comienzo programa
inicio ;accion a ejecutar
if c1=1 then suelo;autonomo
if c2=1 then ;sin terminar
if c3=1 then ;sin terminar
if c4=1 then radio;radiocontrol 
low m1:low m2:low m3:low m4:low ens:low ct:low cservo
goto inicio

suelo;deteccion de suelo
high ens;hablitar infrarojo suelo
if (cis3=1) and (cis4=1) then auto;hay suelo en derecha e izquierda 
if (cis3=1) and (cis4=0) then izquierda;hay suelo en derecha
if (cis3=0) and (cis4=1) then derecha;hay suelo en izquierda
if (cis3=0) and (cis4=0) then atras;no hay suelo
low m1:low m2:low m3:low m4;detener motores 
goto suelo

izquierda;movimiento izquierda
high m2:high m4:low m3:low m1;  movimiento atras
pause 500
low m1:low m2:low m3:low m4;detener motores
pause 50
high m2:high m3:low m1: low m4;movmiento hacia izquierda
pause 300
goto suelo; devuelve a comprobacion de suelo

derecha;movimiento izquierda
high m2:high m4:low m3: low m1; movimiento atras
pause 500
low m1:low m2:low m3:low m4;detener motores
pause 50
high m1:high m4:low m2:low m3;movmiento hacia derecha
pause 300
goto suelo;devuelve a comprobacion de suelo

atras; movimiento hacia atras
high m2:high m4:low m1:low m3;movimiento hacia atras
pause 500
low m1:low m2:low m3:low m4;detener motores
goto suelo

auto
x=0
if (cid1=1) and (cii2=1) then movc ;movimiento hacia atras  
if (cid1=1) and (cii2=0) then mov3 ;movimiento hacia
if (cid1=0) and (cii2=1) then mov4 ;movimiento hacia
if (cid1=1) and (cif=1)  then mov5 ;movimiento hacia
if (cii2=1) and (cif=1)  then mov6 ;movimeinto hacia
if (cif=1)               then mov7 ;movimiento hacia
high m1:low m2:high m3:low m4  ;adelante
low cservo:low ct; deshabilitar controles de luz y servo
cih
goto auto

mov1;movimeinto robot hacia adelante
high m1:high m3:low m2:low m4:movimiento hacia adelante
goto auto

movc;comprobacion de cabeza atras
low m1:low m2:low m3:low m4;detener motores
pause 50
low m1:high m2:low m3:high m4
pause 400
low m1:low m2:low m3:low m4
high cservo
for i=150 to 250 step 1
if (cih=1) then x=1;
pause 10
next i
pause 680
if (cih=1) then x=1;
pause 10

for i=250 to 150 step -1
pause 10
next i
pause 700

for i=150 to 70 step -1
if (cih=1) then x=3
pause 10
next i
pause 700
if (cih=1) then x=3

if x=1 then  
else
if x=3 then
endif
high m1:low m2:high m3:low m4
pause 200
low m1:low m2:low m3:low m4
goto auto
izquierda1
pause 10
low m1:low m2:low m3:low m4

derecha1

 
radio ;radiocontrol
if radio1=1 then high m1: high m3;adelante
if radio2=1 then high m2: high m4;atras
if radio3=1 then high m1: high m4;derecha
if radio4=1 then high m2: high m3;izquierda
low cservo: low ct; deshabilitar controles de luz y servo
low m1: low m2: low m3: low m4 ;detener motores
goto inicio

PDD tiene un sensor infrarojo mirando hacia el suelo para detectar si hay algun tipo de caida o hueco que lo haga caerse "pero eso esta ya funcionando tambien un control de radiofrecuencia , un seguidor de linea negra y un seguidor de luz
 
Atrás
Arriba