LED som Touch Sensor

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

LED som Touch Sensor

Inlägg av Jeppsson »

Efter att sett och hört om ett antal projekt där man använder vanliga lysdioder som Touch Sensor så blev jag sugen att koppla upp och prova själv. :)

Teori:
För att en LED skall lysa så måste man koppla positivkraft till Anoden och negativkraft/GND till Katoden. På engelska kallas den kopplingen att man ger LEDen "forward-bias". Men om man vänder på kraftmatningen till LEDen och ger den så kallad "Back-bias" så fungerar LEDen som en kondensator som laddas upp. LEDen håller laddningn en stund, lite beroende på vilken typ av diod man kör med. Om man kontrollerar nivån på LEDens Katod så kommer den att vara "Hög" under den tiden som LEDen klara att hålla laddningen. Därefter är det dax att ladda upp LEDen igen...

Skulle man nu komma i närheten av LEDen när den är uppladdad så laddar den ursig och det är detta vi kollar, om LEDen laddar ur sig innan det är dax för den att laddas igen.

Hur nära man måste komma LEDen för att den skall ladda ursig beror bland annat på under hur lång tid den fick "back-bias".

Bild

När jag skulle koppla upp och testa teorin så använde jag mig av följande komponeter:
- PIC16F648A
- Vanlig 5mm blå LED som sensor
- En liten 3mm gul LED som indikator
- Några 1k5 motstånd

Uppkopplingen skede enligt följande:
Kopplade upp en PIC16F648A µprocessor från Microchip med en Wisp628 programmerarer från Sodjan :D. Satt en indikerings LED (Liten gul) på PORTA,1 som skall tändas om LED sensorn skulle laddas ur för tidigt. Sensor LEDens katod kopplade jag in till PORTB,5 och anoden kopplades via två parallellkopplade 1k5 motstånd ner till GND.

Bild
Som ni kan se på bilden så är Sodjan oxå min elektronik "supplier" i djunglen!

µprocssesor program:
Ge sensor LEDen "back-bias" genom att dra katod till "Hög" via PORTB,5 i cirka 1ms. Därefter gör om PORTB,5 till en ingång och kolla den logiska nivå i några ms. Om det skulle vara nivå "Låg" under denna tiden tänd då den gula indikerings LEDen på PORTA,1. Därefter börja om från början igen och gör detta tills jag säger att du skall göra något annt din dumma lilla µprocessor.... :twisted:

Jag har valt att inte ha sensor LEDen "tänd" nu under tiden när det är test och försök. Men annars så kopplar man både LEDens anod och katod till µprocessorn och ger den "forward-bias" en liten stund innan kraften växlas och LEDen får "backward-bias".

Självklar så blir det lite film på detta:
LED Touch Sensor Film01!
LED Touch Sensor Film02!
Gammal didigtalkamera men filmerna fungerar i Windows Media Player :?


Som filmerna visar så räcker det att jag är några centimeter från Sensor LEDen för att den skall reagera...

/ Jeppsson
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

Lägg till mellanslag efter filnamnen så fungerar det att hämta dem direkt. Tripod/spray är INTE bra webhost fö.
Användarvisningsbild
lgrfbs
Inlägg: 7310
Blev medlem: 28 januari 2005, 15:48:53
Ort: X-län
Kontakt:

Inlägg av lgrfbs »

Film #2 finns ju inte.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

lgrfbs:Klicka höger på länken, kopiera genvägen och klistra in den i nytt fönster och lägg till ett mellanslag efter så fungerar det.

Annars rätt skoj experiment som kan användas till mycket "nyttigt".
Användarvisningsbild
lgrfbs
Inlägg: 7310
Blev medlem: 28 januari 2005, 15:48:53
Ort: X-län
Kontakt:

Inlägg av lgrfbs »

Okej, det funkar :)
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Intressant! :tumupp:
Jag är en av dem som har byggt (ok, bygger) en touchplatta med lysdioder, men jag har aldrig tänkt på att en LED faktiskt laddas upp.

Fortsätt gärna labba med detta. :)
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Gött, vem har sagt att lysdioder bara kan lysa? :)

I film 2 ser det ut snarare som det är din hands förmåga att blockera omgivningsljuset som get upphov till utslaget. Men om jag fattat Jeppsson rätt så är det handens förmåga att ändra diodens kapacitans som ger störst inverkan?
Glöm inte att en backspänd LED även är en fotodiod!

Jag har för övrigt själv byggt en touch-matris som nästan funkar... :eh:
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Det är "bara" handens förmåga som ändrar LEDens kapacitans.

Det "låga" omgivnings ljuste beror på att kameran/ni tydligare skall kunna se indikator LEDen...

Jag har gjort tester där jag täcker sensor LEDen med olika föremål så inget annat ljus kommer åt den och får inget utslag då, har även haft starka lampor på mot LEDen och fört in fingert från sidan utan att skymma ljuset och den indikerar direkt...

