Microcontroladores PIC en Linux.
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

nuevo projecto,Vicky2

2 participantes

Ir abajo

nuevo projecto,Vicky2 Empty nuevo projecto,Vicky2

Mensaje por alejandro Jue 18 Nov 2010 - 16:01

como explicava a pikitin,soy de nuevo en camino despuès de dos operaciones en un lapso de 8 meses y y por consecuencia problemas en el trabajo.estoy terminando de montar Vicky2 y su programaziòn(espero de terminarlo antes de Navidad).la principal diferencia con Vicky es el tamaño y el sensor de proximidad.en Vicky usè un par de sensores a infrarrojos.en V2 installè un sonar (funziona perfectamente) y un PAN&TILT con dos servos de 9 gramos (chineses) para dirigir el sonar.es muy simple de construir y questa poco (+-) €20.voy a hacer el upload en imagesshack y les hago ver el esquema.funciona al 100%.
Image Hosted by ImageShack.us
By null at 2010-11-18

nuevo projecto,Vicky2 Esquemafinalreceptorson



P.D.=si necesitan un relevador a ultrasonido con un alcance de +- 80 cm no saldar la impedencia de 330mH.si necesitan ver lo que hace el vecino de casa en el edificio de frente,entonces sladen la impedencia.el alcance era de unos 6 mts.
al puesto del circuito con el NE555 de prueva en el robot conecto el pin de PWM del 16F876A al BD139.
el receptor va bien en los dos casos.
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Vie 19 Nov 2010 - 10:24

mirando los esquemas me di cuenta de un error.el negativo de la capsula a ultrasonido(40KHZ) se conecta como sigue
nuevo projecto,Vicky2 Esquemafinalreceptorson.th
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Dom 4 Mar 2012 - 19:45

despues de otras dos operaciones(ahora estoy bien) y dos matrimonios(de dos de mis hijos) vuelvo a trabajar en este projecto.
he hecho muchas modificas.desde el sonar(ahora funciona muy bien),la parte mecanica,etc.hasta los sensores y board.todo con la gestiòn soft con el buen viejo y seguro GCBasic.estoy a un buen punto de la construcciòn.
durante la semana voy a poner las primeras fotos y un video de laa primera prueva de los servos y demàs mecanismos.
para programar los pic y leer la memoria 24C256 uso un pickit2 y un software en gambas2 como interfaz del pkcmd(gbPicKit2_Lite-0.0.9).funciona muy bien con los 16Fxxxx.nos vemos.
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Dom 4 Mar 2012 - 20:47

las primeras fotos.
[img]nuevo projecto,Vicky2 20120304155435.th[/img]
[img]nuevo projecto,Vicky2 20120304155430.th[/img]
[img]nuevo projecto,Vicky2 20120304155425.th[/img][img]nuevo projecto,Vicky2 20120304155418.th[/img]
[img]nuevo projecto,Vicky2 20120304155404.th[/img]
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Dom 4 Mar 2012 - 20:52

todos los mecanismos son hechos personalmente.no son comparados,los hice con la fresadora y torno.la rueda central del carril posterior es distinta a las otras por que termine la plata y tube que poner unas que tenia.

estoy editando para agregar el esquema del sonar que funciona muy bien hasta unos +- 1500 cm
nuevo projecto,Vicky2 Sonar.th

este es el esquema del Slave 16F877A(control de los motores) que viene comandado por el Master 16F876A a traves del I2C.
nuevo projecto,Vicky2 Controlmotores.th
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por Pikitin Lun 5 Mar 2012 - 23:50

Hola de nuevo Alejandro, me alegro de que estés bien y vuelvas a la carga con este proyecto.

La mecánica está impresionante, te felicito!!

Una cosa.. todas las ruedas tienen tracción?? 10 servos en total?
y.. para que es el engranaje de la primera foto?? el que está arriba en el centro.

A ver si le echo un ojo al sonar ese y entiendo algo...

Pues ya te digo, impresionante, ya nos irás contando.

Saludos.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Mar 6 Mar 2012 - 22:25

son 6 servos modificados para tracciòn y 4 servos sin modificar que doblan las ruedas al girar.
los engranajes sirven como diferencial rocker bogie(ver el linkk)
http://en.wikipedia.org/wiki/Rocker-bogie
sistema usado per il Mars_Rover Very Happy
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por Pikitin Mar 6 Mar 2012 - 23:12

Quiero verlo caminando en todo-terreno!!!! Razz

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Jue 8 Mar 2012 - 20:45

acà les pongo el disegno(Cadsoft) del circuito del Master.
[img]nuevo projecto,Vicky2 Marsrovercpu.th[/img]
se ve el 16F876A + la Eeprom 24C256 como "caja negra"
este es el circuito simple de los sensores(temperatura,iluminaciòn y humedad).
[img]nuevo projecto,Vicky2 Boardsensor.th[/img]
actualmente,si tengo dinero para comprar los sensores Hall,estoy estudiando la construccion de una brujula digital.
este es el firmware del Slave que controla los motores.bastava un 16F876A como control.pero aproveche para crear una board con estos componentes asi me servirà para un hipotetico robot cuadrupe con 18 servos Rolling Eyes
Código:

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'CHIP SETUP 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#CHIP 16F877A,4
#CONFIG OSC=XT,WDT_OFF,PWRTE_ON,CP_OFF,DEBUG_OFF,WRT_OFF,CPD_OFF,LVP_OFF,BODEN_ON   
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'INTERRUPT
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
On Interrupt SSP1Ready call I2C_Interrupt                   
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'VARIABLES y DEFINE
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
DIM Motor(6),Servo_direccion(4) AS WORD                       
DIM InByte,Clear_Address AS BYTE                             
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'SUB AND FUNCTION
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
SUB I2C_Interrupt()#NR
IF PIR1.SSPIF=1 THEN
  IF SSPSTAT.D_A=1 THEN
      InByte=SSPBUF                                                   
  END IF                                     
  Clear_Address=SSPBUF     
  PIR1.SSPIF=0                     
  SSPCON.CKP=1           
