Resultados 1 al 6 de 6

Tema: robot con pic

  1. AngelCaidox
    AngelCaidox está desconectado
    Usuario registrado CV Avatar de AngelCaidox
    Fecha de ingreso
    30 dic, 04
    Ubicación
    Llodio(Alava)
    Mensajes
    6,499

    robot con pic

    Bueno esto no tiene nada que ver con la electrónica para el modding pero como es la única sección para la electrónica lo coloco aquí.

    El caso es que nos estan mandando en clase hacer miniproyectos de robots controlados por pic y maquinas de estados.

    Mi tema es el siguiente, hay que elegir una estratégia en la cual un robot es introducido en el centro de un cuadrado de 1 metro cuadrado más o menos y el cual no puede salirse de ese cuadrado. En cualquier punto del cuadrado se dejara una caja, una vez iniciado el robot y a base de dar vueltas por el cuadrado tiene que lograr sacar la caja del cuadrado, el problema es que el robot ya está creado y solo tiene dos sensores (so y s1), y esto supone varios problemas al no tener un sensor trasero para evitar algunas actuaciones.

    Tengo hecho el código, con el profesor hizimos una pequeña prueba con un diagrama de flujo que nos dio él pero nos comento que usaramos otras estratégias, pues eso aquí estoy yo con la mia.


    DIBUJO:




    Y el código que tengo creado para ensamblar sería este, seguramente tenga fallos, tener piedad xD
    Acepto sugerencias, pero pensar que solo hay dos sensores.

    Código:
    ;*******************CONFIGURACIÓN PUERTOS****************
    
    list	p=16f84a
    	#include  "p16f84a.inc"
    estado	equ	0x0c
    evento 	equ	0x0d
    	org	0
    	bsf	STATUS,RP0
    	movlw	b'11111111'
    	movwf	PORTA
    	movlw	b'00000000'
    	movwf	PORTB
    	bcf	STATUS,RP0
    	call 	pon0
    
    loop:	movf	PORTA,W
    	andlw	b'00000011'  ;NUMERO DE EVENTOS, 4 POSIBLIDADES
    	movwf	evento
    	call	maq
    
    	goto	loop
    
    ;**********LLAMADA DE MAQUINAS*******************
    
    maq:	movf	estado,W
    	addwf	PCL,F
    	goto maq0
    	goto maq1
    	goto maq2
    	goto maq3
    
    ;******************MAQUINAS**********************
    
    maq0:	movf	evento,W
    	addwf	PCL,F
    	return
    	goto	pon1
    	goto	pon3
    	goto	pon2
    
    maq1:	movf	evento,W
    	addwf	PCL,F
    	goto	pon1
    	return
    	return
    	goto	pon2
    
    maq2:	movf	evento,W
    	addwf	PCL,F
    	return
    	goto	pon1
    	goto	pon1
    	goto	pon1
    
    maq3:	movf	evento,W
    	addwf	PCL,F
    	goto 	pon1
    	return
    	return
    	goto	pon2
    
    
    ;********************LLAMADA A PONS***********************
    
    
    pon0:	movlw	0
    	movwf	estado
    	movlw	b'00001111'
    	movwf	PORTB
    	return
    pon1:	movlw	1
    	movwf	estado
    	movlw	b'00001011'
    	movwf	PORTB
    	return
    
    pon2:	movlw	2
    	movwf	estado
    	movlw	b'00001010'
    	movwf	PORTB
    	return
    
    pon3:	movlw	3
    	movwf	estado
    	movlw	b'00001101'
    	movwf	PORTB
    	return
    
    	
    	end

  2. Taro28
    Taro28 está desconectado
    Usuario registrado CV
    Fecha de ingreso
    01 abr, 05
    Ubicación
    Mallorca
    Mensajes
    1,363
    podrias comentar un poco el codigo, para que sirve cada variable y como estan conectadas las entradas y las salidas del pic y que hace cada actuador. si no especificas mas poco te podremos ayudar...

  3. AngelCaidox
    AngelCaidox está desconectado
    Usuario registrado CV Avatar de AngelCaidox
    Fecha de ingreso
    30 dic, 04
    Ubicación
    Llodio(Alava)
    Mensajes
    6,499
    Haber si me puedo explicar bien.
    Te dejado marcado los números en el código.

    - Cuando el sensor detecta dos negros retrocede, cuando detecta dos blancos avanza, y cuando detecta cada uno de un color, pues hace variado, dependiendo si es "s0=1 s1=0" o "0 1" creo que puse que seguia girando hasta encontrar dos blancos y avanzar.

    - El tema es que no se salga del cuadrado.

    (1)SATUS,RP0 son variables que ya estan definidas en un fichero "**.inc" bueno creo que eso esta claro ya xD. Se configuran los "puerto A" como entradas y "puerto B" como salidas


    (2) configurar para 4 combinaciones 00 01 10 11, me salen 4 estados en el diagrama de flujo que hize anteriormente.
    El chisme solo puede avanzar, retroceder, girar a la derecha (parando una rueda y girando la otra o girando una para alante y la otra para atrás, dependiendo de lo indicado en los "pons") y girar izquierda (igual que en derecha)

    En la variable "evento" guardo el contenido del Word ("filtro" en la linea anterior"= andlw b'00000011')


    (3) llamo a maquina, seria como hacer un case en visual basic, y con un incremental desde 0 hasta 3 dependiendo de la variable "estado" me mandara a las diferentes maquinas, que son los 4 estados del diagrama de flujo, avanzar...retroceder..


    (4) una vez llamado a maquina 0 se situa en la etiqueta "maq0" y le digo que hacer, en mi caso en el estado 0 del flujograma le digo que mientras los dos sensores vean blanco s0=0 y s1=0 siga avanazando haciendo un return.
    En la siguiente instrucción cuando los sensores marquen s0=0 y s1=1 le digo "goto pon1" donde girara continuadamente para buscar los dos blancos y volver avanzar.

    resumen:

    0 0 -- return
    0 1 -- pon1 le mando al estado del flujograma 1 que es por ejemplo girar a la derecha
    1 0 -- pon3 le mando al estado 3 del flujograma que es girar en el otro sentido
    1 1 -- pon2 que en este caso el estado 2 del flujograma hace que el robot retroceda.

    Esto en la "maq0" y así con el resto de las etiquetas "maqx"

    Los "pon´s" lo unico que marcan es la acción de las ruedas, avanzan las dos, retrocenden, solo gira una y la otra no, etc...


    Código:
    pon0:	movlw	0
    	movwf	estado
    	movlw	b'00001111'
    	movwf	PORTB
    	return
    donde siguiendo el orden de izquierda a derecha:

    0
    0
    0
    0
    1 -- motor 1 avanza (si es 0 se para el motor)
    1 -- motor 1 gira (si es 0 gira inversamente)
    1 -- motor 2 avanza (si es 0 se para el motor)
    1 -- motor 2 gira (si es 0 gira inversamente)





    ;**************ROBOT SIN SALIRSE DEL CUADRADO*********************


    list p=16f84a
    #include "p16f84a.inc"
    estado equ 0x0c
    evento equ 0x0d
    org 0
    bsf STATUS,RP0 (1)
    movlw b'11111111'
    movwf PORTA
    movlw b'00000000'
    movwf PORTB
    bcf STATUS,RP0
    call pon0

    loop: movf PORTA,W
    andlw b'00000011' (2)
    movwf evento
    call maq (3)

    goto loop

    ;**********LLAMADA DE MAQUINAS*******************

    maq: movf estado,W
    addwf PCL,F
    goto maq0
    goto maq1
    goto maq2
    goto maq3

    ;******************MAQUINAS**********************

    maq0: movf evento,W (4)
    addwf PCL,F
    return
    goto pon1
    goto pon3
    goto pon2

    maq1: movf evento,W
    addwf PCL,F
    goto pon1
    return
    return
    goto pon2

    maq2: movf evento,W
    addwf PCL,F
    return
    goto pon1
    goto pon1
    goto pon1

    maq3: movf evento,W
    addwf PCL,F
    goto pon1
    return
    return
    goto pon2


    ;********************LLAMADA A PONS***********************


    pon0: movlw 0
    movwf estado
    movlw b'00001111'
    movwf PORTB
    return
    pon1: movlw 1
    movwf estado
    movlw b'00001011'
    movwf PORTB
    return

    pon2: movlw 2
    movwf estado
    movlw b'00001010'
    movwf PORTB
    return

    pon3: movlw 3
    movwf estado
    movlw b'00001101'
    movwf PORTB
    return


    end

  4. pritt
    pritt está desconectado
    Administrador Avatar de pritt
    Fecha de ingreso
    05 nov, 03
    Mensajes
    15,425
    Hay cosas que no entiendo.

    El cuadrado, ¿será una línea negra pintada en el suelo?

    La caja, ¿será negra?

    Es decir, ¿cómo sabrá que toca la caja?

    Hasta ahora solamente tienes que el robot se mueva sin salirse del cuadrado, pero, ¿cómo sacará la caja? ¿por casualidad a base de moverse?

    Si la caja y la línea son del mismo color, ¿cómo se sabrá cual es una y cual es otra?

    Un saludo.

  5. Fr34k
    Fr34k está desconectado
    Usuario registrado CV
    Fecha de ingreso
    30 may, 06
    Mensajes
    1,156
    Cita Iniciado por pritt
    Hay cosas que no entiendo.

    El cuadrado, ¿será una línea negra pintada en el suelo?

    La caja, ¿será negra?

    Es decir, ¿cómo sabrá que toca la caja?

    Hasta ahora solamente tienes que el robot se mueva sin salirse del cuadrado, pero, ¿cómo sacará la caja? ¿por casualidad a base de moverse?

    Si la caja y la línea son del mismo color, ¿cómo se sabrá cual es una y cual es otra?

    Un saludo.
    supongo que cada sensor estará orientado de tal forma que evite confusiones entre suelo y paredes

  6. pritt
    pritt está desconectado
    Administrador Avatar de pritt
    Fecha de ingreso
    05 nov, 03
    Mensajes
    15,425
    Cita Iniciado por Fr34k
    supongo que cada sensor estará orientado de tal forma que evite confusiones entre suelo y paredes
    Por lo que explica, entendio que no, ya que girará hacia un lado u otro según sea 1 0 ó 0 1.

    A ver si nos lo aclara, porque de ser así, habría que controlar la distancia que avanza en cada paso y giro y, sino hay un punto de partida fijo, los pasos que necesita para llegar de un lado al otro de la raya para saber donde se encuentra.

    De momento, no he repasado detenidamente el código, pero hay algún error:

    0 1 -- pon1 le mando al estado del flujograma 1 que es por ejemplo girar a la derecha
    1 0 -- pon3 le mando al estado 3 del flujograma que es girar en el otro sentido
    1 1 -- pon2 que en este caso el estado 2 del flujograma hace que el robot retroceda.

    0 1: Si el negro lo ve a la derecha, creo que debería girar hacia la izquierda.

    1 0: Al otro sentido

    1 1: Debería de dar media vuelta. Si retrocede habrá que controlar cuánto lo hace porque sino llegaría al otro extremo del cuadrado y al ir hacia atrás no lo detectaría.

    Sino sabemos donde está la caja habría que hacer que el robot hiciese un recorrido por todo el cuadrado. Tendría que llegar a 1 1, girar 45º, e ir hacia delante hasta 1 1. Con eso lo tendríamos situado en una esquina y a partir de ahí recorrerer todo el cuadrado, girando 180º, tendríamos 0 0, cuando llegase a 1 1, giro de 45º, avance, giro de 45º y vuelta al principio.

    Con eso aseguraríamos que se va a encontrar con la caja, ya que si se deja de forma aleatoria, no lo podemos asegurar.

    También habría que ponerle una especie de barrera al robot lo suficientemente ancha para que cuando tope con la caja no la gire.

    ... y cubrir cualquier suceso de error.

    Un saludo.