TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Manofwar en 16 de Junio de 2006, 18:03:36

Título: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 16 de Junio de 2006, 18:03:36
Hola a todos.

Leyendo el subforo de Robótica vi hace unas semanas un video de unos bots humanoides luchando entre ellos. Me dejaron alucinando y no he podido resistirme a tener uno de estos juguetes.

Buscando por la red encontré varios bots comerciales a unos precios desorbitados, por lo que decidí diseñar uno desde cero para abaratar
costes.

Conseguidos unos servos, bastante bien de precio en China, ahora faltaba su control. Así que a diseñar una placa capaz de controlar un número elevado de servos.

En principio, mi intención era controlar 16 servos, suficiente para un humanoide tipo Robonova. Metido en faena pense que quizas en un futuro quisiera unas pinzas, garras o algo así como manos para mi bot o aumentar los grados de libertad, asi que había que aumentar el número de servos a controlar.

Tras ver las posibilidades de los pics facilitos de conseguir me decidí por un 16f877 a 20Mhz. Con los puertos que tiene hay para controlar
24 servos y tener comunicación por hardware con el exterior.Aunque esto último he tenido que sacrificarlo para conseguir una mayor velocidad de la rutina de control, redundando en una mayor precisión en el posicionamiento de los servos.

Bien, las características de la placa controladora son:

1. Refresco de las posiciones de los 24 servos cada 20mS.
2. Rango de trabajo desde 500us (-90º) hasta 2500us (+90º).
3. Control de posicion y velocidad independiente de cada servo.
4. Lectura de la posición actual de cada servo.   
5. Comunicación por usart e i2c, para controlar los servos desde un pc o desde un PIC.

En este último punto es donde me encuentro ahora; la comunicación.

La usart por software la tengo implementada, eso sí a 115200, ya que a una velocidad inferior, según mis calculos, me sería dificil ordenar
un cambio de posición de todos los servos a la vez cada 20ms, como es mi intención.

Aquí es donde solicito vuestra ayuda para diseñar un protocolo con el menor número de bytes posible por orden.

Mi idea es esta:

Mover-> M(S,P1,P2,V)

- Donde M indica que vamos a mover los servos
- S es el número de servo a mover, de 1 a 24. (1 byte)
- P1 y P2. Estos 2 bytes son la posición a la que debe ir el servo, ejemplo: 0x5DC = 1000us
- V la velocidad a la que se movera el servo (1byte), ejemplo: un valor de 10 correspondería a 10us cada 20ms.

Esta serie de bytes debería repetirse para cada servo.

Así que si queremos ordenar a los 24 servos que inicien un movimiento a la vez, tendríamos que enviar algo como esto:

M(S,P1,P2,V,S,P1,P2,V,S,P1,P2,V,etc...)

No se si esta sería la mejor forma también para el i2c, puesto que desconozco casi todo de este bus.

Bueno, espero haberme expresado con claridad y que podáis ayudarme.

PD: En breve subire el firmware y una simulación en Proteus, para que la vayais probando y entro todos consigamos una buena placa.
Ahora que recuerdo: ¿Alguien me puede decir si hay software para cinemática de robots?



Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Manofwar en 19 de Junio de 2006, 11:28:44
Como lo prometido es deuda, aquí  (http://www.ual.es/personal/salguero/control_servos/CONTROLADORA_28_SERVOS.htm) os dejo la simulación en proteus y su firmware.

Los servos se mueven del siguiente modo:

NN,PPPP. Donde NN es el número de servo a mover
PPPP. La posición a donde debe ir el servo

ejemplo:

05,0500. Con esto moveremos el servo número 5 a la posición 500us(-90º)

Ahora mismo la comunicación sólo interpreta 7 bytes, el equivalente a mover un sólo servo cada 20ms.

Si queréis dar una orden para varios servos a la vez, sería del siguiente modo:

05,050010,25007,2000 = servo 5 a 500us (-90º), servo 10 a 2500us (90º), servo 7 a 2000us (45º)

Para que el pic acepte la orden se debe pausar la simulación, escribir la orden en el puerto serie virtual y despúes pulsar el play de la simulación. Con esto conseguimos que cada 20ms el pic lea una orden de posicionamiento.

Se que es muy rudimentario pero este protocolo sólo es para pruebas. En la versión definitiva haré un software de control más depurado.

En el próximo firmware que suba espero tener los algoritmos de velocidad terminados. Ahora mismo estoy buscando un error en ellos que me vuelven locos los servos. Se posicionan todos bien y a la velocidad individual que le digo, pero cuando el último llega a su posición todos al unísono comienzan a bailar un regetón  :) que no sé de donde viene.

Ahora a probarlo y a detectar errores :)
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Manofwar en 19 de Junio de 2006, 19:58:15
Hola LordLabre, como me has sugerido te contesto aquí.

Lo estoy haciendo en ensamblador ya que me permite más control sobre todos los procesos.
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: LordLafebre en 20 de Junio de 2006, 00:48:43
Hola:

gracias por aceptar la sugerencia Manofwar, solo una preguntilla mas, ya probaste con los servos en la realidad?
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Artifox en 20 de Junio de 2006, 01:54:01
Hola Manofwar, quize escribir ayer pero se me borro todo antes de enviar :2] Primero que nada dejame decirte que se ve muy bien tu controladora :mrgreen: baje los archivos los corri y me parece mejor que la mia jeje...  Creo que la diferencia radica en que yo basicamente atiendo un servo a la vez, es decir haciendo el control secuencialmente con lo que puedo controlar 8 servos tranquilamente y para logra hacer 16, controlo 2 servos a la vez en paralelo obteniendo 16 en total.

(http://img50.imageshack.us/img50/7227/sealesdelosservos2el.th.jpg) (http://img50.imageshack.us/my.php?image=sealesdelosservos2el.jpg)

Y veo que tu haces los 24 servos en paralelo... yo queria hacer lo mismo pero no se me ocurrio como hacerlo. Y probablemente sea porque yo trabajo en CCS y no en Asembler (aunque en mi algoritmo hay algo de ASM) A ver si nos muestras tu magia ;)
Aca dejo lo que he avanzado, aun no esta implementado la aprte de comunicacion pues aun tengo que mejorar y probar algunas cosas... A ver que les parece...

