Autor Tema: Robot Hexapodo  (Leído 70425 veces)

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

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Robot Hexapodo
« Respuesta #120 en: 16 de Enero de 2013, 00:32:14 »
Willy, estas queriendo controlar los servos directamente con temporizaciones desde el programa en PC ???
Es bastante dificil lograrlo, ya que las tareas en multitareas siempre tendran mayor prioridad de procesador que cualquier programa del usuario, por lo tanto veo bastante dificil que puedas lograr tiempos con precision del milisegundo...

Perdon que me meta, pero en realidad el micro controla los servos. La PC le envia instrucciones al micro para actualizar las posiciones, y eso es lo que Willy quiere controlar (la frecuencia con la q la PC envia esas instrucciones).
Saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Robot Hexapodo
« Respuesta #121 en: 16 de Enero de 2013, 00:46:48 »
Yo había entendido que el pc xD  :D

No necesitan una tasa de envío rápida porque los servos toman su tiempo en llegar a la posición deseada.

Para tener una idea de la velocidad viene un valor de tiempo en recorrer X angulo.Podrían probar con ese tiempo para establecer velocidad de transferencia..

Saludos!

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Robot Hexapodo
« Respuesta #122 en: 16 de Enero de 2013, 07:13:14 »
Tener la variable tiempo en el soft host es para poder determinar, en base a una velocidad de desplazamiento del robot previamente establecida, las sucesivas posiciones de cada servo.

Gracias por las respuestas, voy a ver si empiezo a leer eso del 24F, solo para tener una idea  ;-)
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Robot Hexapodo
« Respuesta #123 en: 16 de Enero de 2013, 09:27:52 »
Yo había entendido que el pc xD  :D

No necesitan una tasa de envío rápida porque los servos toman su tiempo en llegar a la posición deseada.

Para tener una idea de la velocidad viene un valor de tiempo en recorrer X angulo.Podrían probar con ese tiempo para establecer velocidad de transferencia..

Saludos!

Claro, ademas no queremos saturar al micro enviandole datos por el puerto serie ;)

Les cuento que se me quemo la placa donde tenia el pic ¬¬ es la segunda vez q me pasa con los pics en formato TQFP.. Seguramente algun corto entre las patitas. Asique bueno, a hacer otra placa y tener mas cuidado con la distancia entre pistas.. Tambien voy a conseguir algun flux para q no quede estaño entre patita y patita.
Saludos!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Robot Hexapodo
« Respuesta #124 en: 16 de Enero de 2013, 12:58:59 »
Huuuu, que garrón che, y podes recuperar el PIC?

Estos temas son los que me desalientan a hacer algo con montaje superficial  :oops:
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Robot Hexapodo
« Respuesta #125 en: 16 de Enero de 2013, 13:16:18 »
Huuuu, que garrón che, y podes recuperar el PIC?

Estos temas son los que me desalientan a hacer algo con montaje superficial  :oops:

Lo dudo, hasta tiro humito jaja. Pero tengo un par mas. El garron es todo el trabajo de hacer otra placa, soldar, etc..
En fin, dentro de poco voy a estar en carrera de nuevo jeje.
Suerte!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Robot Hexapodo
« Respuesta #126 en: 16 de Enero de 2013, 13:23:02 »
Citar
hasta tiro humito 

Fumar es perjudicial para la salud !!  :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Robot Hexapodo
« Respuesta #127 en: 16 de Enero de 2013, 15:53:32 »
En fin, dentro de poco voy a estar en carrera de nuevo jeje.

Lo bueno de esta carrera es que ganamos todos  8)
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Robot Hexapodo
« Respuesta #128 en: 16 de Enero de 2013, 22:05:12 »
Hola Gera

