Vous êtes sur la page 1sur 8

Control de un brazo Robot de 4 ejes con PIC

Se trata del control de un brazo de 4 ejes para aplicar a un robot. El principio de


funcionamiento es similar al empleado en el artículo Control de 8 servos con PIC.

Lo lógico es que la fuente de energía de los robots sean baterías o similares. Cuando
intentamos hacer funcionar varios ejes del brazo a la vez, puede pasar que se produzcan
bajadas de tensión momentaneas que ocasione el reset del PIC e impidan el movimiento
del brazo. Para evitarlo hay que indicar en la configuración del programa:

#fuses NOBROWNOUT //No reset por baja tensión

Mediante interrupción por desborde del Timer 0 generaremos las señales de control de
los servos. Y mediante el valor numérico contenido en una variable la posición de giro.
Estas variables las hemos denominado 'pinza' , 'muneca' , 'brazo' y 'hombro', e
identifican a cada uno de los ejes. Con otra variable, 'velocidad' especificaremos la
rapidez de los movimientos.

pulsa en la imagen para ampliarla

Para conseguir controlar la velocidad de los movimientos se ha establecido este


procedimiento:

//Modificará posición del servo mientras flag=1


while (flag){
flag=0;
//Si el eje brazo no está en su posición...
if (pwm_brazo != brazo){
//...retrocede una posición si la nueva es menor
if (pwm_brazo > brazo) --pwm_brazo;
//...o avanza una posición si la nueva es mayor
else if (pwm_brazo < brazo) ++pwm_brazo;
//Con retardo de movimiento de posición indicado
delay_ms(velocidad);
//Y se comprueba otra vez si coincide posición actual
//con posición deseada
flag=1;
}
}

Y la forma de indicar las posiciones del servo mediante dos procedimientos. Por un lado
indicando numéricamente las nuevas posiciones de los servos que han de cambiar:

velocidad=5; //Velocidad del movimiento


muneca= 16; //Nueva posición muñeca
brazo=20; //Nueva posición brazo
hombro=13; //Nueva posición hombro

//Acceso a la función del cambio de posiciones


movimiento_brazo_num (muneca, pinza, brazo, hombro, velocidad);

O tener unas posiciones preestablecidas definidas por una opción que se envía para
obtener la nueva posición:

brazo_pos=2; //Brazo levantado

//Acceso a la función del cambio de posiciones


movimiento_brazo (brazo_pos,velocidad);

Donde brazo_pos indicará la posición genericamente preestablecida:

switch (brazo_pos){
//Brazo recogido
case0:muneca=8;pinza=8;brazo=5;hombro=21;break;
//Brazo recogido
case1:muneca=pwm_muneca;pinza=pwm_pinza;brazo=5;hombro=21;break;
//Brazo levantado
case2:muneca=pwm_muneca;pinza=pwm_pinza;brazo=16;hombro=16;break;
|
|
|
//Brazo abajo extendido
case9:muneca=pwm_muneca;pinza=pwm_pinza;brazo=16;hombro=11;break;
}

La generación de las señales pulsatorias para el control de los servos se realiza mediante
la interrupción por rebose del timer 0. Con cada rebose del timer 0 se accede a la función
de interrupción donde se incrementa la variable "Ancho_pulso" y comparandola con cada
una de las variables que contienen la posición de los servos se decide cuando la señal
de control correspondiente a cada servo debe pasar a cero. Cuando la variable
"Ancho_pulso" incrementandose pasa de 0xff a 0x00, comienza un nuevo ciclo y por
tanto un nuevo pulso para todos los servos. De esta forma se consigue un pulso cíclico
para los servos de entre unos 0,9 ms a 2,1 ms cuando establecemos valores de la
variable del servo de entre unos 7 y 21, correspondientes a las posiciones extremas.
¡Ojo! Todos estos valores corresponden al uso de un cristal de cuarzo de 4 MHz y un
preescaler de 32 del timer 0.

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

Todos los archivos se pueden descargar en el siguiente enlace:

Descarga de archivos Brazo Robot

El proyecto contenido en el artículo ha sido diseñado con la versión v4.084 de CCS PIC
C COMPILER

CÓDIGO DE COLORES Y NOMENCLATURA PARA CONDENSADORES


CÓDIGO DE COLORES PARA RESISTENCIAS
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.
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.
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

Vous aimerez peut-être aussi