Hey,
Ik ben bezig met het maken van een elektrische prullenbak welke opengaat met behulp van een sensor.(deze sensor had ik in gedachte: http://sharp-world.com/products/device/lineup/data/pdf/datas...40k_e.p…)
De klep wordt dan aangedreven door een modelbouw-servo. Op picbasic.nl heb ik al een hele mooie code gevonden om met een PIC een servo aan te sturen. Aangezien deze code niet helemaal geschikt is voor mijn project heb ik die ietwat aangepast. Ik ben alleen vrij nieuw met het programmeren van PIC's dus weet niet zeker of ik het wel goed gedaan heb. Als er iemand is die mij hier mee zou kunnen helpen zou ik dat zeer waarderen.
De eisen van het systeem zijn als volgt:
1. De klep gaat open door een IR sensor te triggeren.
2. De klep blijft openstaan zolang de sensor iets waarneemt. (Als je dus je handen erboven houd)
3. Als de sensor niks meer waarneemt blijft de klep nog 3 sec openstaan en sluit vervolgens.
Ook zou het erg mooi zijn als de klep tijdens het open/dicht gaan de laatste 20 graden met een langzamere snelheid open/dicht gaat. Dit voorkomt dat deksel iedere keer open/dicht slaat met een harde klap. Ik kom alleen niet uit de codering voor deze functie.
De volgende code is de door mij aangepaste code:
pic basic code:
DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
;Logische constanten
SYMBOL LAAG = 0 ;Laag signaal
SYMBOL HOOG = 1 ;Hoog signaal
;Algemene constanten
SYMBOL MinPos = 700 ;Minimale uitslag van de servomotor (0o)
;Poortnamen
SYMBOL Motor = PORTA.0 ;Poort waar de pulsjes voor de servomotor uitkomen
SYMBOL Potmeter = PORTA.1 ;Potmeter bepaalt hoever de servo verdraaid na druk op S2
SYMBOL S1 = PORTB.0 ;S1 zet de servo terug naar beginstand (linksom, 0o)
SYMBOL S2 = PORTB.1 ;S2 zet de servo in de met de potmeter ingestelde positie
;Variabelen declareren
;WORD
DIM Positie AS WORD ;WORD(!) variabele bevat de positie van de servomotor
; 76543210
PORTA = %00000000 ;Maak alle poorten van PORTA laag
TRISA = %11111110 ;PORTA.0 is uitgang voor de servomotor
PORTB_PULLUPS ON ;On-chip pull-up weerstanden actief (voor de toetsen)
CLEAR ;Wis alle RAM geheugen
;Hoofdprogramma
Positie = MinPos ;Startwaarde, servomotor in beginstand zetten (linksom, 0o)
WHILE 1 = 1 ;Oneindige lus
IF S2 = HOOG TO 3000 NEXT ;Als s2 3 sec niet meer in wordt gedrukt, dan...
Positie = MinPos ;Servo in beginstand zetten
ELSEIF S2 = LAAG THEN ;...anders, als op S2 wordt gedrukt, dan...
Positie = MinPos + (6 * POT Potmeter, 140) ;Meet potmeter, reken om, geef aan 'Positie'
ENDIF
SERVO Motor, Positie ;Stuur 'Positie' uSec pulsjes naar poort 'Motor'
DELAYMS 20 ;Om de 20mSec pulsjes = 50Hz
FOR S2 = 1 TO 100 ;Nog 100 pulsjes geven als toets wordt losgelaten
SERVO Motor, Positie ;Stuur 'Positie' pulsjes naar poort 'Motor'
DELAYMS 20 ;20mSec = 50Hz, eventueel wijzigen bij ander type motor
IF Volume = LAAG THEN BREAK ;FOR-NEXT lus meteen verlaten als volumetoets is ingedrukt
WEND
Ik weet bijna wel zeker dat in mijn code nog heel wat fouten staan. De originele code heb ik gevonden op: http://www.picbasic.nl/beginners8.htm
Ik hoop dat iemand mij hiermee kan/wil helpen!
Frits Kieftenbelt
Ohm sweet Ohm | www.picbasic.nl