a mi los chip en montaje tqfp y smd me dan un miedo que pa que
hace un tiempo cuando me informe en soldar esos "tamaños" encontre un truco para ellos,
un aleman o un ingles estañaba primero las pistas y luego con la maya extendia el
cobre por todas y el cobre de sobras se lo comia la maya y
despues con una lupa de estas de relojero miraba las pistas y si no estab seguro
media continudidad con el polimetro y en ultimo lugar le ponia flush, ese bote pequeño, la de pincel parecia agua
y con unas pinzas y la lupa de relojero ponia el chip en su sitio y con un soldador,
 no de los de aire caliente, si  no de los otros soldaba el chip.

yo nunca lo intente, pero lo hacia que parecia tan sencillo... pero uf
no debe de serlo

voy a buscar el enlace,.. y lo pongo


« Última modificación: 18 de Enero de 2013, 11:31:28 por pajaro »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Robot Hexapodo
« Respuesta #129 en: 16 de Enero de 2013, 22:07:38 »
Así lo hago yo, como describió Pájaro, y lo pongo antes que nada en el circuito, de modo que pueda medir continuidad del circuito antes de soldar el resto...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Robot Hexapodo
« Respuesta #130 en: 17 de Enero de 2013, 21:06:54 »
Hola amigos, gracias por ir compartiendo todos sus avances, si no les importa, me gustaría unirme a este hilo!, me dejó flipado el video del PhantomX y me emociona mucho la idea de fabricar uno, acabo de pedir el día de hoy unos servos en DX de 3.94 dólares, con los que haré pruebas, he hecho algunos ensayos con micros, pero nunca un proyecto completo, y me gustaría hacer este, tengo ya bastante experiencia en progrmar en CCS, y en lo que los pueda ayudar, encantado, de hecho, tengo un código para generar tantos PWM como salidas tenga el micro, es algo parecido a lo que están realizando, solo que la resolución es mas baja, no recuerdo cuanto. Estoy por salir del trabajo, cuando llegue a mi casa lo posteo por si quieren hecharle un vistazo. Saludos a todos desde México!!!
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Robot Hexapodo
« Respuesta #131 en: 17 de Enero de 2013, 23:11:58 »
Hola falflores, bienvenido al hilo  :)
Todo lo que quieras aportar será bienvenido.
El tema del hexapod supongo que varios quieren hacerse uno, así que este hilo resulta como un conglomerado de ideas y como veras tambien de ejemplos, por supuesto que no de como hacerse un hexapod desde cero, pero creo que ayuda un poco.

Por ahora los que venimos adelantando algo somos Gera y yo. Uno con CCS y otro con C18, pero los programas son similares y simples así que creo facil de transportar de uno a otro.

Yo por ahora estoy desarrollando tambien algo en Visual C++ para el soft de la PC, no es mucho lo que tengo, tengo que probar varias cosas y funcionando medianamente bien les comparto los avances.
En estos días me voy a dedicar un poco a construir un modelo de una pata para hacer las primeras pruebas con los servos.
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Robot Hexapodo
« Respuesta #132 en: 18 de Enero de 2013, 02:46:35 »
gracias willynovi, que bien que van avanzando, espero poder contribuir, por lo pronto les dejo el código que tengo para manejar 8 servos y 8 LEDs, que en esencia es lo mismo, equivalente a tener 18 servos, los servos tienen como 15 pasos, se que no es mucha resolución, pero tal vez se pueda mejorar o sacar alguna idea de ahí, por cierto, también tengo un programa que resolvía la cinemática inversa de 2 grados de libertad, tal vez pueda ser útil, ese también lo posteo, solo que tengo que comentarlo, haber si me acuerdo, por que tiene como 2 años que lo hice XD.

El programa del control de servos y LEDs es muy largo, por lo pronto lo pongo tal como está, pero pienso quitarle la parte del menú y de los LEDs, para que sea más entendible. Saludos!

