Autor Tema: Brazo Robot - RaDoN  (Leído 43380 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Brazo Robot - RaDoN
« Respuesta #30 en: 12 de Abril de 2006, 07:24:15 »
A falta de algunas cosas, tengo el codigo más o menos listo, a lo que mover los motores se refiere.

Creo que habia dos opciones básicas, controlar de estos el sentido y el nº de pasos que da, o controlar la posición de estos, he elegido la segunda porque básicamente (puede y de hecho contiene la primera), con la primera "a pelo" se podría indicar mover el motor en un sentido que ya llego al tope por limitación de la mecánica del brazo. Cuando haga pruebas "físicas" con el brazo le agregaré al programa los rangos de posición para impedir esto.

El programa es inmensamente sencillo, se trata de multiplexar los motores PaP, además esta yo creo, excesivamente comentado para ser todo entendido por culaquiera que le caiga en sus manos (debe ser así para cuando deba exponerlo ante los profesores, que por que no decirlo ... algunos no esque sean unos llumbreras!!). Va comparando la posición en la que se encuentra hasta la "posición nueva", la cual en el futuro sera ingresada por un programa via RS232.

En el ejemplo, el 1er motor da un paso (7.5º), el 2º 2 ...
Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////
//// RaDoN-Bot 877                                                     ////
//// Por Daniel G - by RaDoN (12/04/06)                                ////
///////////////////////////////////////////////////////////////////////////

  #include <16f877A.h>        // Cabecera para el PIC16F877A

  #fuses HS,NOWDT,PUT,NODEBUG,NOPROTECT,NOBROWNOUT,NOLVP
                              // Fusibles que se activarán cuando el dispositivo
                              // se programe. P.ej: NOLVP, NO Low voltage program.
                              // Indica que será programado con tensión alta (13.5V)

  #use delay(clock=20000000)  // Cristal 20 Mhz <-> 0.25 uS/instrucción
                              // requerida para la funciones:
                              // delay_us(x) y delay_ms(x)

  #use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)

  //#ORG 0x1F00,0x1FFF {} //for the 8k 16F876/7 bootloader

  #use fast_io(A)    // Directiva que afecta al código que el compilador
  #use fast_io(B)    // generará para las instrucciones de entrada y salida.
  #use fast_io(C)    // Este método rápido de  hacer I/O ocasiona que el
  #use fast_io(D)    // compilador realice I/O sin programar el registro
  #use fast_io(E)    // de dirección.

  #byte port_a = 5   // Dirección del registro PORTA del PIC16F877 (05h)
  #byte port_b = 6   // Dirección del registro PORTB del PIC16F877 (06h)
  #byte port_c = 7   // Dirección del registro PORTC del PIC16F877 (07h)
  #byte port_d = 8   // Dirección del registro PORTD del PIC16F877 (08h)
  #byte port_e = 9   // Dirección del registro PORTE del PIC16F877 (09h)

  #define cintura 0     // Nº de motor 0 (cero porque es el valor que apunta al
                        // primer elemento del vector -array-) -> RA0:3
  #define hombro 1      // Nº de motor 1 -> RB0:3
  #define codo 2        // Nº de motor 2 -> RB4:7
  #define muneca_dcha 3 // Nº de motor 3 -> RC0:3
  #define muneca_izq 4  // Nº de motor 4 -> RD0:3
  #define pinza 5       // Nº de motor 5 -> RD4:7

  /* Las siguientes tablas constan de 6 elementos, 1 para cada motor.
  En las que se indican: la posición que ocupa, la posición a la que
  se debe dirigir y el nº de la secuencia de paso que ocupa para ser
  gobernado */

  int16 posicion_pap[6] = {0,0,0,0,0,0};  // Posición de los motores 1-6 en pasos
  int16 posicion_nueva[6] = {1,2,3,4,5,6}; // Posición a la que se deben
                                                // dirigir los PaP recibida por la UART
  int8 secuencia_pap[6] = {0,0,0,0,0,0};  // Nº de la secuencia del paso (8 pasos)
                                          // de cada motor
  /***********************************************************************/

  const int8 pasos[8] = {2,6,4,12,8,9,1,3};     // Valores para activar las bobinas:
                                                // secuencia de medio paso.

  /*#int_rda
  void serial_isr()
  {
   int num;
   if(kbhit())
   {
    num = getc();
    printf("%u\n\r", num);
   }
  }*/

  /***********************************************************************/
  // Esta funcion compara la posición del motor paso a paso correspondiente,
  // con la indicada por el programa de control mediante el puerto serie (UART).
  // En caso de ser diferente irá moviendolo secuencialmente y en forma
  // multiplexada hasta que este ocupe la posición requerida.
  /***********************************************************************/

  void mover_motor(int motor)    // Motor 0-6;  Cintura, hombro, codo,
                                 //             muñeca_dcha, muneca_izq,  pinza
  {
   if(posicion_pap[motor] == posicion_nueva[motor])   // Si el PaP esta en la
                                                      // posición requerida,
                                                      // mantén las bobinas
                                                      // inactivas.
   {
      switch(motor)
      {
         case cintura:     port_a = port_a & 0xF0; // Limpiamos el nibble inferior
                           break;
         case hombro:      port_b = port_b & 0xF0; // Limpiamos el nibble inferior
                           break;
         case codo:        port_b = port_b & 0x0F; // Limpiamos el nibble superior
                           break;
         case muneca_dcha: port_c = port_c & 0xF0; // Limpiamos el nibble inferior
                           break;
         case muneca_izq:  port_d = port_d & 0xF0; // Limpiamos el nibble inferior
                           break;
         case pinza:       port_d = port_d & 0x0F; // Limpiamos el nibble superior
                           break;
      }
   }
   else  // Si el PaP NO esta en la posición requerida, lo muevo y actualizo:
         // posición y secuencia (fase en la que se encuentra).
   {
      switch(motor)
      {
         case cintura:     port_a = pasos[secuencia_pap[motor]] | (port_a & 0xF0);;
                           break;
         case hombro:      port_b = (pasos[secuencia_pap[motor]]) | (port_b & 0xF0);
                           break;
         case codo:        port_b = (pasos[secuencia_pap[motor]] << 4) | (port_b & 0x0F);
                           break;
         case muneca_dcha: port_c = (pasos[secuencia_pap[motor]]) | (port_c & 0xF0);
                           break;
         case muneca_izq:  port_d = (pasos[secuencia_pap[motor]]) | (port_d & 0xF0);
                           break;
         case pinza:       port_d = (pasos[secuencia_pap[motor]] << 4) | (port_d & 0x0F);
                           //printf("%Lu --> ", posicion_pap[motor]);
                           //printf("%u\n\r", secuencia_pap[motor]);
                           break;
      }
      if(posicion_pap[motor] > posicion_nueva[motor])
      {
         --posicion_pap[motor];
         if(secuencia_pap[motor] == 0) secuencia_pap[motor] = 7;
         else --secuencia_pap[motor];
      }
      if(posicion_pap[motor] < posicion_nueva[motor])
      {
         ++posicion_pap[motor];
         if(secuencia_pap[motor] == 7) secuencia_pap[motor] = 0;
         else ++secuencia_pap[motor];
      }
   }
  }
  /**********************************************************************/

  // Función principal
  void main(void)
  {
   int i;
   set_tris_a(0xF0); // RA7:4 entradas, RA3:0 salidas
   set_tris_b(0x00); // RB7:0 salidas
   set_tris_c(0xF0); // RC7:4 entradas, RC3:0 salidas
   set_tris_d(0x00); // RD7:0 salidas
   //enable_interrupts(int_rda);
   //enable_interrupts(global);
   while(1)
   {
      for(i=0;i<=5;++i){
      mover_motor(i);}
      delay_ms(500);
   }
  }

De momento la demostración con Isis (Proteus)



http://www.megaupload.com/es/?d=H3WZIJ01
Si juegas contra el mejor, pierdes como los demás.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Brazo Robot - RaDoN
« Respuesta #31 en: 15 de Abril de 2006, 09:26:36 »
He aquí el esquematico de la placa de potencia para el control de motores (de 2 canales, serán 3 en total)



Y la placa:



Si veis algo raro no dudeis en postear y comentarmelo, y si alguno quiere el fotolito pues igual  :D
Si juegas contra el mejor, pierdes como los demás.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Brazo Robot - RaDoN
« Respuesta #32 en: 18 de Abril de 2006, 19:22:07 »
Que haya dejado un poquito de postear no es que lo haya dejado de lado jeje, ando haciendo placas y demás. He hecho algunas simulaciones ya con la UART moviendo los PaP, os dejo esta foto y paso a explicarla:



El programa en primer plano, Virtual Serial Port Kit te crea 2 puertos series virtuales (obvio, despues de saber el nombre...) COM3 y COM4, que ademas, están virtualmente unidos por un cable cruzado:



Con la device COMPIN de Proteus que permite enlazar un puerto (en este caso el COM3) con la simulación, voi pasandole datos a la UART del PIC para mover los motores PaP a la posición indicada por el Terminal.

Espero estar probandolo fisicamente pronto y remplazar el terminal por un programa en VB6  :)

