Bueno amigos!!! He estado trabajando en un buen proyecto que a todos les va a interesar, es un controlador para 8 servos. Que contiene un software para controlarlos via serial. Batalle para porde hacer esto mas simple para proigrama del PIC.
El software esta hecho en C#. Gracias a esto ustedes contruiran su propio controlador y asi ya no estaran gastando para comprar uno. Ustedes mismos podran hacer un controlador.
Este es el programa que contiene el microcontrolador PIC.
La explicacion es muy simple, conectamos el cirucito al serial por medio del Max232,
abrimos el archivo de CONTROL DE 8 SERVOS.exe entonces buscamos el COM en donde esta conectado y presionamos CONECTAR, aparacera un menu y luego nos pedira inicializar donde dice el INICIALIZADOR ahi movemos la barra para cada servo que, cuando completemos los 8 servos, los servos se posicionara en lo que se puso en el inicializador, y luego ya podremos controlarlos uno por uno con las barras respectivas.
Yo lo probe fisicamente y funciono correctamanete.
Espero que les guste...y Esperen mas proyectos mas complejos!!!
El software esta hecho en C#. Gracias a esto ustedes contruiran su propio controlador y asi ya no estaran gastando para comprar uno. Ustedes mismos podran hacer un controlador.
Este es el programa que contiene el microcontrolador PIC.
Código:
////////////////////////////////////////////////////////////////////
//TITULO: CONTROL DE 8 SERVOMOTORES PARA HITEC //////
//AUTOR: JORGE ARTURO RODRIGUEZ HERNANDEZ //////
//FECHA: 11-12-09 //////
//DESCRIPCION: POR MEDIO DEL PROGRAMA CONTROL DE 8 SERVOS.EXE //////
// CONTROLARAS POR MEDIO DE BARRAS QUE TE INDICARA//////
// EL GRADO Y EL SERVO A CONTROLAR. //////
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
#include<16F628A.H>
#fuses HS,NOWDT,NOLVP,MCLR,NOPROTECT
//HS: CRISTAL DE HIGH SPEED 20MHZ
//NOWDT: NO SE UTILIZA EL PERRO GUARDIAN
//NOLVP: SE DESACTIVA ESTA OPCION DE PROGRAMACION
//MCLR:ACTIVAMOS EL MASTER CLEAN
//NOPROTECT: NO SE PROTEGE EL CODIGO()
#use delay(clock=20000000) //CRISTAL DE 20MHZ
#use rs232(uart1,baud=2400) //PIN_B1->RX,PIN_B2->TX
#use fast_io(A) //RAPIDA INTERVENCION DEL PUERTO A
#use fast_io(B) // '' '' PUERTO B
#priority timer1,rda //Es mas primordial que se atienda la interrupcion
//en el timer1
//CONSTANTES DE ENCENDIDO
int ON='A';
//VARIABLES A CONTROLAR
unsigned long tick; //E
unsigned int SERVO=0; //ES EL NUMERO DEL SERVO A CONTRLAR MAXIMO CONTAR DE 0 A 7
unsigned int PUERTO=5; //SOLO AQUI PASA DEL 5 A 6
short LAHL=1; // SOLO AQUI HACES EL SWITCHEO CUANDO ESTA ALTO O BAJO
short FLAG=0; //ACTUALIZADOR
unsigned long AUX,AUXH,AUXL;//AUXILIARES PARA OPERACIONES
unsigned int NSERVO=0; //NUMERO DE SERVO SELECCIONADO
unsigned long POSICION=180; //0 - 180 grados maximo
unsigned int i;
//VARIABLE DE CONTROL DE PULSO DE ALTO Y BAJO PARA LOS 8 SERVOS
//COLOCADO COMO UN ARREGLO
unsigned long HIGH[]={0,0,0,0,0,0,0,0};
unsigned long LOW[] ={0,0,0,0,0,0,0,0};
void config(void){
output_a(0x00);
output_b(0x00);
set_tris_a(0xA0);
set_tris_b(0x02);
output_bit(PIN_B3,1);
setup_comparator(NC_NC_NC_NC); //Comparadores APAGADO
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //Tick de 0.0002ms
set_timer1(tick);
disable_interrupts(INT_TIMER1);
disable_interrupts(INT_RDA);
disable_interrupts(GLOBAL);
}
#INT_TIMER1
void Interrupcion_timer1(void){
if(LAHL==1){ //SI ES PARA EL TIEMPO ALTO? ENTRA
bit_set(*PUERTO,SERVO); //ESTABLECE EL PIN A PRENDER
tick=HIGH[SERVO]; //TOMA LOS TICK NECESARIOS PARA TIEMPO EN ALTO
LAHL=0; //LO CAMBIA PARA EL TIEMPO BAJO
}else if(LAHL==0){ //SI ES PARA EL TIEMPO BAJO? ENTRA
bit_clear(*PUERTO,SERVO); //PONE A BAJO EL PIN QUE CORRESPONDE
SERVO++; //INCREMENTA PARA SIGUIENTE SERVO
if(SERVO>=4){ //HA TERMINADO EN EL PUERTO A?
if(SERVO>=4 && PUERTO==5){ //CAMBIA AL PUERTO B, Y ENCIENDE EL PIN 4
PUERTO=6;
SERVO=4;
}else if(SERVO>=8 && PUERTO==6){ //HA LLEGADO EL LIMITE DEL PUERTO B
PUERTO=5; //CAMBIA EL PUERTO A
SERVO=0; //Y EMPIEZA EL CICLO DESDE EL PIN CERO
}
}
tick=LOW[SERVO]; //TOMA EL TICK PARA EL TIEMPO BAJO
LAHL=1; //LO CAMBIA PARA EL TIEMPO ALTO
}
set_timer1(tick); //ESTABLECE EL TIMER PARA MANTENER EL PUSLO ALTO
//O BAJO PARA EL PIN QUE CORRESPONDA
}
#INT_RDA
void Interrupcion_X_recepcion(void){
disable_interrupts(INT_TIMER1);//DESACTIVA EL TIMER 1
if(kbhit()){ //HAY INFORMACION A CAPTAR
NSERVO=getc(); //1ER BYTE PARA EL NUMERO DEL SERVO
POSICION=getc(); //2DO BYTE PARA LA POSICION
}
FLAG=1; //ESTE PARAMETRO TE INDICA QUE SE A EFECTUADO UN CAMBIO EN UN DE LOS
//SERVOMOTORES
set_timer1(get_timer1()); //CUANDO SE SALIO DE LA RUTINASE QUEDO CON UN
enable_interrupts(INT_TIMER1); //CIERTO VALOR EL TIMER 1, ENTONCES LO TOMAMOS
} //PARA QUE SIGA DONDE SE QUEDO...
void main(void){
config();
ON=getc();
if(ON=='E'){
printf("----Control de Servomotores----\r\n");
printf("Version 1.0\r\n");
printf("Contacto: george.manson.69@gmail.com\r\n");
printf("Window XP SP3\r\n");
printf("\r\n");
printf("Inicializar Servos:\r\n");
for(i=0;i<=7;i++){
printf("SERVO %u: ",i);
POSICION=getc();
printf("%Lu Grados \r\n",POSICION);
AUX=(POSICION*34)+4400; //AQUI OBTIENES LOS TICK'S
AUXH=65536-AUX; //AQUI OBTIENES EL TIEMPO EN ALTO
HIGH[i]=AUXH; //ACTUALIZA EL SERVO SELECCIONADO
AUX=12500-AUX; //2.5ms - (TIEMPO TRANSCURRIDO EN ALTO)
AUXL=65536-AUX; //AQUI OBTIENES EL TIEMPO BAJO
LOW[i]=AUXL; //ACTUALIZAS SERVO SELECCIONADO
}
output_bit(PIN_B0,1);
output_bit(PIN_B3,0);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_RDA);
}
while(TRUE){
if(FLAG==1){
Printf("SERVO %u: %Lu Grados...\r\n",NSERVO,POSICION);
disable_interrupts(INT_RDA);
AUX=(POSICION*34)+4400; //AQUI OBTIENES LOS TICK'S
AUXH=65536-AUX; //AQUI OBTIENES EL TIEMPO EN ALTO
HIGH[NSERVO]=AUXH; //ACTUALIZA EL SERVO SELECCIONADO
AUX=12500-AUX; //2.5ms - (TIEMPO TRANSCURRIDO EN ALTO)
AUXL=65536-AUX; //AQUI OBTIENES EL TIEMPO BAJO
LOW[NSERVO]=AUXL; //ACTUALIZAS SERVO SELECCIONADO
FLAG=0;
enable_interrupts(INT_RDA);
}
};
}
La explicacion es muy simple, conectamos el cirucito al serial por medio del Max232,
abrimos el archivo de CONTROL DE 8 SERVOS.exe entonces buscamos el COM en donde esta conectado y presionamos CONECTAR, aparacera un menu y luego nos pedira inicializar donde dice el INICIALIZADOR ahi movemos la barra para cada servo que, cuando completemos los 8 servos, los servos se posicionara en lo que se puso en el inicializador, y luego ya podremos controlarlos uno por uno con las barras respectivas.
Yo lo probe fisicamente y funciono correctamanete.
Espero que les guste...y Esperen mas proyectos mas complejos!!!