END IF                                             
END SUB

SUB Impulso()#NR 
PulseOut PORTD.7,Servo_direccion(0) 10us             
PulseOut PORTD.6,Servo_direccion(1) 10us   
PulseOut PORTD.5,Servo_direccion(2) 10us 
PulseOut PORTD.4,Servo_direccion(3) 10us
PulseOut PORTB.5,Motor(0) 10us                   
PulseOut PORTB.4,Motor(1) 10us     
PulseOut PORTB.3,Motor(2) 10us             
PulseOut PORTB.2,Motor(3) 10us 
PulseOut PORTB.1,Motor(4) 10us   
PulseOut PORTB.0,Motor(5) 10us   
WAIT 20 ms
END SUB

SUB Sentido_Normal()#NR
DIM Ciclo AS INTEGER 
FOR Ciclo=0 TO 3   
    Servo_direccion(Ciclo)=150 
NEXT Ciclo
Impulso()
END SUB

SUB Sentido_Gira()#NR
Servo_direccion(0)=100   
Servo_direccion(1)=200               
Servo_direccion(2)=200   
Servo_direccion(3)=100 
Impulso()
END SUB

SUB STOP()#NR 
Motor(0)=156 
Motor(1)=154   
Motor(2)=153   
Motor(3)=151   
Motor(4)=147 
Motor(5)=151   
Impulso()                                             
END SUB

SUB ADELANTE_LENTO()#NR
Motor(0)=156+10 
Motor(1)=154+10     
Motor(2)=153+10       
Motor(3)=151-10   
Motor(4)=147-10         
Motor(5)=151-10     
Impulso() 
END SUB

SUB ADELANTE_DX_LENTO()#NR
Motor(0)=156+17 
Motor(1)=154+17 
Motor(2)=153+17 
Motor(3)=151-10 
Motor(4)=147-10 
Motor(5)=151-10
Impulso()
END SUB

SUB ADELANTE_SX_LENTO()#NR
Motor(0)=156+10   
Motor(1)=154+10 
Motor(2)=153+10 
Motor(3)=151-17   
Motor(4)=147-17   
Motor(5)=151-17 
Impulso()   
END SUB

SUB ADELANTE_NORMAL()#NR
Motor(0)=156+25 
Motor(1)=154+25 
Motor(2)=153+25 
Motor(3)=151-25   
Motor(4)=147-25 
Motor(5)=151-25 
Impulso()
END SUB

SUB ADELANTE_DX_NORMAL()#NR
Motor(0)=156+33                                                    '
Motor(1)=154+33                                                    '
Motor(2)=153+33                                                    '
Motor(3)=151-25                                                    '
Motor(4)=147-25                                                    '
Motor(5)=151-25                                                    '
Impulso()                                                          '
END SUB

SUB ADELANTE_SX_NORMAL()#NR
Motor(0)=156+25                                                    '
Motor(1)=154+25                                                    '
Motor(2)=153+25                                                    '
Motor(3)=151-33                                                    '
Motor(4)=147-33                                                    '
Motor(5)=151-33                                                    '
Impulso()                                                          '
END SUB

SUB ADELANTE_VELOZ()#NR
Motor(0)=156+40                                                    '
Motor(1)=154+40                                                    '
Motor(2)=153+40                                                    '
Motor(3)=151-40                                                    '
Motor(4)=147-40                                                    '
Motor(5)=151-40                                                    '
Impulso()                                                          '
END SUB

SUB ADELANTE_DX_VELOZ()#NR
Motor(0)=156+48                                                    '
Motor(1)=154+48                                                    '
Motor(2)=153+48                                                    '
Motor(3)=151-40                                                    '
Motor(4)=147-40                                                    '
Motor(5)=151-40                                                    '
Impulso()                                                          '
END SUB

SUB ADELANTE_SX_VELOZ()#NR
Motor(0)=156-40                                                    '
Motor(1)=154-40                                                    '
Motor(2)=153-40                                                    '
Motor(3)=151+48                                                    '
Motor(4)=147+48                                                    '
Motor(5)=151+48                                                    '
Impulso()                                                          '
END SUB

SUB ATRAS_NORMAL()#NR
Motor(0)=156-25                                                    '
Motor(1)=154-25                                                    '
Motor(2)=153-25                                                    '
Motor(3)=151+25                                                    '
Motor(4)=147+25                                                    '
Motor(5)=151+25                                                    '
Impulso()                                                          '
END SUB

SUB DX_NORMAL()#NR
Motor(0)=156-25   
Motor(1)=154-25 
Motor(2)=153-25 
Motor(3)=151-25   
Motor(4)=147-25 
Motor(5)=151-25
Impulso()   
END SUB