« Última modificación: 18 de Abril de 2006, 19:24:50 por RaDoN »
Si juegas contra el mejor, pierdes como los demás.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Brazo Robot - RaDoN
« Respuesta #33 en: 21 de Abril de 2006, 18:20:01 »
Aquí esta la primera de las placas de potencia para el brazo (serán 2 más).





La proxima que haga será la placa de control con el PIC para empezar a "tontear" ya con el brazo :D
Si juegas contra el mejor, pierdes como los demás.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Brazo Robot - RaDoN
« Respuesta #34 en: 22 de Abril de 2006, 02:19:37 »
Oye, RaDoN, ¿cómo es que no has puesto los transistores en línea para poder meterle un disipa continuo a todos?

P.D.: ¿esa rueda que tiene tu teclado sirve para manejar el volumen de los altavoces?

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Brazo Robot - RaDoN
« Respuesta #35 en: 22 de Abril de 2006, 02:37:39 »
Que nooo Manolo, que noooo ... esa rueda es el Botón de Autodestrucción ...
por si acaso al Brazo Robótico Radónico de le dá por atacar a su creadorrrrr  :D  :D  :D

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Brazo Robot - RaDoN
« Respuesta #36 en: 22 de Abril de 2006, 10:10:46 »
Jejeje, me temo que la sospecha de manolo es la cierta, aunque me replantearé su uso al propuesto por Redpic  :lol:

