Cuprins:

DIY Lightmeter fotografic: 5 pași
DIY Lightmeter fotografic: 5 pași
Anonim
DIY Lightmeter fotografic
DIY Lightmeter fotografic
DIY Lightmeter fotografic
DIY Lightmeter fotografic

Acest Instructable împărtășește câteva idei despre construirea unui contor de lumină incident mic și ieftin.

Deoarece Instructables nu mă lasă să introduc propriile mele videoclipuri, încercați acest link:

www.youtube.com/embed/avQD10fd52s

Scopul pentru mine a fost un metru de lumină care să-mi însoțească camera de film cu format mediu Bronica ETRSi.

Lucruri pe care am vrut să le prezinte:

  • single ASA (100) deoarece folosesc aproape doar film ASA 100
  • cât mai mic posibil
  • dă-mi doar combinații pe care Bronica mea le poate reproduce, ceea ce înseamnă f2.8-f22 și 1sec la 1/500 sec.
  • fără caracteristici aiurea, cu excepția orelor simple și a valorilor diafragmei

Lucruri pe care le-am folosit:

  • Adafruit (Vishay) VEML 7700 Lux-metru digital (aproximativ 5 $)
  • Microcontroler Adafruit Trinket M0 (aproximativ 9 $)
  • Afișaj OLED 128x32 (aproximativ 10 $)
  • un buton pentru al porni temporar (câțiva cenți)
  • o bucată mică de bandă, pentru că încerc să nu folosesc cabluri, dar cu siguranță puteți folosi și cabluri

Pasul 1: Calcule de bază | Lux la EV

Calcule de bază | Lux la EV
Calcule de bază | Lux la EV
Calcule de bază | Lux la EV
Calcule de bază | Lux la EV

Senzorul pe care l-am cumpărat folosește două caracteristici care mă permit să decid asupra lui:

  • produce valori de 16 biți lux în loc de valori de lumină „fără dimensiuni”
  • scoate valorile prin I2C

Un contor de lumină fotografic folosește valori de expunere (EV), senzorul pe care l-am cumpărat folosește valori Lux, care este o scară complet diferită. Deci, primul pas este să obțineți EV-uri din valorile Lux cu condiția ca senzorul.

O privire rapidă pe Wikipedia și puteți găsi o formulă pentru măsurarea incidentelor și puteți converti EV în Lux:

E = 2,5 * 2 ^ EV

unde E se măsoară în Lux.

Deoarece am obținut deja valoarea Lux de la senzor și dorim valoarea EV, trebuie să reformăm formula, care ne determină să:

EV = log2 (E / 2.5)

Deci, acesta este primul calcul care trebuie făcut pentru a obține valori fotografice din lumometru.

În tabelul de căutare atașat puteți vedea toate valorile care vor fi utilizate în acest contor de lumină, împreună cu valorile Lux și EV corespunzătoare.

Pasul 2: Prezentarea valorilor pe ecran | Biblioteca Adafruit GFX

Prezentarea valorilor pe ecran | Biblioteca Adafruit GFX
Prezentarea valorilor pe ecran | Biblioteca Adafruit GFX
Prezentarea valorilor pe ecran | Biblioteca Adafruit GFX
Prezentarea valorilor pe ecran | Biblioteca Adafruit GFX
Prezentarea valorilor pe ecran | Biblioteca Adafruit GFX
Prezentarea valorilor pe ecran | Biblioteca Adafruit GFX

Am încercat mai întâi să prezint valorile în pași întregi, pentru că asta îmi pot seta Bronica, dar asta mă duce la o problemă:

Să presupunem că senzorul Lux produce o valoare de exact 20480, ceea ce ar însemna că este exact EV 13, așa că aș putea, de exemplu, să-mi setez camera pe f4 și 1/500 de secundă și ar fi bine să merg

Apoi, să presupunem că senzorul Lux ar genera 20479 Lux, 1 Lux sub EV13, care ar produce o valoare EV de 12, dar este doar la un Lux distanță de EV13

