hallo allemaal,

ik heb een GP2Y0A21YK0F -sharp distance measuring sensor.
en ik zou graag hiermee een afstand meting willen doen alleen wie kan mij helpen met een opbouw van een programmetje in pic basic.
ik wil dan gebruik maken van het ADC en een 16f877 en daar zit al een LCD bij. Dus als iemand mij zou kunnen helpen met een pic basic programmetje dan zou dat fijn zijn.

gr robo

Hier heb je een stukje code voor analoog met display.


Device 16F877                          ; processor type

XTAL 10                                ; crystal 10 Mhz

Config HS_OSC,_                        ; cristal groter dan 4MHz
       WDT_OFF,_                       ; Watchdog Timer Enable uit
       PWRTE_ON,_                      ; Power-up Timer Enable aan
       BODEN_OFF,_                     ; Brown-out Reset Enable uit
       LVP_OFF,_                       ; Low Voltage Programming uit
       CPD_OFF,_                       ; Memory Code Protection uit
       WRTE_ON,_                       ; Program Memory Write Enable aan
       DEBUG_ON,_                      ; In-Circuit Debugger Mode aan
       CP_OFF                          ; Code Protection uit

ALL_DIGITAL true                       ; alle poorten digitaal

Symbol On  = 1                         ; 1 is hoog
Symbol off = 0                         ; 0 is laag
                                       
Declare LCD_RSPIN PORTD.2              ; reset display poort D.2
Declare LCD_ENPIN PORTD.3              ; enable display poort D.3
Declare LCD_DTPIN PORTD.4              ; data display poort D.4 t/m D.7

Declare ADIN_RES    = 8                ; resolutie 8 bits      
Declare ADIN_TAD    = frc              ; Set rc osc     
Declare ADIN_STIME  = 50               ; sample tijd 5        

Dim waarde As Byte                     ; variabele waarde 0 t/m 255

Clear                                  ; wis geheugen

DelayMS 2000                           ; wacht 2 seconden

Cls                                    ; wis display

        ;210                           ; Hulp regel poort E 
PORTE = %000                           ; Maak poort E laag
TRISE = %111                           ; Poort E als ingang 

         ;76543210                     ; Hulp regel analoog
ADCON0 = %00000001                     ; Analooge ingang 7 

start:

    waarde = ADIn 7 
    Print At 1,1,Dec waarde,"   "      ; zet waarde op display
GoTo start

End

De analoge ingang_7 zit op E2_pin10.

Het display zit op poort_D, maar dat kan je ook aan passen op hoe het bij jou zit natuurlijk.

dit werkt niet egt ik krijg allemaal rare waardes. hoe kan dat?

[Bericht gewijzigd door robokop op (13%)]

Sluit eens een potmeter aan ipv de sensor.

Heb je de GND van de sensor ook op de GND van de controller aangesloten.

het werkt:) ik weet niet wat de fout was maar in eens naar vele malen proberen deed hij het.
maar hoe kan ik bijv nou in cm mee meten?

Ja dan zal je een formule moeten maken, de uitgangsspanning van je sensor verloopt niet lineaire dus de uitkomst op je display ook niet.

Probeer eens X 2.5

Nog even over het storen van je sensor, misschien moet je een pulldown weerstand tussen je analoge ingang en de GND zetten, de waarde maak niet zoveel uit als deze maar min 10K is of groter.

oke thnx;) het was /2,5 alleen als ik nu dicht er bij kom dan wordt het pas de maximale waarde en dat is 80 dat klopt want in de datasheet staat dat hij tot en met 80cm kan. maar dat is geen 0 als ik dichterbij kom. dus nu wil ik dat als hij verder af is 80 word en dichterbij 0 is.
hoe kan ik dat in pic basic oplossen

Zo bijvoorbeeld.


start:

    waarde = ADIn 7 
    Print At 1,1,Dec ~waarde,"   "      ; zet waarde op display
GoTo start

Zo inverteer je het signaal, als dat de bedoeling is tenminste.

alleen nou krijg ik getallen in de 650000 en telt de waarde zo weer op 650311. dit klopt niet egt. ik denk dat dit komt door dit teken ~ . of doe ik nou iets fout?

