Control de Un Brazo Robot de 4 Ejes Con PIC

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 princ

Views 37 Downloads 2 File size 526KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

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; muneca= 16; brazo=20; hombro=13;

//Velocidad del movimiento //Nueva posición muñeca //Nueva posición brazo //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) if (control_pwm==pwm0) bit_pwm0=0;

bit_pwm0=1;

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