SUB SX_NORMAL()#NR 
Motor(0)=156+25                                                    '
Motor(1)=154+25                                                    '
Motor(2)=153+25                                                    '
Motor(3)=151+25                                                    '
Motor(4)=147+25                                                    '
Motor(5)=151+25                                                    '
Impulso()                                                          '       
END SUB
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'MAIN PROGRAM LOOP 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
MAIN:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'DEFINE THE PORTS 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  TRISA=b'000000'             
  TRISB=b'00000000'       
  TRISC=b'00011000'       
  TRISD=b'00000000'       
  TRISE=b'000'                           
  PORTA=b'000000'                       
  PORTB=b'00000000'                 
  PORTC=b'00000000'           
  PORTD=b'00000000'         
  PORTE=b'000'                     
  INTCON=b'11000000'           
  SSPADD=0xA2                           
  SSPSTAT=b'11000000'         
  SSPCON=b'00110110' 
  SSPCON2=b'0000000'           
  PIE1=b'00001000'                     
  CCP1CON=b'00000000'   
  CCP2CON=b'00000000'   
  ADCON0=b'00000000'     
  ADCON1=b'00000110'     
  Sentido_Normal()   
  InByte=0xF0                   
  DO                       
    SELECT CASE InByte   
            CASE 0xF0             
            STOP()                 
            CASE 0xF1                 
            ADELANTE_NORMAL()   
            CASE 0xF2                       
            ATRAS_NORMAL() 
            CASE 0xF3                   
            DX_NORMAL()       
            CASE 0xF4                                   
            SX_NORMAL()   
            CASE 0xF5           
            Sentido_Gira() 
            CASE 0xF6                                                   
            Sentido_Normal()     
            CASE 0xF7           
            ADELANTE_LENTO()   
            CASE 0xF8                                                   
            ADELANTE_VELOZ() 
            CASE 0xF9                   
            ADELANTE_DX_LENTO() 
            CASE 0xFA 
            ADELANTE_DX_NORMAL()   
            CASE 0xFB                             
            ADELANTE_DX_VELOZ()   
            CASE 0xFC 
            ADELANTE_SX_LENTO()     
            CASE 0xFD                         
            ADELANTE_SX_NORMAL()     
            CASE 0xFE   
            ADELANTE_SX_VELOZ() 
    END SELECT 
  LOOP

y este es el firmware para el Master de prueva.
Código:

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'CHIP
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#CHIP 16F876A,4
#CONFIG OSC=XT,WDT_OFF,PWRTE_ON,CP_OFF,DEBUG_OFF,WRT_OFF,CPD_OFF,LVP_OFF,BODEN_ON,BOREN_OFF
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'INTERRUPT
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
On Interrupt PORTBChange Call PORTB_Interrupt          'Interrupt PORTB
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'INCLUDE Y DEFINE
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#INCLUDE <Master_I2C.h>                                'Libreria I2C
#DEFINE ClockValue 9                                  'ClockValue = 100Khz
#DEFINE Wr_Servos 0xA2                                'Escribe el slave
#DEFINE Rd_Servos 0xA3                                'Lee el slave% 
#DEFINE Motores_Stop 0xF0                              '
#DEFINE Motores_adelante_normal 0xF1                  '
#DEFINE Motores_atras_normal 0xF2                      '
#DEFINE Motores_dx_normal 0xF3                        '
#DEFINE Motores_sx_normal 0xF4                        '
#DEFINE Sentido_Gira 0xF5                              '
#DEFINE Sentido_normal 0xF6                            '
#DEFINE Motores_adelante_lento 0xF7                    '
#DEFINE Motores_adelante_veloz 0xF8                    '
#DEFINE Motores_adelante_dx_lento 0xF9                '
#DEFINE Motores_adelante_dx_normal 0xFA                '
#DEFINE Motores_adelante_dx_veloz 0xFB                '
#DEFINE Motores_adelante_sx_lento 0xFC                '
#DEFINE Motores_adelante_sx_normal 0xFD                '
#DEFINE Motores_adelante_sx_veloz 0xFE                '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'VARIABLES
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'SUB AND FUNCTION
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
SUB PORTB_Interrupt()#NR
IF INTCON.RBIF=1 THEN 
  IF PORTB.7=1 THEN   
      DO                       
      LOOP UNTIL PORTB.7=1     
      WAIT 200 ms   
      IF Flag=0 THEN   
        Flag=1 
      ELSE
        Flag=0 
      END IF   
  END IF   
  INTCON.RBIF=0   
END IF
END SUB