Código: [Seleccionar]
/* Este código sirve para controlar por medio de PWM el encendido de hasta
8 LEDs, y la posición de hasta 8 servos, por medio de comandos seriales
propios del puerto de comunicaciones seriales del PIC16F887, aunque
fácilmente se puede migrar a otros dispositivos.

En una pantalla LCD de 16x2 caracteres, se puede ver el menú de la aplicación
el cuál consta de un menú principal, al mandar el comando ASCII "ENTER" que
corresponde con el valor decimal 13, se pasa a la siguiente pantalla, para
        volver al menu principal, es con ESCAPE, en el segundo menú es donde
da a escoger entre controlar los LEDs o los servos, con los números 1 y 2
respectivamente, posteriormente se muestra el número actual del LED o servo
que se esté controlando, pudiendo cambiar de número solo con presionar el
correspondiente dígito, si se presiona un número que no es, manda un mensaje
de error, al presionar "-" o "=" (lo deje con el signo igual, por que mi lap
no tiene signo más sin presionar shift) decremente o incrementa el pwm del
dispositivo en cuetión, con la barra espacioadora se va a ambos extremos, 0 o
180 grados en los servos, o prendido o apagado en los LEDs, toda la info que
se imprimie en el LCD también se manda serialmente a la computadora.
*/

#include <16F887.h>
#fuses HS, MCLR, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP, NODEBUG
#use delay(clock=20Mhz)
#use rs232(baud=115200, xmit=PIN_C6, rcv=PIN_C7,bits=8,parity=N) // Definición del RS232
#include <total_lcd.h>

#define LED1 PIN_B5
#define LED2 PIN_B4
#define LED3 PIN_B3
#define LED4 PIN_B2
#define LED5 PIN_B1
#define LED6 PIN_B0
#define LED7 PIN_C5
#define LED8 PIN_C4

#define SERVO1 PIN_A0
#define SERVO2 PIN_A1
#define SERVO3 PIN_A2
#define SERVO4 PIN_A3
#define SERVO5 PIN_A4
#define SERVO6 PIN_A5
#define SERVO7 PIN_E0
#define SERVO8 PIN_E1
#define SERVO9 PIN_E2

#define MIN_SERVO 9
#define MAX_SERVO 34
#define DEGREE 6.923
#define ENTER 13
#define ESCAPE 27
#define REGRESO 8


int8 duty_cycle=0,n=0;
int8 LED[8] = {0,0,0,0,0,0,0,0};
int8 SERVO[8] = {0,0,0,0,0,0,0,0};
int8 directory=0;
//int16 t=1000;
int1 flag_data=1;
char data=ESCAPE,last_data;
float degress[8] = {0,0,0,0,0,0,0,0};

void configure()
{
set_tris_A(0x00);
set_tris_B(0x00);
set_tris_C(0x00);
set_tris_D(0x00);
set_tris_E(0x00);
output_A(0x00);
output_B(0x00);
output_C(0x00);
output_D(0x00);
output_E(0x00);
setup_timer_0(T0_INTERNAL|T0_DIV_1);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
lcd_init();
}

void print_LED()
{
flag_data=0;
printf(lcd_putc,"\fPulsa + - SPACE\n  LED %d: %U %%" ,(n+1),LED[n]);
printf("Pulsa + - SPACE\rLED %d: %U %%\r\r" ,(n+1),LED[n]);
}


void print_servo()
{
flag_data=0;
printf(lcd_putc,"\fPulsa + - SPACE\nSERVO%d: %.2f¡"(n+1),degress[n]);
printf("Pulsa + - SPACE\rSERVO%d: %.2f¡\r\r"(n+1),degress[n]);
}

void print_error()
{
lcd_putc("\f     ERROR!     \nOpcion invalida");
lcd_putc("ERROR!  Opcion invalida\r\r");

delay_ms(500);
data=last_data;
flag_data=1;
}