Deci mi-aș seta camera pe f2.8 și 1/500 de secundă, ceea ce ar supraexpune 1 oprire fără să știu măcar cât de aproape eram de EV13.

Concluzie: avem nevoie de un fel de afișare analogică a valorilor pentru a vedea cel puțin cât de aproape sau de departe este contorul de pasul EV următor sau anterior.

După ce am încercat să folosesc literele și fonturile încorporate din biblioteca GFX, am decis să folosesc două elemente grafice personalizate care se vor deplasa pe ecranul OLED.

Una pentru valorile diafragmei, una pentru timpuri.

Biblioteca GFX folosește valori de 8 biți pentru a prezenta grafica, așa că am făcut o foaie xls (a se vedea imaginea de mai sus).

  • fiecare valoare are exact aceeași cantitate de pixeli pe valoare
  • timpii și diafragmele au exact aceeași cantitate de valori pe rând
  • Am adăugat „B” necesar la începutul fiecărui octet și „,” la sfârșit
  • Apoi l-am exportat într-un text simplu și voila: am atașat al treilea grafic

Valorile timpului încep cu 1/8 secunda, iar valorile diafragmei încep cu f2.8

Folosind tabelul de căutare al pasului anterior știm că acesta reprezintă 160 Lux sau EV6.

Cele mai întunecate valori ar fi apoi f22 și 1/500 de secundă

Din nou, prin intermediul tabelului de căutare, putem vedea că înseamnă 655360 Lux sau EV18

Până acum, bine.

Deci, pe EV6, graficul diafragmei trebuie să fie în extrema stângă, orele în extrema dreaptă și invers pe EV18

Pasul 3: Citirea și compensarea valorilor Lux | VEML7700

Citirea și compensarea valorilor Lux VEML7700
Citirea și compensarea valorilor Lux VEML7700
Citirea și compensarea valorilor Lux VEML7700
Citirea și compensarea valorilor Lux VEML7700

În timp ce defilați prin fișa tehnică a Vishay VEML7700 Adafruit utilizează pentru placa lor, am găsit o notă destul de deranjantă:

Senzorul funcționează liniar doar între 0 și 1000Lux (!)

vezi captura de ecran cu linia portocalie (liniară) și linia albastră (ieșirea reală a senzorului)

Lumina soarelui (EV15) este în jur de 80.000 Lux, ceea ce înseamnă că fără compensarea părții neliniare a senzorului ar fi complet inutil ca un contor de lumină.

Vishay știe asta, așa că au furnizat clienților lor un alt pdf numit Proiectarea VEML7700 într-o aplicație.

În acest pdf puteți găsi o formulă pentru a compensa neliniaritatea senzorilor:

LUX_CORR = 6.0135e-13 * pow (LUX, 4) -9.3924e-9 * pow (LUX, 3) + 8.1488e-5 * pow (LUX, 2) + 1.0023 * LUX

În cazul în care LUX_CORR este valoarea Lux corectată și LUX este valoarea ieșită de senzor.

Acestea sunt variabilele pe care le-am folosit, cele diferite utilizate în foaia lor.

Ceea ce mă deranjează puțin este că Adafruit nu menționează acest lucru cu un singur cuvânt pe pagina lor, documentația lor, biblioteca lor sau în altă parte.

Așadar, în primele câteva zile mă întrebam de ce lightmetrul meu produce doar 20000 Lux maxim chiar și în lumina directă a soarelui.

Dacă aruncați o privire la graficul cu linia roșie și albastră puteți vedea de ce: deoarece nu poate merge mai sus fără formula de compensare.

Dar există un alt indiciu ascuns în documentația senzorului:

Această formulă de compensare funcționează numai dacă setați senzorul la 25 ms și un raport de câștig de 1/8.

Asta se face destul de ușor cu biblioteca Adafruits adăugând:

veml.setGain (VEML7700_GAIN_1_8); veml.setIntegrationTime (VEML7700_IT_25MS);

în configurarea voidă ()