SUB I2C_Master_to_Slave(IDAddress AS WORD,Dato AS WORD)#NR
Start 
TxI2C(IDAddress)   
TxI2C(Dato)     
Stop     
END SUB 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'MAIN PROGRAM LOOP 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Inicio:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'DEFINE THE PORTS 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  TRISA=b'000011'   
  TRISB=b'10000000' 
  TRISC=b'00011000' 
  PORTA=b'000000' 
  PORTB=b'00000000' 
  PORTC=b'00000000' 
  CVRCON=b'00000000' 
  CCP1CON=b'00000000' 
  CCP2CON=b'00000000'   
  ADCON0=b'00000001'       
  ADCON1=b'10000100'   
  Flag=0   
  InitI2C   
  IF Flag=0 THEN GOTO Inicio 
  IF Flag=1 THEN SET PORTC.5 ON 
  I2C_Master_to_Slave(Wr_Servos,Sentido_normal) 
  PulseOut PORTB.2,1 s 
  WAIT 1 s 
  I2C_Master_to_Slave(Wr_Servos,Motores_adelante_normal)'Adelante normal
  PulseOut PORTB.2,1 s                                '
  WAIT 3 s                                            ' 
  I2C_Master_to_Slave(Wr_Servos,Motores_Stop)        'Stop total
  PulseOut PORTB.2,1 s                                '
  WAIT 1 s                                            '
  I2C_Master_to_Slave(Wr_Servos,Sentido_normal)      'Ruedas derechas
  PulseOut PORTB.2,1 s                                '
  WAIT 1 s                                            ' 
  I2C_Master_to_Slave(Wr_Servos,Motores_atras_normal) 'Atras normal
  PulseOut PORTB.2,1 s                                ' 
  WAIT 3 s                                            ' 
  I2C_Master_to_Slave(Wr_Servos,Motores_Stop)        'Stop total
  PulseOut PORTB.2,1 s                                '
  WAIT 1 s                                            '
  I2C_Master_to_Slave(Wr_Servos,Sentido_Gira)        'Ruedas giran
  PulseOut PORTB.2,1 s                                '
  WAIT 1 s                                            ' 
  I2C_Master_to_Slave(Wr_Servos,Motores_dx_normal)    'Derecha normal
  PulseOut PORTB.2,1 s                                '
  WAIT 3 s                                            ' 
  I2C_Master_to_Slave(Wr_Servos,Motores_Stop)        'Stop total
  PulseOut PORTB.2,1 s                                '
  WAIT 1 s                                            '
  I2C_Master_to_Slave(Wr_Servos,Sentido_Gira)        'Ruedas giran
  PulseOut PORTB.2,1 s                                '
  WAIT 1 s                                            '
  I2C_Master_to_Slave(Wr_Servos,Motores_sx_normal)    'Izquierda normal
  PulseOut PORTB.2,1 s                                '
  WAIT 3 s                                            '
  I2C_Master_to_Slave(Wr_Servos,Motores_Stop)        'Stop total
  PulseOut PORTB.2,1 s                                '
  WAIT 1 s                                            '
  I2C_Master_to_Slave(Wr_Servos,Sentido_normal)      'Ruedas derechas
  PulseOut PORTB.2,1 s                                '
  SET PORTC.5 OFF                                    'Fin programa
  Flag=0                                              '
  GOTO Inicio                                        '

manana pruevo el robot con el odometro.
a proposito,provaron el programa que escrivi con Gambas2 para escrivir los pic serie 16F ?
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Sáb 10 Mar 2012 - 11:54

un pedacito a la vez lo estoy metiendo en pie Very Happy
agregue fotosensores a las ruedas principales como odometro y para girar en modo + o - preciso Shocked
el filmaado de prueva es necesario


camina 1 metro --> se para --> gira las ruedas --> gira de 180° --> vuelve por donde vino por 1 metro --> se para --> gira las ruedas --> gira de 180° y espera(basta apretar el botòn para recomensar).

una estupides,mas me serviò para calibrar los CNY70.
este es el codigo GCBasic del Master para la prueva(se accepttan mejorias) Very Happy
Código:

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'CHIP
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#CHIP 16F876A,4
#CONFIG OSC=XT,WDT_OFF,PWRTE_ON,CP_OFF,DEBUG_OFF,WRT_OFF,CPD_OFF,LVP_OFF,BODEN_ON,BOREN_OFF
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'INTERRUPT
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
On Interrupt PORTBChange Call PORTB_Interrupt          'Interrupt PORTB
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'INCLUDE Y DEFINE
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#INCLUDE <Master_I2C.h>                                'Libreria I2C
#DEFINE ClockValue 9                                  'ClockValue = 100Khz
#DEFINE Wr_Servos 0xA2                                'Escribe el slave
#DEFINE Rd_Servos 0xA3                                'Lee el slave% 
#DEFINE Motores_Stop 0xF0                              '
#DEFINE Motores_adelante_normal 0xF1                  '
#DEFINE Motores_atras_normal 0xF2                      '
#DEFINE Motores_dx_normal 0xF3                        '
#DEFINE Motores_sx_normal 0xF4                        '
#DEFINE Sentido_Gira 0xF5                              '
#DEFINE Sentido_normal 0xF6                            '
#DEFINE Motores_adelante_lento 0xF7                    '
#DEFINE Motores_adelante_veloz 0xF8                    '
#DEFINE Motores_adelante_dx_lento 0xF9                '
#DEFINE Motores_adelante_dx_normal 0xFA                '
#DEFINE Motores_adelante_dx_veloz 0xFB                '
#DEFINE Motores_adelante_sx_lento 0xFC                '
#DEFINE Motores_adelante_sx_normal 0xFD                '
#DEFINE Motores_adelante_sx_veloz 0xFE                '
'DIM Impulso AS INTEGER                                '
DIM PORTB_New,PORTB_Old AS BYTE                        '
''1 impulso=30 mm                                      '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'VARIABLES
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'SUB AND FUNCTION
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
SUB PORTB_Interrupt()#NR
IF INTCON.RBIF=1 THEN                             
  'Llega un impulso desde PORTB.7
  IF PORTB.7=1 THEN               
    'Loop anti-dump             
      DO                                           
      LOOP UNTIL PORTB.7=1 
      WAIT 200 ms   
      IF Flag=0 THEN 
        Flag=1 
      ELSE             
        Flag=0             
      END IF         
  END IF           
  'el pin cambiado se pone a 1 con el mask dei bit
  PORTB_New=PORTB_Old#0xC0
  'Llega un impulso desde los encoders conectados a PORTB.4 o PORTB.5
  IF PORTB_New=0xD0|PORTB_New=0xE0 THEN Impulso+=1
  'Llega un impulso desde los encoders conectados a PORTB.4 y PORTB.5
  IF PORTB_New=0xD0&PORTB_New=0xE0 THEN Impulso+=1 
  PORTB_Old=PORTB 
  INTCON.RBIF=0
END IF           
END SUB