El tema de los disipas, no se calientan nada, la probe primero en la proto y decidi que no los necesitaba.
Si juegas contra el mejor, pierdes como los demás.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Brazo Robot - RaDoN
« Respuesta #37 en: 30 de Abril de 2006, 12:23:51 »
Otro pasito, al programa anterior citado le implementado la recepción de la información para la UART, para el posicionamiento de los motores. Para esto me he valido con el trabajo hecho por Redpic, "Procesador de comandos vía RS232 (con Buffer de recepción)" :

( http://picmania.garcia-cuervo.com/PICC.htm#COMBUF232 )

Del que me aprobechado al 100%, editandolo minimamente para mi aplicación en concreto, en la voi recibiendo carácters y llenando el buffer, hasta que detecta un intro y mediante la función atol(string) la convierto en un dato númerico de 16bit que será la posición a la que ir el motor.

Esta un poco en versión beta jeje, pero esto a tiene forma  :mrgreen:



P.D: Gracias DIEGO!!!!!!!!  :-)
Si juegas contra el mejor, pierdes como los demás.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Brazo Robot - RaDoN
« Respuesta #38 en: 01 de Mayo de 2006, 13:39:14 »
Veo que hay mucha gente que le interesa el tema del brazo y sigue el hilo, pero por algún motivo no se atreven a postear ...