Deci, după ce îl setați la 1/8 și 25 ms și adăugați formula de compensare puteți măsura până la 120000 lux, suficient pentru a acoperi lumina soarelui la 80-100k Lux

Pasul 4: Arduino / C-code

Deoarece depinde de afișajul folosit și de controlerul preferat, nu voi intra prea mult în detalii, ci doar câteva gânduri și sugestii de adăugat, mai ales atunci când se utilizează bibliotecile Adafruit și OLED-ul de 128x32 px:

în configurația nulă:

Am setat partea de bibliotecă VEML la:

veml.setGain (VEML7700_GAIN_1_8);

veml.setIntegrationTime (VEML7700_IT_25MS);

veml.setLowThreshold (10000);

veml.setHighThreshold (20000);

veml.interruptEnable (adevărat);

în bucla de gol:

asigurați-vă că adăugați compensația:

int LUX_CORR = 6.0135e-13 * pow (LUX, 4) -9.3924e-9 * pow (LUX, 3) + 8.1488e-5 * pow (LUX, 2) + 1.0023 * LUX;

pentru a obține vehicule electrice de la Lux folosiți această linie:

plutitor EV = log2 ((LUX_CORR / 2.5));

deplasarea bitmap-urilor

pentru a vă asigura că bitmap-urile se mișcă numai atunci când valorile sunt cuprinse între 160Lux și 655360Lux așa cum sa menționat într-un pas anterior, înfășurați-o într-o astfel de clauză if:

if (LUX_CORR> 159 && LUX_CORR <655361)

În continuare, trebuie să mapăm valorile EV la coordonate, întrucât gama EV-urilor este de două cifre și vrem să le mutăm din afară peste 128 px pe întregul ecran, avem nevoie de valori mai mari.

Deoarece avem deja un număr flotant, doar înmulțim acest lucru cu 100 și folosim acel număr întreg pentru a mapa coordonatele

int EV_DSPL = EV * 100;

și:

TIMP = hartă (EV_DSPL, 600, 1900, -260, 39); APERTURE = hartă (EV_DSPL, 600, 1900, 39, -260);

După cum puteți vedea în cazul meu, poziția minimă a bitmap-ului ar fi -260px și cea maximă ar fi 39px

Ceea ce se poate vedea și aici este că am schimbat coordonatele astfel încât cele două bitmap-uri să se deplaseze în direcția opusă

Apoi, trebuie să mutăm bitmap-urile în funcție de coordonate prin:

display.drawBitmap ((TIME), (0), TIMES_bmp, 352, 16, 1); display.drawBitmap ((APERTURE), (15), APERTURES_bmp, 352, 16, 1);

Și asta este tot ce trebuie făcut

Ca bonus, afișez valori EV și Lux directe atunci când senzorul produce valori sub 160Lux, doar pentru că am vrut să văd lucruri atunci când îl testez.

Pasul 5: Puneți-l împreună

Punând laolaltă
Punând laolaltă
Punând laolaltă
Punând laolaltă

Întrucât ambele, afișajul și senzorul utilizează I2C pentru a comunica, construirea hardware-ului real este la fel de simplă pe cât posibil.

Conectați doar datele, masa de ceas și liniile de 3V cu Arduino și sunteți gata să mergeți.

Am adăugat o grafică cum am făcut-o cu o placă de bord, dar, așa cum s-a spus mai devreme, puteți folosi cabluri sau chiar să construiți o aripă, totul depinde de controler și afișaj.

În imaginea mea, punctele albe ar trebui să fie conectate la afișaj și senzor, iar punctele galbene se conectează la bibelou.

Singura excepție ar fi pinul de date al liniei I2C care se conectează la afișaj, acel pin se conectează și la pinul de date Trinkets.

Am ales să nu folosesc un comutator de pornire / oprire, ci în schimb să folosesc un buton și două butoane de 3V pentru a-l alimenta temporar atâta timp cât apăs butonul. Se aprinde sub 1/10 dintr-o secundă, astfel încât este suficient de rapid pentru ca eu să economisesc un buton și să-l fac mai mic.

Recomandat: