Autor Tema: Andar con suavidad  (Leído 3794 veces)

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Andar con suavidad
« en: 18 de Mayo de 2009, 14:32:34 »
Hola de nuevo a todos,siento no poder estar todo lo que me gustaria con ustedes,pero hice un invento con internet al querer cambiar de compañia y llevo 20 dias castigado.Suerte que todavia quedan amigos para dejarte el ordenador.
Mi pregunta es la siguiente: tengo los servos de mi primer bipedo que tienen los movimientos muy rapidos,y quisiera que sus movimientos fueran mas suaves o sea mas realistas ¿Es esto posible?.
Aqui os dejo el trozo de codigo donde se centran los servos por si sirve de algo:
 

#include <16F873.h>
#device *=8                                                     //pic a utilizar
#fuses XT,NOWDT,NOPROTECT                     //ordenes para el programador
#use delay (clock=4000000)                           //Fosc=4Mhz
#use standard_io(B)                                      //Puerto B como salida
#use standard_io(A)

               /* C E N T R A D O   D E   S E R V O S */
               
      void Centra_Servo_1(int Repeticiones)
   {
      int Bucle;
      for(Bucle=1;Bucle<=Repeticiones;++Bucle)
      {
         output_high(pin_B0);
         delay_us(1550);
         output_low(pin_B0);
         delay_ms(20);
      }
   }
      void Centra_Servo_2(int Repeticiones)
   {
      int Bucle;
      for(Bucle=1;Bucle<=Repeticiones;++Bucle)
      {
         output_high(pin_B1);
         delay_us(1500);
         output_low(pin_B1);
         delay_ms(20);
      }
   }
      void Centra_Servo_3(int Repeticiones)
   {
      int Bucle;
      for(Bucle=1;Bucle<=Repeticiones;++Bucle)
      {
         output_high(pin_B2);
         delay_us(1500);
         output_low(pin_B2);
         delay_ms(20);
      }
   }
      void Centra_Servo_4(int Repeticiones)
   {
      int Bucle;
      for(Bucle=1;Bucle<=Repeticiones;++Bucle)
      {
         output_high(pin_B3);
         delay_us(1500);
         output_low(pin_B3);
         delay_ms(20);
      }
   }
      void Centra_Servo_5(int Repeticiones)
   {
      int Bucle;
      for(Bucle=1;Bucle<=Repeticiones;++Bucle)
      {
         output_high(pin_B4);
         delay_us(1500);
         output_low(pin_B4);
         delay_ms(20);
      }
   }
      void Centra_Servo_6(int Repeticiones)
   {
      int Bucle;
      for(Bucle=1;Bucle<=Repeticiones;++Bucle)
      {
         output_high(pin_B5);
         delay_us(1500);
         output_low(pin_B5);
         delay_ms(20);
      }
   }
      void Fin_de_Centrado(int Repeticiones)
   {
      int Fin;
      for(Fin=1;Fin<=Repeticiones;++Fin)
      {
         output_high(pin_A0);
         delay_ms(250);
         output_low(pin_A0);
         delay_ms(250);
      }
   }   
               
                 /* P R O G R A M A    P R I N C I P A L */
                 
      void main()
   {
         output_a(0x00);
         set_tris_a(0b000000);         /* Puerta PA todo salida */
         set_tris_b(0x00);             /* Puerta PB todo salidas */
         output_b(0x00);               /* Ponemos pines PB a 0 */
     
      do
      {
         Centra_Servo_1(25);           /* Llamamos a las funciones y generamos*/
         Centra_Servo_2(25);           /* 25 pulsos para darle tiempo a los */
         Centra_Servo_3(25);           /* servos a posicionarse en sus */
         Centra_Servo_4(25);           /* respectivas posiciones */
         Centra_Servo_5(25);
         Centra_Servo_6(25);
         Fin_de_Centrado(2);   
      }
      while(1);
   }   
         

PD: Aceptaria encantado sugerencias para mejoras del codigo ya que es mi primer proyecto.  :-)             
 
   
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Andar con suavidad
« Respuesta #1 en: 18 de Mayo de 2009, 16:27:37 »

Hola compañero!

Esto es lo que hago cuando queiro movimiento suave con los servos.

Tengo el valor final de la posicion y el actual

Entonces voy aumentando de 1 en 1 hasta llegar , si quiero ir mas rapido , voy de 2 en 2 .y asi sucesivamente.



Un saludo!




Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Andar con suavidad
« Respuesta #2 en: 19 de Mayo de 2009, 10:30:11 »
Lo primero de todo hola y gracias amigo AKENAFAB por tu respuesta, entiendo que seria algo parecido a esto:

 void Centra_Servo_1(int Repeticiones)
   {
      int Bucle;
      for(Bucle=1;Bucle<=Repeticiones;++Bucle)
      {
         output_high(pin_B0);
         delay_us(850);
         output_low(pin_B0);
         delay_ms(20);
         output_high(pin_B0);
         delay_us(852);
         output_low(pin_B0);
         delay_ms(20);
         output_high(pin_B0);
         delay_us(854);
         output_low(pin_B0);
         delay_ms(20);
         etc,etc........
      }
   }
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Andar con suavidad
« Respuesta #3 en: 19 de Mayo de 2009, 12:56:57 »

