[size=150]Hämäräkytkimen toteutus resistiivisillä antureilla[/size]
LDR, NTC, PTC, venymäliuska… Resistiivisiä antureita voidaan käyttää mittaamaan useita fysikaalisia suureita. Tässä projektissa käytämme valovastusta (LDR, light dependent resistor) sekä Arduinon Duemilanove kehitysalustaa sytyttämään LEDin valaistuksen tippuessa halutun tason alle.
Valovastus toimii vakiovalaistuksessa kuten tavallisetkin vastukset. Valaistuksen muuttuminen muuttaa kuitenkin valovastuksen impedanssia. Valovastus muodostuu puolijohteesta, jonka resistanssi riippuu varauksenkuljettajien eli vapaiden elektronien ja aukkojen määrästä. Valon fotonit pystyvät vapauttamaan elektroni-aukko –pareja lisäten puolijohteen johtavuutta. Käytännössä tämä tarkoittaa valovastuksen resistanssin pienenemistä valaistuksen lisääntyessä.
Valovastuksille tyypillinen pimeäresistanssi on useita megaohmeja. Kirkkaassa valaistuksessa (>150 lx) resistanssi voi laskea muutamaan sataan ohmiin. Tarkat arvot riippuvat käytetyistä valovastuksista, tässä projektissa käytetyille vastuksille mitattu vaihteluväli on 2kΩ - 1MΩ. Vaikka esimerkeissä käytetäänkin valovastusta, sopivat käytetyt kytkennät käytettäväksi minkä tahansa resistiivisen anturin kanssa, kun vastuksien arvot mitoitetaan sopivasti.
Resistiivisten antureiden kytkentöjä
Yksinkertaisimmillaan resistiivisen anturin lukeminen vaatii vain resistanssin mittaamista. Vaikka tämä onnistuukin helposti esim. yleismittarilla, ei resistanssin mittaaminen onnistu suoraan käytetyllä mikrokontrollerilla. Elektronisissa mittauksissa virta ja vastus muutetaankin yleensä niihin verrannollisiin jännitteisiin, jonka mittaaminen onnistuu helposti AD-muuntimella (ADC, analog to digital converter). Yksinkertaisin tapa muunnoksen toteuttamiseksi on mitata kahden sarjaan kytketyn vastuksen välipisteen jännite.
Jännite kahden vastuksen välillä riippuu suoraan niiden resistanssin suhteesta. Kun ylemmän vastuksen R9 arvo tunnetaan, saadaan valovastuksen R11 resistanssi laskettua kaavasta R11 = (Vjako * R9) / (5V - Vjako), missä Vjako on vastusten väliltä mitattu jännite. Vaikka kytkentä onkin yksinkertainen, ei sen käyttö ole aina perusteltua, sillä sen vaste on hyvin epälineaarinen. Toisien sanoen jännitteen vaihtelu valaistuksen mukana on suurinta valovastuksen resistanssin ollessa lähellä vastuksen R9 arvoa. Siirryttäessä kauemmas nimellisestä arvosta vastaavan suuruinen valaistuksen muutos saa aikaan vain pienen muutokseen jännitteessä.
Kytkentää voidaan kuitenkin käyttää valaistuksen ohjaamiseen. Yhdistämällä keskipiste N-kanavaisen FETin hilalle alkaa NFET V2 johtaa, kun jännite ylittää transistorin kynnysjännitteen VGS(th). Alkaessaan johtaa NFET V2 kytkee LEDin V3 katodin maahan, jolloin LED syttyy. FDV301 kestää jatkuvaa virtaa 220 mA, jolloin sitä voitaisiin käyttää turvallisesti ohjaamaan kymmentä rinnan kytkettyä LED + vastus yhdistelmää, jotka on mitoitettu 15-20 mA:n virralle. FET:in kynnysjännitteen VGS(th) suuri vaihtelu eri yksilöiden välille sekä lämpötilan mukana tekee menetelmästä kuitenkin epätarkan, minkä lisäksi liian matala kynnysjännite lisää turhaan transistorin häviöitä.
Muuttamalla jännitemittaus differentiaaliseksi ns. Wheatstonen siltakytkennällä yllä olevan kuvan mukaisesti saadaan mitattava jännite muuttumaan lineaarisesti koko mittausalueella. Kun vastukset R1 ja R4 sekä R2 ja R3 ovat identtisiä, ovat operaatiovahvistimien A4-A ja A4-B menevät jännitteet (5VR3) / (R1+R3) sekä (5VR1) / (R1+R3). Vahvistimet toimivat puskureina, jotka siirtävät +napoihin tulevat jännitteet ulostuloihin. Kytkennän ansiosta seuraavat vastukset eivät enää kuormita mittausta eivätkä vaikuta jännitteenjakoon.
Vastukset R5-R8 sekä operaatiovahvistin A4-C muodostavat differentiaalisen kytkennän, joka antaa ulostuloonsa vastuksiin R5 ja R7 kytkettyjen jännitteiden eron. Kun vastukset R5-R8 ovat identtisiä, vahvistimen A4-C antama jännite on suoraan erojännite. Muutamalla vastuksien suhteita voidaan sisään tulevien signaalien suhdetta muuttaa ja erojännitettä vahvistaa. Vahvistus tapahtuu valitsemalla vastukset R5 ja R7 sekä R6 ja R8 yhtä suuriksi. Tällöin vastusten R5 ja R6 suhde määrää vahvistuksen suoraan.
Valitsemalla vastuksen R1 arvo vastaamaan valovastuksen R3 suurinta arvoa, muuttuu mittausjännite V_measure välillä 0-5V valaistuksen muuttuessa välillä 0-150 lx. Jos mittausalue haluttaisiin tarkentaa alkamaan suuremmasta arvosta, tulisi vastuksen R1 arvo valita vastaamaan kyseisen alueen suurinta resistanssia, esim. alueelle 90-150 lx vastuksen R1 arvoksi valittaisiin 100 kΩ.
Käytännössä tähän ei aivan päästä, sillä valittu vahvistin ei pysty antamaan ulostuloihinsa aivan käyttöjännitteitä vastaavia arvoja rail-to-rail ominaisuudesta huolimatta. Nyt ulostulot leikkaantuvat noin 200 mV:n päähän käyttöjännitteistä. Ongelma voitaisiin korjata rajoittamalla mittaussignaalia tai käyttämällä eri tyyppistä operaatiovahvistinta mittausaluetta suuremmilla käyttöjännitteillä. Nykyinen kytkentä riittää kuitenkin hyvin hämäräkytkimen toiminnan esittelemiseksi.
Valaistuksen ohjaaminen mitta- ja referenssisignaalin avulla
Koska kytkentä antaa nyt valaistukseen verrannollisen jännitteen, voitaisiin hämäräkytkimen toimintaa säätää puhtaasti ohjelmallisesti. Käytännön sovelluksissa mahdollisuutta tietokoneliitäntään ei aina ole lähellä, minkä vuoksi kytkentään lisätään trimmeri, joka säätää ohjausjännitettä V_ref. Vertaamalla valaistusmittauksen antamaan jännitettä tähän jännitteeseen, saadaan hämäräkytkimen toimintapistettä säädettyä ruuvia pyörittämällä. Koska operaatiovahvistimeksi valittiin quad-pakattu versio, voidaan viimeistä vapaata operaatiovahvistinta käyttää puskuroimaan signaalia, jolloin sitä voidaan käyttää tulevaisuudessa myös mikrokontrollerin tuloa suuremman kuorman ohjaamiseen.
Koska hämäräkytkimen toiminta perustuu kahden jännitetason vertailuun, voitaisiin signaalit kytkeä suoraan komparaattoriin, joka puolestaan ohjaisi aikaisemmin käytettyä transistoria. Käyttämällä komparaattoria syöttämään 5V FETin hilalle, päästäisiin eroon kynnysjännitteen epävarmuudesta. Toisaalta ongelmaksi nousisi LED vilkkuminen valaistuksen ollessa lähellä rajapistettä. Tällöin pienikin muutos valaistuksessa voisi muuttaa kytkennän tilaa. Lisäämällä kytkentään hystereesiä vaihtaa komparaattoria tilaansa eri pisteessä suunnasta riippuen.
Kun V_measure on pienempi kuin V_ref, komparaattorin ulostulo on alhaalla. Tällöin tilan muuttamiseksi V_measuren täytyy nousta yli jännitteen R16*(V_ref*R17)+V_ref. Jännitteen ylittäessä rajan, komparaattorin ulostulo nousee +5V, jolloin sammuminen vaatii V_ref tippumisen jännitteen (V_ref (R1+ R2) – 5VR1)/R2.
Arduinon liittäminen kytkentään
Komparaattoria käytettäessä menetetään kuitenkin tieto valaistuksen tasosta, minkä vuoksi signaalit mitataan Arduinon analogiatuloilla, minkä jälkeen FETin ohjaus hoidetaan digitaalisella ulostulolla. Digitaalisen ohjauksen käyttö mahdollistaisi myös LEDin kirkkauden säädön PWM moduloinnilla valaistustason mukaan. Tämä toiminta jätetään kuitenkin pois projektin koodista selkeyden vuoksi. Anturikytkennän ja LEDien ohjauksen lisäksi Arduinoon kytketään LCD näyttö, joka näyttää sekä mitatun että asetetun valaistustason.
[code]/* Hämäräkytkimen ohjauskoodi Arduino Duemilanove alustalle.
Mikrokontrolleri mittaa kahdelta analogiselta kanavalta
signaalin ja ohjausjännitteen. Tasoista riippuen digitaalista
kanavaa käytetään ohjaamaan LEDiä päälle ja pois. Mittaustulos
sekä referenssitaso näytetään LCD näytöllä.
Käytetään valmista kirjastoa LCD näytön ohjaamiseen:
LiquidCrystal Library
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
MTS
5.2.2011
*/
#include <LiquidCrystal.h>
int sensorValue = 0; // mitattu jännite V_measure
int printValue = 0; // näyttöön tulostettava kirkkaus
int refValue = 0; // referenssijännite
int printRef = 0; // referenssi luxeina
// Käytetään seuraavia pinnejä näytön ohjaamiseen
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
lcd.begin(16, 2); // 2x16 merkkinen näyttö
pinMode(8, OUTPUT); // Valaistusta ohjaava pinni
}
void loop() {
delay(200); // hidastetaan mittausta luettavalle tasolle
sensorValue = analogRead(A0); // V_measuren lukeminen
refValue = analogRead(A5); // V_refin lukeminen
printValue = map(sensorValue, 0, 1023, 0, 100); // muutetaan jännite vastaamaan valaistusta välillä 0-100 lx
printRef = map(refValue, 0, 1023, 0, 100); // sama referenssille
lcd.clear();
lcd.print("Valaistus: ");
lcd.print(word(printValue));
lcd.setCursor(0, 1);
lcd.print("Referenssi: ");
lcd.print(printRef);
if(printValue < printRef){ // sytyttää LEDin kun taso alittuu
digitalWrite(8,HIGH);
}
else if(printValue > (printRef+10)) // sammuttaa LEDin kun taso+10 ylittyy, estää valon vilkkumista
digitalWrite(8, LOW);
}
[/code]
Oheista koodia käytettäessä referenssisignaali kytketään kanavalle A5, mittaussignaali kanavalle A0 sekä LEDin ohjauskanavalle D8. Näytön ohjaamiseen käytetään Arduinon valmista kirjastoa:
http://www.arduino.cc/en/Tutorial/LiquidCrystal
Näytön liitännät noudattavat oheisen ohjeen mukaisia pinnejä.
Oheisissa kuvissa on lyhyesti testattu laitteen toimintaa. Piirikaavioihin verrattuna kytkentää on hiukan yksinkertaistettu, operaatiovahvistimen kondensaattori sekä LEDin ohjaus FET on jätetty pois kuten myös referenssitason puskurointi. Näistä huolimatta valovastusten peittäminen kädellä sai LEDin syttymään kuten kuuluukin.