# Ayuda con el codigo C para Robot sumo



## Elizabeth Bathory (Ago 14, 2010)

Hola a todos!
Les comento que estoy intentando hacer el programa de un robot sumo.. me he guiado de varios codigos que he visto aqui y en otro foros.. pero tngo un problema.. no se programar bien.. y no se que tngo mal en mi codigo. pido ayuda a uds.. para que me ayuden a corregirlo o sii tienen algun aporte sera bienvenido. mi  robot.. esta conformado por.. 2 servos para el control de ruedas.. cny70 para detectar el fondo de la pista. y 4 bumpers de contacto para detectar al enemigo.. ( uno en cada esquina.. mi robot tendra como especie de pincitas.. )
Declare puerto A como salida y puerto B como entradas.. bueno ahi les va!


```
// Cuadro de Tiempos :

//    Periodo 20 ms (Frecuencia 50 Hz)
//    Ancho Pulso minimo 0.5 ms
//    Ancho pulso medio  1.5 ms
//    Ancho pulso maximo 2.5 ms

//    TMR0 a 1:16 -> 1 RTCC cada 4.096 ms
//                -> 1 Tick cada 0.096 / 256 = 0.016 ms
//                -> 20 ms = (4 x RTCC completas) + (1 * RTCC - 30 ticks)

//    Ancho Pulso minimo 0.5 ms ->  31 ticks de TMR0
//    Ancho pulso medio  1.5 ms ->  93 ticks de TMR0
//    Ancho pulso maximo 2.5 ms -> 155 ticks de TMR0



#include <16f84A.h>
#fuses TX,NOWDT
#use delay(clock=4000000)
#byte PORTA=5
#byte PORTB=6


#define PIN_SERVOD PIN_A1  		  //servo derecha
#define PIN_SERVOI PIN_A2         //servo izquierda

const int RTCC         =30;
const int Pulsominimo  =31;
const int Pulsomedio   =93;
const int Pulsomaximo =155;

int1 flagRTCC    =0;
int  contRTCC    =0;
int1 flagSERVOD  =0;
int1 flagSERVOI  =0;
int  tSERVOD     =Pulsomedio;
int  tSERVOI     =Pulsomedio;



void main ()
{
  int ValTIMER0;
  set_tris_A=0;
  set_tris_B=1;
  PortA=0;
  PortB=0;
  
 
      // DISPARO DEL PULSO PWM

      if(flagRTCC==1)
	   {
         flagRTCC=0;
         output_high(PIN_SERVOD);
         output_high(PIN_SERVOI);
         flagSERVOD=1;  
         flagSERVOI=1;   
       }

      // CONTROL DE ANCHO DEL PULSO PWM
      
       if(flagSERVOD==1)
	    {
             valTIMER0 = get_TIMER0();
          if(valTIMER0>tSERVOD)
	        {
             flagSERVOD=0;
             output_low(PIN_SERVOD);
            }   
         }
  
        if(flagSERVOI==1)
	     {
             valTIMER0 = get_TIMER0();
           if(valTIMER0>tSERVOI)
	         {
             flagSERVOI=0;
             output_low(PIN_SERVOI);
            }   
         }
  
        if((bit_test(PORTB,2))||(bit_test(PORTB,4))==0)         // si RB2 O RB4 =0,entonces gire a la izquierda.
          { 
            tSERVOD=Pulsominimo;
            tSERVOI=Pulsominimo;
             delay_ms(20);
            tSERVOD=Pulsomedio;                                 // avance
            tSERVOI=Pulsomedio;
          }
       
          if((bit_test(PORTB,3))||(bit_test(PORTB,5))==0)       // si RB3 O RB5 =0,entonces gire a la derecha.
            { 
              tSERVOD=Pulsomaximo;
              tSERVOI=Pulsomaximo;
              delay_ms(20);
              tSERVOD=Pulsomedio;                                // avance de servos 
              tSERVOI=Pulsomedio;
            }

         if(bit_test(PORTB,1)==1)                               // si RB1 =1,entonces avance.(cny70 superficie negra =1)
           { 
             tSERVOD=Pulsomedio;
             tSERVOI=Pulsomedio;
           }
         if(bit_test(PORTB,1)==0)                               // si RB1 =0,entonces gire izquierda (cny70 superficie blanca=0)
           { 
             tSERVOD=Pulsomedio;
             tSERVOI=Pulsomedio;
           }
   }
```


----------



## Chico3001 (Ago 15, 2010)

Y cual es el error que te genera?


----------



## willynovi (Ago 15, 2010)

hola Elizabeth, creo que el programa ese que quieres usar corresponde a servos pero para usarlos como servos para posicion y lo que necesitas tu es que tnegan movimiento continuo si los estas usando como propulsión. En la web puedes encontrar varios trucajes de servos para usarlos como motor y reducción.