Código: CSS
  1. #include <16F876A.h>
  2. #fuses   XT, NOWDT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOBROWNOUT
  3. #use     delay(clock=4000000)
  4. #define  Nservos  16
  5. #define  High  True
  6. #define  Low   False
  7. #byte    timer0 = 0x01
  8. #byte    porta =  0x05
  9. #byte    portb =  0x06
  10. #byte    portc =  0x07
  11. #bit     t0if =   0xb.2
  12. #bit     Servo01 =   portb.0
  13. #bit     Servo02 =   portb.1
  14. #bit     Servo03 =   portb.2
  15. #bit     Servo04 =   portb.3
  16. #bit     Servo05 =   portb.4
  17. #bit     Servo06 =   portb.5
  18. #bit     Servo07 =   portb.6
  19. #bit     Servo08 =   portb.7
  20. #bit     Servo09 =   porta.0
  21. #bit     Servo10 =   porta.1
  22. #bit     Servo11 =   porta.2
  23. #bit     Servo12 =   porta.3
  24. #bit     Servo13 =   porta.5
  25. #bit     Servo14 =   portc.0
  26. #bit     Servo15 =   portc.1
  27. #bit     Servo16 =   portc.2
  28. int8  Index, Angulo[Nservos], s[2], time[2];
  29.  
  30. void Servo(int n, int1 Estado);
  31. void Ini_Ang();
  32. void retardo(int t);
  33.  
  34. void main()
  35. {
  36.    Index=0;
  37.    setup_timer_0(RTCC_DIV_16);                     // Configura el tiempo de 2.5ms entre cada Interrupcion
  38.    output_a(0);
  39.    output_b(0);
  40.    output_c(0);
  41.    Ini_Ang();
  42.    enable_interrupts( GLOBAL );
  43.    while(1)
  44.    {
  45.       set_timer0(100);
  46.       Servo(2*Index,High);
  47.       Servo(2*Index+1,High);
  48.       delay_us(300);
  49.       if (Angulo[2*Index]>=Angulo[2*Index+1])
  50.       {
  51.          if (Angulo[2*Index]=Angulo[2*Index+1])
  52.          {
  53.             Time[0] = Angulo[2*Index];
  54.             Time[1] = 0;
  55.             s[0] = 2*Index;
  56.             s[1] = 2*Index+1;
  57.          }
  58.          else
  59.          {
  60.             Time[0] = Angulo[2*Index+1];
  61.             Time[1] = Angulo[2*Index]-Angulo[2*Index+1];
  62.             s[0] = 2*Index+1;
  63.             s[1] = 2*Index;
  64.          }
  65.       }
  66.       else
  67.       {
  68.             Time[0] = Angulo[2*Index];
  69.             Time[1] = Angulo[2*Index+1]-Angulo[2*Index];
  70.             s[0] = 2*Index;
  71.             s[1] = 2*Index+1;
  72.       }
  73.       retardo(time[0]);
  74.       Servo(s[0],Low);
  75.       retardo(time[1]);
  76.       Servo(s[1],Low);
  77.       #asm                                      // espera hasta que los 2.5ms hallan pasado
  78.       Loop:
  79.          BTFSS t0if
  80.          GOTO  Loop
  81.          BCF   t0if
  82.       #endasm
  83.       Index++;
  84.       if (Index>=8)
  85.          Index=0;
  86.    }
  87. }
  88.  
  89. void retardo(int t)
  90. {
  91.    int w;
  92.    if (t!=0)
  93.    {
  94.       for (w=0;w<8;w++)
  95.          delay_us(t);
  96.    }
  97. }
  98.  
  99. void Ini_Ang()
  100. {
  101.    int k;
  102.    for(k=0;k<Nservos;k++)
  103.       Angulo[k]=5*k;
  104. }
  105.  
  106. void Servo(int n, int1 Estado)
  107. {
  108.    n+=n;
  109.    if (Estado)
  110.    {
  111.       #asm
  112.          MOVF  n,0
  113.          ADDWF 2,1
  114.          BSF   Servo01
  115.          GOTO  SalidaH
  116.          BSF   Servo02
  117.          GOTO  SalidaH
  118.          BSF   Servo03
  119.          GOTO  SalidaH
  120.          BSF   Servo04
  121.          GOTO  SalidaH
  122.          BSF   Servo05
  123.          GOTO  SalidaH
  124.          BSF   Servo06
  125.          GOTO  SalidaH
  126.          BSF   Servo07
  127.          GOTO  SalidaH
  128.          BSF   Servo08
  129.          GOTO  SalidaH
  130.          BSF   Servo09
  131.          GOTO  SalidaH
  132.          BSF   Servo10
  133.          GOTO  SalidaH
  134.          BSF   Servo11
  135.          GOTO  SalidaH
  136.          BSF   Servo12
  137.          GOTO  SalidaH
  138.          BSF   Servo13
  139.          GOTO  SalidaH
  140.          BSF   Servo14
  141.          GOTO  SalidaH
  142.          BSF   Servo15
  143.          GOTO  SalidaH
  144.          BSF   Servo16
  145.       SalidaH:
  146.       #endasm
  147.    }
  148.    else
  149.    {
  150.       #asm
  151.          MOVF  n,0
  152.          ADDWF 2,1
  153.          BCF   Servo01
  154.          GOTO  SalidaL
  155.          BCF   Servo02
  156.          GOTO  SalidaL
  157.          BCF   Servo03
  158.          GOTO  SalidaL
  159.          BCF   Servo04
  160.          GOTO  SalidaL
  161.          BCF   Servo05
  162.          GOTO  SalidaL
  163.          BCF   Servo06
  164.          GOTO  SalidaL
  165.          BCF   Servo07
  166.          GOTO  SalidaL
  167.          BCF   Servo08
  168.          GOTO  SalidaL
  169.          BCF   Servo09
  170.          GOTO  SalidaL
  171.          BCF   Servo10
  172.          GOTO  SalidaL
  173.          BCF   Servo11
  174.          GOTO  SalidaL
  175.          BCF   Servo12
  176.          GOTO  SalidaL
  177.          BCF   Servo13
  178.          GOTO  SalidaL
  179.          BCF   Servo14
  180.          GOTO  SalidaL
  181.          BCF   Servo15
  182.          GOTO  SalidaL
  183.          BCF   Servo16
  184.       SalidaL:
  185.       #endasm
  186.    }
  187. }

Este codigo esta hecho para un 16F876 con un cristal de 4MHz, pronto lo pondre para 20MHz(aunque no se porque razon he tenido algunos problemas con este cristal) Y como podras dar cuenta atiendo 2 servos a la vez, por esa razon debo tener cuidado con la cantidad de tiempo que utilice para la comunicacion.

Vamos a ver como anda todo... pero me sigue pareciendo mas optimo tu protocolo, en especial porque optimizas totalmente el tiempo, a ver si me das ideas para mejorar el mio.

Nos vemos :-/ :-/ :-/ :-/ :-/ :-/ :-/
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Manofwar en 20 de Junio de 2006, 17:23:33
Hola a todos

LordLafebre, sólo he podido probarlo con 3 servos, que son lo que tengo, pero esta misma mañana he recibido de China 6 que había pedido :-/. A ver si puede esta noche y conecto todos a ver como trabaja. En cuanto a esto una pregunta ¿Sabéis si el consumo de un servo a través del pin de control es elevado?¿Es necesaria alguna resistencia que limite el consumo?. Sobre todo por no quemar el PIC cuando los 24 servos se conecten a la vez

Artifox, te comento por encima como lo hago.

Utilizo la interrupción del CCPR1 con el TMR1.

Tengo los siguientes registros (5 por pulso) en RAM.

PULSO_X_H y PULSO_X_L : Tiempo de duración del ancho de pulso

Máscara de los puertos al finalizar dicho tiempo: PUERTOB_X, PUERTOC_X, PUERTOD_X

Las máscaras tienen todos los bits a 1 excepto el que debe de cambiar a 0 para realizar un AND con el puerto en cuestión.

Ejemplo: '11110111', cambiará a cero el bit 3 de puerto X respetando al resto de los bits.


Al inicio de los 20ms todos las salidas de los puertos están a 1, cargo el CCPR1 con el tiempo del ancho del pulso menor, previamente hay que ordenar ascendentemente todos los pulsos según su duración.

Cuando llega la interrupción del comparador CCPR1, hacemos un AND con las máscaras de todos los puertos, cargamos un nuevo valor en el CCPR1 y vuelta a empezar hasta que se realiza para los 24 pulsos.

Una vez hecho esto, vienen 2 registros (INI_20ms_H, INI_20ms_L) que son los de inicio de los 20ms con un valor que se cargará en el comparador CCPR1 hasta completar los 20ms.

Aquí os pego el código que hace esto.

Código: ASM
  1. ORG 0
  2.        
  3.         goto    inicio
  4.  
  5.         ORG 4
  6.  
  7. ;-----------------------------------------------
  8. ;           DETECCION DE INTERRUPCIONES
  9. ;-----------------------------------------------
  10.  
  11. ;-----------------------------------------------
  12. ;   PUESTA A CERO DE PINES DE LOS PUERTOS
  13. ; SEGUN PULSOS VARIABLES DE CONTROL DE SERVOS
  14. ;-----------------------------------------------
  15.         clrf    PIR1            ;Borramos la bandera indicador de interrupción
  16.         btfsc   CCPR1H,7
  17.         goto    ini_20ms
  18.         incf    FSR,F
  19.         movf    INDF,W
  20.         andwf   PORTB,F
  21.         bsf     FSR,7   ;-------------------------
  22.         movf    INDF,;
  23.         andwf   PORTC,F ;
  24.         incf    FSR,F   ;---------------------------
  25.         movf    INDF,;
  26.         andwf   PORTD,F ;-------------------------
  27.  
  28.         bcf     FSR,7
  29.         movf    INDF,W          ;Nos posicionamos en el registro bajo del siguiente cambio en los puertos
  30.         movwf   CCPR1H          ;
  31.         incf    FSR,F           ;con el siguiente ancho
  32.         movf    INDF,W          ;
  33.         movwf   CCPR1L          ;de pulso que se detectará
  34.         retfie
  35.  
  36. ini_20ms
  37.         movlw   PULSO_1_H       ;Nos posicionamos al principio de los pulsos
  38.         movwf   FSR
  39.         clrf    TMR1H           ;Iniciamos el
  40.         clrf    TMR1L           ;Timer
  41.         goto    $+1
  42.         bcf     BANDERAS,0
  43.         movf    INDF,W          ;Cargamos el comparador
  44.         movwf   CCPR1H          ;
  45.         incf    FSR,F           ;con el valor del ancho
  46.         movf    INDF,W          ;
  47.         movwf   CCPR1L          ;de pulso de menor valor
  48.         movlw   0xff            ;--------------------------
  49.         movwf   PORTB           ;
  50.         goto    $+1                     ;
  51.         movwf   PORTC           ;
  52.         goto    $+1                     ;
  53.         movwf   PORTD           ;
  54.         goto    $+1                     ;
  55.         retfie
  56.  
  57. bucle
  58.         btfss   TMR1H,6         ;El control de los servos ha acabado
  59.         goto    bucle           ;y podemos comprobar la usart
  60.         btfsc   BANDERAS,0      ;sumar velocidades y ordenar los pulsos
  61.         goto    bucle
  62.         call    usart
  63.         call    VELOCIDAD
  64.         call    ORDENA_PULSOS
  65.         bsf     BANDERAS,0      ;Ponemos a cero la bandera para que no vuelva a ejecutar hasta dentro de 20ms
  66.         goto    bucle



Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Artifox en 22 de Junio de 2006, 01:35:15
Hola Manofwar, muy bueno tu algoritmo... estoy tratando de hacer algo parecido en CCS a ver como me sale (si bien tomare tu idea como base, tienes todo el credito) No estoy usando el modulo de comparacion, aunque no descarto no hacerlo, solo estoy haciendo comparaciones simples por codigo, me hice mi algoritmo de ordenar los tiempos, pero me falta terminar la parte en donde se pone en bajo la señal de control, poco a poco ire avanzando. Ojala lo tenga para el fin de semana, ya veremos cuando lo termine, pues parece que hay algunas variaciones en el diseño mecanico y tengo que controlar 26 servos :?

Por otro lado, viendo bien las funciones de tu controladora, me quede con una duda, Como le haces para leer la posicion en la cual esta un servo???? Mandas un pulso por el pin de control y lees la respuesta??? o usas servos digitales???  :shock: creo que estoy algo confundido con eso.