SUB I2C_Master_to_Slave(IDAddress AS WORD,Dato AS WORD)#NR
Start                                                  'Start I2C
TxI2C(IDAddress)                          'Device ID write byte
TxI2C(Dato)                                    'Send byte size data
Stop                                                  'Stop I2C
END SUB 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'MAIN PROGRAM LOOP 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Inicio:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'PORTA.0/1 son input,las demàs son output.
  TRISA=b'000011'     
    'PORTB.7 es input,las demàs son output.
  TRISB=b'10110000'                             
  'PORTC.4(SDA) y PORTC.3(SCL) son input,las demàs son output.
  TRISC=b'00011000'                               
  PORTA=b'000000'           
  PORTB=b'00000000'       
  PORTC=b'00000000'
  CVRCON=b'00000000'       
  CCP1CON=b'00000000' 
  CCP2CON=b'00000000'                                         
  ADCON0=b'00000001'
  ADCON1=b'10000100'
  PORTB_New=0         
  PORTB_Old=0   
  Impulso=0         
  Flag=0         
  'Inicia el modulo I2C.
  InitI2C                           
  'Si el pulsante de inicio programa no fue apretado vuelve al inicio
  IF Flag=0 THEN GOTO Inicio   
  'Si el pulsante de inicio programa fue apretado se enciende el led de inicio
  IF Flag=1 THEN SET PORTC.5 ON                   
  I2C_Master_to_Slave(Wr_Servos,Sentido_normal)      'Ruedas derechas 
  PulseOut PORTB.2,1 s                                '   
  I2C_Master_to_Slave(Wr_Servos,Motores_adelante_normal)'Adelante normal
  PulseOut PORTB.2,1 s                                '   
  DO                                                  '
  LOOP UNTIL Impulso=33                              ' 
  Impulso=0                                          '
  I2C_Master_to_Slave(Wr_Servos,Motores_Stop)        'Stop total
  PulseOut PORTB.2,1 s                                ' 
  I2C_Master_to_Slave(Wr_Servos,Sentido_Gira)        'Ruedas giran
  PulseOut PORTB.2,1 s                                '
  I2C_Master_to_Slave(Wr_Servos,Motores_dx_normal)    'Derecha normal
  PulseOut PORTB.2,1 s                                '   
  DO                                                  '
  LOOP UNTIL Impulso=14                              ' 
  Impulso=0                                          '
  I2C_Master_to_Slave(Wr_Servos,Motores_Stop)        'Stop total
  PulseOut PORTB.2,1 s                                '
  I2C_Master_to_Slave(Wr_Servos,Sentido_normal)      'Ruedas derechas 
  PulseOut PORTB.2,1 s                                '
  I2C_Master_to_Slave(Wr_Servos,Motores_adelante_normal)'Adelante normal
  PulseOut PORTB.2,1 s                                '   
  DO                                                  '
  LOOP UNTIL Impulso=33                              ' 
  Impulso=0                                          '
  I2C_Master_to_Slave(Wr_Servos,Motores_Stop)        'Stop total
  PulseOut PORTB.2,1 s                                '
  I2C_Master_to_Slave(Wr_Servos,Sentido_Gira)        'Ruedas giran
  PulseOut PORTB.2,1 s                                '
  I2C_Master_to_Slave(Wr_Servos,Motores_dx_normal)    'Derecha normal
  PulseOut PORTB.2,1 s                                '   
  DO                                                  '
  LOOP UNTIL Impulso=14                              ' 
  Impulso=0                                          '
  I2C_Master_to_Slave(Wr_Servos,Motores_Stop)        'Stop total
  PulseOut PORTB.2,1 s                                '
  I2C_Master_to_Slave(Wr_Servos,Sentido_normal)      'Ruedas derechas 
  PulseOut PORTB.2,1 s                                '
  I2C_Master_to_Slave(Wr_Servos,Motores_Stop)        'Stop total
  PulseOut PORTB.2,1 s                                '
  SET PORTC.5 OFF                                    'Fin programa
  GOTO Inicio                                        '                               

Edit:
Manana lo voy a provar en el jardin sin el sonar para ver como camina en terreno no pavimentado

Pikitin,quisiera hacerte ver una brujula que tengo en mente con sensores Hall.como la que construyo Pablo
http://personales.ya.com/perropinto/robotidus/BRUJULA.htm
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por Pikitin Sáb 10 Mar 2012 - 19:08

Hola Alejandro.. te comento algunas cosillas que no veo claras

En la subrutina PORTB_Interrupt() esta parte:

    PORTB_New=PORTB_Old#0xC0
'Llega un impulso desde los encoders conectados a PORTB.4 o PORTB.5
IF PORTB_New=0xD0|PORTB_New=0xE0 THEN Impulso+=1
'Llega un impulso desde los encoders conectados a PORTB.4 y PORTB.5
IF PORTB_New=0xD0&PORTB_New=0xE0 THEN Impulso+=1

PORTB_Old = PORTB_New


Entiendo que sólo te interesan los bits 4 y 5 para leer los encoders, si entiendo bien entonces creo que yo lo haría así:

    'Seleccionas bits 4 y 5:
PORTB_New = PORTB & b'00110000'

'Llega un impulso desde los encoders conectados a PORTB.4 o PORTB.5
'xor PORTB_New y PORTB_OLD, si hay algun bit a 1 entonces algo ha cambiado
IF PORTB_New # PORTB_OLD <> 0 THEN Impulso+=1

PORTB_Old = PORTB_New



Si quieres sumar 2 cuando se activan los 2 encoders entonces:

    'Seleccionas bits 4 y 5:
PORTB_New = PORTB & b'00110000'

'Ver que bits han cambiado
ENCODER_BITS = PORTB_New # PORTB_OLD

