Hi.
Maybe this code will help you. Is the complete program. sensor subroutine contains the managemente of parallax Ping. Some comments are in spanish, but code is the important thing.
I hope it will help you.
P.D. I am having problem with a Parallax GPS module also. Seems is something common with parallax ATOM28 interations
Regards
Ricardo Alonso
[email protected]
'====================== SECCION DE DECLARACION DE LAS VARIABLES Y CONSTANTES =====================
lecturaA var word
lecturaB var word
VA var long
VB var long
heading var long
SP_RUMBO var long
flag var byte
gradiente var long
FLAG_ESCAPE VAR BYTE
FLAG_EVITAR VAR BYTE
FLAG_NAVEGAR VAR BYTE
T VAR WORD
M VAR LONG 'ALMACENA LA DIFERENCIA ENTRE LA LECTURA DE DISTANCIA DE
'EL SONAR Y LA DEL SONAR DERECHO
VAVG VAR LONG 'AVERAGE CALCULO DE VELOCIDADES DE AMBOS SONARES
AAVG VAR LONG 'AVERAGE CALCULO DE ACELERACIONES DE AMBOS SONARES
Medicion1 VAR WORD 'ALMACENA LA MEDICION DEL SENSOR IZQUIERDO EN US
Medicion2 VAR WORD 'ALMACENA LA MEDICION DEL SENSOR DERECHO EN US
Distance1 VAR LONG 'DISTANCIA DEL OBJETO AL SENSOR PING IZQUIERDO EN CM
Distance2 VAR LONG 'DISTANCIA DEL OBJETO AL SENSOR PING DERECHO EN CM
D1OLD VAR LONG
D2OLD VAR LONG
V1NEW VAR LONG
V2NEW VAR LONG
V1OLD VAR LONG
V2OLD VAR LONG
A1 VAR LONG
A2 VAR LONG
RUMBO VAR LONG
CONTADOR VAR BYTE
SIG1 CON P0 'TERMINAL DE E/S DEL SENSOR PING IZQUIERDO
SIG2 CON P1 'TERMINAL DE E/S DEL SENSOR PING DERECHO
mot_der CON P8
mot_izq CON P7
Conversion FCON 29.034 'CONSTANTE PARA LA MEDICION
rot_izq var sword
rot_der var sword
temporal VAR SWORD
CUENTA VAR BYTE
GOSUB SENSORES
SP_RUMBO = Heading
D1OLD = 300.00
D2OLD = 300.00
V1OLD = 0.00
V2OLD = 0.00
RUMBO = SP_RUMBO
CONTADOR = 0
'================================================================================================
CICLO:
GOSUB SENSORES
IF ( Distance1 < 10.0 ) OR ( Distance2 < 10.0 ) THEN
FLAG_ESCAPE = 1
ELSE
FLAG_ESCAPE = 0
ENDIF
IF (((Distance1 >= 10.0) AND (Distance1 < = 40.0)) OR ((Distance2 >= 10.0) AND (Distance2 < = 40.0))) AND (FLAG_ESCAPE = 0) THEN
FLAG_EVITAR = 1
ELSE
FLAG_EVITAR = 0
ENDIF
IF (FLAG_ESCAPE = 0) AND (FLAG_EVITAR = 0) THEN
FLAG_NAVEGAR = 1
ELSE
FLAG_NAVEGAR = 0
ENDIF
IF FLAG_ESCAPE = 1 THEN GOSUB ESCAPE
IF FLAG_EVITAR = 1 THEN GOSUB EVITAR
IF FLAG_NAVEGAR = 1 THEN GOSUB NAVEGAR
IF CONTADOR >= 15 THEN
RUMBO = SP_RUMBO
CONTADOR = 0
ENDIF
CONTADOR = CONTADOR + 1
GOTO CICLO
SENSORES:
’ ESTA PARTE DE LA SUBRUTINA SE DEDICA A LA LECTURA DE LOS DOS SONARES DEL ROBOT
’ PARA EL SENSOR IZQUIERDO SE COMIENZA LA MEDICION
LOW SIG1 'GARANTIZAR ESTADO INICIAL DEL PIN
PULSOUT SIG1,5 'EMITIR PULSO DE ACTIVACION
PULSIN SIG1,1, Medicion1 'LEER SALIDA DEL SENSOR (ECO)
'EL TIEMPO ALMACENADO EN Medicion FUE EL REQUERIDO POR LA ONDA ULTRA-
'SONICA PARA LLEGAR HASTA EL OBJETO Y REGRESARSE
’ SE HACE LA MEDICION PARA EL SENSOR DERECHO
LOW SIG2 'GARANTIZAR ESTADO INICIAL DEL PIN
PULSOUT SIG2,5 'EMITIR PULSO DE ACTIVACION
PULSIN SIG2,1, Medicion2 'LEER SALIDA DEL SENSOR (ECO)
'EL TIEMPO ALMACENADO EN Medicion FUE EL REQUERIDO POR LA ONDA ULTRA-
'SONICA PARA LLEGAR HASTA EL OBJETO Y REGRESARSE
Medicion1 = Medicion1 /2 'TIEMPO DE VIAJE DE LA SEÑAL
Medicion2 = Medicion2 /2
Distance1 = FLOAT(Medicion1) FDIV Conversion
Distance2 = FLOAT(Medicion2) FDIV Conversion
'DISTANCIA GUARDA LA DISTANCIA ENTRE EL PING Y EL OBJETO EN CM
V1NEW = (D1OLD FSUB Distance1) FDIV 0.3
V2NEW = (D2OLD FSUB Distance2) FDIV 0.3
A1 = (V1NEW FSUB V1OLD) FDIV 0.3
A2 = (V2NEW FSUB V2OLD) FDIV 0.3
D1OLD = Distance1
D2OLD = Distance2
V1OLD = V1NEW
V2OLD = V2NEW
VAVG = 0.5 FMUL (V1NEW FADD V2NEW)
AAVG = 0.5 FMUL (A1 FADD A2)
’ ESTA PARTE DE LA SUBRUTINA SE DEDICA A LA LECTURA DEL COMPAS MAGNETICO 1655 DINSMORE
pause 1500 ' ESPERE 1.5 SEGUNDOS PARA QUE SE ESTABILIZE LA BRUJULA
Adin AX0,2,AD_RON,lecturaA
Adin AX1,2,AD_RON,lecturaB
VA = ((5.00 fdiv 1024.0) fmul (float lecturaA))
VB = ((5.00 fdiv 1024.0) fmul (float lecturaB))
gradiente = (VA fsub VB) fadd 10.00
IF (VA >= 2.08) AND (VA <= 2.92) AND (gradiente <= 10.00) then
heading = 45.0 fadd 107.14 fmul ( 2.92 fsub VA )
endif
IF (VA >= 2.08) AND (VA <= 2.92) AND (gradiente >= 10.0) then
heading = 225.0 fadd 107.14 fmul ( VA fsub 2.08)
endif
IF (VB >= 2.08) AND (VB <= 2.92) AND (gradiente <= 10.0) then
heading = 135.0 fadd 107.14 fmul ( 2.92 fsub VB )
endif
IF (VB >= 2.5) AND (VB <= 2.92) AND (gradiente >= 10.0) then
heading = 107.14 fmul ( VB fsub 2.50)
endif
IF (VB >= 2.08) AND (VB < 2.50) AND (gradiente >= 10.0) then
heading = 315.00 fadd 107.14 fmul ( VB fsub 2.08)
endif
’ serout s_out,i9600, REAL heading\2, " grados ",REAL Distance1, " ", REAL Distance2,13]
RETURN
'================================================================================================
EVITAR:
M = ((Distance2 FSUB Distance1) fadd 360.00)
’ SEROUT S_OUT, I9600 , [real Distance1\2," “,real Distance2\2, " " , real M,” ", DEC T, 13]
GOSUB AJUSTE
GOSUB SENSORES
RUMBO = heading
CONTADOR = 0
IF (M < 364.00) AND (M > 356.00) THEN GOSUB AVANCE
RETURN
'=================================================================================================
NAVEGAR:
M = ((RUMBO FSUB heading) fadd 360.00)
GOSUB AJUSTE
IF (M < 370.00) AND (M > 350.00) THEN GOSUB AVANCE
RETURN
'================================================================================================
AJUSTE:
temporal = int(M)
rot_izq = 3*(temporal - 360)
rot_der = 3*(temporal - 360)
’ serout s_out , i9600, [sdec rot_der, " ", sdec rot_izq,13]
servo mot_der,rot_der,1
servo mot_izq,rot_izq,1
RETURN
'=================================================================================================
AVANCE:
FOR CUENTA = 1 TO 5
rot_der = 400
rot_izq = -400
servo mot_der,rot_der,1
servo mot_izq,rot_izq,1
NEXT
RETURN
'=================================================================================================
ESCAPE:
FOR CUENTA = 1 TO 50
servo mot_izq, 200,1
servo mot_der,-200,1
NEXT
FOR CUENTA = 1 TO 20
servo mot_izq, 200,1
servo mot_der, 200,1
NEXT
GOSUB SENSORES
RUMBO = heading
CONTADOR = 0
RETURN