Fijate por este hilo https://www.forosdeelectronica.com/f19/robot-luchador-sumo-25024/#post338341 que en el mensaje #10 deje una guia para construir un robot de sumo, es lo que yo tengo como experiencia personal.

Y en este https://www.forosdeelectronica.com/f19/consejos-hacer-robot-sumo-40139/#post337405 hay algo de los servos.

Saludos, Willy


----------



## Elizabeth Bathory (Ago 16, 2010)

Gracias Willy sii tenia entendido que tocaba trucar los servos, debo decir  q aun no manejo bien el tema de pwm y por esoo ando tan embolatada.. aparte ahora tngo otro problema... uhm.. el asembler no lo manejo bien.. asi que me esta costando entender el codigo de ejemplo y por ende no se como modificarlo para adaptarlo a lo q yo quiero   
ya habia visto varios codigos por ahi.. pero toditos en asembler Y_Y  
disculpen la ignorancia pero apenas empiezo a cacharrear esto de los pics.. 

Sii alguno me pudiera ayudar con un codigo en C se lo agradeceria de corazon. mientras estare mirando como modificar el codigo asm q tngo.. q de hecho funciona muy bien en la simulacion.


----------



## willynovi (Ago 16, 2010)

Elizabeth, y cual es el hardware que tienes? me refiero a si tienes una placa armada para el control.

Si estas partiendo de cero, seria conveniente que aprendieras el Assembler porque manejas todo el PIC a nivel hardware, enotnces comprendes bien como funciona internamente, que de usar el C o algun otro lenjuage de alto nivel muchas cosas quedan implicitasy luego es mas dificil de encontrar errores.

Si no tienes armado nada aun y no quieres meterte en el detalle de la programacion del PIC, puedes ir por una controladora comercial, por ejemplo alguna de estas dos.
http://www.myamicus.co.uk/
http://www.arduino.cc/es/


----------



## Elizabeth Bathory (Ago 16, 2010)

Hola willy, pues temo decir que tengo que crear el PCB. en mi ciudad no consigo ni arduino ni parallax.. asii pues tngo que empezar de 0, por otro lado.. pues tngo leves nociones del asm.. pero este codigo aun se me complica entenderlo, es todo raro.. no se parece mucho al asm q conozco  lo adjuntare para que le eches un vistazo.. en ese ejemplo utilzan un 16f877 pero me parece innecesario en mi caso.. solo usare practicamente un puerto.. asii q estaria subutilizando el micro. quiero usar el 16f84 que es mas pequeño y funcionaria bien para mi robot. verdad?
Los programas que uso, son el mplab 8.53 y proteus 7.6.. para la compilacion de c uso el ccs 4


----------



## Elizabeth Bathory (Ago 20, 2010)

Hoooooola gente yo de nuevo por aca molestando!

ahm... bueno hice el programa en asm. me compiló bien pero no lo he probado.. quisiera que me dieran el visto bueno del codigo, o si tengo algun error por ahi me comentan.. no mas utilizaré 1 cny70 y 2 bumper.. y 2 servos trucados.. que segun le entendí a willynovi al trucarse quedan como CC asii que supongo que tendre que ponerle driver para el control de giro.. tonces pense usar el L293B.. correcto? O.O? o estoy confu? ahmm y otra cosa,tengo duda como es la conexion de los bumpers.. osea ellos constantemente mandan un 1? y al momento de accionarse manda el 0?.. sii es asii tendria que activar las pullup de portA verdad?.. 


```
;Mi primer Robot "Sumobot" :D 
;Autor: Elii ^^
;Componentes Pic 16f84A,CNY70,Bumpers(2),Servomotores trucados(2)

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

LIST	P=16F84A
INCLUDE	<P16F84A.INC>


#DEFINE SensorCNY70           PORTA,0         ;Sensor optico CNY70
#DEFINE SensorBumper1        PORTA,1        ;Sensor Bumper1= izquierdo
#DEFINE SensorBumper2        PORTA,2        ;Sensor Bumper2= derecho

        ORG     0

Inicio 
           bsf	STATUS,RP0	; Seleccion banco 1 de registro
           bsf	SensorCNY70	; Esta linea como entrada
           bsf	SensorBumper1	; Esta linea como entrada
           bsf	SensorBumper2	; Esta linea como entrada        
           clrf	PORTB		; Puerto B como salida
           bcf 	STATUS,RP0	; Seleccion Banco 0 de registros

Principal
          btfsc	SensorCNY70	; Comprueba el estado 0 del CNY70
          goto	Retroceder					
          btfss	SensorCNY70	; Comprueba el estado 1 del CNY70
          goto	Avanzar
          btfsc	SensorBumper1	; Comprueba el estado 0 del bumper1
          goto	GiroIzquierda	
          btfsc	SensorBumper2	; Comprueba el estado 0 del bumper2
          goto	GiroDerecha

GiroDerecha
          movlw	b'00001000'	; Para girar a la derecha.
          goto 	ActivaSalida	

GiroIzquierda
          movlw	b'00000001' 	; Para girar a la izquierda.
          goto	ActivaSalida

Retroceder
           movlw	b'00000110'	; Vuelta atrás
           goto	ActivaSalida
Avanzar
           movlw	b'00001111'	; Avanza
           goto	ActivaSalida
ActivaSalida	
           movwf	PORTB
           goto	Principal
		
           END
```