ik heb het nou zo:

start:
    

    waarde = ADIn 1
   
    Print At 1,1,Dec ~waarde /2,5 ,"   "      ; zet waarde op display
GoTo start]

[Bericht gewijzigd door robokop op (50%)]

En als je het zo neer zet.


start:

    ~waarde = ADIn 7 
    Print At 1,1,Dec ~waarde,"   "      ; zet waarde op display
GoTo start

End

ik kan dit niet compile.

~waarde = ADIn 7 dit gaat niet

andere opties?

Zo iets.


Device 16F877                          ; processor type

XTAL 10                                ; crystal 10 Mhz

Config HS_OSC,_                        ; cristal groter dan 4MHz
       WDT_OFF,_                       ; Watchdog Timer Enable uit
       PWRTE_ON,_                      ; Power-up Timer Enable aan
       BODEN_OFF,_                     ; Brown-out Reset Enable uit
       LVP_OFF,_                       ; Low Voltage Programming uit
       CPD_OFF,_                       ; Memory Code Protection uit
       WRTE_ON,_                       ; Program Memory Write Enable aan
       DEBUG_ON,_                      ; In-Circuit Debugger Mode aan
       CP_OFF                          ; Code Protection uit

ALL_DIGITAL true                       ; alle poorten digitaal

Symbol On  = 1                         ; 1 is hoog
Symbol off = 0                         ; 0 is laag
                                       
Declare LCD_RSPIN PORTD.2              ; reset display poort D.2
Declare LCD_ENPIN PORTD.3              ; enable display poort D.3
Declare LCD_DTPIN PORTD.4              ; data display poort D.4 t/m D.7

Declare ADIN_RES    = 8                ; resolutie 8 bits      
Declare ADIN_TAD    = frc              ; Set rc osc     
Declare ADIN_STIME  = 50               ; sample tijd 5        

Dim IR_waarde As Byte                  ; variabele IR_waarde 0 t/m 255
Dim waarde As Byte                     ; Variabele waarde 0 t/m 255

Clear                                  ; wis geheugen

DelayMS 2000                           ; wacht 2 seconden

Cls                                    ; wis display

        ;210                           ; Hulp regel poort E 
PORTE = %000                           ; Maak poort E laag
TRISE = %111                           ; Poort E als ingang 

         ;76543210                     ; Hulp regel analoog
ADCON0 = %00000001                     ; Analooge ingang 7 

start:

    IR_waarde = ADIn 7 
    waarde = IR_waarde
    waarde = waarde * 2.5 - 25
    Print At 1,1,Dec ~waarde,"   "     ; zet waarde op display
GoTo start

End

De sensor werkt tussen de 10 en 80cm, als je nu de sensor op 10cm van een object houd dan geeft dit een nul op het display. De waarde loopt nu op als de afstand groter wordt, alleen het geeft niet de centimeters weer.

Als je dat echt wilt dan moet je dat per cm gaan berekenen, omdat het verloop niet lineaire is van de sensor.

Waar wil je het voor gaan gebruiken als ik vragen mag?

Hi -

Ik gebruik zelf de GP2D120x met de PIC16F887 voor div toepassingen. En kan hiermee tot op de mm nauwkeurig meten.

Ik adviser je om meedere samples (bijv 10) te nemen, deze bij elkaar optellen in een variable en delen door 10. Dan is het erg belangrijk om na elke AD reading, 10ms te wachten! Anders krijg je leesfouten zie datasheet PIC controller. En je moet de linear slope van de reading berekenen.

Dit gaat ongeveer zo worden:

Distance VAR Word
adcVar VAR Word

Distance = (getal / (adcVar1 + 5)) - 1

HO, ik zeg niet dat het niet kan. Maar zo als je al zegt moet je het helemaal gaan berekenen.

sorry maar het wil nog steeds niet werken. ik heb de hele tijd het probleem dat ik te hoge getallen krijg. Hij zoekt nu getallen tussen de
0 255 dus bijv. 113 193.

Dat komt omdat de resolutie in de code van Lambiek op 8 bit staat, verander dat eens in 10.