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
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?
plano
Webshop voor Electronic Prototype | http://eProto.nl/
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
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.
hadv
Just find out what you like and let it kill you