Autor Tema: Robot evita obstaculos  (Leído 16563 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Robot evita obstaculos
« Respuesta #15 en: 07 de Agosto de 2009, 04:09:34 »
Hola de nuevo, el criterio a seguir tambien lo decides tu, siempre y cuando tengas en cuenta que hay pines con funciones especificas.Lo mismo da que los pines de la puerta A los uses para conectar los sensores en este caso los tendrias como entradas, y en la puerta B conectes los motores que los tendrias como salida,como si los sensores los conectas a la puerta C.
Yo personalmente prefiero conectar los motores en la puerta B, porque de esta manera no tengo que preocuparme de las resistencias pull-up al ser pines de colector abierto.
 
  Saludos.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Robot evita obstaculos
« Respuesta #16 en: 07 de Agosto de 2009, 05:11:38 »
Hola otra vez, se me ocurre que podria echarte una mano con lo del bot de la siguiente manera:
Dame tiempo hasta la tarde porque en estos momentos estoy trabajando y me daran un tiron de orejas,  :D te prestare uno de los primeros programas para bot que hice y te lo explicare instruccion por instruccion lo mejor que sepa, pero como todo tiene un precio tienes que prometer que lo modificaras a tu gusto,por ejemplo un buzzer que emita un pitido cuando cambia de direccion,unos leds que se enciendan cuando oscurece ,etc etc. Y debes postearlo en el foro para que lo veamos no vale con decir que lo haras,tenemos que ver el resultado.  :mrgreen:  :mrgreen:

  PD: Que malo que soy.

   
                  Saludos.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado alpha44

  • PIC10
  • *
  • Mensajes: 29
Re: Robot evita obstaculos
« Respuesta #17 en: 07 de Agosto de 2009, 09:23:35 »
.
« Última modificación: 24 de Octubre de 2009, 19:29:25 por alpha44 »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Robot evita obstaculos
« Respuesta #18 en: 08 de Agosto de 2009, 17:37:34 »
Hola alpha44, siento haber tardado tanto pero el internet no me funcionaba.
 
  Lo prometido es deuda:


; El recorrido se inicia al accionar cualquiera de los bumpers.
; Si durante el recorrido los bumpers detectan cualquier obstaculo frontal,el BOT,retrocede,se
; detiene durante 0,5" y vuelve a intentarlo.




                     LIST      P=16F84A            ;Se indica el tipo de procesador
                     
                     INCLUDE      "P16F84A.INC"         ;Incluimos la definicion de los registros
                     
#define         SD         PORTB,0                        ;Sensor derecho
#define         SI         PORTB,1                        ;Sensor izquierdo

; Con estos dos #define lo que hacemos es que cada vez que tengamos que llamar a un sensor no necesitamos
; recordar en que Puerto o en que bit lo tenemos conectado.

   Temp_1         equ         0x0c                     ;Nombre de la variable donde vamos a almacenar
                                                ;la temporizacion la cual se guarda en el reg 0x0c
                                                
               org         0x00
               goto      Inicio                     ;Saltamos a la etiqueta inicio,donde empieza el programa.
                                                ;Aqui pondriamos el vector de interrupcion si fuera necesario,
                                                ;el cual seria org 0x04.
               org         0x05
               
; Rutina de temporizacion la cual temporiza 50ms tantas veces como indique la variable Temp_1.

Delay50ms         movwf      Temp_1
Delay50ms_2         bcf         INTCON,2                  ;Borramos el flag TOIF
               movlw       0x3c
               movwf      TMR0                     ;Cargamos el complemento de 195 en el TMR0.
Delay50ms_1         btfss      INTCON,2                  ;Exploramos si el TMR0 se ha desbordado.
               goto      Delay50ms_1                  ;Todavia no.
               decfsz      Temp_1,F                  ;Decrementamos la variable Temp_1
               goto      Delay50ms_2                  ;Todavia no es 0
               return                              ;Ahora si,con esta instruccion volvemos donde lo habiamos dejado.
               
Inicio                                             ;Aqui empezamos el programa,configuramos los bits de salida y entrada
                                                                ;el TMR0, etc.
                    clrf      PORTA                     ;Borramos los bits de la puerta A
                    bsf         STATUS,RP0                  ;Seleccionamos la pagina 1.
                    movlw      b'00010000'
                    movwf      TRISA                     ;Configuramos los bits como salidas o entradas,en este caso tenemos
                                                     ;RA0-RA3 salidas,RA4 entrada.
                    movlw      b'11111111'
                    movwf      TRISB                     ;Puerta B todo entradas.
                    movlw      b'11010111'                  ;Preescaler de 256 para el TMR0.
                    movwf      OPTION_REG
                    bcf         STATUS,RP0                  ;Seleccionamos la pagina 0.
                    bcf         INTCON,GIE                  ;Desabilitamos las interrupciones.
                   
; Ahora esperamos que se accione alguno de los dos bumpers.

Wait            clrwdt
               clrf      PORTA                     ;Situacion inicial de parada.
               btfss      SD                        ;Sensor derecho en ON??
               goto      Avanza                     ;Si,empieza a caminar.
               btfsc      SI                        ;Sensor izquierdo en ON??
               goto      Wait
               
;Bucle principal

Avanza            clrwdt
               btfsc      SD                        ;Sensor derecho ON??
               goto      No_Obstaculo
               btfsc      SI                        ;Sensor izquierdo ON??
               goto      No_Obstaculo
Atras            movlw      b'00001110
               movwf      PORTA
               btfss      SD
               goto      Atras
               btfss      SI
               goto      Atras
               clrf      PORTA
               call      Delay50ms
               goto      Avanza
               
No_Obstaculo      btfsc      SD                        ;Ha salido por la izquierda?
               goto      No_Izq                     ;No
               movlw      b'00001100'
               movwf      PORTA                     ;Si,movimiento a la derecha.
               goto      Avanza
               
No_Izq            btfsc      SI                        ;Ha salido por la derecha?
               goto      No_Dcha
               movlw      b'00001111'
               movwf      PORTA
               goto        Avanza
               
No_Dcha            movlw      b'00001101'
               movwf      PORTA
               goto      Avanza
               
               END                           
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado alpha44

  • PIC10
  • *
  • Mensajes: 29
Re: Robot evita obstaculos
« Respuesta #19 en: 10 de Agosto de 2009, 15:32:08 »
.
« Última modificación: 24 de Octubre de 2009, 19:29:01 por alpha44 »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Robot evita obstaculos
« Respuesta #20 en: 11 de Agosto de 2009, 12:39:31 »
Referente a los sensores de ultrasonidos se conectan de diferente manera, y es un poco mas dificil su programacion, dale una ojeada a este programa que usa un sensor como el tuyo y lo que no entiendas preguntalo.


;********************************** Sensor_ Ultrasonido_01.asm **************************

;

;   ===================================================================

;     Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"

;     E. Palacios, F. Remiro y L. López.          www.pic16f84a.com

;      Editorial Ra-Ma.  www.ra-ma.es

;   ===================================================================

;

; Programa para un medidor de distancias hasta un objeto utilizando sensor por ultrasonido SRF04.

;

; Para el control del sensor en primer lugar se genera un  pulso de 10 µs a nivel alto por la

; línea RA3 que se conecta a la entrada de disparo del sensor. Seguidamente se espera a que en el

; sensor se ponga un nivel alto en la salida ECO que se conecta a la línea RA4 y se utilizan las

; interrupciones por desbordamiento del Timer 0 para medir el tiempo que está en alto el pulso.

; Seguidamente se visualiza en el módulo LCD el valor de la distancia hasta el objeto expresada en

; centímetros.

;

; Por cada centímetro de distancia al objeto el SRF04 aumenta 60 µs la anchura del pulso.

; En este programa la distancia mínima es 3 cm y la máxima 250 cm.

;

; ZONA DE DATOS **********************************************************************



   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

   LIST      P=16F84A

   INCLUDE  <P16F84A.INC>



   CBLOCK  0x0C

   Distancia            ; Se expresará en centímetros.

   ENDC



#DEFINE  Disparo   PORTA,3         ; Disparo para iniciar la medida.

#DEFINE  Eco      PORTA,4      ; Pulso cuya anchura hay que medir.



MinimaDistancia   EQU   .3

MaximaDistancia   EQU   .250

TMR0_Carga60micros   EQU   -d'27'       ; Valor obtenido experimentalmente con la

               ; ventana Stopwatch para una interrupción del

; Timer 0 cada 60 µs.  Si no mide correctamente por las tolerancias de los componentes habrá

; que hacer un ajuste fino de este valor, comprobándolo sobre las condiciones reales.

;

; ZONA DE CÓDIGOS ********************************************************************



   ORG    0

   goto   Inicio

   ORG   4

   goto   ServicioInterrupcion



Mensajes

   addwf   PCL,F

MensajeDistancia

   DT "   Distancia: ", 0x00

MensajeCentimetro

   DT " cm", 0x00

MensajeDistanciaMenor

   DT "Dist. MENOR de:", 0x00

MensajeDistanciaMayor

   DT "Dist. MAYOR de:", 0x00

Inicio

   call   LCD_Inicializa

   bsf   STATUS,RP0

   bcf   Disparo

   bsf   Eco

   movlw   b'00000000'      ; Prescaler de 2 para el TMR0.

   movwf   OPTION_REG

   bcf   STATUS,RP0

   bcf   Disparo         ; Inicializa línea de disparo en bajo.

Principal

   clrf   Distancia         ; Inicializa el registro.

   bsf   Disparo         ; Comienza el pulso de disparo.

   call   Retardo_20micros      ; Duración del pulso.

   bcf   Disparo         ; Final del pulso de disparo.

Espera_Eco_1

   btfss   Eco         ; Si ECO=0, espera el flanco de subida de la señal

   goto   Espera_Eco_1      ; de salida del sensor.

   movlw   TMR0_Carga60micros   ; Ya se ha producido el flanco de subida.

   movwf   TMR0         ; Carga el Timer 0.

   movlw   b'10100000'      ; Autoriza interrupción del TMR0 (T0IE).

   movwf   INTCON

Espera_Eco_0

   btfsc   Eco         ; Espera flanco de bajada de la señal de la salida

   goto   Espera_Eco_0      ; del SRF04.

   clrf   INTCON         ; Se ha producido el flanco de bajada. Prohíbe interrup.

   call   Visualiza         ; Visualiza la distancia.

   call   Retardo_2s      ; Espera un tiempo hasta la próxima medida.

Fin   goto   Principal

   

; Subrutina "ServicioInterrupcion" ------------------------------------------------------

;

; Se ejecuta debido a la petición de interrupción del Timer 0 cada 60 µs que es el incremento

; de la anchura de pulso por centímetro de distancia medido. La variable "Distancia" contiene el

; valor de la distancia expresada en centímetros.

;

ServicioInterrupcion

     movlw   TMR0_Carga60micros   ; Carga el Timer 0.

   movwf   TMR0

   movlw   .1         ; Se utiliza instrucción "addwf", en lugar de "incf"

   addwf   Distancia,F      ; para posicionar flag de Carry.

   movlw   MaximaDistancia      ; En caso de desbordamiento carga su máximo valor.

   btfsc   STATUS,C

   movwf   Distancia

   bcf   INTCON,T0IF

   retfie



; Subrutina "Visualiza" -----------------------------------------------------------------

;

; Visualiza la distancia expresada en centímetros. Se hace de manera que cuando haya que

; visualizar un número mayor de 99 las decenas siempre se visualicen aunque sean cero.

; Y cuando sea menor de 99 las decenas no se visualicen si es cero.

;

; Si la distancia es menor de 3 cm o mayor de 250 cm aparece un mensaje de error.

;

Visualiza

   call   LCD_Borra      ; Borra la pantalla anterior.

   movlw   MinimaDistancia      ; Va a comprobar si es menor del mínimo admisible.

   subwf   Distancia,W      ; (W)=(Distancia)-MinimaDistancia

   btfss   STATUS,C      ; ¿C=1?, ¿(W) positivo?, ¿(Distancia)>=MinimaDistancia?

   goto   DistanciaMenor      ; No ha resultado menor, y salta al mensaje de error.

   movf   Distancia,W      ; Va a comprobar si es mayor del máximo admisible.

   sublw   MaximaDistancia      ; (W)=MaximaDistancia-(Distancia)

   btfsc   STATUS,C      ; ¿C=0?, ¿(W) negativo?, ¿MaximaDistancia<(Distancia)?

   goto   DistanciaFiable      ; No, la medida de la distancia entra dentro del rango.

;

DistanciaMayor

   movlw   MaximaDistancia      ; La distancia es mayor que el máximo.

   movwf   Distancia

   movlw   MensajeDistanciaMayor

   goto   VisualizaDistancia

;

DistanciaMenor

   movlw   MinimaDistancia      ; La distancia es menor del mínimo fiable.

   movwf   Distancia

   movlw   MensajeDistanciaMenor

   goto   VisualizaDistancia

DistanciaFiable

   movlw   MensajeDistancia

VisualizaDistancia

   call   LCD_Mensaje

   movlw   .5         ; Centra la medida de la distancia en la segunda línea

   call   LCD_PosicionLinea2   ; de la pantalla.

   movf   Distancia,W

   call   BIN_a_BCD      ; Lo pasa a BCD.

   movf   BCD_Centenas,W      ; Primero las centenas.

   btfss   STATUS,Z      ; Si son cero no visualiza las centenas.

   goto   VisualizaCentenas

   movf   Distancia,W      ; Vuelve a recuperar este valor.

   call   BIN_a_BCD      ; Lo pasa a BCD.

   call   LCD_Byte      ; Visualiza las decenas y unidades.

   goto   Visualiza_cm

VisualizaCentenas

   call   LCD_Nibble      ; Visualiza las centenas.

   movf   Distancia,W      ; Vuelve a recuperar este valor.

   call   BIN_a_BCD      ; Lo pasa a BCD.

   call   LCD_ByteCompleto   ; Visualiza las decenas (aunque sea cero) y

Visualiza_cm            ; unidades.

   movlw   MensajeCentimetro

   call   LCD_Mensaje

   return



   INCLUDE  <RETARDOS.INC>

   INCLUDE  <LCD_4BIT.INC>

   INCLUDE  <LCD_MENS.INC>

   INCLUDE  <BIN_BCD.INC>

   END

 Te dejo un link para que veas como funciona.

 http://www.robot-electronics.co.uk/htm/srf04tech.htm
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado alpha44

  • PIC10
  • *
  • Mensajes: 29
Re: Robot evita obstaculos
« Respuesta #21 en: 11 de Agosto de 2009, 20:28:35 »
.
« Última modificación: 24 de Octubre de 2009, 19:31:43 por alpha44 »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Robot evita obstaculos
« Respuesta #22 en: 12 de Agosto de 2009, 05:05:20 »
Perdona por no haberme expresado bien,lo digo en el sentido de que no es como un interruptor que su estado es abierto o cerrado,si no que necesitas generar unos pulsos de una duracion x y luego leer por el receptor las señales recibidas.

 Saludos y animo.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado alpha44

  • PIC10
  • *
  • Mensajes: 29
Re: Robot evita obstaculos
« Respuesta #23 en: 12 de Agosto de 2009, 09:13:50 »
.
« Última modificación: 24 de Octubre de 2009, 19:32:02 por alpha44 »

Desconectado alpha44

  • PIC10
  • *
  • Mensajes: 29
Re: Robot evita obstaculos
« Respuesta #24 en: 12 de Agosto de 2009, 09:18:47 »
.
« Última modificación: 24 de Octubre de 2009, 19:32:39 por alpha44 »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Robot evita obstaculos
« Respuesta #25 en: 12 de Agosto de 2009, 13:10:43 »
Me gusta, vas aprendiendo, al final terminaras dandome clases a mi, la electronica es la correcta me refiero al segundo esquema el que usa el sensor que tu tienes, solo dos cosas:

- Recuerda que puedes usar cualquiera de los pines de los puertos, en el esquema se usa el puerto A pero podrias usar el puerto B.
- Una cosa que no hemos comentado es la alimentacion, te aconsejo que separes lo que es la electronica de los motores para evitar interferencias en el pic o en el sensor.

 Estoy impaciente por ver las fotos.  :-/  :-/
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado alpha44

  • PIC10
  • *
  • Mensajes: 29
Re: Robot evita obstaculos
« Respuesta #26 en: 12 de Agosto de 2009, 16:37:17 »
.
« Última modificación: 24 de Octubre de 2009, 19:32:18 por alpha44 »

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Robot evita obstaculos
« Respuesta #27 en: 12 de Agosto de 2009, 17:01:05 »
http://picmania.garcia-cuervo.net/proyectos_aux_srf04.php

Aqui una excelente explicacion, como siempre, de Don Diego, el programa esta en C pero creo que os puede ayudar.

tapi8

Desconectado DanMech21

  • PIC10
  • *
  • Mensajes: 31
Re: Robot evita obstaculos
« Respuesta #28 en: 15 de Agosto de 2009, 01:52:01 »
Hola alpha44 (metiendome un poco al post) el sensor ultrasonico lo que hace es enviar un "sonido" y esperar el revote del mismo para asi  poder calcular la distancia ya que Velocidad = Distancia / Tiempo de ahi sacas las medidas , ahora respecto al SRF04 si no me equivoco el pulso que tienes que enviar de la salida del pic a el Trigger del SRF04 no debe ser menor a 10us.

Ahora respecto al programa... sinceramente veo muy dificil que puedas manejar un sensor ultrasonico con lenguaje ASM siendo este tu primer proyecto en programacion. Hace unos meses yo realize un programa para verificar el buen estado de un SRF05 que es muy similar al tuyo estoy casi seguro que te servira pero mi proyecto esta echo en PicBasic , de cualquier forma te dejo el programa espero y te ayude en algo.
Código: [Seleccionar]
Include "modedefs.bas" ' Include serial modes

trisa = %00000000 ' set porta to outputs
trisb = %00001000 ' set portb pin 3 to input

lcd           var PORTA.3 ' define variables and constants
piezo       var PORTB.4
trigger      var PORTB.2
echo         var PORTB.3
left_led     var PORTB.0
right_led   var PORTB.1
baud          con N2400
dist_raw     var word
dist_inch    var word
dist_cm      var word
conv_inch    con 15
conv_cm      con 6

low trigger ' set trigger pin to logic 0
low left_led ' turn off left LED
low right_led ' turn off right LED

Serout lcd,baud,[254,1] ' clear lcd screen

pause 1000 ' give time to initialize lcd

Serout lcd,baud,[254,128,"- Sonar Ranger -"] ' display program title on the LCD

sound piezo,[100,10,50,5,70,10,50,2] ' Make startup sound
                                              
pause 1000 ' wait for 1 second

Serout lcd,baud,[254,128,"inches:         "] ' set up the LCD display

Serout lcd,baud,[254,192,"centimeters:    "]

main:

     gosub sr_sonar ' get sonar reading

     if dist_cm <= 100 then call LED
    
     IF dist_cm >100 then call APA
    
    
     Serout lcd,baud,[254,135,#dist_inch,"   "] ' display the distance in inches

     Serout lcd,baud,[254,204,#dist_cm,"   "] ' display the distance in centimeters

Goto main
LED:    
    high PORTB.0
    RETURN
APA:
    low PORTB.0
    RETURN

end

sr_sonar:

         pulsout trigger,1 ' send a 10us trigger pulse to the SRF04
         pulsin echo,1,dist_raw ' start timing the pulse width on echo pin
         dist_inch = (dist_raw/conv_inch) ' Convert raw data into inches
         dist_cm = (dist_raw/conv_cm) ' Convert raw data into centimeters
         pause 1 ' wait for 10us before returning to main

return

Lo unico que tendrias que modificar seria las condisiones y la llamada del LED ( que ahi podrias poner los motores) no esta demas decirte que las condiciones vienen con una division que te permite poner la distancia en cm , por ejemplo yo tengo ahi 100cm.
Cualquier duda que tengas espero futuramente poder aclararla.

Saludos

 PD: Disculpen si me equivoque en algo
« Última modificación: 15 de Agosto de 2009, 02:09:58 por DanMech21 »
Aprendiendo cada dia algo nuevo.

Desconectado alpha44

  • PIC10
  • *
  • Mensajes: 29
Re: Robot evita obstaculos
« Respuesta #29 en: 22 de Agosto de 2009, 19:45:28 »
.
« Última modificación: 24 de Octubre de 2009, 19:33:53 por alpha44 »


 

anything