Ya nos vemos  :-/ :-/ :-/ :-/ :-/
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Manofwar en 22 de Junio de 2006, 07:33:10
Hola Artifox

Como he comentado en Robótica, he leido antes aquel subforo, sólo leo la posición teórica en donde se encuentra el servo. Tengo unos registros con la posición actual de los servo, que utilizo para sumar o restar, según el sentido del giro, de la velocidad a la que queremos que se muevan los servos.

Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Manofwar en 23 de Junio de 2006, 08:25:25
Hola de nuevo

Solucionados los problemas con las rutinas de velocidad, he subido el nuevo firmware a http://www.ual.es/personal/salguero/control_servos/CONTROLADORA_28_SERVOS.htm (http://www.ual.es/personal/salguero/control_servos/CONTROLADORA_28_SERVOS.htm). El procedimiento para mover los servos es el mismo, aún no se puede escoger la velocidad, pero tienen velocidades diferentes a la hora de posicionarse.

Este fin de semana espero tener tiempo y hacer un pequeño software de control desde el pc, para no estar escribiendo en el hyperterminal
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: JHOSEF en 23 de Junio de 2006, 14:58:20
Hola Manofwar, que intersante esta el proyecto que nos presentas... e estado merodeando por todas las paginas que he podido... y de hecho tenia que pasar por el FORO, te comento que estamos realizado un proyecto que consiste en un robot cuadrupedo.. similar al de nuestro amigo ARTIFOX, donde tenemos que manejar  servos (3 por cada pata) y pues, esta propuesta y la tarjeta controladora que nos presentas se ve precisa... hemos descargado el diseño y el hex, y pues va muy bien, pero queremos controlar la posicion y velocidad de cada motor... y como vemos el hex no nos ayuda... teniamos la idea de manejar de 3 en 3 servos... ya incluso habia logrado eso.. pero tu protocolo me deja chikito :$ quisieramos que nos des la idea mas clara de como controlar los 12 servos a la vez, te agradeceriamos mucho.. si puedes enviarnos informacion sobre control de servos... por nuestra cuenta seguiremos intentandolo... y ya estaremos comentando en el FORO y seguramente publicando nuetros avances.... nos vemos... saludos desde PERU.
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Artifox en 27 de Junio de 2006, 01:53:34
Hola nuevamente, he dejado algunas ideas acerca de la controladora en  Proyecto: Robot Humanoide (http://www.todopic.com.ar/foros/index.php?topic=12333.0) especificamente para ver cual es la manera de controlar los servomotores.

Por otro lado JHOSEF seria bueno que revises este link del foro acerca de los Servos Futaba (http://www.todopic.com.ar/foros/index.php?topic=11441.0).

Nos vemos.... :mrgreen: :mrgreen: :mrgreen: :mrgreen:
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Manofwar en 02 de Julio de 2006, 07:25:05
Hola a todos, perdonad por no responder antes, pero tengo problemas de conexión en casa y en el trabajo ahora estoy demasiado liado.

Jhosef, gracias por tu interés. Te comento que todo lo que sé sobre el control de  servos está en el link que te ha dicho Artifox. En cuanto a la forma de controlarlos yo lo hago como explico  aquí http://www.todopic.com.ar/foros/index.php?topic=12528.msg71656#msg71656 (http://www.todopic.com.ar/foros/index.php?topic=12528.msg71656#msg71656). Si hay alguna parte que no esté bien explicada, dímelo e intentaré aclarartelo.

Artifox corro a leer ese post.

He estado diseñando el impreso de la placa, que una vez comprobado su correcto funcionamiento colgaré, y haciendo la estructura del robot. Con esto último no he conseguido los resultados deseados. Sin las herramientas adecuadas para trabajar el aluminio no consigo un acabado de las piezas que me convenza, aunque como estoy loco por ver al robot en pie, las utilizaré y después veré si compro algo de esto http://www.superrobotica.com/S360235.htm (http://www.superrobotica.com/S360235.htm). 
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Artifox en 04 de Julio de 2006, 17:17:37
Hola Manofwar, yo tambien ando atareado y sin mucho tiempo, pero te comento que nosotros ya estamos en proceso de produccion de las piezas para el robot, todo se esta haciendo en aluminio, en base a planchas de 2mm de espesor. Incluso para no comprar esas piezas que me comentas, se le ha hecho unas modificaciones a los servos con el fin de ponerle un contraeje a cada servo.

Por otro lado una duda, como hace tu algoritmo si llega el caso que tengas 2 o mas posiciones iguales, es decir si tengo para varios servos la misma posicion(por consiguiente el mismo tiempo en alto) En tu algoritmo de ordenarlos valores tambien incluye eso????

Bueno ya nos comunicamos... Nos vemos :-/ :-/ :-/ :-/
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Manofwar en 04 de Julio de 2006, 18:23:10
Hola Artifox

¿Podrías decirme algo más del segundo eje?. Yo había pensado en taladrar la parte posterior del servo y poner un tornillo como segundo eje, aunque al final he optado por montarlo en las articulaciones, que son algo parecido a esto
(http://www.webdearde.com/modules/Trabajos/tito/Robo-One_files/a_sc2.jpg)

claro que sin las herramientas adecuadas no me quedan tan bonitos pero la función la realizan igual.

Pues sí, tengo en cuenta las posiciones iguales y además hay que tener en cuenta también otra cosa algo más complicada de resolver. Se trata de aquellos pulsos con una diferencia de tiempo, entre ellos, inferior al tiempo de ejecución del código de la interrupción.

Vamos que durante la ejecución del código de la interrupción llega el tiempo del siguiente pulso.

Un ejemplo:

Tiempo de ejecución del código de interrupción=5us
Pulso 1=1500us
Pulso 2=1504us

Ahora mismo la solución que le he dado es tratar ambos pulsos como si tuviesen la misma duración. Si ejecutas mi simulación y cambias la posición de algún servo llevandolo a -90º o a 90º veras que cuando pasa por la posición que ya ocupa otro de los servos hay una fluctuación de la posición de este segundo servo y es debido a esto.

Esta fluctuación no se si afectará a los servos. Según lo comentado, en el hilo de los servos Futaba en el subforo de Robótocia, sobre la zona muerta de los servos no debería afectar. En cuanto termine algunas articulaciones del robot y monte todo en su placa definitiva comprobaré esto.






Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Artifox en 06 de Julio de 2006, 16:25:26
Hola Manofwar, sorry si no respondi antes, he estado algo cabezon con unas compras para el proyecto. He puesto algunas fotos de los servos modificados en Robot Humanoide (http://www.todopic.com.ar/foros/index.php?topic=12333.0)

Con respecto al algoritmo aun no lo termino para tratar de evitar el problema de las posiciones iguales, ojala q funcione :2]

Ya nos vemos :-/ :-/ :-/
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Manofwar en 16 de Julio de 2006, 15:24:57
Por fin he tenido algo de tiempo y he conseguido hacer el circuito impreso.

Aquí tenéis una imagen, mañana cuando vaya al trabajo lo colgaré para que se pueda bajar y si hay algún atrevido, que la monte y la pruebe. Yo la montaré mañana, cuando la imprima con la impresora laser del trabajo.

Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Manofwar en 17 de Julio de 2006, 07:46:30
Subido el circuito impreso en bmp a 600dpi y en Ares.

http://www.ual.es/personal/salguero/control_servos/CONTROLADORA_28_SERVOS.htm

PD: Si encontráis algún error o algo que corregir, por favor avisadme.
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Artifox en 17 de Julio de 2006, 08:49:38
Hola Manofwar, ya le di una mirada a tu diseño, se ve muy bien. veo que le has puesto al puerto A un conector de entradas/salidas que tienes pensado ponerle alli?? Veo tambien que le has puesto directamente el max232 para conectarte a la PC, eso quiere decir que tu robot siempre conservara su cordon umbilical a la PC... yo lo ubiera dejado con algun molex, para tener la posibilidad de hacerlo independiente de la PC, pues le podrias poner RF o sino tener otro PIC que tenga guardado en su memoria todos los movimientos del robot.... piensalo... Por lo demas veo que todo esta OK, seguro le dare otra ojeada, cualquier cosa te lo comento.

Yo por mi parte ya casi termino mi controladora de 26 servos :shock: aumento el numero de servos, pues mis compañeros hicieron unas modificaciones mecanicas. El algoritmo ya esta listo, solo pude hacerlo funcionar con 8 bits y no con 16 como el tuyo, pues demoraba mucho para poder ordenar los 26 datos de 16 bits cada uno (se demoraba como 19ms@20MHz) y tambien se demoraba mucho cuando los datos eran iguales... Solo me falta perfeccionar lo de la comunicacion i2c, pues al simular se pone recontra lento el Proteus y no me simula muy bien, asi que tendre que probarlo en real :2]

Bueno, ya te comentare como voy. un abrazo :-/ :-/ :-/ :-/ :-/
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Manofwar en 18 de Julio de 2006, 07:41:08
Hola Artifox, gracias por dedicarle algo de tu tiempo a mi c.i.

La comunicación serie con el PC sólo será para probar y/o guardar nuevos movimientos en el PIC. Lo que no había pensado era en RF y me gusta la solución que propones, ya que así el robot no tendrá pesos añadidos y dispondrá de más libertad para realizar los movimientos cuando esté probándolos. Creo que haré la modificación que me comentas y añadiré un transceptor de RF. Voy a consultar el hilo de Bot controlado por RF (http://www.todopic.com.ar/foros/index.php?topic=11964.0).

Mi intención es hacerlo totalmente autónomo guardando todos los movimientos posibles en el mismo 16F877. Me quedan libres unos 7k de memoria de programa y según mis cálculos tengo espacio para guardar bastastes movimientos simples y luego combinarlos para conseguir otros más complicados.

Me alegro de que hayas terminado tu algoritmo y me sorprende que tardase tanto la ordenación. ¿Lo has hecho en C verdad?¿Tanto código genera el compilador?

En cuanto a las salidas del puerto A, aún no tengo previsto qué conectaré, pero había que sacarlas para no diseñar una nueva placa si en un futuro deseo conectar algún tipo de sensor u otra cosa.

Nos leemos.
Título: Re: Proyecto: Placa controladora de 24 servos para robot humanoide
Publicado por: Artifox en 21 de Julio de 2006, 20:44:23
Hola Manofwar, estos ultimos dias he estado super ocupado y no he podido avanzar nada... Te comento que yo voy a utilizar unos transceivers RF que vienen con antena incluida y noestan muy caros us$20... aun estoy esperando que lleguen, cualquier cosa podemos intercambiar info...

http://www.sparkfun.com/commerce/product_info.php?products_id=151#

Por otro lado, mi algoritmo para ordenar los datos en C lo termine haciendo por ASM, pues el codigo generado por el compilador demoraba demasiado (cerca de 17ms), por lo que tuve que hacerlo en ASM, reduciendo el tiempo a 6ms... eso me causo mas de un dolor de cabeza... pero finalmente lo pude lograr, como mi comunicacion es i2c no toma mucho tiempo enviar los datos, solo que me faltan hacer algunos ajustes por alli.

Bueno ya nos leeremos... Ojala y tenga mas tiempo libre.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 24 de Noviembre de 2006, 19:47:31
Bueno, por fin he podido dedicarle tiempo a este proyecto. Así que os presento el diseño, espero que definitivo, de la controladora.

He aumentado el número de servos de 24 a 28, he restringido la resolución a 0,5º y el protocolo de comunicación ha cambiado un poco.

La comunicación se realiza enviando 4 bytes del siguiente modo:

 S V P1 P2

- S es el número de servo a mover, de 1 a 28. (1 byte)
- V la velocidad a la que se movera el servo desde la posición actual hasta la nueva posición (1byte), ejemplo: un valor de 1 correspondería a 0,5º cada 20ms.
- P1 y P2. Estos 2 bytes son la posición a la que debe ir el servo (0 a 360), P1 corresponde al byte de menos peso y P2 al de más. ejemplo: 68 01 = 360 =+90º

Si se quiere cambiar la posición de varios servos o de todos a la vez la orden será:

S V P1 P2 S V P1 P2 S V P1 P2 ...

Espero en este fin de semana montarla y poner alguna foto para que se vea mejor el resultado final, ya que hasta ahora sólo la he montado y comprobado su funcionamiento en una protoboard.

Una imagen de como quedará

(http://www.ual.es/personal/salguero/control_servos/Placa_28_servos.jpg)


Si alguien quiere ir buscando bugs AQUÍ (http://www.ual.es/personal/salguero/control_servos/CONTROLADORA_28_SERVOS.htm) tenéis lo necesario para montarla.

Saludos
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: aitopes en 24 de Noviembre de 2006, 20:16:08
Hola!
Me vendria de perillas para mi aracnido, aunque empece a armar seis controladoras mas pequeñas. :?

¿No son algo delgadas las pistas de alimentacion de los servos? Los mios consumen hasta 250 mA si los fuerzo un poco. Eso por 28 da....unos 7A.

Saludos!

EDITO: Acabo de ver bienel fotolito en formato PDF, y las pistas parecen estar bien. Perdon! :)
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 25 de Noviembre de 2006, 16:37:45
Hola Aitopes.

No se si las pistas de alimentación de los servos serán suficientemente anchas o no, por eso he dividido la alimentación de estos en 2 conectores separados, pero que uniendo los pines de J5 (el de al lado del ICSP) puede tenerse una alimentación única para todos.

Al final algo de razón sí que tenías con las pistas, las del 7805 estaban unidas la masa y la entrada de este. Desplacé el componente y Ares dejo tras de si las antiguas pistas. Este problema y otro que he encontrado en el firmware están solucionados y subidos los archivos correctos a mi espacio web.

Por este problema no voy a poder hacer la placa hasta el Lunes, que iré al trabajo y podré imprimir en una laser el fotolito.

Saludos
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Nocturno en 26 de Noviembre de 2006, 04:29:51
Felicidades Manofwar, es un proyecto muy interesante el que has conseguido terminar. Y el diseño de la placa ha quedado muy compacto; enhorabuena.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 27 de Noviembre de 2006, 06:37:15
Muchas gracias Nocturno, aún faltan algunas cosillas en el firmware así que no lo puedo dar por terminado.

A ver si poco a poco consigo diseños tan espectaculares como tu dsRRBOARD.

Saludos
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: softjad en 21 de Marzo de 2007, 12:01:34
Hola Manofwar, quize escribir ayer pero se me borro todo antes de enviar :2] Primero que nada dejame decirte que se ve muy bien tu controladora :mrgreen: baje los archivos los corri y me parece mejor que la mia jeje...  Creo que la diferencia radica en que yo basicamente atiendo un servo a la vez, es decir haciendo el control secuencialmente con lo que puedo controlar 8 servos tranquilamente y para logra hacer 16, controlo 2 servos a la vez en paralelo obteniendo 16 en total.

(http://img50.imageshack.us/img50/7227/sealesdelosservos2el.th.jpg) (http://img50.imageshack.us/my.php?image=sealesdelosservos2el.jpg)

Y veo que tu haces los 24 servos en paralelo... yo queria hacer lo mismo pero no se me ocurrio como hacerlo. Y probablemente sea porque yo trabajo en CCS y no en Asembler (aunque en mi algoritmo hay algo de ASM) A ver si nos muestras tu magia ;)
Aca dejo lo que he avanzado, aun no esta implementado la aprte de comunicacion pues aun tengo que mejorar y probar algunas cosas... A ver que les parece...

Código: CSS
  1. #include <16F876A.h>
  2. #fuses   XT, NOWDT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOBROWNOUT
  3. #use     delay(clock=4000000)
  4. #define  Nservos  16
  5. #define  High  True
  6. #define  Low   False
  7. #byte    timer0 = 0x01
  8. #byte    porta =  0x05
  9. #byte    portb =  0x06
  10. #byte    portc =  0x07
  11. #bit     t0if =   0xb.2
  12. #bit     Servo01 =   portb.0
  13. #bit     Servo02 =   portb.1
  14. #bit     Servo03 =   portb.2
  15. #bit     Servo04 =   portb.3
  16. #bit     Servo05 =   portb.4
  17. #bit     Servo06 =   portb.5
  18. #bit     Servo07 =   portb.6
  19. #bit     Servo08 =   portb.7
  20. #bit     Servo09 =   porta.0
  21. #bit     Servo10 =   porta.1
  22. #bit     Servo11 =   porta.2
  23. #bit     Servo12 =   porta.3
  24. #bit     Servo13 =   porta.5
  25. #bit     Servo14 =   portc.0
  26. #bit     Servo15 =   portc.1
  27. #bit     Servo16 =   portc.2
  28. int8  Index, Angulo[Nservos], s[2], time[2];
  29.  
  30. void Servo(int n, int1 Estado);
  31. void Ini_Ang();
  32. void retardo(int t);
  33.  
  34. void main()
  35. {
  36.    Index=0;
  37.    setup_timer_0(RTCC_DIV_16);                     // Configura el tiempo de 2.5ms entre cada Interrupcion
  38.    output_a(0);
  39.    output_b(0);
  40.    output_c(0);
  41.    Ini_Ang();
  42.    enable_interrupts( GLOBAL );
  43.    while(1)
  44.    {
  45.       set_timer0(100);
  46.       Servo(2*Index,High);
  47.       Servo(2*Index+1,High);
  48.       delay_us(300);
  49.       if (Angulo[2*Index]>=Angulo[2*Index+1])
  50.       {
  51.          if (Angulo[2*Index]=Angulo[2*Index+1])
  52.          {
  53.             Time[0] = Angulo[2*Index];
  54.             Time[1] = 0;
  55.             s[0] = 2*Index;
  56.             s[1] = 2*Index+1;
  57.          }
  58.          else
  59.          {
  60.             Time[0] = Angulo[2*Index+1];
  61.             Time[1] = Angulo[2*Index]-Angulo[2*Index+1];
  62.             s[0] = 2*Index+1;
  63.             s[1] = 2*Index;
  64.          }
  65.       }
  66.       else
  67.       {
  68.             Time[0] = Angulo[2*Index];
  69.             Time[1] = Angulo[2*Index+1]-Angulo[2*Index];
  70.             s[0] = 2*Index;
  71.             s[1] = 2*Index+1;
  72.       }
  73.       retardo(time[0]);
  74.       Servo(s[0],Low);
  75.       retardo(time[1]);
  76.       Servo(s[1],Low);
  77.       #asm                                      // espera hasta que los 2.5ms hallan pasado
  78.       Loop:
  79.          BTFSS t0if
  80.          GOTO  Loop
  81.          BCF   t0if
  82.       #endasm
  83.       Index++;
  84.       if (Index>=8)
  85.          Index=0;
  86.    }
  87. }
  88.  
  89. void retardo(int t)
  90. {
  91.    int w;
  92.    if (t!=0)
  93.    {
  94.       for (w=0;w<8;w++)
  95.          delay_us(t);
  96.    }
  97. }
  98.  
  99. void Ini_Ang()
  100. {
  101.    int k;
  102.    for(k=0;k<Nservos;k++)
  103.       Angulo[k]=5*k;
  104. }
  105.  
  106. void Servo(int n, int1 Estado)
  107. {
  108.    n+=n;
  109.    if (Estado)
  110.    {
  111.       #asm
  112.          MOVF  n,0
  113.          ADDWF 2,1
  114.          BSF   Servo01
  115.          GOTO  SalidaH
  116.          BSF   Servo02
  117.          GOTO  SalidaH
  118.          BSF   Servo03
  119.          GOTO  SalidaH
  120.          BSF   Servo04
  121.          GOTO  SalidaH
  122.          BSF   Servo05
  123.          GOTO  SalidaH
  124.          BSF   Servo06
  125.          GOTO  SalidaH
  126.          BSF   Servo07
  127.          GOTO  SalidaH
  128.          BSF   Servo08
  129.          GOTO  SalidaH
  130.          BSF   Servo09
  131.          GOTO  SalidaH
  132.          BSF   Servo10
  133.          GOTO  SalidaH
  134.          BSF   Servo11
  135.          GOTO  SalidaH
  136.          BSF   Servo12
  137.          GOTO  SalidaH
  138.          BSF   Servo13
  139.          GOTO  SalidaH
  140.          BSF   Servo14
  141.          GOTO  SalidaH
  142.          BSF   Servo15
  143.          GOTO  SalidaH
  144.          BSF   Servo16
  145.       SalidaH:
  146.       #endasm
  147.    }
  148.    else
  149.    {
  150.       #asm
  151.          MOVF  n,0
  152.          ADDWF 2,1
  153.          BCF   Servo01
  154.          GOTO  SalidaL
  155.          BCF   Servo02
  156.          GOTO  SalidaL
  157.          BCF   Servo03
  158.          GOTO  SalidaL
  159.          BCF   Servo04
  160.          GOTO  SalidaL
  161.          BCF   Servo05
  162.          GOTO  SalidaL
  163.          BCF   Servo06
  164.          GOTO  SalidaL
  165.          BCF   Servo07
  166.          GOTO  SalidaL
  167.          BCF   Servo08
  168.          GOTO  SalidaL
  169.          BCF   Servo09
  170.          GOTO  SalidaL
  171.          BCF   Servo10
  172.          GOTO  SalidaL
  173.          BCF   Servo11
  174.          GOTO  SalidaL
  175.          BCF   Servo12
  176.          GOTO  SalidaL
  177.          BCF   Servo13
  178.          GOTO  SalidaL
  179.          BCF   Servo14
  180.          GOTO  SalidaL
  181.          BCF   Servo15
  182.          GOTO  SalidaL
  183.          BCF   Servo16
  184.       SalidaL:
  185.       #endasm
  186.    }
  187. }

Este codigo esta hecho para un 16F876 con un cristal de 4MHz, pronto lo pondre para 20MHz(aunque no se porque razon he tenido algunos problemas con este cristal) Y como podras dar cuenta atiendo 2 servos a la vez, por esa razon debo tener cuidado con la cantidad de tiempo que utilice para la comunicacion.

Vamos a ver como anda todo... pero me sigue pareciendo mas optimo tu protocolo, en especial porque optimizas totalmente el tiempo, a ver si me das ideas para mejorar el mio.

Nos vemos :-/ :-/ :-/ :-/ :-/ :-/ :-/

holá!

Puedes comentar las partes mas importantes del programa? Es que no lo intiendo muy bien.

Gracias.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: RedPic en 19 de Febrero de 2008, 20:09:15
Manofwar. todos los enlaces a la Uni están desaparecidos en combate.  :shock:

Nota: Si queires tienes disponible Artistas Invitados (http://picmania.garcia-cuervo.net/invitados.php) para lo que necesites.  :mrgreen:
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 20 de Febrero de 2008, 10:26:50
Arreglados RedPic. Hubo problemas con el servidor de la universidad y con también con mi salud y he tenido el tema abandonado. A ver si continúo donde lo dejé.

Encantado de volver a leeros. Un saludo
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: jfh900 en 20 de Febrero de 2008, 10:57:38
Bienvenido de nuevo Manofwar esperamos contar contigo por estos lares. Un pequeño detalle: no se puede acceder a la página de la universidad.

Un saludo
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 20 de Febrero de 2008, 11:16:43
Creo que ya está todo arreglado

Gracias por la bienvenida.

Saludos
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LordLafebre en 20 de Febrero de 2008, 12:27:40
Hola:

Excelente trabajo :-/, voy a montar la placa para comprobar su funcionamiento, gracias por compartirlo, me ha caido muy bien, pues tengo unos 14 servos esperando a ser utilizados en una arañita  :P  :D
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LordLafebre en 20 de Febrero de 2008, 12:50:22
Hola:

Hay algo que no me ha quedado claro :oops: y es el funcionamiento de P1 y P2:

- P1 y P2. Estos 2 bytes son la posición a la que debe ir el servo (0 a 360), P1 corresponde al byte de menos peso y P2 al de más. ejemplo: 68 01 = 360 =+90º .

Si lo pudieras explicar un poquito más te lo agradecería.

Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 18 de Marzo de 2008, 05:41:33
Perdón por responder tan tarde.

Es tal y como dices LordLafebre.

Saludos
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LordLafebre en 18 de Marzo de 2008, 11:10:25
Hola:

Pues justamente lo que está citado en mi post es lo que no me queda claro  :P

Que valores mínimos y máximos se deben utilizar en P1 y P2, y como es que puedo variarlos para mover los servos?, está interesante la placa y quiero construirla, pero aún no me ha quedado claro el tema del funcionamiento de las variables P1 y P2  :(
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 18 de Marzo de 2008, 15:04:22
Perdón de nuevo, no había visto que era un copy/paste de mi explicación.

Los 180º de movimiento del servo están divididos en 360 pasos de 1/2 grado cada uno. Por lo tanto pasamos a hexadecimal la posición +90º=360=0x168. Enviamos primero el byte de menos peso y luego el de más peso.

Espero haberme explicado bien esta vez.

He colgado la simulación y el diseño de la placa en Proteus.

Saludos
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LordLafebre en 18 de Marzo de 2008, 16:25:06
Hola:

pues ya está claro, veamos, si quiero ubicar a un servo en la mitad, sería 0º=180=0XB4

los valores para P1 y P2 serían:

P1=0XB4

P2=0X00

Estoy en lo correcto?
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 18 de Marzo de 2008, 17:14:16
Correcto LordLafebre.

Si usas la simulación que he colgado y algún programa para enviar datos al puerto serie (creo que ccs traía uno) podrás probarlo.

Saludos
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LordLafebre en 19 de Marzo de 2008, 10:32:34
Hola:

Gracias por la explicación, ahora si ya lo tengo claro, ahora voy a hacer lo que me recomiendas, probaré primero en la simulación y me pasaré luego a probar en los servos, tengo un total de 21 servos para probarlos.  :P
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LordLafebre en 19 de Marzo de 2008, 11:21:53
Hola:

Pues no puedo hacerlos mover  :(

Para posicional al servo 1 a 0º que es el que está conectado a RB0, como tengo que escribir los datos?  Estoy probando con el Terminal de Protón, pero no lo he podido hace que se mueva  :P
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 20 de Marzo de 2008, 21:01:53
He estado mirando como funciona (demasiado tiempo sin mirarlo) y hay que conectar un cable null-modem entre el com1 y el com2 del pc. Ambos deben estar configurados a 115200.

Utilicé en su día esta forma ya que el VirtualTerminal de Isis no es muy flexible.

Saludos

Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LordLafebre en 21 de Marzo de 2008, 02:05:40
hay que conectar un cable null-modem entre el com1 y el com2 del pc. Ambos deben estar configurados a 115200.


Hola:

Solo tengo un com, probaré la placa en la realidad, creo que será mejor, pero como puedo enviar los comandos desde una aplicación en VB por ejemplo?  osea, cuál sería la forma de enviarlos, por ejemplo, veo que los datos se deben transmitir a 115200, imagino que a 8 bits, porque leí que al inicio utilizabas solo 7 bits, tengo que enviar los datos, primero el servo, luego la velocidad, luego P1 y luego P2, envío todo al mismo tiempo y nada más?

Estaría bien enviar estos valores?

MSComm1.Output = Chr$(1) 'servo
MSComm1.Output = Chr$(1) ' velocidad
MSComm1.Output = Chr$(B4) 'P1
MSComm1.Output = Chr$(0) 'P2

Siento tanta preguntadera, pero no se como se deben enviar los valores  :?
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 26 de Marzo de 2008, 20:36:43
Hola LordLaFebre:

Siento no haber respondido antes.

Creo que sí funcionará tal como dices. La comunicación es 8N1

¿Es para un bot arácnido?

Saludos
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LordLafebre en 27 de Marzo de 2008, 01:08:59
Hola:

Pues sí, es para una arañita que quiero hacer desde hace rato y bien me sirve tu controladora para los 14 servos que quiero ponerle, no he podido con la simulación, no me funcionó, voy a poner una imagn de como envié los datos, lo probé con el terminal de mikrobasic:

(http://img301.imageshack.us/img301/7378/mkbterminalgiovannilafelk0.jpg)

De ninguna de las dos formas se mueve el servo, será que me puedes poner un pantallazo del termial que usas para ver como envías los valores para mover al servo?
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 27 de Marzo de 2008, 05:07:59
Algo que se me olvidó decirte :(, RTS activado.

Saludos
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: gu1llermo en 27 de Marzo de 2008, 10:02:32
Oye! Felicidades Manofwar, no sabía de la existencia de éste post, no e descargado el código pero por lo poco que he ví todo lo hicistes en assembler, bueno no sé si vistes el que hice que está en la sección de lenguaje C, todo lo hice en C utilizando el compilador del CCS y para el pic18, el problema del C es que te genera mucho código, como bien has dicho en un post anterior, bueno ya lo tenemos tanto en assembler como en C  :mrgreen:

Que precisión has logrado, 0,5º yo lo más que podía lograr era 2º, actualmente lo tengo en 2,5º, lo que pasa es que la rutina de interrupción generada por el CCS se tarda 6,166667us y eso que estamos hablando de 83,33ns cada ciclo de reloj  :? la única forma de lograr disminuir es como has hecho, todo en assembler, pero absolutamente todo. 8)

Si lo haces para el pic18 vas a tener precisión microscópica  :shock: :mrgreen:

Saludos y felicitaciones de nuevo.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LordLafebre en 27 de Marzo de 2008, 12:17:35
Hola:

Perdón por mi ignorancia, ¿Qué es el RTS?
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LordLafebre en 27 de Marzo de 2008, 12:27:30
Hola:

Pues he activado el RTS pero nada que lo puedo hacer funcionar  :8}
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: gu1llermo en 27 de Marzo de 2008, 12:33:34
Hola LordLafebre, no te sabría responder exactamente que es RTS, pero lo que te recomendó Manofwar es que activaras esto:
(http://img248.imageshack.us/img248/6797/rtsyq5.jpg)

Por mi parte cuando utilizo el COM1 de de la máquina en el proteus siempre lo conecto así:

(http://img155.imageshack.us/img155/6938/db9conexionix0.jpg)

fíjate que RTS Y CTS están unidos, también buscando en internet conseguí esto:
Citar
The signal level on the DTR and RTS lines is also controlled by the test software and the attached inputs are read back in the software to see if these signal levels are properly returned
Fuente (http://www.lammertbies.nl/comm/cable/RS-232.html)

Activa el DTR también a ver.

Saludos.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LordLafebre en 27 de Marzo de 2008, 12:37:23
Hola:

Eso fue exactamente lo que hice, activar el RTS como lo indicas en la imagen, el lío que me hago es porque no sé exactamente como hay que enviar los valores y eso es lo que me gustaría que manofwar lo explique un poquitín mejor  :P de ser posible con un ejemplo mucho mejor.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 27 de Marzo de 2008, 16:14:34
Hola LordLaFebre:

Te dejo una imagen de mi configuración

 (http://www.ual.es/personal/salguero/control_servos/serie.jpg)

A ver si soy capaz de poner a trabajas a las pocas neuronas que tengo funcionales :) :) y esta vez dar una explicación clara

La trama de bytes la envías en el orden correcto, pero como puedes ver no envío los datos como ASCII si no como HEX. Al enviarlos ASCII estás enviando el valor del carácter 1, B, 4 ó 0.

La configuración debe ser:

velocidad: 115200
bits de datos: 8
paridad: No
bits de parada: 1

Es necesario activar el RTS (control por hardware de la comunicación) ya que de otro modo se interfiere con los PWM, originándose algún temblor en los servos, esto creo que puedo arreglarlo y poder utilizar ese pin para un servo más.

Como puedes observar en mi configuración, es el puerto COM2 por donde envío los datos y en la simulación el puerto seríe está configurado con el COM1. Esto lo tuve que hacer así ya que si intentaba enviar y recibir por el mismo puerto, COM1 como en tu caso, había problemas. Si era el terminal serie el que activaba primero el COM1, proteus no protestaba al comenzar la simulación pero no hace caso a los datos enviados desde el terminal. Si es al contrario, primero ejecutamos la simulación y luego el terminal serie, este último protestaba diciendo que el puerto ya esta ocupado por otra aplicación.

¿Cómo lo haces para no tener este problema?

Hola gu1llermo:

No he visto tu hilo, el C y yo no nos llevamos demasiado bien :mrgreen:, aparte de no entrar mucho en el foro, pero descuida que lo haré y ya te formularé alguna pregunta seguro.

En cuanto a la resolución de mi código, lo tengo restringido a 0,5º pero creo recordar que podía llegar a los 0,35º (unos 5us de interrupción).

Tengo algo hecho para los 18F, también en ensamblador, y sí que tenía una resolución bajísima, otra cosa es que sea útil.

Saludos







Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: gu1llermo en 27 de Marzo de 2008, 19:18:43
Hola Manofwar, gracias por responder, yo tampoco me la llevaba bien con C, le tenía como miedo hacer algo allí, pero era por desconocimiento, jejeje prefería darme cabezazos con el assembler mi lenguaje natal también  :mrgreen: le tengo mucho cariño y respeto a él porque fué el primero que me recibió  8) pero después de conocer el C el cambio fué impresionante, ahora hago cualquier aplicación en un dos por tres, antes lo hacía así en asm pero lo dejé por un tiempo y al volverlo a tomar mis neuronas ya estaban congeladas y ponerlas andar de nuevo  :? no fué sencillo, aunque te confieso que no tengo ni 3 semanas programando en C, antes mi pasión eran mis calculadoras hp, puedo hacer que me hablen (literalmente  :wink:)

Por otro lado, es como dices, la precisión depende de la aplicación a realizar porque si a ello vamos, podemos disminuirla utilizando engranajes, por ejemplo los 0,5º con una RT 5:1 ó lo que es lo mismo RT=0,2 tenemos que 0,5x0,2=0,1º aunque los 180º también se disminuirían en 5 veces quedando 180/5=36º solamente.

Bueno cuando quieras te pasas por allá y le hechas un vistazo, por lo menos se entiende más que el assembler  :wink:  :lol:

Saludos. ;-)
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LordLafebre en 27 de Marzo de 2008, 21:24:00
Hola:

Bueno, no hay de otra, no me funciona la simulación, armaré la placa para probar.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: gu1llermo en 27 de Marzo de 2008, 23:42:05
Según entendí hay que tener dos puertos DB9 en la pc para poder correr la simulación LordLafebre y según leí lo que escribistes tienes uno solo, así que por esa vía no se puede, estoy pensando en programar un pic que junto con el hyper terminal envíe los datos al com1.

Saludos.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LordLafebre en 28 de Marzo de 2008, 00:39:19
Hola:

Por eso mismo es que decidí hacer la placa.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: gu1llermo en 28 de Marzo de 2008, 01:58:09
Bueno ya hice el programa en el otro pic, pero la simulación del proteus todos los servos se están moviendo constantemente así no le envíe datos, será que no tengo una versión del firmware actualizada?

Aquí está el código:
Código: [Seleccionar]
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
#use delay (clock=20000000)
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7, stream=hyper)
#USE RS232 (baud=115200,bits=8,xmit=PIN_B3, stream=pic)

#use fast_io(B)
#use fast_io(C)


int8 buffer_rx[8];// Buffer de recepción del hyper terminal
int8 i=0;

#INT_RDA
void serial_isr(void){
  buffer_rx[i]=fgetc(hyper);
  fputc(buffer_rx[i], hyper);// Hacemos eco
  i++;
}


void main()
{
   int8 buffer_tx[64];// Podemos enviar hasta 64 bytes (16servos*4bytes)
   int8 j=0, i_old=0, k;
   int16 valor;
   
   set_tris_c(0b10000000);
   set_tris_b(0b00000000);
   
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL); 
   fprintf(hyper, "Listo para recibir datos\n\r");
   
   while (TRUE)
   {
      if (i_old!=i){
         if (buffer_rx[i-1]==13){// Si es ENTER enviamos
            //for (k=0; k<=j-1; k++) fputc(buffer_tx[k], pic);// Enviamos al pic
            j=0;
            i=0;
            fprintf(hyper, "Datos enviados!\n\r");
         }
         else{
            switch (i){
               case 1:
                  buffer_tx[j]=(buffer_rx[i-1]-0x30)*10;// asumo que todos son números
               break;
               
               case 2:
                  buffer_tx[j]=(buffer_rx[i-1]-0x30)+buffer_tx[j];
                  j++;
               break;
               
               case 3:
                  buffer_tx[j]=(buffer_rx[i-1]-0x30)*100;
               break;
               
               case 4:
                  buffer_tx[j]=(buffer_rx[i-1]-0x30)*10+buffer_tx[j];
               break;
               
               case 5:
                  buffer_tx[j]=(buffer_rx[i-1]-0x30)+buffer_tx[j];
                  j++;
               break;
               
               case 6:
                  valor=(buffer_rx[i-1]-0x30)*100;
               break;
               
               case 7:
                  valor=(buffer_rx[i-1]-0x30)*10+valor;
               break;
               
               case 8:
                  valor=(buffer_rx[i-1]-0x30)+valor;
                  buffer_tx[j]=make8(valor, 0);// Guardamos el byte bajo
                  j++;
                  buffer_tx[j]=make8(valor, 1);// Guardamos el byte alto
                  j++;
                  i=0;
               break;
            }
         }
         i_old=i;
      }
   }
}

La idea es usar otro pic, y conectar el hyper terminal a 9600 baudios a él, ver imagen:

(http://img259.imageshack.us/img259/507/conezt9.jpg)

Por ejemplo para mover el servo 2 a la velocidad 1, 9 grados, esto es:
Servo=2
Vel=1
Grados=9

Escribimos en el hyper terminal 02001009 y le damos enter.

El formato es así: SSVVVGGG escribir todo en formato decimal, del 0 al 9.

El programa no es inteligente así que ingresen bien los datos, es decir hay que escribir 8 números y luego darle a ENTER.

Saludos.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 28 de Marzo de 2008, 05:29:52
El firmware está bien gu1llermo. El que se muevan es porque tiene unas posiciones iniciales grabadas. Esta tarde publico un nuevo firmware sin estas.

Saludos
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: gu1llermo en 28 de Marzo de 2008, 09:07:22
A ok, cierto ahora ví que todos los servos se estabilizaban, ahora una pregunta: es con respecto al RTS también, yo lo conecto con CTS pero lo hago sin saber, lo hago porque lo ví en uno de los ejemplos del proteus y lo repito porque me ha funcionado hasta los momentos, pero esta bien que los conecte en éste caso? desde el pic que programé envío los bytes por el pin RB3 (TX) al pin RC7 (RX) de tu pic a 115200 baudios vía serial rs232 8N1, está bien eso?

PD: He corregido el código anterior porque no envíaba 4 bytes correctamente, ahora sip, los envía así: SVP1P2
S: (1 byte)
V:(1 byte)
P1 (1 byte)
P2 (1 byte)

Pero esto es transparente para el usuario porque desde el hyper terminal no se escribe así sino que (repito la explicación del otro post)
Citar
Por ejemplo para mover el servo 2 a la velocidad 1, 9 grados, esto es:
Servo=2
Vel=1
Grados=9

Escribimos en el hyper terminal 02001009 y le damos enter.

El formato es así: SSVVVGGG escribir todo en formato decimal, del 0 al 9.

El programa no es inteligente así que ingresen bien los datos, es decir hay que escribir 8 números y luego darle a ENTER.

Luego el programa en el pic se encarga de llevarlo a 4Bytes y enviarlos correctamente.

Yo estoy mandando los 4 bytes de esta forma pero no veo que se mueva ningún servo, que no estoy haciendo bien?

Otra cosa, tampoco sé cuál es el servo 1? no están numerados, solo el pin al que están conectados, yo mando a mover el servo 2 y no sé cuál es el que tengo que ver que se tiene que mover. :?

Saludos.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 28 de Marzo de 2008, 19:33:00
Gu1llermo, sí debes de conectar el RTS a una entrada de tu PIC y cuando pase a valor alto querrá decir que la controladora está preparada para recibir datos. Esta es la razón de que no funcione tal como está ahora.

He subido una nueva versión de la simulación en la que los servos están ordenados de izquierda a derecha y de abajo a arriba, empezando el 1 arriba a la izquierda.

He estado mirando un fuente que tengo, que aunque no corresponde al firmware publicado ya que no encuentro su fuente, si he podido ver que las posiciones iniciales de los servos se guardan en eeprom con el mismo formato que se le envían datos, exceptuando el primer byte correspondiente al nº de servo. La trama queda así: 3 bytes servo 1 (V-P1-P2) 3 bytes servo 2 (V-P1-P2), etc.

Una imagen de la eeprom en el WinPic800 con el HEX de mi web cargado. Antes de grabar el PIC podéis editar la eeprom y guardar vuestras posiciones iniciales de los servos.

(http://www.ual.es/personal/salguero/control_servos/eeprom.jpg)

Siento mucho ir dando la información poco a poco  pero estoy casi como vosotros ya que llevo como año y medio que no he visto el código y no recuerdo bien como lo hice :oops::oops:

Saludos
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: gu1llermo en 28 de Marzo de 2008, 22:38:08
A ok, gracias por responder, bueno conecté la señal RTS al pin RB0 y programé la interrupción externa para que cuando ocurra un transición alfa envíe los datos, envío 4 bytes SVP1P2 a 115200 baudios, trato de mover el servo 1 que es el que está en la esquina superior izquierda cierto? a la velocidad 1 (0,5º) para que se ubique 20º (esto es 01001020 según mi interface por el hyper terminal) y nada que lo consigo  :( esperaré a que LordLafebre lo monte en físico y nos comente, esperaba poder simularlo para ver como se movían  8)

Adjunto el archivo de la simulación en proteus .dsn, el código fuente en C y los .hex

PD: Archivo de simulación del Proteus corregido!

Saludos.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Manofwar en 29 de Marzo de 2008, 05:26:45
Gu1llermo, he bajado tu simulación y he encontrado el problema, elimina el conector de puerto serie, están en conflicto tu pic y él.

He conseguido que se muevan los servos, pero los grados parece que no los hace bien. Estoy intentando entender tu código en C y ver donde está el problema.

Saludos
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: gu1llermo en 29 de Marzo de 2008, 13:44:59
 :-/ que bien! tenías razón era el conector serie  :P lo quité y pude mover el servo 1, pero tiene problema con el ángulo, voy a chequear también.

Eso de la velocidad está bueno  :wink:

PD1: Ya ví el error  :? , lo estoy corrigiendo.

PD2: Miento, el programa envía bien los grados, envía 1ero el byte bajo y luego el alto, es decir P1 y luego P2, está bien eso?

Por ejemplo para 360º, envía P1=00000001b y P2=01101000b, lo que es lo mismo P1=1d y P2=104d

Cómo tengo que enviarle los grados?

PD3: El programa en el pic encargado de controlar los servos cuando le indico 299 pulsos, el posiciona el servo en 299*0,5-90=59,5º y si le indico un número <=299 lo hace bien, pero si le digo 300 pulsos se descontrola  y se regresa  :?
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: gu1llermo en 29 de Marzo de 2008, 19:30:12
He corregido el Archivo de simulación del proteus y colgado de nuevo en el post anterior (http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=12528.0;attach=6532), le quité el conector DB9 por presentar conflictos con el pic, gracias a la observación de Manofwar.

Saludos.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: pocher en 02 de Abril de 2008, 03:20:54
Hola Guillermo.

Ayer por la tarde estuve jugando con la simulación y támpoco conseguí que se moviera el dichoso SERVO1.

Es de vital importancia que Manofwar nos diga cual es exactamente la trama que se envia.

Yo estuve provando con la trama SVP1P2 (4 bytes).

S: nº de Servo
V: Velocidad
P1: Byte bajo de la posición
P2: byte alto de la posición

Creo que los Bytes los tienes mal:

Para el ejemplo que tienes de 360 sería:

P1=68 (6·16^1+8·16^0=104 en decimal)
P2=01 (0·16^3+1·16^2=256 en decimal) ... de tal forma que 256+104=360=+90º

Otro ejemplo: 0101B400 ----> Servo1, velocidad "1", posición B4=11·16+4=180=0º

Yo simplifiqué al máximo el programa de tu PIC auxiliar y desde él enviaba solo:

printf("%u",1);  //SERVO1

printf("%u",1);     //Velocidad

printf("%u",180);  //Byte bajo (P1)

printf("%u",0);     //Byte alto (P2)

Esto se supone que tendría que posicionar al SERVO1 en 0º pero no se inmuta.

Repito, es fundamental que Manofwar nos diga si la trama es esta.

Por otra parte Manofwar dice que se deben de enviar los datos cuando RTS pase a 1. En el PROTEUS RTS está parpadeando contínuamente ??

Un saludo

 


Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: gu1llermo en 02 de Abril de 2008, 16:53:31
Tienes razón Pocher, me equivoqué pero fué escribiendo, porque el programa lo hace bien

...
PD2: Miento, el programa envía bien los grados, envía 1ero el byte bajo y luego el alto, es decir P1 y luego P2, está bien eso?

Por ejemplo para 360º, envía P1=00000001b y P2=01101000b, lo que es lo mismo P1=1d y P2=104d
...

En la cita anterior lo correcto sería decir: P1=104d y P2=1d, para que 256*1+104=360

...
Otro ejemplo: 0101B400 ----> Servo1, velocidad "1", posición B4=11·16+4=180=0º
...

Pocher, el programa que yo hice del pic auxiliar no admite ninguna letra, es decir solo le puedes escribir números en base decimal [0..9]

Por ejemplo:
Servo son dos dígitos: SS [01..24]
Velocidad son tres dígitos: VVV [000...255]
Grados son tres dígitos: GGG [000...360]

En la interface que hice, por el virtual terminal tienes que escribir 8 números en total, por ejemplo:
Servo: 01 (Servo 1)
Velocidad: 001 (Velocidad 1)
Grados: 020 (Supuestamente 20º, pero son 20 pulsos según entiendo)

Todo en una sola línea, esto es 01001020 y pulsar ENTER, que cuando RTS se ponga en 1 el pic envía la trama y te devuelve el mensaje de datos enviados!

...
Por otra parte Manofwar dice que se deben de enviar los datos cuando RTS pase a 1. En el PROTEUS RTS está parpadeando contínuamente ??
...

La señal RTS siempre está parpadeando, a veces tarda un poco en hacerlo pero cuando ocurre una transición alfa, es decir que va de 0 a 1, por interrupción mando la trama.

Cualquier otra cosa pregunta, por aquí estamos y que bueno que lo hayas probado también, esperaremos los comentarios de Manowar.

PD1: Pocher el programa no está pa bruto como te gustan  8) pero manda la trama  ;-)

PD2:
...
Otro ejemplo: 0101B400 ----> Servo1, velocidad "1", posición B4=11·16+4=180=0º
...
Esto se supone que tendría que posicionar al SERVO1 en 0º pero no se inmuta.
...

La controladora no hace nada porque no está recibiendo los datos correctamente, los datos correctamente, si es a través de mi interface, son puros dígitos del 0 al 9.

Saludos.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: pocher en 03 de Abril de 2008, 02:30:08
Hola Guillermo.

Se vé que no me he sabido explicar. Tu programa del PIC auxiliar seguramente estará bien, yo no lo estoy usando,lo he dejado ligerito de ropa, en el programa del PIC auxiliar que has introducido lo he borrado todo y solo le he metido los 4 printf:

printf("%u",1);     //SERVO1

printf("%u",1);     //Velocidad

printf("%u",180);  //Byte bajo (P1) correspondiente al hexadecimal B4

printf("%u",0);     //Byte alto (P2)

... para ver si "el PIC de Manofwar" posicionaba bien al SERVO1.

Según comentaba Manofwar esta es la trama que él envia:


Hola LordLaFebre:

Te dejo una imagen de mi configuración

 (http://www.ual.es/personal/salguero/control_servos/serie.jpg)

A ver si soy capaz de poner a trabajas a las pocas neuronas que tengo funcionales :) :) y esta vez dar una explicación clara

La trama de bytes la envías en el orden correcto, pero como puedes ver no envío los datos como ASCII si no como HEX. Al enviarlos ASCII estás enviando el valor del carácter 1, B, 4 ó 0.

La configuración debe ser:

velocidad: 115200
bits de datos: 8
paridad: No
bits de parada: 1

Es necesario activar el RTS (control por hardware de la comunicación) ya que de otro modo se interfiere con los PWM, originándose algún temblor en los servos, esto creo que puedo arreglarlo y poder utilizar ese pin para un servo más.

Como puedes observar en mi configuración, es el puerto COM2 por donde envío los datos y en la simulación el puerto seríe está configurado con el COM1. Esto lo tuve que hacer así ya que si intentaba enviar y recibir por el mismo puerto, COM1 como en tu caso, había problemas. Si era el terminal serie el que activaba primero el COM1, proteus no protestaba al comenzar la simulación pero no hace caso a los datos enviados desde el terminal. Si es al contrario, primero ejecutamos la simulación y luego el terminal serie, este último protestaba diciendo que el puerto ya esta ocupado por otra aplicación.

¿Cómo lo haces para no tener este problema?

Hola gu1llermo:

No he visto tu hilo, el C y yo no nos llevamos demasiado bien :mrgreen:, aparte de no entrar mucho en el foro, pero descuida que lo haré y ya te formularé alguna pregunta seguro.

En cuanto a la resolución de mi código, lo tengo restringido a 0,5º pero creo recordar que podía llegar a los 0,35º (unos 5us de interrupción).

Tengo algo hecho para los 18F, también en ensamblador, y sí que tenía una resolución bajísima, otra cosa es que sea útil.

Saludos



... es decir 01 01 B4 00 que es lo que le intento enviar con los printf.

LordLafebre también intentó enviar dicha trama y támpoco le funcionaba. ¿qué pasa? Pués no lo sé.

PD. Tengo una idea para hacer el programa en el cual se usaria C para ordenar los tiempos de menor a mayor y ensamblador para activar todas las señales al mismo tiempo y luego ir bajándolas a cero de menor a mayor utilizando el TMR1 comparando su valor con los registros ordenados en C (fosc=20MHz fundamental). No sé lo que saldrá, a ver si esta tarde me pongo a ello.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: gu1llermo en 03 de Abril de 2008, 09:48:07
Ah! ok ya entendí, entonces tienes una omisión al enviar los datos y es que el pic controlador solo te escuchará si tiene la señal RTS en alto, por eso es que en mi programa del pic auxiliar utilizo la interrupción RB0, y en dicho pin coloco la señal RTS de manera que al cambiar a 1 mando "toda" la trama y tu no lo haces así, mandas byte a byte sin tener esto en cuenta, mi programa del pic auxiliar si mueve al servo 1 y a todos los servos, el problema es con los grados, pero eso creo que está en el pic controlador.

Saludos.
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Cortijero en 09 de Mayo de 2010, 17:53:37
Hola! estoy muy interesado en hacerme una plaquita controladora de estas. Me he bajado la simulacion que hay por aqui, de la plaquita y otro pic mas para ordenar los movimientos de los servos, pero no entiendo muy bien el funcionamiento.

En cuanto al numero de servo, y la velocidad no hay problema, pero en cuanto a los ultimos 3 digitos, no termino de entenderlo...  :?

Alguien me puede ayudar??

Saludos y gracias!
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: brunomozzi en 22 de Junio de 2010, 04:45:27
Hola, gran proyecto y gran idea tambien, suerte con el mismo
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: LeugimZerO en 11 de Julio de 2010, 20:54:10
Bueno, por fin he podido dedicarle tiempo a este proyecto. Así que os presento el diseño, espero que definitivo, de la controladora.

He aumentado el número de servos de 24 a 28, he restringido la resolución a 0,5º y el protocolo de comunicación ha cambiado un poco.

La comunicación se realiza enviando 4 bytes del siguiente modo:

 S V P1 P2

- S es el número de servo a mover, de 1 a 28. (1 byte)
- V la velocidad a la que se movera el servo desde la posición actual hasta la nueva posición (1byte), ejemplo: un valor de 1 correspondería a 0,5º cada 20ms.
- P1 y P2. Estos 2 bytes son la posición a la que debe ir el servo (0 a 360), P1 corresponde al byte de menos peso y P2 al de más. ejemplo: 68 01 = 360 =+90º

Si se quiere cambiar la posición de varios servos o de todos a la vez la orden será:

S V P1 P2 S V P1 P2 S V P1 P2 ...

Espero en este fin de semana montarla y poner alguna foto para que se vea mejor el resultado final, ya que hasta ahora sólo la he montado y comprobado su funcionamiento en una protoboard.

Una imagen de como quedará

(http://www.ual.es/personal/salguero/control_servos/Placa_28_servos.jpg)


Si alguien quiere ir buscando bugs AQUÍ (http://www.ual.es/personal/salguero/control_servos/CONTROLADORA_28_SERVOS.htm) tenéis lo necesario para montarla.

Saludos
una pregunta, de donde descargo los archivos, no veo los enlaces... :(
saludos desde Peru
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: Miquel_S en 26 de Octubre de 2010, 05:09:50
Hola a todos, ya se que ha pasado mucho tiempo desde el ultimo post, alguien podria volver a postear todos los archivos de la controladora del amigo Manofwar, los enlaces no funcionan.

Muchas gracias.
Miquel_S
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: robertito_c_r en 22 de Enero de 2011, 03:59:18
Hola a todos.
Estoy interesado en construir la controladora para 28 servos pero parece que los links ya no estan accesibles.
Podriais decirme algun link para poder descargarlos o enviarmelos por correo electronico?
Gracias y un saludo
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: movlwjps en 23 de Enero de 2011, 01:32:29
Yo hice un algoritmo para controlar 24 servomotores con el Timer1 de 16bit del pic a resolucion de 0,0075 grados, si quieren se los pongo solo digan, ademas se comunica por el RS-232 y los servos no vibran en absoluto. :)
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: AKENAFAB en 23 de Enero de 2011, 02:00:29
Yo hice un algoritmo para controlar 24 servomotores con el Timer1 de 16bit del pic a resolucion de 0,0075 grados, si quieren se los pongo solo digan, ademas se comunica por el RS-232 y los servos no vibran en absoluto. :)

Pues sería bueno que lo subas.

Parece muy interesante!

Saludos!
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: robotec en 17 de Febrero de 2011, 23:16:38
que tal saludos estoy empezando a trabajar con la programacion con el c30, tengo conocimientos acerca del compilador ccs, y esstoy checando el programa de guillermo, para realizar una placa que controle 30 servos, estari bien que pudieras subir tu proyecto AKENAFAB, para darnos mejor idea con respecto al diseño y trabajar respecto a la programacion. como valla teniendo avances, ire subiendolo para compartir
Título: Re: Proyecto: Placa controladora de 28 servos para robot humanoide
Publicado por: mktronic07 en 14 de Marzo de 2014, 12:32:22
Buenas, me podrían proporcionar el código fuente y los archivos pcb, porque no están disponibles, estoy interesado en realizar una placa controladora pero aun no se muy bien como controlar estos servos, controlarlos desde la pc. Gracias!!!