domingo, 14 de noviembre de 2010

Controladora de servos basada en PIC16F628A

Controladora funcionando
Bueno aquí dejo esta controladora de servos que me he hecho para utilizar en futuros proyectos. La PCB es la que está publicada en una entrada anterior realizada por CNC.
En la descarga están las fuentes, esquemas y demás. El programa está realizado en CCS y los esquemas en Eagle.
Tiene algunos bugs que detallo a continuación, los cuales serán corregidos en futuras versiones.

Frontal
Trasera detalle bugs corregidos
PinOut
ServoControl r1 (13 Octubre 2010) para PIC16F628A por villamany
Contacto: villamany@msn.com

CARACTERISTICAS:
Este circuito, mediante línea de comandos, permite el control independiente de 8 servo-motores (los utilizados en RC), una salida digital, un zumbador de frecuencia variable y una entrada digital.

Está basado en el microcontrolador PIC16F628A y La comunicación se lleva a cabo mediante UART niveles TTL 5v a 9600bps con 8 bits de datos 1 bit de stop y sin control de flujo ni paridad.

Se incluyen 4 pines para futura expansión con 2 I/O auxiliares.

Se incluyen 5 pines para programación "in situ" del PIC vía ICSP.

Led de estado de funcionamiento en placa (parpadeo rápido=ok).

Atención: A la hora de reprogramar el PIC por ICSP, es recomendable desconectar la alimentación de la placa para evitar posibles errores de programación y/o movimientos involuntarios de servos/salida.

COMANDOS:
Los comandos tienen la sintaxis CMD ARG1 ARG2, es decir, un comando y 2 argumentos opcionales separados entre si por un espacio.

CMD siempre es un byte mientras que ARG1 y ARG2 pueden variar entre 1 y 5 bytes, dependiendo del comando utilizado.

Los comandos deben enviarse de uno en uno seguidos de la tecla “Enter”, tras ejecutarse el comando, el dispositivo enviara una respuesta para indicar info adicional sobre la ejecución que tuvo lugar seguido de una nueva línea de texto con "rdy>" indicando que el PIC está preparado para recibir un nuevo comando (Ready).

Listado de comandos:
Comando
Acción
R
Resetea el hardware y devuelve la versión del firmware y la posición
por defecto de los 8 servos en orden ascendente,  emitiendo un breve 
"beep" y quedando preparado ("rdy>").
i
Lee el estado de la entrada todo-nada (interno y/o externo) y devuelve "1"
si está cerrada "0" en caso contrario
o
Devuelve "1" si la salida esta activada y "0" en caso contrario.
o 1
Activa salida y devuelve "1" (salida activada).
o 0
Desactiva salida y devuelve "0" (salida desactivada).
o t           
Invierte el estado de la salida y devuelve "1" si ha sido activada o "0" si ha 
sido desactivada.
b
Devuelve la frecuencia en Hz a la que está sonando el Zumbador.
b [fffff]     
Activa el Buzzer a la frecuencia indicada y devuelve la frecuenciareal 
(frecuencia mas próxima que puede generar el oscilador).
[s]       
Obtener posición de servo. Devuelve el valor del dutty cycle aplicado a 
un servo.
[s] [tttt]    
Posicionar servo. Posiciona un servo aplicando el dutty cycle  indicado 
y devuelve el valor aplicado.
[s] + [tttt]  
Incrementar posición relativa de servo. Incrementa en el numero indicado 
el dutty cycle aplicado a un servo y devuelve el valor aplicado al mismo.
[s] - [tttt]  
Decrementar posición de servo. Decrementa en el numero indicado el 
dutty cicle aplicado a un servo y devuelve el valor aplicado al mismo.
[s] h         
Posicionar servo en su posición por defecto (valor home definible por 
otro comando), devuelve el valor del dutty cicle aplicado.
[s] U [tttt]  
Definir posición máxima admisible para un servo (dutty cycle máximo). 
Devuelve el valor introducido.
[s] L [tttt]  
Definir posición mínima admisible para un servo (dutty cicle mínimo). 
Devuelve el valor introducido.
[s] H [tttt]  
Definir posición por defecto para un servo (tras reset y comando [s] h). 
Devuelve valor introducido.
[s] u [tttt]  
Posicionar servo en su valor máximo admisible. Devuelve valor aplicado.
[s] l [tttt]  
Posicionar servo en su valor mínimo admisible. Devuelve valor aplicado.
[fffff]  :  Indica la frecuencia de funcionamiento del buzzer en Hz. Los valores posibles son los enteros comprendidos entre 250 y 62500. El valor 0 también es válido e indica buzzer desactivado.   
           
[s]      :  Indica el servo al que hace referencia el comando. Los valores posibles son 1,2,3,4,5,6,7 u 8.

[tttt]   : Indica el valor del dutty cicle en microsegundos aplicado a un servo para posicionarlo. Los valores posibles son los enteros comprendidos entre 200 y 2500. Cualquier intento de posicionar un servo por encima de su valor máximo admisible (comando[s] U [tttt]) dará como resultado el posicionado del servo a su valor máximo admisible. Cualquier intento de posicionar un servo por debajo de su valor mínimo admisible (comando [s] L [tttt]) dará como resultado el posicionado del servo a su valor mínimo admisible.

BUGS ENCONTRADOS
HARDWARE r1
-14/10/2010
Falta diodo/s de protección de entrada de alimentación (protección frente a error al alimentarlo)
-La salida RA4 (pin 3) del pic es open collector y necesita una resistencia de pull up de 1K que se ha olvidado.
29/10/2010
-El pulsador no funciona bien, se queda a 1 a veces. Es debido a que el led solo, no conduce bien a masa, esta forma de ponerlo no vale. Para salir del paso se puede poner una R de 1k entre sus patitas, así funcionara bien la entrada pero el led se enciende muy poco cuando se acciona el pulsador.

FIRMWARE r1
29/10/2010
-Cuando se le da un valor muy alto a algún servo (ejemplo 2500) empieza a no funcionar bien (van a tirones todos los servos). Parece que es porque las instrucciones de la interrupción de control de servos tardan más tiempo en ser procesadas (se pisa con la próxima ventana de servos). Se puede apreciar como el led de estado parpadea un poco mas lento  de lo habitual cuando esto ocurre. La única solución hasta su futura corrección es utilizar valores mas bajos.

Descarga Archivos del Proyecto

2 comentarios:

Andrey Marin dijo...


Andrey Marin dijo...

hola era para saber si todavia tienes ese codigo por ahi ya que se borro, se que esta entrada tiene como 4 anos pero si lo pudieras conseguir serial genial