Sigo ... la placa principal, controladora de motores con conectores para cable plano, circuito de reset, ICSP, UART con max232 y conector DB9, un par de leds (TX y RX), algunos pulsadores y poco más, bien sencilla.

El esquemático:


La PCB:


Y unas foticos de como quedó:



Vamos a empezar a mover el trasto este ya  :mrgreen: :-/
Si juegas contra el mejor, pierdes como los demás.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Brazo Robot - RaDoN
« Respuesta #39 en: 27 de Mayo de 2006, 11:13:34 »
Siento no poder avanzar mucho en el brazo, pero ando haciendo las practicas de empresa y no me deja mucho tiempo, pero no queda más remedio que darle un fuerte achuchón a esto porque debe estar entregado a mediados de junio.

A falta de realizas 2 placas más de potencia para poder mover todas las articulaciones simultaneamente os dejo este video (tb me falta hacer el soft para VB6, aunque pienso que esto es lo más sencillo).

http://www.megaupload.com/es/?d=M268HXPM

Si juegas contra el mejor, pierdes como los demás.

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Brazo Robot - RaDoN
« Respuesta #40 en: 27 de Mayo de 2006, 12:34:05 »
Hola:

Radon, no puedo descargar el archivo  :(, el link esta bien, pero al momento de descargarlo, no aparece el cuadro para guardar el archivo, me sale un error en la pagina.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Brazo Robot - RaDoN
« Respuesta #41 en: 27 de Mayo de 2006, 13:41:50 »
Debes esperar el tiempo que te indica, despues aparece un popup que debes cerrar y debajo esta el boton para comenzar la descarga .... las cosas de megaupload (lo acabo de probar y no he tenido problemas).

Por cierto, acabo de terminar otra placa de potencia, solo me queda uno, voi a probar moviendo 4 articulaciones simultaneamente ...  :mrgreen:
Si juegas contra el mejor, pierdes como los demás.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Brazo Robot - RaDoN
« Respuesta #42 en: 28 de Mayo de 2006, 12:45:18 »
Hola Radon, pues todo va muy interesante; quisiera que me ayudes con un problema que tengo, quiero hacer creo lo mismo que tu con la simulacion, tengo la versión de prueba del virtual serial port (por si acaso no tienes la versión completa, mi mail cryn137-arroba-hotmail.com porque en el emule nunca lo descarga, o algo para "arreglarlo") y quiero comunicar el pic del proteus con el hyperterminal de windows xp; debo usar el compin creo, pero no encuentro este muy nombrado compin, donde lo encuentro?? como lo configuro?? muchas gracias, chao.
« Última modificación: 04 de Mayo de 2008, 19:27:01 por Cryn »
.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Brazo Robot - RaDoN
« Respuesta #43 en: 29 de Mayo de 2006, 10:07:36 »
hola radon llevo un tiempo sin pasar por aqui veo que lo tienes casi todo terminado, un trabajo magnifico radon...   :-/
Saludos desde Granada, España.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Brazo Robot - RaDoN
« Respuesta #44 en: 29 de Mayo de 2006, 10:27:09 »
Hola Radon, pues todo va muy interesante; quisiera que me ayudes con un problema que tengo, quiero hacer creo lo mismo que tu con la simulacion, tengo la versión de prueba del virtual serial port (por si acaso no tienes la versión completa, mi mail cryn137@hotmail.com porque en el emule nunca lo descarga, o algo para "arreglarlo") y quiero comunicar el pic del proteus con el hyperterminal de windows xp; debo usar el compin creo, pero no encuentro este muy nombrado compin, donde lo encuentro?? como lo configuro?? muchas gracias, chao.
Yo tmpc tengo la versión completa, es de pago ... aprobeche el tiempo que te deja la versión trial (creo que un mes) para simular mientras hacia las placas fisicas y poder hacerlo fisicamente.

hola radon llevo un tiempo sin pasar por aqui veo que lo tienes casi todo terminado, un trabajo magnifico radon...   :-/

Gracias dog ... todavia le queda bastante trabajo.
Si juegas contra el mejor, pierdes como los demás.


 

anything