----------



## Elizabeth Bathory (Sep 19, 2010)

Hola chicos, de nuevo yo por aca necesitando su ayuda.. 
He avanzado poco por falta de tiempo pero este es el codigo que llevo hasta el momento. en el archivo comprimido van 2 circuitos en proteus 7.6, uno es con el que voy a hacer la PCB y el otro es el que cogi para simular el codigo ya que proteus no simula cny70 y servos depronto sii pero yo puse 2 leds  tambien va el .hex y .asm del codigo. Si alguno puede ayudarme a revisar que todo marche bien se lo agradezco de corazon.

Ahh  y otra cosita.. en la simulacion cuando los 2 bumpers estan en 1 se me paran los motores por que ?? como corrijo esto? 
PD: Disculpen el desorden en el codigo pero cuando copio y pego no logro dejarlo derechito aqui 


```
;Mi primer Robot "Sumobot" :D 
;Autor: Elii
;Componentes Pic 16f84A,CNY70,Bumpers(2),Servomotores trucados(2)

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

LIST	P=16F84A
INCLUDE	<P16F84A.INC>

CBLOCK
R_ContA
R_ContB										; Contadores para los retardos.
ENDC

#DEFINE SensorCNY70          PORTA,0     ;Sensor optico CNY70
#DEFINE SensorBumper1        PORTA,1    ;Sensor Bumper1= izquierdo
#DEFINE SensorBumper2        PORTA,2    ;Sensor Bumper2= derecho

        ORG     0

Inicio 
  		
        bsf		STATUS,RP0	   ;Seleccion banco 1 de registro
        bsf		SensorCNY70	   ;Esta linea como entrada
        bsf		SensorBumper1    	   ;Esta linea como entrada
        bsf		SensorBumper2    	   ;Esta linea como entrada	       
        clrf   	PORTB		   ;Puerto B como salida
        bcf 	STATUS,RP0	   ;Seleccion Banco 0 de registros

Principal
      btfsc	PORTA,0		  ;comprueba el estado 0 del CNY70
      call	             Avanzar
      btfss   	PORTA,0		 ;Comprueba el estado 1 del CNY70
      call	             Retroceder
      btfss   	PORTA,1	 	 ;Comprueba el estado 1 del bumper1
      call	            GiroIzquierda	
      btfss	             PORTA,2 		;Comprueba el estado 1 del bumper2
      call	            GiroDerecha
      goto	            Principal	
GiroDerecha
      movlw	b'00000010'	;Para girar a la derecha
      movwf	PORTB
      call    	Retardo_1ms
      return
GiroIzquierda
      movlw	b'00000001' 	;Para girar a la izquierda
      movwf	PORTB	
      call	            Retardo_1ms
      return
Retroceder
     movlw	b'00000011'	;Vuelta atrás
     movwf	PORTB
      call	            Retardo_2ms
      call    	GiroDerecha
      return
Avanzar
     movlw	b'00000011'	;Avanza
     movwf	PORTB
     call	             Retardo_1ms
     return

;///////////////////////Retardos//////////////////////////	

Retardo_1ms
	movlw	d'1'
	goto	Retardos_ms
Retardo_2ms
	movlw	d'2'
	goto	Retardos_ms
Retardo_20ms					; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'20'				; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms			; Aporta 2 ciclos máquina.
Retardos_ms
	movwf	R_ContB				; Aporta 1 ciclo máquina.
R1ms_BucleExterno
	movlw	d'249'				; Aporta Mx1 ciclos máquina. Este es el valor de "K".
	movwf	R_ContA				; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
	nop							; Aporta KxMx1 ciclos máquina.
	decfsz	R_ContA,F			; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
	goto	R1ms_BucleInterno		; Aporta (K-1)xMx2 ciclos máquina.
	decfsz	R_ContB,F			; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
	goto	R1ms_BucleExterno 	; Aporta (M-1)x2 ciclos máquina.
	return						; El salto del retorno aporta 2 ciclos máquina.


	END
```


----------



## Hugo GC (Jun 20, 2014)

Hola Elizabeth, se que ha pasado mucho tiempo, pero me gustaria saber si resolviste lo de la programación del robot sumo, ya que yo tengo que realizar uno, pero no tengo ni idea de por donde empezar a programarlo y me sería muy útil tu ayuda. Aclaro que yo no tengo ni idea de como funciona el ensamblador, sólo eh manejado el código c. Espero puedas ayudarme y muchas gracias.


----------

