Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Bueno soy nuevo en el foro me llamo Daniel y este en mi nuevo proyecto, se trata de un Hexápodo cortado a láser ya tengo las piezas cortadas, y casi todos los accesorios (tornillos, tirantes, tuercas, pasadores de nylon, tapones para las patas, etc.) llevo tiempo queriendo hacer uno pero la verdad eso de ponerte a cortar pvc es un co..., ahora tengo la posibilidad de cortarlo a láser y de aluminio de 3mm la verdad es que el corte por láser es increíble. Bueno hay os lo dejo a ve que os parece.
Llevo tiempo con este proyecto pero lo tenia parado, no se cuanta gente del foro tiene un hexapodo o un cuadrupedo, o cuanta gente le gustaria tener uno. Por eso pienso que podriamos estudiar el codigo de este para crear y modificar el control del hexapodo.
-En este caso se maneja desde un mando de Playstation 2.
-Usa cinematica inversa para la posicion de las patas.
La verdad es que el codigo es perfecto para el control del hexapod, lo que pasa es que en el foro de lynxmotion, usan para controlar sus robots, el Atom Pro 28, y creo que podriamos sacarle partido a este hexapodo con un pic de microchip, sobre todo por que es mas barato y nos podemos hacer las placas.
Yo estoy usando este codigo y va perfecto, lo que pasa es que ahora quiero estudiar y comprender el codigo para ponerle sensores, comunicar el hexapodo por I2C.
Creeis que seria posible, comentar este codigo por partes y asi saber como controla la cinematica inversa el hexapodo.
Adjunto el codigo que a mi me funciona ok.
PD: Modificando un poco el codigo vale para cuadrupedos, esta probado.
Hola Ma_Black el verdadero creador de este codigo es el Sr.Jeroen Janssen junto con el Sr.Zenda (la parte de la cinematica inversa la escribio el en una hoaj de calculo excel y Jeroen lo traslado al AtomPro) su pagina web es http://robot-kits.org/ " onclick="window.open(this.href);return false; podeis buscar informacion en el foro de Lynxmotion por ejemplo aki http://www.lynxmotion.com/images/html/proj102.htm " onclick="window.open(this.href);return false;, efectivamente originalmente se hizo para AtomPro en Basic pero creo firmemente que al trasladarlo a C para pic es mucho mas potente y al mismo tiempo economico de hecho yo lo he trasladado a este entorno, el cabio del 18f4550 al 18f46K20 es por la potencia y capacidad de memoria que ofrece este ultimo sin aumentar el precio practicamente creo que valen lo mismo. Un saludo y Feliz Año!!!!!!!!!!!!!!!!!!!
Me parece estupendo lo de comentar el codigo ya que se trata de un programa muy interesante donde se puede aprender mucho.
Yo tambien pienso que en C y con un pic es mas potente, y sobre todo economico. Voy a empezar con mis dudas a ver si se anima esto.
Voy a poner 3 partes del codigo donde tengo dudas, para no poner todo el codigo.
1-Aqui que hace al pulsar el boton de la derecha, es una duda practica, mas que de no entender el codigo, es para la gente que use el programa y lo haya probado.if (bit_test(DualShock[1],5) == 0 & bit_test(LastButton[0],5)){ //Right Button test
if (RegNo<31)
RegNo++;
}
2-Aqui es parecido pero al pulsar la x del mando, es para la gente que use el programa y lo haya probadoif (bit_test(DualShock[2],6) == 0 & bit_test(LastButton[1],6)){ //X Button test
if (SetupMode == 0){
SetupMode = 1;
generate_tone(2000,100);
generate_tone(10000,100);
}
else{
SetupMode = 0;
generate_tone(8000,250);
}
}
Y la tercera es mas larga pero no comprendo que hace al entrar en la funcion setup, no se por que entra aqui, para que sirve?
//Setup
void Setup(void){
char Res[5];
short Neg;
int Val,Val1,Val2,Val3,I,c,d;
RegNo=32;
//while(){
for (RegNo=0;RegNo<=31;RegNo++){
d=0;
for(c=0;c<=4;c++){
Res[c]='.';
}
printf("R%u%c",(RegNo+32),13);
Neg=0;
for(c=0;c<=4;c++){
Res[c]=getch();
if((Res[c]=='-')&(c==0)){
Neg=1;
}
if(Res[c]==13){
break;
}
}
Val1=255;
Val2=255;
Val3=255;
d=c-1;
for(i=0;i<=d;i++){
if(Neg&i==0){
continue;
}
switch(Res){
case '0':Val=0;
break;
case '1':Val=1;
break;
case '2':Val=2;
break;
case '3':Val=3;
break;
case '4':Val=4;
break;
case '5':Val=5;
break;
case '6':Val=6;
break;
case '7':Val=7;
break;
case '8':Val=8;
break;
case '9':Val=9;
break;
}
//printf("Val=%d%c",Val,13);
if(Neg){
switch(I){
case 1:Val1=Val;
break;
case 2:Val2=Val;
break;
case 3:Val3=Val;
break;
}
}
else{
switch(I){
case 0:Val1=Val;
break;
case 1:Val2=Val;
break;
case 2:Val3=Val;
break;
}
}
}
//printf("Val1=%u Val2=%u Val3=%u%c",Val1,Val2,Val3,13);
if(Val2==255&Val3==255){
ValReg[RegNo]=(signed int)Val1;
}
else{
if(Val3==255)
ValReg[RegNo]=(signed int)(Val1*10+Val2);
else
ValReg[RegNo]=(signed int)(Val1*100+Val2*10+Val3);
}
if(Neg){
ValReg[RegNo]=ValReg[RegNo]*-1;
}
printf("ValReg[%u]=%d%c",(RegNo+32),ValReg[RegNo],13);
//delay_ms(10);
}
//return;
RegNo=0;
while (SetupMode){
Ps2Input();
printf("#%u PO %d%c",RegNo,ValReg[RegNo],13);
printf("R%u = %d%c",(RegNo+32),ValReg[RegNo],13);
delay_ms(100);
}
}
Yo tambien pienso que en C y con un pic es mas potente, y sobre todo economico. Voy a empezar con mis dudas a ver si se anima esto.
Voy a poner 3 partes del codigo donde tengo dudas, para no poner todo el codigo.
1-Aqui que hace al pulsar el boton de la derecha, es una duda practica, mas que de no entender el codigo, es para la gente que use el programa y lo haya probado.
//Esto solo vale para pasar de un registro a otro en la configuracion de lla placa SSC32 controladora de servos si no se utiliza esta placa no vala para nada if (bit_test(DualShock[1],5) == 0 & bit_test(LastButton[0],5)){ //Right Button test
if (RegNo<31)
RegNo++;
}
2-Aqui es parecido pero al pulsar la x del mando, es para la gente que use el programa y lo haya probado
//Esto solo vale para entrar en modo setup de la placa SSC32
if (bit_test(DualShock[2],6) == 0 & bit_test(LastButton[1],6)){ //X Button test
if (SetupMode == 0){
SetupMode = 1;
generate_tone(2000,100);
generate_tone(10000,100);
}
else{
SetupMode = 0;
generate_tone(8000,250);
}
}
Y la tercera es mas larga pero no comprendo que hace al entrar en la funcion setup, no se por que entra aqui, para que sirve?
//Esto es lo que comunica con la placa SSC32 y cambia los ajustes de setup de esta placa//Setup
void Setup(void){
char Res[5];
short Neg;
int Val,Val1,Val2,Val3,I,c,d;
RegNo=32;
//while(){
for (RegNo=0;RegNo<=31;RegNo++){
d=0;
for(c=0;c<=4;c++){
Res[c]='.';
}
printf("R%u%c",(RegNo+32),13);
Neg=0;
for(c=0;c<=4;c++){
Res[c]=getch();
if((Res[c]=='-')&(c==0)){
Neg=1;
}
if(Res[c]==13){
break;
}
}
Val1=255;
Val2=255;
Val3=255;
d=c-1;
for(i=0;i<=d;i++){
if(Neg&i==0){
continue;
}
switch(Res){
case '0':Val=0;
break;
case '1':Val=1;
break;
case '2':Val=2;
break;
case '3':Val=3;
break;
case '4':Val=4;
break;
case '5':Val=5;
break;
case '6':Val=6;
break;
case '7':Val=7;
break;
case '8':Val=8;
break;
case '9':Val=9;
break;
}
//printf("Val=%d%c",Val,13);
if(Neg){
switch(I){
case 1:Val1=Val;
break;
case 2:Val2=Val;
break;
case 3:Val3=Val;
break;
}
}
else{
switch(I){
case 0:Val1=Val;
break;
case 1:Val2=Val;
break;
case 2:Val3=Val;
break;
}
}
}
//printf("Val1=%u Val2=%u Val3=%u%c",Val1,Val2,Val3,13);
if(Val2==255&Val3==255){
ValReg[RegNo]=(signed int)Val1;
}
else{
if(Val3==255)
ValReg[RegNo]=(signed int)(Val1*10+Val2);
else
ValReg[RegNo]=(signed int)(Val1*100+Val2*10+Val3);
}
if(Neg){
ValReg[RegNo]=ValReg[RegNo]*-1;
}
printf("ValReg[%u]=%d%c",(RegNo+32),ValReg[RegNo],13);
//delay_ms(10);
}
//return;
RegNo=0;
while (SetupMode){
Ps2Input();
printf("#%u PO %d%c",RegNo,ValReg[RegNo],13);
printf("R%u = %d%c",(RegNo+32),ValReg[RegNo],13);
delay_ms(100);
}
}
yo usa la SSC32, Pero estos parametros que se cambian de la SSC32 para que es? que registros son? y que hacen en el comportamiento del hexapodo?
Por cierto que version de firmware, usas en la SSC32?