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.
Yo a la SSC-32 ningún problema, te dan el hard y el código, todo abierto por $40. Hablo de la otra controladora que ha salido, que nada más entrar en el foro te encuentras que el firm no es abierto.
Entonces perdóname, pensé que te referías a esa.
Hombre yo tengo la jvm, y la verdad esta muy bien, ademas conozco a julio, y ya me gustaria a mi poder ganarme algunos euros para este hobby asi, por que esto no da dinero solo cuesta, y si puedes pagarte algunas cosas pues mejor.
de todas maneras la SSC32 tambien me parece una buena idea, lo cierto es que son muy parecidas
pd: por eso comentaba que electronica podiamos usar, por que estoy un poco perdido, lo cierto es que lo mejor es controlar los servos como sea y no el saber como se controlan.
Buenas,
Yo no suelo postear incitando polémicas (eso si que no lleva a ningún sitio), en verdad este post solo es para contestar algo que "molesta"...
Veamos... JM
Respecto a la electrónica he mirado la controladora de servos que dices de jvm bots, y lo primero que he visto en el foro:
"Los códigos son libres (los ejemplos de programación), también la documentación de ella, comandos...etc... pero el firmware del pic no"
Por lo que si va a ser un proyecto conjunto yo descartaría esta opción ya que me parece vergonzoso estas iniciativas, no compartir y poder ayudar a la gente por vender 4 placas, muy triste la verdad.
1- La ultima vez que ayude como "tu imaginas" me encontre con que una empresa esta vendiendo mi diseño gratuito asi que decidi "cortar" ciertas cosas/codigos.
2- En www.jvmbots.com se ofrece "de gratis" mucho trabajo y se ayuda mucho a la gente, creo que podria nombrar a mas de uno.
3- Si tu no valoras tu trabajo y no lo quieres cobrar es cosa tuya.
4- Un proyecto conjunto no puede tener multiples ganadores... ¿o habran varios primeros premios para varios robots que hagan lo mismo?
5- Son muchas mas de 4 placas... (te sorprenderías)
Por ultimo... ¿Ahora dime que te parece vergonzoso y triste? porque te dire que para mi... lo realmente vergonzoso y triste es que a dia de hoy... compres la controladora en lugar de "parirla" tu mismo, pero no te preocupes, cuando lo hagas y seas capaz de desarrollarla por tus propios medios... yo y muchos mas estaremos por ahi para recordarte que la tienes que regalar y dar tu trabajo alos demas (asi seras bueno y no seras criticado como lo soy yo por ti)... como dijo un politico "manda huev..."
MA_BLACK...
Hay un codigo "libre" en los foros de www.mikroe.com donde se manejan los comandos del mando de PS2... (de todas formas yo los tengo y te los puedo pasar si los necesitas)
Saludos
Buenas os paso el codigo que use en el control de 16 servos de johnny 5, esta sacado y modificado de picmania, el unico problema es que no controla 18 servos(estoy trabajando en ello) y al recibir los comandos por puerto serie tiembla, lo demas es estable. Recuerdo que lo tengo que pulir mas, si alguien quiere ir modificandolo, lo puede colgar, y lo podemos usar. Aunque no funciona ni mucho menos como las controladoras citadas anteriormente.
Tengo el esquema de la pba utilizada por si alguien lo necesita
#include <18F458>
#fuses HS,PUT,NOWDT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NODEBUG,NOWRT
#use delay(clock=12000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(A)
#use fast_io(B)
#priority timer1,timer3,rda
#define SERVO1 PIN_B0
#define SERVO2 PIN_B1
#define SERVO3 PIN_B2
#define SERVO4 PIN_B3
#define SERVO5 PIN_B4
#define SERVO6 PIN_B5
#define SERVO7 PIN_B6
#define SERVO8 PIN_B7
#define SERVO9 PIN_D0
#define SERVO10 PIN_D1
#define SERVO11 PIN_D2
#define SERVO12 PIN_D3
#define SERVO13 PIN_D4
#define SERVO14 PIN_D5
#define SERVO15 PIN_D6
#define SERVO16 PIN_D7
#define LED1 PIN_E0
#define LED2 PIN_E1
#define MOTOR1A PIN_C0
#define MOTOR1B PIN_C1
#define MOTOR2A PIN_C2
#define MOTOR2B PIN_C5
const int16 Ticks4Window = 7576; //12500; // PWM Window for servo = 2.5 ms x 8 = 20 ms son valores con 12mhz en crystal
const int16 Ticks4Minimum = 2121; //3500; // PWM High for Minimum Position = 0.7 ms
const int16 Ticks4Center = 4545; //7500; // PWM High for Center Position = 1.5 ms
const int16 Ticks4Maximum = 6970; //11500; // PWM High for Maximum Position = 2.3 ms
//static char command;
int16 Keypress=' ';
int16 Keypress2=' ';
int16 Keypress3=' ';
int16 Keypress4=' ';
int16 Keypress5=' ';
int16 Keypress6=' ';
int16 Keypress7=' ';
int16 Keypress8=' ';
int16 servo;
int32 posicion;
int8 se1;
int8 se2;
static int16 Servo_PWM[8]={Ticks4Center,Ticks4Center,Ticks4Center,Ticks4Center,Ticks4Center,Ticks4Center,Ticks4Center,Ticks4Center};
static int16 Servo_PWM2[8]={Ticks4Center,Ticks4Center,Ticks4Center,Ticks4Center,Ticks4Center,Ticks4Center,Ticks4Center,Ticks4Center};
static int8 Servo_Idx=0;
static int8 Servo_Idx2=0;
static int8 S18=0; //selector de servos del 1 al 8
static int8 S916=0; //selector de servos del 9 al 16
static int1 SERVO1_ON=1;
static int1 SERVO2_ON=1;
static int1 SERVO3_ON=1;
static int1 SERVO4_ON=1;
static int1 SERVO5_ON=1;
static int1 SERVO6_ON=1;
static int1 SERVO7_ON=1;
static int1 SERVO8_ON=1;
static int1 SERVO9_ON=1;
static int1 SERVO10_ON=1;
static int1 SERVO11_ON=1;
static int1 SERVO12_ON=1;
static int1 SERVO13_ON=1;
static int1 SERVO14_ON=1;
static int1 SERVO15_ON=1;
static int1 SERVO16_ON=1;
static int1 flag_Phase;
static int16 Ticks4NextInterrupt=58036; //2.5ms hasta el pin en alto del siguiente servo con crystal de 12mhz
static int1 flag_Phase2;
static int16 Ticks4NextInterrupt2=58036; //58036 para 2.5ms hasta el pin en alto del siguiente servo con crystal de 12mhz
#int_rda
void serial_isr(void)
{
//if(kbhit())
//{
servo=99;
Keypress=getc();
Keypress2=getc(); //numero de servo
Keypress3=getc(); //numero de servo
Keypress4=getc(); //posicion de servo
Keypress5=getc(); //posicion de servo
Keypress6=getc(); //posicion de servo
Keypress7=getc(); //posicion de servo
// }
}
#int_timer1
void timer1_isr(void){
if(flag_Phase==0){
if(Servo_Idx==0 && SERVO1_ON) output_high(SERVO1);
if(Servo_Idx==1 && SERVO2_ON) output_high(SERVO2);
if(Servo_Idx==2 && SERVO3_ON) output_high(SERVO3);
if(Servo_Idx==3 && SERVO4_ON) output_high(SERVO4);
if(Servo_Idx==4 && SERVO5_ON) output_high(SERVO5);
if(Servo_Idx==5 && SERVO6_ON) output_high(SERVO6);
if(Servo_Idx==6 && SERVO7_ON) output_high(SERVO7);
if(Servo_Idx==7 && SERVO8_ON) output_high(SERVO8);
Ticks4NextInterrupt = 65535 - Servo_PWM[Servo_Idx];
set_timer1(Ticks4NextInterrupt);
}
if(flag_Phase==1){
if(Servo_Idx==0 && SERVO1_ON) output_low(SERVO1);
if(Servo_Idx==1 && SERVO2_ON) output_low(SERVO2);
if(Servo_Idx==2 && SERVO3_ON) output_low(SERVO3);
if(Servo_Idx==3 && SERVO4_ON) output_low(SERVO4);
if(Servo_Idx==4 && SERVO5_ON) output_low(SERVO5);
if(Servo_Idx==5 && SERVO6_ON) output_low(SERVO6);
if(Servo_Idx==6 && SERVO7_ON) output_low(SERVO7);
if(Servo_Idx==7 && SERVO8_ON) output_low(SERVO8);
Ticks4NextInterrupt = 65535 - Ticks4Window + Servo_PWM[Servo_Idx];
set_timer1(Ticks4NextInterrupt);
if(++Servo_Idx>7) Servo_Idx=0;
}
++flag_Phase;
}
#int_timer3 //8servos mas
void timer3_isr(void){
if(flag_Phase2==0){
if(Servo_Idx2==0 && SERVO9_ON) output_high(SERVO9);
if(Servo_Idx2==1 && SERVO10_ON) output_high(SERVO10);
if(Servo_Idx2==2 && SERVO11_ON) output_high(SERVO11);
if(Servo_Idx2==3 && SERVO12_ON) output_high(SERVO12);
if(Servo_Idx2==4 && SERVO13_ON) output_high(SERVO13);
if(Servo_Idx2==5 && SERVO14_ON) output_high(SERVO14);
if(Servo_Idx2==6 && SERVO15_ON) output_high(SERVO15);
if(Servo_Idx2==7 && SERVO16_ON) output_high(SERVO16);
Ticks4NextInterrupt2 = 65535 - Servo_PWM2[Servo_Idx2];
set_timer3(Ticks4NextInterrupt2);
}
if(flag_Phase2==1){
if(Servo_Idx2==0 && SERVO9_ON) output_low(SERVO9);
if(Servo_Idx2==1 && SERVO10_ON) output_low(SERVO10);
if(Servo_Idx2==2 && SERVO11_ON) output_low(SERVO11);
if(Servo_Idx2==3 && SERVO12_ON) output_low(SERVO12);
if(Servo_Idx2==4 && SERVO13_ON) output_low(SERVO13);
if(Servo_Idx2==5 && SERVO14_ON) output_low(SERVO14);
if(Servo_Idx2==6 && SERVO15_ON) output_low(SERVO15);
if(Servo_Idx2==7 && SERVO16_ON) output_low(SERVO16);
Ticks4NextInterrupt2 = 65535 - Ticks4Window + Servo_PWM2[Servo_Idx2];
set_timer3(Ticks4NextInterrupt2);
if(++Servo_Idx2>7) Servo_Idx2=0;
}
++flag_Phase2;
}
void pres_menu(void){
printf("rnA 18F1320 listen on RS-232");
printf("rnEight Servos Control Algorithm");
printf("rn");
printf("rn[?] This menu");
printf("rn All to Minimum");
printf("rn[C] All to Center");
printf("rn[X] All to Maximum");
printf("rn[+] Step to front");
printf("rn[-] Step to back");
printf("rnn>");
}
void Pinicio(void)
{
Servo_PWM[0]=4545;//cadera
Servo_PWM[1]=2521;//abdominal
Servo_PWM[2]=4245;//hombro DE
Servo_PWM[3]=4545;//hombro IZ
Servo_PWM[4]=4800;//codo DE
Servo_PWM[5]=4145;//codo IZ
Servo_PWM[6]=3500;//cabeza
Servo_PWM[7]=4545;//NO C
}
void main(void)
{
int1 valid_command;
int8 i;
disable_interrupts(global);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_0(RTCC_OFF);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_INTERNAL | T3_DIV_BY_1);
port_b_pullups(FALSE);
set_tris_a(0b00000000);
set_tris_b(0b00000000);
set_tris_e(0b100);
//set_tris_c(0b00000000);
set_tris_d(0b00000000);
output_low(SERVO1);
output_low(SERVO2);
output_low(SERVO3);
output_low(SERVO4);
output_low(SERVO5);
output_low(SERVO6);
output_low(SERVO7);
output_low(SERVO8);
output_low(SERVO9);
output_low(SERVO10);
output_low(SERVO11);
output_low(SERVO12);
output_low(SERVO13);
output_low(SERVO14);
output_low(SERVO15);
output_low(SERVO16);
output_high(LED1);
delay_ms(500);
output_low(LED1);
enable_interrupts(int_rda);
set_timer1(Ticks4NextInterrupt);
set_timer3(Ticks4NextInterrupt2);
enable_interrupts(int_timer1);
enable_interrupts(int_timer3);
enable_interrupts(global);
pres_menu();
//Pinicio();
do
{
if(Keypress==0x53) //si recibe S empieza
{
Keypress2=Keypress2-48;
Keypress3=Keypress3-48;
Keypress2=Keypress2*10;
Keypress4=Keypress4-48;
Keypress5=Keypress5-48;
Keypress6=Keypress6-48;
Keypress7=Keypress7-48;
Keypress4=Keypress4*1000;
Keypress5=Keypress5*100;
Keypress6=Keypress6*10;
servo=Keypress2+Keypress3;
posicion=Keypress4+Keypress5+Keypress6+Keypress7;
keypress=0x00;
keypress2=0x00;
keypress3=0x00;
keypress4=0x00;
keypress5=0x00;
keypress6=0x00;
keypress7=0x00;
}
if(Keypress==0x4D) //si recibe M empieza
{
if(Keypress2==0x50) // P PARADO
{
output_low(MOTOR1A);
output_low(MOTOR1B);
output_low(MOTOR2A);
output_low(MOTOR2B);
}
if(Keypress2==0x41) // A ALANTE
{
output_high(MOTOR1A);
output_low(MOTOR1B);
output_low(MOTOR2A);
output_high(MOTOR2B);
}
keypress=0x00;
keypress2=0x00;
keypress3=0x00;
keypress4=0x00;
keypress5=0x00;
keypress6=0x00;
keypress7=0x00;
}
if(servo==00)
{
i=0;
Servo_PWM=posicion;
}
if(servo==01)
{
i=1;
Servo_PWM=posicion;
}
if(servo==02)
{
i=2;
Servo_PWM=posicion;
}
if(servo==03)
{
i=3;
Servo_PWM=posicion;
}
if(servo==04)
{
i=4;
Servo_PWM=posicion;
}
if(servo==05)
{
i=5;
Servo_PWM=posicion;
}
if(servo==06)
{
i=6;
Servo_PWM=posicion;
}
if(servo==7)
{
i=7;
Servo_PWM=posicion;
}
//**************8 servos mas
if(servo==8)
{
i=0;
Servo_PWM2=posicion;
}
if(servo==9)
{
i=1;
Servo_PWM2=posicion;
}
if(servo==10)
{
i=2;
Servo_PWM2=posicion;
}
if(servo==11)
{
i=3;
Servo_PWM2=posicion;
}
if(servo==12)
{
i=4;
Servo_PWM2=posicion;
}
if(servo==13)
{
i=5;
Servo_PWM2=posicion;
}
if(servo==14)
{
i=6;
Servo_PWM2=posicion;
}
if(servo==15)
{
i=7;
Servo_PWM2=posicion;
}
Servo==99;
} while (TRUE);
}
Se me olvido citar que controlaba 16 servos y 2 motores(sin instalar aun)
