RobotyPic son proyectos básicos de electrónica con microcontroladores PIC, de aplicación en el mundo de la robótica didáctica, con archivos fuente creados mediante el compilador CCS PIC C COMPILER en lenguajeC.

Control de 8 servos con PIC

Este proyecto consiste en el control de 8 servos por el puerto c del pic. En la interacción para el control de los servos se emplea un teclado numérico y un lcd, ambos controlados por el puero b del PIC.

Esquema control 8 servos con pic


En su funcionamiento, el pic pide introducir el número del servo a controlar. Posteriormente solicita el ángulo de orientación deseado para ese servo ( de 0º a 180º). El valor se acepta con la tecla “*” y el programa vuelve a mostrar un mensaje de presentación para un nuevo control. Si el ángulo introducido es superior a 180º, el pic toma por defecto 180º.

Para la generación de las señales moduladas de control de los servos (bit_pwmx), se emplea la subrutina de interrupción por rebose del timer 0. La orientación de cada servo se establece con el valor que se carga en la variable pwmx, donde x es el número de servo correspondiente. Con cada llamada a la subrutina de generación de la señal por mediación de la interrupción del timer 0, se incrementa la variable control_pwm que comparandose con el valor en pwmx, decide si debe o no cortar alguno de los pulsos de modulación de los servos.

   control_pwm++;   
        
   if (control_pwm==0) bit_pwm0=1; 
   if (control_pwm==pwm0) bit_pwm0=0; 
 
Cuando la variable control_pwm, incrementandose en cada rebose del timer0, llega a su máximo valor y pasa a ser 0, todas las señales moduladas comienzan un nuevo ciclo.

Gráficas control servos con pic

Para interpretar los valores numéricos de varias cifras a partir de números simples introducidos por teclado, primero espera a que se pulse una tecla

x=kbd_getc();

el valor obtenido está en codificación ASCII por lo que habrá que pasarlo a su valor numérico decimal

tecla=x-48;

si se ha pulsado una tecla se descartan las pulsaciones en # y * puesto que solo se necesitan números

if (x!=0&&x!='*'&&x!='#'){

y conforme se van pulsando números el último pulsado será las unidades y los anteriores van pasando a decenas y centenas

centenas=decenas;
decenas=unidades;
unidades=tecla;

conforme se van introduciendo números simples se va mostrando el número completo por pantalla lcd

printf(lcd_putc,"\f Angulo = %ld%d%d\n", centenas, decenas, unidades);

y finalmente se guarda en una única variable el número completo resultante de todos los números simples

angulo=(centenas*100)+(decenas*10)+unidades;


[+/-] Ver / Ocultar programa completo en C



En la simulación bajo proteus se comprueba el cambio en el tiempo de las señales de control de los servos individualmente en función del valor del ángulo introducido.




Todos los archivos del proyecto se pueden descargar en este enlace:

Descargar archivos Control de 8 servos con PIC


El proyecto contenido en el artículo ha sido diseñado y probado con éxito utilizando las siguientes versiones de software:
- Windows xp y windows 7
- Proteus V7.7 SP2
- CCS PIC C COMPILER v4.084

Artículo relacionado>> PIC controlador de servos por I2C


14 comentarios:

ALARQUE dijo...

Hola, Estoy realizando un proyecto para una materia en la universidad en el cual me baso de tu proyecto, pero encuentro el problema de el giro del servomotor para ángulos diferentes de 0, 90 y 180 grados.
Te agradecería si me pudieras explicar como corregirlo.
Gracias de antemano

Alexander Aguirre R.

Chabier dijo...

No entiendo cual es tu problema. El ángulo depende del ancho del pulso de control. Si empleas un ancho de pulso en un valor entre 0,8ms y 1,5ms por ejemplo, obtendrás una giro del servo entre 0º y 90º proporcional al pulso.

ALARQUE dijo...

El problema que tenia era que cuando le daba un giro diferente de 0, 90 o 180 no me la hacia exacto, pero tomando los giros reales con los valores ingresados, sacando una tabla y sacando una ecuación, logre modificar el inicial y lograr que el servo se me mueva en los grados que le indico y que el pwm se mantenga en la ultima posición.......Muchas gracias por tu colaboración.

Camilo Valencia dijo...

hola quisiera saber si el codigo me funciona PIC16f883

Chabier dijo...

Hola Camilo.
El código sirve para ese PIC pero deberás adaptar el programa para que cargue el driver de ese PIC con el #include y emplear las direcciones de los puertos correspondientes.

DxlocuraxD dijo...

la libreria kbd.c y lcd.c podrias colgarlas???

Chabier dijo...

Las he incluido con el resto de archivos del enlace de descarga.

xban dijo...

Hola, me parece muy bueno el programa. Solo tengo una duda. La resolución del ángulo no se puede mejorar? Explico: Desde el ángulo de 169° hasta el ángulo 180°, por ejemplo, no hay variación en el movimiento del servomotor.

Robotypic dijo...

Hola xban.
Sí se puede mejorar la resolución. Depende de la combinación del valor de carga del temporizador, su división de frecuencia, de la variable control_PWM y del cristal oscilador empleado. Al pie del texto tienes un enlace para acceder al artículo "PIC controlador de servos por I2C" donde se ha empleado el mismo concepto con mayor resolución.

Julián Abreu dijo...

que se supone q son esas lineas azules?

Robotypic dijo...

Julian, ¿que líneas azules te refieres?

manuel andree mendoza peralta dijo...

quisiera saber como son las conexiones que emplean en esas lineas azules en la simulacion con proteus
porque pienso presentar este proyecto
te agradeceria bastante

Robotypic dijo...

Hola Manuel.
¿Te refieres a las lineas azules gruesas? Son buses. Agrupan en un único bus varias lineas individuales. En este enlace explican como crearlas en proteus: http://www.youtube.com/watch?feature=player_detailpage&v=iTUj5NOuGhI

Sub Zero dijo...

Muchas gracias por compartir tu proyecto!!!!!

Related Posts Plugin for WordPress, Blogger...

CONTACTA - (Haz referencia del artículo sobre el que trata la consulta o comentario)

*
*
*
*
*
contact form faq verification image

Web form generated by 123ContactForm