'Si hay algun bit a 1 entonces algo ha cambiado
IF ENCODER_BITS <> 0 THEN
Impulso+=1
'Si activan los 2 encoders sumar otro
IF ENCODER_BITS = b'00110000' then Impulso+=1
End IF

PORTB_Old = PORTB_New



Luego, esto:

LOOP UNTIL Impulso=33

Que pasa si se suman 2 y pasa de 32 a 34??
En tu código esto nunca pasa porque esto creo que esto no funciona:

'Llega un impulso desde los encoders conectados a PORTB.4 y PORTB.5
IF PORTB_New=0xD0&PORTB_New=0xE0 THEN Impulso+=1

PORTB_New nunca puede valer 0xD0 y 0xE0 a la vez.
Entonces quizás hacerlo así:

LOOP UNTIL Impulso >= 33

O llevar una cuenta distinta para cada encoder... nosé

Saludos.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Sáb 10 Mar 2012 - 23:35

Código:

PORTB_New=PORTB_Old#0xC0
PORTB_New es la variable donde se deposita el XOR de el viejo valor de la PORTB y el mask de bit.en este caso use 0xC0=11000000.tambien hubiera podido usar como dijiste 0x30=00110000.

Código:

IF PORTB_New=0xD0|PORTB_New=0xE0 THEN Impulso+=1
si el valor xorado de la puerta es 0xD0=11010000(PORTB.4=1) o el valor xorado de la puerta es 0xE0=11100000(PORTB.5=1) entonces aumento de 1 la variable de control Impulso

Código:
IF PORTB_New=0xD0&PORTB_New=0xE0 THEN Impulso+=1
esto es un error.lo corregi ya.la PORTB no puede presentar dos estados distintos contemporaneamente Embarassed
en el nuevo code lo cambie por
Código:
IF PORTB_New=0xF0 THEN Impulso+=1
0xF0=11110000 -- PORTB.4=1 y PORTB.5=1

Código:

PORTB_Old = PORTB_New
memorisa el estado de la puerta hasta nuevo cambio de la misma.

Código:

LOOP UNTIL Impulso=33

Que pasa si se suman 2 y pasa de 32 a 34??
En tu código esto nunca pasa porque esto creo que esto no funciona:
no sucede porque aumenta de 1.no aumenta de 2.
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Sáb 24 Mar 2012 - 12:12

provando el sonar con pan_tilt(es momentaneo,tengo que modificar la mecanica) encontre un problema con el codigo de prueva
Código:

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'CHIP
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#CHIP 16F876A,4
#CONFIG OSC=XT,WDT_OFF,PWRTE_ON,CP_OFF,DEBUG_OFF,WRT_OFF,CPD_OFF,LVP_OFF,BODEN_ON,BOREN_OFF
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'INTERRUPT
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
On Interrupt PORTBChange Call PORTB_Interrupt          'Interrupt PORTB
On Interrupt Timer1Overflow Call Interrupt_TMR1        'Interrupt TMR1
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'INCLUDE/VARIABLES Y DEFINE           
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#DEFINE PWM_Freq 40                                    'Set frequency in KHz
#DEFINE PWM_Duty 80                                    'Set duty cycle to 80 %     
#DEFINE PAN PORTC.1                                    '
#DEFINE TILT PORTB.3                                    ' 
#DEFINE PAN PORTC.1                                    '
#DEFINE TILT PORTB.3                                    '
DIM ValorPan,ValorTilt,FlagPan,FlagTilt AS INTEGER      '
DIM Out_Range,Obstaculo,Indice_Buffer AS BYTE          ' 
DIM Ciclo AS INTEGER                                    '     
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'SUB AND FUNCTION
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
SUB PORTB_Interrupt()#NR
IF INTCON.RBIF=1 THEN                                  '
  IF PORTB.7=1 THEN                                    'Llega un impulso desde PORTB.5
      DO 
      LOOP UNTIL PORTB.7=1        'Loop de anti dump
      WAIT 200 ms                                      '
      IF Flag=0 THEN                                    'Si la variable es falsa
        Flag=1                                        '
      ELSE                                              '
        Flag=0                                        '
      END IF                                            '
  END IF                                              '
  INTCON.RBIF=0                                        '
END IF                                                  '             
END SUB

SUB Impulso_US()#NR
PWMOn                                                  'Impulso de 40Khz al 50% del duty ON
WAIT 300 us                                            'Por 300 microsegundos
PWMOff                                                  'Impulso de 40Khz al 50% del duty OFF
END SUB

SUB Interrupt_TMR1()#NR
IF PIR1.TMR1IF=1 THEN Out_Range=1:PIR1.TMR1IF=0        '
END SUB

FUNCTION Sonar()#NR
DIM Distancia AS WORD                                  '
T1CON.TMR1ON=0                                          'Stop TMR1
PIE1.TMR1IE=0                                          'Desabilita el interrupt overflow TMR1
PIR1.TMR1IF=0                                          'Limpia el flag del overflow de TMR1
Out_Range=0                                            'Limpia el flag del overflow de TMR1
Distancia=0   
Total=0   
TMR1H=0x4E      'Cargo el TMR1H para obtener 20ms ==> 78=0X4E
TMR1L=0x20        'Cargo el TMR1L para obtener 20ms ==> 32=0x20
T1CON.TMR1ON=1        'Start TMR1
PIE1.TMR1IE=1            'Habilita el interrupt overflow TMR1
Impulso_US()                'Envia un impulso
WAIT 600 us              'Espera un tiempo anti-eco
DO                                                      'Inicia el ciclo de eco   
LOOP UNTIL Out_Range=1|PORTB.0=1      'TMR1 va en overflow o encuentra un obstaculo
T1CON.TMR1ON=0                                          'Stop TMR1
PIE1.TMR1IE=0              'Desabilita el interrupt overflow TMR1
PIR1.TMR1IF=0                'Limpia el flag del overflow de TMR1
IF PORTB.0=1 THEN          'Si se detecta un obstaculo
    Distancia=(TMR1H*256)+TMR1L    'Suma 8 byte LSB + 8 bit shift MSB <<
    Distancia=(Distancia*34)/200      'Distancia en mm
