Está en la página 1de 2

Logica de programacion del brazo

Lo lgico es que la fuente de energa de los robots sean bateras o similares. Cuando intentamos
hacer funcionar varios ejes del brazo a la vez, puede pasar que se produzcan bajadas de tensin
momentaneas que ocasione el reset del PIC e impidan el movimiento del brazo. Para evitarlo hay que
indicar en la configuracin del programa:
#fuses NOBROWNOUT

//No reset por baja tensin

Mediante interrupcin por desborde del Timer 0 generaremos las seales de control de los servos. Y
mediante el valor numrico contenido en una variable la posicin 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.
Para conseguir controlar la velocidad de los movimientos se ha establecido este procedimiento:
//Modificar posicin del servo mientras flag=1
while (flag)
{
flag=0;
//Si
el
eje
brazo
no
est
en
su
posicin
if (pwm_brazo != brazo)
{
//retrocede una posicin si la nueva es menor
if (pwm_brazo > brazo) pwm_brazo;
//o
avanza
una
posicin
si
la
nueva
es
mayor
else if (pwm_brazo < brazo) ++pwm_brazo;
//Con retardo de movimiento de posicin indicado
delay_ms(velocidad);
//Y se comprueba otra vez si coincide posicin actual
//con posicin deseada
flag=1;
}
}
Y la forma de indicar las posiciones del servo mediante dos procedimientos. Por un lado indicando
numricamente las nuevas posiciones de los servos que han de cambiar:
velocidad=5;
//Velocidad del movimiento
muneca= 16;
//Nueva
posicin
mueca
brazo=20;
//Nueva
posicin
brazo
hombro=13;
//Nueva posicin hombro
//Acceso a la funcin del cambio de posiciones
movimiento_brazo_num (muneca, pinza, brazo, hombro, velocidad);
O tener unas posiciones preestablecidas definidas por una opcin que se enva para obtener la nueva
posicin:

brazo_pos=2

//Brazo levantado

//Acceso a la funcin del cambio de posiciones


movimiento_brazo (brazo_pos,velocidad);
Donde brazo_pos indicar la posicin 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 generacin de las seales pulsatorias para el control de los servos se realiza mediante la
interrupcin por rebose del timer 0. Con cada rebose del timer 0 se accede a la funcin de interrupcin
donde se incrementa la variable Ancho_pulso y comparandola con cada una de las variables que
contienen la posicin de los servos se decide cuando la seal de control correspondiente a cada servo
debe pasar a cero. Cuando la variable Ancho_pulso incrementandose pasa de 0xff a 000, comienza
un nuevo ciclo y por tanto un nuevo pulso para todos los servos. De esta forma se consigue un pulso
cclico 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.

También podría gustarte