//==========================
void main()
{
configure();
lcd_putc("LCD OK!!!");
delay_ms(500);
while(TRUE)
{
if(flag_data==1&&directory==0)
{
flag_data=0;
switch(data)
{
case ESCAPE:
lcd_putc("\f--- M E N U ---\n   PRESS ENTER");
printf("--- M E N U ---\r   PRESS ENTER\r\r");
while(data!=ENTER) {}
directory=0;
break;
case ENTER:
lcd_putc("\f 1 = LEDs\n 2 = SERVOS ");
printf("1 = LEDs\r 2 = SERVOS \r");
directory=1;
break;
default: print_error(); break;
}
}
if(flag_data==1&&directory==1)
{
flag_data=0;
switch(data)
{
case '1':
lcd_putc("\fSelecciona led:\n     1 -- 8");
printf("Selecciona led: 1 -- 8\r");
directory=2;
break;
case '2':
lcd_putc("\fSelecciona servo\n     1 -- 8");
lcd_putc("Selecciona servo: 1 -- 8\r");
directory=3;
break;
case ESCAPE:
directory=0;
flag_data=1;
break;
default: print_error(); break;
}
}
if(flag_data==1&&directory==2)
{
flag_data=0;
switch(data)
{
case '1': n=0; print_LED(); directory=4; break;
case '2': n=1; print_LED(); directory=4; break;
case '3': n=2; print_LED(); directory=4; break;
case '4': n=3; print_LED(); directory=4; break;
case '5': n=4; print_LED(); directory=4; break;
case '6': n=5; print_LED(); directory=4; break;
case '7': n=6; print_LED(); directory=4; break;
case '8': n=7; print_LED(); directory=4; break;
case ESCAPE:
directory=0;
flag_data=1;
break;
default: print_error(); break;
}
}
if(flag_data==1&&directory==3)
{
flag_data=0;
switch(data)
{
case '1': n=0; print_servo(); directory=5; break;
case '2': n=1; print_servo(); directory=5; break;
case '3': n=2; print_servo(); directory=5; break;
case '4': n=3; print_servo(); directory=5; break;
case '5': n=4; print_servo(); directory=5; break;
case '6': n=5; print_servo(); directory=5; break;
case '7': n=6; print_servo(); directory=5; break;
case '8': n=7; print_servo(); directory=5; break;

case ESCAPE:
directory=0;
flag_data=1;
break;
default: print_error(); break;
}
}
if(flag_data==1&&directory==4)
{
flag_data=0;
switch(data)
{
case '=':
{
if(LED[n]<100) LED[n]+=10;
print_LED();
}
break;
case '-':
{
if(LED[n]>0) LED[n]-=10;
print_LED();
}
break;
case ' ':
{
if(LED[n]<50) LED[n]=100;
else LED[n]=0;
print_LED();
}
break;
case '1': n=0; print_LED(); directory=4; break;
case '2': n=1; print_LED(); directory=4; break;
case '3': n=2; print_LED(); directory=4; break;
case '4': n=3; print_LED(); directory=4; break;
case '5': n=4; print_LED(); directory=4; break;
case '6': n=5; print_LED(); directory=4; break;
case '7': n=6; print_LED(); directory=4; break;
case '8': n=7; print_LED(); directory=4; break;
case ESCAPE:
directory=0;
flag_data=1;
break;
default: print_error(); break;
}
}
if(flag_data==1&&directory==5)
{
flag_data=0;
switch(data)
{
case '=':
{
if(SERVO[n]>MIN_SERVO)
{
SERVO[n]--;
degress[n]-=DEGREE;
print_servo();
}
}
break;
case '-':
{
if(SERVO[n]<MAX_SERVO)
{
SERVO[n]++;
degress[n]+=DEGREE;
print_servo();
}
}
break;
case ' ':
{
if(SERVO[n]<23)
{
SERVO[n]=MAX_SERVO;
degress[n]=179.998;
}
else
{
SERVO[n]=MIN_SERVO;
degress[n]=0;
}
print_servo();
}
break;
case '1': n=0; print_servo(); directory=5; break;
case '2': n=1; print_servo(); directory=5; break;
case '3': n=2; print_servo(); directory=5; break;
case '4': n=3; print_servo(); directory=5; break;
case '5': n=4; print_servo(); directory=5; break;
case '6': n=5; print_servo(); directory=5; break;
case '7': n=6; print_servo(); directory=5; break;
case '8': n=7; print_servo(); directory=5; break;

case ESCAPE:
directory=0;
flag_data=1;
break;
default: print_error(); break;
}
}
}
}

