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

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

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #45 en: 27 de Marzo de 2008, 12:17:35 »
Hola:

Perdón por mi ignorancia, ¿Qué es el RTS?

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #46 en: 27 de Marzo de 2008, 12:27:30 »
Hola:

Pues he activado el RTS pero nada que lo puedo hacer funcionar  :8}

Desconectado gu1llermo

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


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



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

Activa el DTR también a ver.

Saludos.

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #48 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.

Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #49 en: 27 de Marzo de 2008, 16:14:34 »
Hola LordLaFebre:

Te dejo una imagen de mi configuración

 

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







Saludos desde Almería, España

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #50 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. ;-)

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #51 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.

Desconectado gu1llermo

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

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #53 en: 28 de Marzo de 2008, 00:39:19 »
Hola:

Por eso mismo es que decidí hacer la placa.

Desconectado gu1llermo

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



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.
« Última modificación: 28 de Marzo de 2008, 08:48:15 por gu1llermo »

Desconectado Manofwar

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

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #56 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.
« Última modificación: 28 de Marzo de 2008, 09:15:25 por gu1llermo »

Desconectado Manofwar

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



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
Saludos desde Almería, España

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: Proyecto: Placa controladora de 28 servos para robot humanoide
« Respuesta #58 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.
« Última modificación: 29 de Marzo de 2008, 19:27:04 por gu1llermo »

Desconectado Manofwar

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