Får bara utslag när jag kommer i närheten med handen eller om jag håller i något ledande och för det förremålet nära LEDen...
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Gött, att man inte behöver ta hänsyn till fotodiodseffekten isåf!

Då är det bara att skriva lite rutiner för att läsa av en handfull LED-knappar, avbrottsstyrt så klart :tumupp:
Användarvisningsbild
Kezo
Inlägg: 711
Blev medlem: 28 november 2005, 19:53:12
Ort: Linköping

Inlägg av Kezo »

Hur hemlig är din kod?
Kan du posta den?
Jag vet att du har beskrivit men jag är inte direkt världens bästa programmerare...
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Jag skall bara "schysta" till koden lite och postare den sedan så fort som möjligt...
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Jag har ändrat rätt så mycket i delay funktionen så den stämmer inte med mina uträkningar men den fungerar i alla fall... :)

Kod: Markera allt

; Använder en LED som en touch sensor
; Inte tända LED:en bara back-bias och se om den kan triggas med touch
; Sensor LED på RB5 
; Indikerings LED Gul Tänd då RA1 = 1
; Processor typ PIC16F648A använda intern OSC 4 MHz
; AV: Jakob Jeppsson 060607
; Filnamn: 648A_LED_TS_02.asm

#include <p16f648a.inc>

	__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT

loop1	equ		h'20'
loop2	equ		h'21'

	org		0x00
	goto 		start

start 
	clrf			PORTA
	clrf			PORTB
	bsf			STATUS,RP0
	clrf			TRISA				;Gör PORTA till Outputs
	clrf 		TRISB				;Gör PORTB till Outputs
	bcf			STATUS,RP0

	goto		sens

;Delay på 1ms - Int Osc 4MHz = 1 Mips - 1ms Delay = 1000 program cycles 
;Delay på cirka 1ms
;Cycles = (TimeDelay * Fosc) / 4
;Cycles = (0,001s * 4MHz) / 4
;Cycles = 1000
delay1ms							;Med loop1=h'02' och loop2=h'0a' = 115 cycles
	movlw		h'02'
	movwf		loop1
subloop1							;subloop1 med loop1=h'0a' och loop2='0a' delay1ms=1010 cycles
	movlw		h'ff'
	movwf		loop2			
subloop2							;subloop2 med loop2=h'0a' = 100 cycles
	nop							
	nop							
	nop
	nop
	nop
	nop
	nop
	nop							
	decfsz		loop2,1				;Om loop2 är 0 hoppa över nästa
	goto		subloop2			

	decfsz		loop1,1				;Om loop1 är 0 hoppa över nästa
	goto		subloop1
	return


sens
	bcf			PORTA,1			;Släck indikerings LED på RA1

;RB5 Utgång
	bsf			STATUS,RP0
	bcf			TRISB,5
	bcf			STATUS,RP0

;Ladda LED i 1ms
	bsf			PORTB,5			;Ladda LED RB5 = 1
	call			delay1ms			;Vänta 1ms


;Gör RB5 till Ingång
	clrf			PORTB
	bsf			STATUS,RP0
	bsf			TRISB,5			;Gör RB5 till ingång
	bcf			STATUS,RP0


;Kolla om RA0 fortfarnde är hög
RB5HIGH
;	btfss		PORTB,5			;Om RB5 är Hög hoppa över nästa
	call			delay1ms
	btfss		PORTB,5	
	goto		sens				;Hoppa till sens
	bsf			PORTA,1			;Tänd LED indikering på RA1
	goto 		RB5HIGH
	end
Hoppas att detta kan vara till en bra början, Kezo...

Är det något mer så bara fråga!
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Koden var så väl-kommenterad att jag inte tänkte på att det var assembler. :) Bonuspoäng för det! :)
Användarvisningsbild
Kezo
Inlägg: 711
Blev medlem: 28 november 2005, 19:53:12
Ort: Linköping

Inlägg av Kezo »

Tack!!! Fast ett schema för den tröge skulle sitta fint... :oops:
DragonOrb
Inlägg: 381
Blev medlem: 16 oktober 2003, 21:57:19
Ort: Flen

Inlägg av DragonOrb »

Kopplade upp en PIC16F648A µprocessor från Microchip med en Wisp628 programmerarer från Sodjan Very Happy. Satt en indikerings LED (Liten gul) på PORTA,1 som skall tändas om LED sensorn skulle laddas ur för tidigt. Sensor LEDens katod kopplade jag in till PORTB,5 och anoden kopplades via två parallellkopplade 1k5 motstånd ner till GND.
PANK - Regeln: Positiv Anod Negativ katod

Förutom det han skrev är det ett Pullup motstånd (10-33k) till +5 till MCLR på PIC´en.
Sedan hur programeraren ska kopplas kolla sodjans hemsida under ICSP.
Sedan 100nF kondning mellan + och - nära processorn.
Skriv svar