END IF     
Sonar=Distancia   
END FUNCTION
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'MAIN PROGRAM LOOP   
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Inicio:
  TRISA=b'101111'        'PORTA.0/1/2/3 y 5 son input,las demàs son Output.
  TRISB=b'10000001'    'PORTB.0 y 7 son Input,las demàs son Output
  TRISC=b'00011000'      'PORTC es Output.
  PORTA=b'000000'     
  PORTB=b'00000000'  'Todas las puertas son bajas,por las dudas
  PORTC=b'00000000' 
  INTCON=b'11001000'      'GIE/PEIE y RBIE
  T1CON=b'00000100'
  PIR1.TMR1IF=0      'Limpia el flag del overflow de TMR1
  CVRCON=b'00000000'             
  CCP1CON=b'00001100'    'PWM1 habilitado.
  CCP2CON=b'00000000'  'PWM2 desabilitado.                                                     
  ADCON0=b'00000000'      'FOSC/2,Canal AN0,converciòn A/D OFF.
  ADCON1=b'10000110'   
  ValorPan=142    'Valor inicial de los servos(centrados)
  FlagPan=0    'Limpia la variable
  ValorTilt=140      'Valor inicial de los servos(centrados)
  FlagTilt=0          'Limpia la variable
  PulseOut PAN,ValorPan 10us 
  PulseOut TILT,ValorTilt 10us   
  WAIT 20 ms 
  IF Flag=0 THEN GOTO Inicio    'Si no apreto el boton de inicio.....
  DO        'Ciclo
    IF Flag=1 THEN        'Si aprete el boton de inicio........
        SET PORTC.5 ON  'Se enciende el led de inicio.
        IF FlagPan=0 THEN    'Si el flag del PAN es cero
          ValorPan+=1        'Al valor del PAN sumo 10 us
          IF ValorPan>200 THEN FlagPan=1  'Si llegue al valor maximo del PAN
        ELSE          'Si en cambio el Flag del PAN es 1
          ValorPan-=1      'Resto 10 us al valor del flag del PAN
          IF ValorPan<90 THEN FlagPan=0  'Si llegue al valor minimo del PAN
        PulseOut PAN,ValorPan 10us    'Impulso al servo del PAN
        PulseOut TILT,ValorTilt 10us    'Impulso al servo del TILT
        IF ValorPan%10=0 THEN 
          IF Sonar>110 THEN     
              FOR Obstaculo=90 TO 200 STEP 10     
                  PulseOut PORTB.2,50 ms  'hay un obstaculo
                  PulseOut TILT,Obstaculo 10us 
                  WAIT 10 ms     
              NEXT Obstaculo   
              FOR Obstaculo=200 TO 150 STEP 10
                  PulseOut PORTB.2,50 ms 
                  PulseOut TILT,Obstaculo 10us
                  WAIT 10 ms   
              NEXT Obstaculo   
              PulseOut TILT,1500 us 
          END IF 
        END IF   
        WAIT 20 ms 
    END IF     
  LOOP UNTIL Flag=0   
  SET PORTC.5 OFF     
  GOTO Inicio
no funciona como deberia Embarassed
Código:
 IF Sonar<110 THEN
si pongo la condiciòn < ve todo lo que se encuentra a màs de 400mm Embarassed
Código:
 IF Sonar>110 THEN
en cambio,asi todo lo que se encuentra dentro los 400mm Embarassed
como puede ser.seguramente no "veo" algo equivocado en el codigo Evil or Very Mad

agrego un video que funciona con el codigo "equivocado" Evil or Very Mad
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por Pikitin Sáb 24 Mar 2012 - 19:07

Hola alejandro.

Creo que tienes un par de cosillas en tu programa:

- Para tener 20 ms overflow en Timer1 creo que deberías ajustarlo a 65536-20000=45536
Luego para calcular la distancia tienes que restarlo.

- Luego tienes un problema al multiplicar Distancia*34 porque si el resultado de esta multiplicación pasa de 65535 tienes acarreo, entonces tienes que asegurarte de que el resultado nunca pase de 65535.
Una posible solución seria:
Distancia=Distancia/20
Distancia=(Distancia*34)/10

Pero así vas a perder varios mm de precisión
Si quieres mantener precisión igual puedes hacer algún truco:

Distancia = (Distancia*3)/20+Distancia/50 'creo que esto es lo mismo que (Distancia*34)/200


Por ejemplo:
Código:
 ' Antes ajustar TMR1L y TMR1H a 45536
        IF PORTB.0=1 THEN          'Si se detecta un obstaculo
            Distancia  = TMR1L
            Distancia_H = TMR1H    'así es mas facil y rapido que multiplicar por 256
            Distancia -= 45536
            Distancia = (Distancia*3)/20 + Distancia/50  'Distancia en mm
        END IF

Tambien para pasar TMR1L y TMR1H a Distancia puedes pasarlo directamente (primero el low byte), es más rápido que multiplicar por 256, pero el resultado es el mismo.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Sáb 24 Mar 2012 - 20:12

