Autor Tema: Proyecto: Placa controladora de 28 servos para robot humanoide  (Leído 49146 veces)

0 Usuarios y 5 Visitantes están viendo este tema.

Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: Proyecto: Placa controladora de 24 servos para robot humanoide
« Respuesta #15 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.

Saludos desde Almería, España

Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: Proyecto: Placa controladora de 24 servos para robot humanoide
« Respuesta #16 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.
« Última modificación: 20 de Febrero de 2008, 11:15:25 por Manofwar »
Saludos desde Almería, España

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
Re: Proyecto: Placa controladora de 24 servos para robot humanoide
« Respuesta #17 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 :-/ :-/ :-/ :-/ :-/
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: Proyecto: Placa controladora de 24 servos para robot humanoide
« Respuesta #18 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.

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.
« Última modificación: 18 de Julio de 2006, 08:03:02 por Manofwar »
Saludos desde Almería, España

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
Re: Proyecto: Placa controladora de 24 servos para robot humanoide
« Respuesta #19 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.
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #20 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á




Si alguien quiere ir buscando bugs AQUÍ tenéis lo necesario para montarla.

Saludos
« Última modificación: 20 de Febrero de 2008, 11:16:00 por Manofwar »
Saludos desde Almería, España

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #21 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! :)
« Última modificación: 24 de Noviembre de 2006, 20:17:55 por aitopes »
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #22 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
Saludos desde Almería, España

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #23 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.

Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #24 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
Saludos desde Almería, España

Desconectado softjad

  • PIC10
  • *
  • Mensajes: 41
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #25 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.



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.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #26 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 para lo que necesites.  :mrgreen:
« Última modificación: 16 de Abril de 2014, 14:08:46 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #27 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
Saludos desde Almería, España

Desconectado jfh900

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #28 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
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #29 en: 20 de Febrero de 2008, 11:16:43 »
Creo que ya está todo arreglado

Gracias por la bienvenida.

Saludos
Saludos desde Almería, España