#INT_TIMER0
void timer0()
{
if(duty_cycle==0)
{
if(LED[0]) output_high(LED1);
if(LED[1]) output_high(LED2);
if(LED[2]) output_high(LED3);
if(LED[3]) output_high(LED4);
if(LED[4]) output_high(LED5);
if(LED[5]) output_high(LED6);
if(LED[6]) output_high(LED7);
if(LED[7]) output_high(LED8);

if(SERVO[0]) output_high(SERVO1);
if(SERVO[1]) output_high(SERVO2);
if(SERVO[2]) output_high(SERVO3);
if(SERVO[3]) output_high(SERVO4);
if(SERVO[4]) output_high(SERVO5);
if(SERVO[5]) output_high(SERVO6);
if(SERVO[6]) output_high(SERVO7);
if(SERVO[7]) output_high(SERVO8);
}

if(LED[0]==duty_cycle) output_low(LED1);
if(LED[1]==duty_cycle) output_low(LED2);
if(LED[2]==duty_cycle) output_low(LED3);
if(LED[3]==duty_cycle) output_low(LED4);
if(LED[4]==duty_cycle) output_low(LED5);
if(LED[5]==duty_cycle) output_low(LED6);
if(LED[6]==duty_cycle) output_low(LED7);
if(LED[7]==duty_cycle) output_low(LED8);
if(SERVO[0]==duty_cycle) output_low(SERVO1);
if(SERVO[1]==duty_cycle) output_low(SERVO2);
if(SERVO[2]==duty_cycle) output_low(SERVO3);
if(SERVO[3]==duty_cycle) output_low(SERVO4);
if(SERVO[4]==duty_cycle) output_low(SERVO5);
if(SERVO[5]==duty_cycle) output_low(SERVO6);
if(SERVO[6]==duty_cycle) output_low(SERVO7);
if(SERVO[7]==duty_cycle) output_low(SERVO8);

duty_cycle++;
if(duty_cycle==101) duty_cycle=0;
SET_TIMER0(0);
}

#int_rda
void serial_isr()
{
if (kbhit())
{
last_data=data;
data=getch();
printf(data);
flag_data=1;
}
}
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Robot Hexapodo
« Respuesta #133 en: 29 de Enero de 2013, 11:09:03 »
Ayer fui a buscar los servos al correo así que ya estan esperando que les haga la estructura, tengo una sola pata  :(

Estoy teniendo problemas con el control del servo con valores bajos, tengo que ver si puedo medir el ancho del pulso para descartar si es eso o algún problema del mismo servo.
De todas formas eso es para que el rengo sea 270°, o sea que si lo hago a 180° y le sumo el error no tendría que tener problemas.

Falflores, estuve revisando tu programa, creo que con el cristal de 20mhz tendrias que usar el control de los servos como alguno de los ejemplos que habia puesto enlaces mas arriba.

http://www.todopic.com.ar/foros/index.php?topic=39181.msg331333#msg331333
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Robot Hexapodo
« Respuesta #134 en: 25 de Mayo de 2014, 14:38:21 »
Hola, se que este post es viejito, pero lo vengo leyendo varias veces y este año estamos intentando de armar el hexa con mis alumnos. Han podido avanzar algo más? yo si voy aanzando puedo ir poniendo los resultados acá si les parece...

Saludos!
-
Leonardo Garberoglio