Project-medewerkers:
Pieter Sijmons, Sybe Natran, Nils Van Butsel
2011
INTERACTIEVE TOUCHSCREEN MET RGB LEDS Verslag voor het vak “Vakoverschrijdende Projecten”
Inhoudsopgave Introductie ............................................................................................................................................... 2 Doelstelling .......................................................................................................................................... 2 Basiswerking Hardware ........................................................................................................................... 3 Totaal ontwerp .................................................................................................................................... 3 Ingang .................................................................................................................................................. 4 Infraroodsensoren ............................................................................................................................... 5 Schuifregister voor detectie ................................................................................................................ 7 Aansturing RGB-leds .......................................................................................................................... 10 Opmerking ......................................................................................................................................... 12 Basiswerking Software .......................................................................................................................... 12 Inleiding ............................................................................................................................................. 12 Uitwerking ......................................................................................................................................... 13 Aansturing RGBleds ........................................................................................................................... 15 Uitlezen van infraroodleds ................................................................................................................ 17 Overzicht printplaat............................................................................................................................... 19 Testresultaten & Opmerkingen ............................................................................................................. 20 Conclusie ............................................................................................................................................... 21 Datasheets componenten ..................................................................................................................... 23
1
Introductie Doelstelling Ontwerp van hard- en software om een Interactief-aanraakscherm te realiseren en aan te sturen. Het scherm is opgebouwd uit een grove matrix van 24 op 16 beeldpunten en elk beeldpunt beslaat een vierkant van ongeveer 5 op 5 cm. Elk beeldblokje bevat een RGB-led en een infrarood sensor. Een RGB- led bevat in één verpakking een rode, een groene en een blauwe led. Met de gepaste aansturing van de drie leds kunnen alle kleuren bekomen worden. Het aanraken van een beeldpunt wordt gedetecteerd door de infrarood sensor. De mogelijkheden van een dergelijk interactief aanraakscherm zijn legio : interactieve spelconsole, display voor het weergeven van data, animatie, rolkrant …enz. In een project van vorig academiejaar werd een module van 4 op 2 RGB-leds gerealiseerd. Dit jaar is het de bedoeling om op basis van deze module verder te gaan en de module te verbeteren en uit te breiden.
2
Basiswerking Hardware Totaal ontwerp
3
Eén bordje bestaat uit 8 RGB-leds en 8 infraroodsensoren. Bovenstaande tekening is het elektronisch schema van de schakeling. Alle leds werken volgens hetzelfde principe. We zien 4 grote delen op het schema:
De buffers/ingang De infraroodsensoren Schuifregister voor de detectie Chip voor de aansturing van de leds met de RGB-leds
Ingang De signalen komen toe in het bordje via J1. We zien dat we 11 ingangen hebben: • • • • • •
SER RETURN_S CLK_S CLK_TC INH SIN
• • • • •
CLR SH/LD BLANK LAT RETURN_T
Wat de specifieke functie is van deze ingangen zal later nog uitgebreid aan bod komen. Als we de draden volgen, zien we dat alle ingangen naar 2 74HC244’s gestuurd worden. De 74HC244 doet dienst als buffer. Intern heeft deze chip allemaal 3-state buffers die gestuurd worden door de ���� en 2𝑂𝐸 ���� . Er wordt gewerkt in 2 groepen van 4 zoals te zien is op de figuur vandaar ook ingangen 1𝑂𝐸 dat er 2 output enable’s zijn. We kunnen dus 8 signalen bufferen. Er zijn 11 ingangen dus hebben we nog een extra 74HC244 nodig voor de laatste 3 ingangssignalen.
4
���� en 2𝑂𝐸 ���� zal ervoor zorgen dat alle uitgangen in hun OFF-state staat en de Een hoge ingang op 1𝑂𝐸 ingangssignalen niet doorgestuurd worden. Voor onze schakeling worden deze ingangen dan ook verbonden met de GND. Als we kijken op het elektronische schema(figuur1) dan zien we dat pinnen 1 en 19 steeds verbonden zijn met de ground. De chip zal ingang AX gebufferd uitsturen naar uitgang YX.
Infraroodsensoren Links onderaan in onderstaande figuur zie je 2 dioden.
D2 is een infrarood-led die continu infrarood licht uitzendt omdat deze via een voorschakelweerstand van 100Ω verbonden is met de 3,3V voedingsspanning. Met het blote oog is het infrarode licht niet zichtbaar. Maar indien men kijkt met een gsm-camera, kunnen we controleren of de led inderdaad iets uitzendt(zie foto rechts). Het gaat hier om een INF5940 van Futurlec. D1 is een infrarood-detectie-led die het infraroodlicht zal detecteren zodra men een voorwerp boven D2 houdt, waardoor het infrarode licht kan weerkaatst worden op de detectie-led. De detectieled is een INFD5940 van Futurlec. Op de afbeelding is D2 de witte led die je, als je goed kijkt, ziet oplichten en de zwarte led is D1. Door de manier waarop D1 geschakeld is, zal D1 pas geleiden wanneer hij infrarood licht detecteert. Op dit moment kan er stroom lopen doorheen de tak van D1. Waardoor er een spanning zal staan over de weerstand R1 van 1 MΩ. En dus een spanning op pin 2 van de opamp. De opamp is van het type LM358A.
5
Als we gaan kijken naar het interne schema van de LM358A zien we dat deze eigenlijk bestaat uit 2 opamps.
Uit het schema halen we dat pin 3 en dus de plus-klem van de opamp verbonden is met de GND en de min-klem(pin2) verbonden is met de detectieled, pin 2 van de opamp. De tweede opamp in de LM358A wordt gebruikt voor de volgende detectieled. Door de manier van schakelen gaat het hier om een inverterende versterker die de ingangsspanning van de opamp zal versterken aan de uitgang. De uitgangsspanning van de opamp is afhankelijk van de hoeveelheid licht die gedetecteerd wordt en is dus afhankelijk van de afstand tussen het object en de infrarood leds. Hoe dichter het object bij de infrarood leds gehouden wordt, hoe hoger de spanning aan de uitgang. We hebben in totaal 8 detectie-punten dus hebben we 4 LM358A’s nodig. De uitgang van de LM358A wordt naar een LM339 gestuurd. Als we gaan kijken naar de datasheet van de LM339 zien we dat dit een quad comparator is. De comparator zal de spanning van de uitgang van de LM358A gaan vergelijken met een referentie-spanning VREF. Deze referentiespanning kunnen we zelf gaan instellen door middel van een pot-meter. Afhankelijk van de hoeveelheid licht in de ruimte waar de touch-screen gebruikt wordt kunnen we VREF gaan verhogen of verkleinen.
LM339
Instellen referentiespanning
De LM339 bestaat dus uit 4 comparators in één behuizing waardoor we in onze schakeling er slechts 2 in totaal nodig hebben. Dit is hetgeen we kregen na de comparator.
6
Deze uitgangsspanning is zoals je ziet zeer laag: 481mV bij detectie. Omdat het schuifregister goed het verschil moet kunnen detecteren tussen detectie en geen detectie, hebben we deze spanning verhoogd. Uit verslagen van vorig jaar zagen we dat zij opteerden voor een weerstand van 4,5MΩ ipv 1MΩ voor de opamp. Alle weerstanden van 1MΩ werden dan ook vervangen door een weerstand van 4,7MΩ(E12-reeks). Hierdoor kregen we aan de uitgang een spanning van 1,59V bij detectie.
De uitgang van de comparator gaat naar een schuifregister, namelijk de 74HC166.
Schuifregister voor detectie Het schuifregister bestaat uit een 74HC166. Dit is een 8 bit parallel-in/serial-out schuifregister. Het schuifregister heeft ook een serial-in ingang. Het schuifregister zal alle sensoren overlopen en kijken of er ergens detectie optreedt. Daar dit parallel gebeurt, gaat dit zeer snel. De uitgang van het schuifregister kan ofwel doorgestuurd worden naar een volgende print met weer 8 leds en sensoren of via een jumper naar de microcontroller. De sensoren worden ingelezen met een puls op de LOAD. Dit is pin 15 van de 74HC166. Deze is actief laag dus moeten we een ‘0’ sturen om alles in te lezen.
7
De pinnummering kan je terugvinden in onderstaande tabel.
Eén touch-screen bestaat uit 8 sensoren. We kunnen meerdere printen aan elkaar hangen. De uitgang(serial output) van het eerste schuifregister moet dan verbonden worden met de ingang(serial in) van het tweede schuifregister. Een nul op de LOAD zal alle sensoren in het schuifregister laden. Vervolgens zullen de bits doorheen alle printen verschoven worden op het ritme van de CLK_S aan de ingang, als de SH/LD terug hoog is geworden. Als er twee printen met elkaar worden verbonden moeten dus 16 bits worden uitgelezen. Met de INH kan het schuifregister gepauzeerd worden. Een hoge ingang zal ervoor zorgen dat de klok niet meer zal ingelezen worden. De uitgang van het schuifregister is pin 13 en wordt weergegeven in onderstaande figuur door de groene lijn. De bits die worden uitgelezen, gaan dan naar een computer of naar een FPGA waar ze verwerkt zullen worden(zie deel Software).
De uitgang van detectieled H is rechtstreeks verbonden met de seriële uitgang. We moeten er dus rekening mee houden als we dit gaan uitsturen dat we deze dit ook gaan uitlezen. De timing van de
8
software-sturing zal dus moeten correct zijn. Onderstaande figuur verduidelijkt dit:
Bij het programmeren moeten we ervoor zorgen dat de timing correct is. Uit onderstaande tabel halen we dat de ingangen worden ingeladen bij een lage ingang op PE of bij ons op de SH/LD ingang EN op de stijgende flank van de klok.
9
Aansturing RGB-leds De aansturing van de leds gebeurt met een TLC5952. De leds zijn afkomstig van EvilMadscience en zijn van het type: BL-L105. Eén RGB-led bestaat in principe uit 3 leds: een groene, rode en blauwe led. Door combinatie van deze leds kunnen we iedere gewenste kleur krijgen. Onze leds zijn common anode en moeten aangestuurd worden met een 0 op de kathode om de led te laten branden. We hebben 8 RGB-leds en 3 inwendige leds per RGB-led dus moeten we de RGB-leds aansturen met 24 bits.
De aansluitingen van de led gebeurt als volgt: (van links naar rechts) Groen, Blauw, gedeelde anode, Rood. Let op de lengte van de pootjes! Als je deze led wil testen, plaats dan 5V op de gedeelde anode, en de gnd op de gewenste kathode. Vergeet de voorschakelweerstand niet!
De TLC regelt dus de aansturing van de leds. De pinconfiguratie van de TLC is als volgt: De 24 bits die de data voor de 8 leds weergeeft worden serieel ingeladen in onze microcontroller via de SIN en zijn afkomstig van een computer. Op het ritme van het kloksignaal CLK_S worden deze 24 bits doorgeschoven. Na 25 klokpulsen komt de data aan de uitgang van onze microcontroller namelijk de SOUT. De TLC5952 bestaat namelijk uit een 25 bit common shift register. De TLC5952 is uitgerust met een brightness control, waarmee de helderheid van de leds bepaald wordt. Vooraleer we de data kunnen sturen voor de RGB-leds, moet eerst de brightness control worden ingeladen. De eerste bit die we sturen, zal bepalen hoe de chip de data moet interpreteren. Voor kleurdata voor de leds moeten we een 0 doorsturen en data die bestemd is voor de brightness control wordt voorafgegaan met een 1. Vandaar dat we 25 bits moeten insturen (1 mode-bit + 24 databits).
10
Om de data naar buiten te brengen moeten we een puls sturen naar de LAT (latch). Een stijgende flank op deze ingang zal ervoor zorgen dat de data uit de registers naar de desbetreffende uitgangen worden gezonden. Voor we data naar de TLC kunnen sturen, moeten we eerst enkele stappen doorlopen om de TLC correct aan te sturen. Bij het opstarten geven we eerst een vijftigtal data bits mee aan de TLC op de SIN. Deze data wordt niet ingelezen zolang er geen puls komt op de LAT van de TLC. Deze bits kunnen zowel 0 of 1 zijn en hebben enkel als doel dat we op deze manier de inhoud van de TLC kennen. De volgende stap is het instellen van de brightness control. We wensen dat alle leds maximaal oplichten. Als eerste sturen we een 1 in op de SIN om duidelijk te maken aan de TLC dat we de brightness willen instellen. Daarna sturen we nog 24 hoge bits op de SIN om alle bits maximaal te laten branden. Als we nu een puls sturen op de LAT worden er 25 hoge bits ingelezen. Om ervoor te zorgen dat alle data correct ingelezen wordt, wachten we nog 1 klokcyclus vooraleer we de LAT doorsturen. Ook laten we deze LAT 2 klokcycli hoog om er zeker van te zijn dat deze doorkomt. Na de LAT wachten we best nog 1 klokcyclus vooraleer we nieuwe data inlezen. Na deze stap sturen we 25 lage bits op de SIN. Ook hier is een puls op de LAT nodig om de data in te lezen. We wachten opnieuw enkele klokcycli zoals hierboven om alle data goed te laten doorkomen. Na deze stap weten we zeker dan alle leds uit zijn voor we aan het eigenlijke programma beginnen. De TLC doet dienst als schuifregister. Hierdoor kunnen er opnieuw meerdere modules na elkaar geplaatst worden. De uitgang van de eerste TLC(SOUT) wordt verbonden met de ingang van de tweede TLC(SIN), enzovoort… Hierdoor kunnen meerdere modules na elkaar worden geplaatst. De data voor de eerste module, dus de data op de SIN van de eerste module, is afkomstig van een computer of FPGA. Hierin zal bepaald worden, afhankelijk van de toestand van de detectieleds, hoe de RGB-leds moeten worden aangestuurd.
11
Softwarematig wordt dus de data bepaald die de leds aanstuurt. De aansturing is natuurlijk afhankelijk van welke infrarood leds iets detecteren en welke toepassing de designer wenst.
Opmerking Op de module zie je twee jumpers JP1 en JP2. Deze zijn noodzakelijk om de signalen van de laatste module terug te schakelen naar alle voorgaande. Bij de laatste module zullen deze 2 jumpers geplaatst worden, waardoor het signaal terug zichtbaar zal zijn aan de eerste module en er geen onnodige (lange) kabels moeten gelegd worden.
Basiswerking Software Inleiding De aansturing van ons bordje gebeurt voorlopig door middel van een Arduino Uno en een computer. Later is het de bedoeling dat de computer en Arduino en computer vervangen worden door een FPGA zodanig dat de module zelfstandig z’n werk doet. Ook zal de module uitgebreid worden naar 24 op 16 beeldpunten in plaats van de huidige 4 op 2 beeldpunten. Nu:
Later:
De code van de Arduino is gebaseerd op een variant van de c-taal (=de Wiring-programmeertaal).
12
Uitwerking Het aansturen van een Arduino vereist een bepaalde manier van werken: •
Een setup()-functie wordt als eerste uitgevoerd en bevat de initialisatie van de poorten en het opzetten van de verbinding tussen PC en Arduino. Wij gebruiken daarnaast ook deze functie om de registers van de TLC5952-chip te resetten (doorsturen van nullen en eenmaal de latch ‘hoog’ zetten). Bijvoorbeeld: void setup() { pinMode(SInPin, OUTPUT); pinMode(CLK_TCPin, OUTPUT); pinMode(latchPin, OUTPUT); Serial.begin(9600); // Serial.begin(baudrate)
•
} Een loop()-functie wordt na de initialisatie continu uitgevoerd. Deze functie gebruiken we om afwisselend de leds een andere kleur te geven. Daarnaast kunnen we ook via deze manier periodiek kijken of er beweging gedetecteerd wordt over de infraroodsensors. Merk op dat de volgorde RGB in de bitstream van rechts naar links moet gelezen worden, bv blauw wordt: 1,0,0. Bijvoorbeeld: void loop(){ readInfrared(); //====OFF==== int bitpatternOff[]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; sendPattern(bitpatternOff); delay(1000); //====WHITE==== int bitpatternWhite[]={ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }; sendPattern(bitpatternWhite); delay(1000); //====RED==== int bitpatternRed[]={ 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1 }; sendPattern(bitpatternRed); delay(1000); //====GREEN==== int bitpatternGreen[]={ 0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 }; sendPattern(bitpatternGreen); delay(1000);
}
//====BLUE==== int bitpatternBlue[]={ 1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0 }; sendPattern(bitpatternBlue); delay(1000);
13
In dit stukje code wordt nog een functie vermeld, nl. de sendPattern()-functie. Deze functie verzorgt dus de synchronisatie tussen de Serial-IN, de Clock_TC en de Latch. De output van zo’n functie ziet er als volgt uit:
Deze grafiek werd gegenereerd door de Logic Analyzer. Dit apparaat werd verbonden met de pinnen op de Arduino, om te zien welke signalen er werden uitgestuurd naar het led-bordje. Aan de hand daarvan verliep het debuggen zeer vlot, omdat we een directe visuele indruk kregen van de signalen. De setup zag er zo uit: onderaan zien we het bordje, gekoppeld aan de Arduino, die op zijn beurt verbonden is met een laptop én de Logic Analyzer.
14
Aansturing RGBleds De code die bovenstaand signaal genereert, is de volgende: void sendPattern(int *pattern){ int brightnessPattern[]={ 0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1 }; setLEDBrightness(brightnessPattern); int counter=0; for(int i=0;i<58;i++){ if(i==0){ digitalWrite(SInPin,LOW); digitalWrite(CLK_TCPin,LOW); digitalWrite(latchPin,LOW); } else if(i==1){ digitalWrite(SInPin,LOW); digitalWrite(CLK_TCPin,HIGH); digitalWrite(latchPin,LOW); } else if(i<50){ if(i%2==0){ digitalWrite(SInPin,pattern[counter]); digitalWrite(CLK_TCPin,LOW); } else{ digitalWrite(SInPin,pattern[counter++]); digitalWrite(CLK_TCPin,HIGH); } digitalWrite(latchPin,LOW); } else if(i==50){ digitalWrite(SInPin,LOW); digitalWrite(CLK_TCPin,LOW); digitalWrite(latchPin,LOW); } else if(i==51){ digitalWrite(SInPin,LOW); digitalWrite(CLK_TCPin,LOW); digitalWrite(latchPin,LOW); } else if(i==52){ digitalWrite(SInPin,LOW); digitalWrite(CLK_TCPin,LOW); digitalWrite(latchPin,LOW); } else if(i<57){ digitalWrite(SInPin,LOW); digitalWrite(CLK_TCPin,LOW); digitalWrite(latchPin,HIGH); } 15
else{
}
}
}
digitalWrite(SInPin,LOW); digitalWrite(CLK_TCPin,LOW); digitalWrite(latchPin,LOW);
De werking hierachter is als volgt: • • •
De waarde voor de kleur of helderheid sturen we door via de Serial-IN, voorafgegaan van een mode-bit die 0 is voor de kleur en 1 voor de helderheid. Op de stijgende flank van de Clock_TC puls wordt de waarde van de Serial-IN gesampled. Wanneer alle 25 bits (1 mode-bit + 24 databits) binnen gekomen zijn, zetten we de Latch hoog om deze waardes te laten interpreteren door de TLC5952-chip.
De setLEDBrightness()-functie werkt op dezelfde manier als de sendPattern()-functie, op die ene mode-bit na.
16
Uitlezen van infraroodleds Dit gebeurt aan de hand van de readInfrared()-functie. Deze wordt aangeroepen tijdens de loop() op de Arduino. Wanneer de sensoren detecteren dat er een ‘afdekking’ plaatsvindt, wordt er een bitstream van 8 bits in het schuifregister gepusht. Elke bit die “1” is, duidt op een afdekking. De totale bitstream wordt langs de PC-kant via de Arduino uitgelezen in een array (arr_infra). In deze functie worden 3 poorten aangesproken: • • •
SER: bevat de 8bit bitstream. CLK_S: op de stijgende flank van de CLK_S puls wordt de waarde van de SER gesampled. SH/LD: geeft bij “0” aan dat de waarden naar het schuifregister moeten worden gepusht.
Het signaal in de Logic Analyzer ziet er als volgt uit (wanneer geen enkele led afgedekt is):
Wanneer bijvoorbeeld led 4 bedekt wordt, krijgen we het volgende signaal:
De inhoud van de array wordt via de Serial.print()-functie getoond op het scherm. Via de Serial Monitor krijgen we bijvoorbeeld het volgende te zien als we één voor één de leds bedekken:
17
void readInfrared(){ int arr_infra[]={ 0,0,0,0,0,0,0,0 }; int j=0; for(int i=0;i<18;i++){ if(i%2==0){ if(i==0){
} else{
} digitalWrite(CLK_SPin,LOW); delay(.001);
digitalWrite(CLK_SPin,HIGH); if(i==1){ } if(i>0){
}
}
digitalWrite(SHLDPin,LOW);
}
digitalWrite(SHLDPin,HIGH); delay(1); arr_infra[j++]=digitalRead(SER);
Serial.print("Status: "); for(int i=0;i<8;i++){ Serial.print(arr_infra[i]); } delay(1000); Serial.print("\n\r");
}
digitalWrite(SHLDPin,LOW); digitalWrite(CLK_SPin,LOW);
18
Overzicht printplaat
19
Testresultaten & Opmerkingen Gedurende de uitwerking van ons nieuw prototype ondervonden we een aantal problemen. • •
• •
Het kiezen van een nieuwe weerstand voor de opamp zorgde alvast voor een betere detectie zoals reeds vermeldt. Een 2de probleem dat we ondervonden was de enorme storing op de voedingsspanning 3.3V. Daar we niet beschikten over een zeer gestabiliseerde voeding kozen we om de data en vermogensstroom te splitsen. Dit had tot gevolg dat een nieuwe voeding van 5V moest voorzien worden op het bordje. De aansluiting van de leds aan de anode werd dus onderbroken en aangesloten op de aparte voedingsspanning van 5V.
De TLC5952 kwam tijdens het testen zeer warm. We besloten om de stroom te beperken en R26 te vervangen door een weerstand van 2,2kΩ BLANK, INH, CLR mogen in principe weg want deze worden niet gebruikt. CLR constant aan voedingsspanning hangen. Deze is standaard actief laag waardoor het register niet kan gereset worden. INH moet dan met de gnd geconnecteerd worden, deze is standaard actief hoog. 20
Conclusie De evolutie van onze prototypes kan niet weerlegd worden, hieronder nog een klein overzicht: Proof of concept prototype:
Prototype 1.0:
De proof of concept en prototype 1.0 werden behandeld in het project van vorig jaar 2010-2011. Er waren echter zodanig veel wijzigingen aan de print gebeurt dat verder werken hierop niet mogelijk was.
21
Prototype 2.0:
Protoype 2.2:
Met prototype 2.2 hebben we een werkende testopstelling kunnen simuleren, doch door willekeurige slechte contactpunten op de printplaat (door slecht solderen, veel transport, uitpluggen/inpluggen) werd het testen erg bemoeilijkt. Een industrieel geproduceerde printplaat zou met de aanwezige kennis correct moeten werken. 22
Datasheets componenten 74HC244 : http://www.datasheetcatalog.org/datasheet/philips/74HC_HCT244_CNV_2.pdf Infraroodled: http://www.futurlec.com/LED/INF5940pr.shtml Infrarooddetectieled: http://www.futurlec.com/LED/INFD5940pr.shtml LM358A: http://www.datasheetcatalog.org/datasheet/fairchild/LM358A.pdf LM339: http://www.datasheetcatalog.org/datasheet/fairchild/LM339.pdf 74HC166: http://www.datasheetcatalog.org/datasheet/philips/74HC_HCT166_CNV_2.pdf TLC5952: http://www.ti.com/lit/ds/symlink/tlc5952.pdf RGB-led: http://cat.emscdn.com/components/semi/LED/datasheets/BL-L105.pdf
23