Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

CODIGO 5 SERVOS EN ...
 
Avisos
Vaciar todo

CODIGO 5 SERVOS EN PIC 16F877

4 Respuestas
3 Usuarios
0 Reactions
4,514 Visitas
ulises_odiseo39
Respuestas: 13
Topic starter
(@ulises_odiseo39)
Active Member
Registrado: hace 18 años

Que tal caballeros 😀 , ando haciendo un pequeno brazo robot, ya tengo la estructura y los servos,(5 FUTABA S3003), que representan la base giratoria, el hombro, el codo, la muneca y la pinza. Todos han sido probados individuamente y a esepcion del hombro van excelente, 🙄 el de hombro es como uds saben el que carga todo el peso.

Ahora como les decia han sido probados individualmente mediante el siguiente programa en leguaje c:

/************************************************************************

* *

* SERVO *

* *

* Si RA0=1 --- > SERVO EN POSICION 0º *

* Si RA0=0 --- > SERVO EN POSICION 180º *

* *

* *

************************************************************************/
#include <16F877A>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay (clock=4000000)
#use fast_io(A)
#use fast_io(B)

main()
{
short I1;
set_tris_a(0x1F);
set_tris_b(0x00);

while (1)
{
I1=input(PIN_A0);

if(I1==1) // Posición 0º
{
output_bit(pin_b0,1);
delay_us(200);

output_bit(pin_b0,0);
delay_us(19800);

}

else // Posición 180º

{
output_bit(pin_b0,1);
delay_us(2200);
output_bit(pin_b0,0);
delay_us(17800);

}
}
}

Y va excelente, nadamas le modifico los delays y le doy a mis servos el movimiento que desee. 8)

Ahora me encuentro con un PIC16F877 y quiero controlar de 5 a 8 servos con este, pero no puedo controlar dos servos al mismo tiempo, no se mucho de leguaje c, asi que escribi uno basado en sentencias IF, asi si porejemplo ra0 y ra1 estan activados, sus respectivos rb0 y rb1 deben activar dos servos y que hasta que yo cambie los RA los RB deben quedarse en la posicion deseada. Pero no me sale el programa, 😥 aqui les anexo el que me invente :

#include <16F877A>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD,
#use delay (clock=4000000)
#use fast_io(A)
#use fast_io(B)
////////////////////////////////////////////////
//----------------------------------------------
//
// Programa Principal
//
//----------------------------------------------
////////////////////////////////////////////////
void main ()
{
set_tris_a(0xff);
//todo el puerto A como entrada
//----------------------------------------------
set_tris_b(0x00);
//todo el puerto B como salida
//----------------------------------------------
while (1)
{
if( input(PIN_A0) ) // Posición 0º

{output_bit(pin_b0,1);

delay_us(200);

output_bit(pin_b0,0);

delay_us(19800); }

else // Posición 180º

{ output_bit(pin_b0,1);

delay_us(2200);

output_bit(pin_b0,0);

delay_us(17800);

}
if( input(PIN_A1) ) // Posición 0º

{output_bit(pin_b1,1);

delay_us(200);

output_bit(pin_b1,0);

delay_us(19800); }

else // Posición 180º

{ output_bit(pin_b1,1);

delay_us(2200);

output_bit(pin_b1,0);

delay_us(17800);

}

}
}

Si alguien me pudiera decir en donde estan mis errores se lo agradeceria porque ya estuve 3 dias calando pero no puedo, necesito la ayuda de personas con mas experiencia. 😉

P.D

Este ultimo codigo lo escribi para solo 2 servos en caso de funcionar se expandiria para los 5 que manejo.

Gracias y porfavor Comenten

ATTE
SU COMPANERO
ULICES SANTACRUZ LEAL
´´ODYSSEUS´´

Responder
3 respuestas
TumBos
Respuestas: 158
(@tumbos)
Estimable Member
Registrado: hace 19 años

Te recomiendo que uses interrupciones para esto de los 5 servos.
Prueba de poner un solo retardo largo es decir, pones los primeros de posicion seguidos y luego temporizas uno solo de 18 ms. (este tiempo no es critico) Variara de 18+ 1 +1 = 20 ms. minima posicion a 18+ 2.2+ 2.2 = 22.4 ms. maxima posicion de servos

Queda así.

otro:
Bucle tiempo 1. Output servo 1
Bucle tiempo2 . Output servo 2
Bucle de espera (18 ms.)
goto otro

Responder
boops
Respuestas: 1813
(@boops)
Ardero
Registrado: hace 20 años

ulises_odiseo39, Lo mejor que puedes hacer es hacer un timer que interrumpa cada 20ms, sino tendrás que sumar los anchos y restarlos de 20ms como dice TumBos,

Responder
ulises_odiseo39
Respuestas: 13
Topic starter
(@ulises_odiseo39)
Active Member
Registrado: hace 18 años

Caballeros 8) , ahora veo que mi idea de controlar los 5 servos por medio de simples sentencias if seria un mal trabajo, e investigado ´´LAS INTERRUPCIONES´´ y me parecen muy interesantes 🙄 .

Me he leido un post de la pagina IEAROBOTICS, donde un companero usa solo una interrupcion para controlar hasta 8 servomotores, es posible que uds ya lo haya visto pero aqui les va el link: 😉

http://www.garcia-cuervo.com/picmania.g ... os_x_8.php

No se pracicamente nada de interrupciones pero es claro que al usar solo una, el pic tendra mas libertad para otras cosas, ahora e buscado en todo san google 💡 y todos los codigos que me encuentro son para comunicar el pic con la pc ´´el famoso rs232´´, Y yo no quiero entablar inguna comunicacio PIC-PC y quisiera saber si el codigo de IEAROBOTICS puede ser configurado para no necesitar del rs232 y usar 1 switch para cada servo.???, solo necesito 5 servos.

me pueden echar una mano??, un link??? un tuto??? LO QUE SEA porfavor

ATTE.
ULICES SANTACRUZ LEAL
´´ODYSSEUS´´

Responder
Compartir: