home *** CD-ROM | disk | FTP | other *** search
- // ********************************************************
- // Programa para control del Hexßpodo *
- // Versi≤n 1.0 *
- // (c) Luis Asensio Morcillo y Eugenio Martφn Cuenca *
- // Enero del 2.000 *
- // ********************************************************
-
- #define TOUCHED 0
- #define LEFT_EYE 3
- #define RIGHT_EYE 1
-
- #define PULSES 20 //N·mero de pulsos que se le envφa a cada servo
- #define TIME_DELAY 20 //Retardo en ms entre pulsos
- #define MODE 0 //PIN puerto B que indica el mode para andar
-
- #define LEFT_SERVO_PIN 5 //Pin de salida que ataca al servo izquierdo
- #define CENTER_SERVO_PIN 6 //Pin de salida que ataca al servo central
- #define RIGHT_SERVO_PIN 7 //Pin de salida que ataca al servo derecho
-
- #define LEFT_FEELER 4 //Pin de entrada del sensor izquierdo
- #define RIGHT_FEELER 2 //Pin de entrada del sensor derecho
-
- #define CHECK_FEELERS 0 //Comando para la rutina walk.
- #define DO_NOT_CHECK_FEELERS 1 //Comando para la rutina walk.
-
- #define NO_FEELER_TOUCHED 0 //Valor que devuelve la rutina feelers()
- #define LEFT_FEELER_TOUCHED 1 //Valor que devuelve la rutina feelers()
- #define RIGHT_FEELER_TOUCHED 2 //Valor que devuelve la rutina feelers()
-
- #define ADD_PORTB 0x06 //Direcci≤n del puerto B
- #define puerto 0x06
-
- #define CENTER 150 //Valor en unidades de 100 us para colocar el servo en el centro.
-
- char counter; //Contador
- char counter2; //Contador
-
- char Cleg_max;
- char Cleg_min;
- char error_code; //Valor de vuelta
-
- #define Rleg_max 185 //Posiciones de los servos en unidades de 100 us.
- #define Rleg_min 130
- #define Lleg_max 170
- #define Lleg_min 115
-
- #define Retrasa_patas_izquierdas 170
- #define Avanza_patas_derechas 185
- #define Avanza_patas_izquierdas 115
- #define Retrasa_patas_derechas 130
-
- #define Apoya_patas_izquierdas Cleg_min
- #define Apoya_patas_derechas Cleg_max
-
- char feelers(void);
- void walk_back(void);
- char walk(char left_servo, char center_servo, char right_servo, char check_feelers);
- void delay_dms(char duracion);
- void calibrate(void);
-
-
-
- void main (void)
- {
- //Inicializaci≤n del Hardware
- set_bit( STATUS, RP0 ); //Selecciona banco de registros 1
- set_tris_a( 0 ); //Configura el puerto A
- set_tris_b( 21 ); //Configura el puerto B
- OPTION_REG = 71; //Configura el registro OPTION
- clear_bit( STATUS, RP0 ); //Selecciona banco de registros 1
- INTCON = 160; //Configura el registro INTCON
-
- //PIN que controlan los servos a estado bajo
- clear_bit(PORTB, RIGHT_SERVO_PIN);
- clear_bit(PORTB, CENTER_SERVO_PIN);
- clear_bit(PORTB, LEFT_SERVO_PIN);
- if ( input_pin_port_b( MODE ) ) //Selecciona el modo de funcionamiento para andar
- {
- Apoya_patas_derechas = 157;
- Apoya_patas_izquierdas = 143; //Elevaci≤n mas baja
- }
- else
- {
- Apoya_patas_derechas = 165; //Elevaci≤n mßs alta
- Apoya_patas_izquierdas = 135;
- }
-
-
- if (input_pin_port_b( LEFT_FEELER ) == 0) calibrate();//Sensor izquierdo activo ?(es activo en baja)
-
- error_code = NO_FEELER_TOUCHED; //Indica que no hay ning·n sensor activo.
- while (1) //bucle principal
- {
-
- switch (error_code)
- {
- case NO_FEELER_TOUCHED: //Sigue sin haber sensores activos
- {
- set_bit(PORTB, LEFT_EYE); //Enciende el led izquierdo
- clear_bit(PORTB, RIGHT_EYE); //Apaga el el led derecho
- error_code = walk(Retrasa_patas_izquierdas,Apoya_patas_izquierdas,Avanza_patas_derechas,CHECK_FEELERS);
- if (error_code == NO_FEELER_TOUCHED) //Sigue sin haber sensores activos.
- {
- clear_bit(PORTB, LEFT_EYE); //Apaga el ojo izquierdo
- set_bit(PORTB, RIGHT_EYE); //Enciende el derecho
- error_code = walk(Avanza_patas_izquierdas,Apoya_patas_derechas,Retrasa_patas_derechas,CHECK_FEELERS);
- }
- break;
- }
-
- case LEFT_FEELER_TOUCHED: //Se ha activado el sensor izquierdo
- {
- walk_back(); //Camina hacia atrßs
- set_bit(PORTB, LEFT_EYE); //Enciende el ojo izquierdo
- clear_bit(PORTB, RIGHT_EYE);//Apaga el ojo derecho
- for (counter2=1;counter2<=4 ;counter2++) //Gira hacia al lado correspondiente
- {
- error_code = walk(Retrasa_patas_izquierdas,Apoya_patas_izquierdas,Retrasa_patas_derechas,CHECK_FEELERS);
- if (error_code != NO_FEELER_TOUCHED) break; //Si hay alg·n sensor activo sale
- error_code = walk(Avanza_patas_izquierdas,Apoya_patas_derechas,Avanza_patas_derechas,CHECK_FEELERS);
- if (error_code != NO_FEELER_TOUCHED) break; //Si hay alg·n sensor activo sale
- }
- break;
- }
-
- case RIGHT_FEELER_TOUCHED: //Se ha activado el sensor derecho
- {
- walk_back(); //Camina hacia atrßs
- clear_bit(PORTB, LEFT_EYE); //Apaga el ojo izquierdo
- set_bit(PORTB, RIGHT_EYE); //Enciende el ojo derecho
- for (counter2=1;counter2<=4 ;counter2++) //Gira hacia el lado correspondiente.
- {
- error_code = walk(Retrasa_patas_izquierdas,Apoya_patas_derechas,Retrasa_patas_derechas,CHECK_FEELERS);
- if (error_code != NO_FEELER_TOUCHED) break; //Si hay alg·n sensor activo sale
- error_code = walk(Avanza_patas_izquierdas,Apoya_patas_izquierdas,Avanza_patas_derechas,CHECK_FEELERS);
- if (error_code != NO_FEELER_TOUCHED) break; //Si hay alg·n sensor activo sale
- }
- break;
- }
-
- }//del switch
-
- }//del while
-
- }
-
- //**************************************************************************//
- //Funci≤n feelers //
- //**************************************************************************//
- //Entradas: nada:
- //
- //Devuelve: el sensor que estß activo; si lo hay.
- //
- //Nota: Los sensores son activos en baja.
- //**************************************************************************//
- char feelers(void)
- {
- if (input_pin_port_b(LEFT_FEELER)== 0)
- {
- return LEFT_FEELER_TOUCHED;
-
- }
- if (input_pin_port_b(RIGHT_FEELER)== 0)
- {
- return RIGHT_FEELER_TOUCHED;
-
- }
- return NO_FEELER_TOUCHED;
- }
- //**************************************************************************//
-
- //**************************************************************************//
- //Procedimiento: pulse_out //
- //**************************************************************************//
- //Entradas: char pin: pin por donde envφa el pulso
- // char duraci≤n: tiempo en unidades de 10 us
- //Devuelve: nada
- //
- //Nota: El pulso el positivo:(estado bajo, estado alto, estado bajo)
- //**************************************************************************//
- void pulse_out(char pin, char duracion)
- {
-
- switch (pin)
- {
-
- case 0:{
- clear_bit(puerto,0);
- set_bit(puerto,0);
- delay_dms(duracion);
- clear_bit(puerto,0);
- return;
- }
- case 1:{
- clear_bit(puerto,1);
- set_bit(puerto,1);
- delay_dms(duracion);
- clear_bit(puerto,1);
- return;
- }
- case 2:{
- clear_bit(puerto,2);
- set_bit(puerto,2);
- delay_dms(duracion);
- clear_bit(puerto,2);
- return;
- }
- case 3:{
- clear_bit(puerto,3);
- set_bit(puerto,3);
- delay_dms(duracion);
- clear_bit(puerto,3);
- return;
- }
- case 4:{
- clear_bit(puerto,4);
- set_bit(puerto,4);
- delay_dms(duracion);
- clear_bit(puerto,4);
- return;
- }
- case 5:{
- clear_bit(puerto,5);
- set_bit(puerto,5);
- delay_dms(duracion);
- clear_bit(puerto,5);
- return;
- }
- case 6:{
- clear_bit(puerto,6);
- set_bit(puerto,6);
- delay_dms(duracion);
- clear_bit(puerto,6);
- return;
- }
- case 7:{
- clear_bit(puerto,7);
- set_bit(puerto,7);
- delay_dms(duracion);
- clear_bit(puerto,7);
- return;
- }
- }
-
-
- }
-
- //**************************************************************************//
- //Funci≤n: walk //
- //**************************************************************************//
- //Entradas: char left_servo: posicion del servo IZQUIERDO
- // char center_servo: posicion del servo CENTRAL
- // char right_servo: posicion del servo DERECHO
- // char feelers_checking: indica si tiene que comprobar los sensores
- //
- //Devuelve: Si se activado alg·n sensor (lo mismo que feelers)
- //
- //Nota: La posici≤n de los servos se da en unidades de 10 us.
- //**************************************************************************//
-
- char walk(char left_servo, char center_servo, char right_servo, char feelers_checking)
- {
- char walk1; //Almacena temporalmente el resultado de feelers()
- //Se envφan total numero PULSES de pulsos.
- for (counter = 0; counter < PULSES; counter++)
- {
- pulse_out( CENTER_SERVO_PIN, center_servo);//Mueve el servo central
- delay_ms(TIME_DELAY); //Retardo de TIME_DELAY ms
- //Si hay que comprobar los sensores se hace
- if (feelers_checking == CHECK_FEELERS)
- {
- walk1 = feelers();
- if (walk1 != NO_FEELER_TOUCHED) return walk1; //Si hay sensor activo se sale
- }
-
- }
- //Se envφan total numero PULSES de pulsos.
- for (counter = 0; counter < PULSES; counter++)
- {
- //Da un paso
- pulse_out( RIGHT_SERVO_PIN, right_servo);
- pulse_out( LEFT_SERVO_PIN, left_servo);
- pulse_out( CENTER_SERVO_PIN, center_servo);
- delay_ms(TIME_DELAY);
- //Si hay que comprobar los sensores, se hace.
- if (feelers_checking == CHECK_FEELERS)
- {
- walk1 = feelers();
- if (walk1 != NO_FEELER_TOUCHED) return walk1;//Si hay alg·n sensor activo se sale
- }
-
- }
- return NO_FEELER_TOUCHED;
- }
-
-
- //**************************************************************************//
- //Procedimiento: walk_back() //
- //**************************************************************************//
- //Entradas: nada
- //
- //Devuelve: Nada
- //
- //Nota: Da un paso hacia atrßs
- //**************************************************************************//
- void walk_back()
- {
- set_bit(PORTB,RIGHT_EYE);
- set_bit(PORTB,LEFT_EYE);
- for (counter2=1;counter2<=4;counter2++)
- {
- walk(Avanza_patas_izquierdas,Apoya_patas_izquierdas,Retrasa_patas_derechas,DO_NOT_CHECK_FEELERS);
- walk(Retrasa_patas_izquierdas,Apoya_patas_derechas,Avanza_patas_derechas,DO_NOT_CHECK_FEELERS);
- }
- }
-
-
- //**************************************************************************//
- //Procedimiento: calibrate()
- //**************************************************************************//
- //Entradas: nada
- //
- //Devuelve: Nada
- //
- //Nota: Pone los servos izquierdo y derecho e posici≤n central
- //**************************************************************************//
- void calibrate(void)
- {
-
- while(1){
- pulse_out(RIGHT_SERVO_PIN,CENTER);
- pulse_out(LEFT_SERVO_PIN,CENTER);
- delay_ms(TIME_DELAY);
- }
-
- }
-
-
- //**************************************************************************//
- //Procedimiento: delay_dms
- //**************************************************************************//
- //Entradas: duraci≤n del retardo en unidades de 10 us
- //
- //Devuelve: Nada
- //
- //Nota: el retardo final es de duracion*10 us + 2 us + 2 us
- //**************************************************************************//
- void delay_dms(char duracion)
- {
- asm{
-
- bucle
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- decfsz param00_delay_dms, f
- goto bucle
- return
- }
-
- }