grazias,Pikitin.siempre pronto para ayudar.este proyecto hecho con un par de horas al dia(quando es posible),crea un efecto OE(Ojos Empaňados).ha un cierto punto no te das cuenta de los errores elementales cometidos.
Código:

Para tener 20 ms overflow en Timer1 creo que deberías ajustarlo a 65536-20000=45536
primer error. Mad
la formula para calcular los valores de inicio de TMR1L y TMR1H es:
TM1H=Vini/256
TM1L=Vini-(TM1H*256)
en vez de calcular Vini=45536 lo hice con Vini=20000
TM1H=Vini/256=20000/256=78,125=78=0x4E
TM1L=Vini-(TM1H*256)=20000-(78*256)=20000-19968=32=0x20

segundo error
Código:

Luego para calcular la distancia tienes que restarlo.
me olvide Shocked

esta es buena
Código:

Distancia  = TMR1L
Distancia_H = TMR1H
se ahorran algunos ciclos Cool

corrijo y te hago saber.
despues voy a provar
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Sáb 24 Mar 2012 - 20:33

a proposito,viste el filmado de sonar?
funciona hasta unos 3m(+-) con 7,5V Very Happy
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por Pikitin Sáb 24 Mar 2012 - 22:02

crea un efecto OE(Ojos Empaňados).ha un cierto punto no te das cuenta de los errores elementales
Si... eso pasa mucho, además siempre pasa con los detalles más simples.

a proposito,viste el filmado de sonar?
funciona hasta unos 3m(+-) con 7,5V Very Happy
Si... tiene muy buena pinta, bueno.. el robot en general está muy bien. Un gran trabajo!!

Ahhh!! una cosa importante: la variable "Sonar" la tienes como byte, creo que deberías declararla como word igual que "Distancia".

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Sáb 24 Mar 2012 - 23:49

Código:

Ahhh!! una cosa importante: la variable "Sonar" la tienes como byte, creo que deberías declararla como word igual que "Distancia".
x error
Ok.grazias como siempre.
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Vie 13 Abr 2012 - 10:45

soy de nuevo yo con novedades.el sonar funziona perfectamente(aunque se tuve que modificar la alimentaciòn y separarla de la alimentaciòn de los servos).
esta funciòn trabaja bien(grazias pikitin)
Código:

FUNCTION Sonar() AS WORD
DIM Distancia AS WORD
T1CON.TMR1ON=0
PIE1.TMR1IE=0
PIR1.TMR1IF=0
Out_Range=0
Distancia=0
TMR1H=0
TMR1L=0
T1CON.TMR1ON=1
PIE1.TMR1IE=1
Impulso_US()
WAIT 600 us
DO
LOOP UNTIL Out_Range=1|PORTB.0=1
T1CON.TMR1ON=0
PIE1.TMR1IE=0
PIR1.TMR1IF=0
IF PORTB.0=1 THEN
    Distancia=TMR1L                                       
    Distancia_H=TMR1H (ahorro ciclos) :D
    Sonar=(Distancia*17)/100
END IF 
IF Out_Range=1 THEN   
    Sonar=0xFFFF
END IF
END FUNCTION

con este main el sonar me senala todo lo que se encuentra dentro un radio de x mm(en este caso 1000mm=1m)
Código:

IF Sonar<1000 THEN
    SET PORTB.1 ON
ELSE
    SET PORTB.1 OFF
END IF
como ven es un code muy complicado,però funciona.se enciende el led quando el sonar "ve" el obstaculo y se apaga quando no Embarassed

pero si pruevo a gestir con este main
Código:

DO
    SELECT CASE Sonar
                    CASE <300
                                SET PORTB.1 ON
                                SET PORTB.2 OFF
                    CASE >301<500
                                SET PORTB.1 ON
                                SET PORTB.2 ON
                  CASE >501<700
                                SET PORTB.1 OFF
                                SET PORTB.2 ON
                  CASE >701
                                SET PORTB.1 OFF
                                SET PORTB.2 OFF     
    END SELECT
    WAIT 30 ms
LOOP
senala solo el obstaculo <300.todos los obstaculos màs allà de 300mm el main "usa" el CASE >301<500
en que cosa me equivoco(seguramente,ya que no uso el select--end select en GCBasic)?? Shocked
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por Pikitin Vie 13 Abr 2012 - 12:02

Creo que el Select case no funciona con < o >, sólo con valores concretos.

Igual tendrías que hacerlo con if, por ejemplo:

Código:
Do
    distancia
Loop

Sub distancia
    if Sonar > 701 then
        SET PORTB.1 OFF
        SET PORTB.2 OFF
        return
    End if
   
    if Sonar > 501 then
        SET PORTB.1 OFF
        SET PORTB.2 ON
        return
    End if
   
    if Sonar > 301 then
        SET PORTB.1 ON
        SET PORTB.2 ON
        return
    End if
   
    SET PORTB.1 ON
    SET PORTB.2 OFF
End Sub

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por alejandro Vie 13 Abr 2012 - 14:01

grazias pikitin,pruevo con IF--END IF.
por caso sabès de un manual de GCBasic(preferisco en castellano)??
alejandro
alejandro
Participante Activo
Participante Activo

Mensajes : 87
Fecha de inscripción : 12/02/2009

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por Pikitin Dom 15 Abr 2012 - 20:57

Si.. tienes este:
http://sourceforge.net/projects/piclinux/files/GcBasic-PL/GcBasic_Manual.pdf/download

Pero no esta muy actualizado, también tienes la ayuda de gcbasic (ingles):
http://gcbasic.sourceforge.net/newfiles/help/

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

nuevo projecto,Vicky2 Empty Re: nuevo projecto,Vicky2

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.