Si asi seria solo que amm creo que seria bueno tener una tarjeta dedicada a los servos.PAra que los tratase de esa manera y con la otra digamos una CPU que le mande las coordenadas y valores , etc... Asi ya no tendrias que hacer el refresco ni la rutina cada coordenada que mandes.

Sino enviarle una trama , digamos Servo,Velocidad,Posicion

Un saludo!

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Andar con suavidad
« Respuesta #4 en: 19 de Mayo de 2009, 14:23:34 »
Gracias de nuevo AKENAFAB,pero me he perdido, te refieres a una tarjeta controladora de servos como la que hay en el foro;
lo pregunto porque me interesa que sea autonomo,y si no me equivoco dicha controladora recibe dichos datos a traves del PC.
Si no es asi lo siento pero no te entendi bien, a no ser que te refieras a montar dos placas con su correspondiente pic y comunicarlas via bus i2c.
Gracias de nuevo y perdona por mi torpeza pero estoy empezando.

                       Saludos.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Andar con suavidad
« Respuesta #5 en: 19 de Mayo de 2009, 15:12:54 »
Los comandos los puedes enviar via serie ya sea mediante un pc u otro microcontrolador , siendo el otro micro que lo trabajes como autonomo enviando dato y seña de lo que quieras trabajar.

Cuantos servos vas a mover?

Y que tipo de aplicación es?

Por que puede que armes rutinas y solo vayas cargando el valor de los servos y trabajar todo con un micro.


Un saludo!

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Andar con suavidad
« Respuesta #6 en: 20 de Mayo de 2009, 07:35:48 »
Hola de nuevo AKENAFAB, el numero de servos en principio serian seis, para las articulaciones de las piernas del robot bipedo
que tengo en mente,por este motivo era que buscaba un movimiento suave lo mas parecido a un humano.
Si consigo que ande sin que se caiga luego añadire los brazos.

PD: Para mi todo un reto.  :mrgreen:
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Andar con suavidad
« Respuesta #7 en: 20 de Mayo de 2009, 15:10:25 »
Miguel, se me hace que podrias tener mejor respuesta si implementas un control tipo PID, pero en este caso solo la parte proporcional si lo que quieres es suavisar la respuesta. Si bien un control PID se aplica a un sistema con feedback, que este no es tu caso, ya que el servo lo tiene implementado internamente, podria aplicarse.

La idea es así;
Posicion Salida = Posicion Actual + Error * Cte
Posicion Salida = es el valor del pulso que tienes que indicarle al servo
Error = Posicion Deseada - Posicion Actual
Cte = 0,5 (para suavisar la salida)

Ejemplo para ir de un extremo a la posicion central
Posicion Actual = 850us
Posicion Deseada = 1500us
Error = 1500us - 850us = 650us
Posicion Salida = 850us + (650us * 0,5) = 1175us

Cuando hace este loop debes actualizar los datos para cuando lo ejecute nuevamente:
Posicion Actual = 1175us
Posicion Deseada = 1500us
Error = 1500us - 1175us = 325us
Posicion Salidad = 1175us + (325us * 0,5) = 1338us

Entonces lo que puedes hacer es tener una sola funcion que te tome los valores de las variables y las trate dentro.
Luego actualizas las variables en la parte principal del programa y llamas a la funcion de mover los servos cada cierto tiempo. Para esto debes implementar de manejar los pulsos de los servos por interrupciones. Tenderia a parecerse a un soft multitarea.

Esto hace que tengas un movimiento rapido al principio, pero cuando este por llegar a la posicion deseada, es muy lento, incluso no llegaria porque siempre esta a la mitad de la diferencia. Para eso puedes a partir de cierto valor de error, que la salida sea la Posicion Deseada.
Ejemplo: Si Error < 100us Luego Posicion Salidad = Posicion Deseada

Tambien puedes variar el valor de la Cte a necesidad segun las condiciones del programa principal.

Te recomiendo que vallas variando cada valor de a uno por ves y ver como se comporta, es una buena forma de hacer un debbuger cuando hay mecanica de pormedio.

Tambien si piensas en usar mas servos tendria que ver de manejarlos por interrupciones, fijate que en el foro hay algo de una placa para controlar hasta 28 sevos.

Tb fijate este link: http://robots-argentina.com.ar/Prueba_ServoRC02.htm

Saludos,
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Andar con suavidad
« Respuesta #8 en: 21 de Mayo de 2009, 06:24:18 »
Gracias willynovi intentare hacer lo que me pides en principio lo veo complicado,pero probando probando intentare hacerlo, entiendo lo que dices pero como en C estoy empezando ahora para mi es mas dificil dicho lenguaje que si tuviera que hacerlo en asm el cual domino mejor.
Gracias por la ayuda, y como imagino saldran mas dudas ire preguntando hasta que me mandeis a hacer pu*****.  :mrgreen:
 
 Aunque sera largo porque como he dicho anteriormente no domino el lenguaje C,ire posteando los avances.

 Gracias de nuevo a todos por el excelente trabajo que haceis ayudando a la gente como yo. :-/ :-/
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.


 

anything