Turinys:

„Pasidaryk pats“fotografijos šviesos matuoklis: 5 žingsniai
„Pasidaryk pats“fotografijos šviesos matuoklis: 5 žingsniai

Video: „Pasidaryk pats“fotografijos šviesos matuoklis: 5 žingsniai

Video: „Pasidaryk pats“fotografijos šviesos matuoklis: 5 žingsniai
Video: Arduino pamoka Nr. 3: RGB šviesos diodas 2024, Lapkritis
Anonim
„Pasidaryk pats“fotografinis šviesos matuoklis
„Pasidaryk pats“fotografinis šviesos matuoklis
„Pasidaryk pats“fotografinis šviesos matuoklis
„Pasidaryk pats“fotografinis šviesos matuoklis

Ši instrukcija dalijasi idėjomis, kaip sukurti paprastą mažą ir pigų kritimo šviesos matuoklį.

Kadangi „Instructables“neleidžia įterpti savo vaizdo įrašų, pabandykite šią nuorodą:

www.youtube.com/embed/avQD10fd52s

Mano tikslas buvo šviesos matuoklis, lydintis mano Bronica ETRSi vidutinio formato filmavimo kamerą.

Dalykai, kuriuos norėjau parodyti:

  • vieną ASA (100), nes beveik naudoju tik ASA 100 plėvelę
  • kuo mažesnis
  • duok man tik kombinacijas, kurias mano Bronica gali atkurti, o tai reiškia f2.8-f22 ir 1 sek. iki 1/500 sek.
  • jokių nesąmonių, išskyrus paprastą laiką ir diafragmos vertes

Dalykai, kuriuos naudojau:

  • „Adafruit“(„Vishay“) „VEML 7700“skaitmeninis liukso matuoklis (apie 5 USD)
  • „Adafruit Trinket M0“mikrovaldiklis (apie 9 USD)
  • 128x32 OLED ekranas (apie 10 USD)
  • mygtukas laikinai jį įjungti (keli centai)
  • mažas juostelės plokštės gabalas, nes stengiuosi nenaudoti kabelių, bet jūs taip pat galite naudoti kabelius

1 žingsnis: pagrindiniai skaičiavimai | Nuo liukso iki EV

Pagrindiniai skaičiavimai | Nuo liukso iki EV
Pagrindiniai skaičiavimai | Nuo liukso iki EV
Pagrindiniai skaičiavimai | Nuo liukso iki EV
Pagrindiniai skaičiavimai | Nuo liukso iki EV

Pirktame jutiklyje naudojamos dvi funkcijos, leidžiančios man nuspręsti:

  • išleidžia 16 bitų liukso reikšmes, o ne „be matmenų“šviesos reikšmes
  • išleidžia reikšmes per I2C

Fotografinis šviesos matuoklis naudoja ekspozicijos vertes (EV), mano įsigytas jutiklis naudoja liukso vertes, o tai yra visiškai skirtinga skalė. Taigi pirmas žingsnis yra gauti EV iš „Lux“verčių, jei yra jutiklis.

Greitas žvilgsnis į Vikipediją ir rasite incidentų matavimo formulę ir konvertuokite EV į liuksą:

E = 2,5 * 2^EV

kur E matuojamas liuksais.

Kadangi iš jutiklio jau gavome „Lux“vertę ir norime EV vertės, turime iš naujo suformuoti formulę, kuri leidžia mums:

EV = log2 (E/2,5)

Taigi tai yra pirmas skaičiavimas, kurį reikia atlikti norint išgauti fotografines vertes iš šviesos matuoklio.

Pridedamoje peržiūros lentelėje galite pamatyti visas reikšmes, kurios bus naudojamos šiame šviesos matuoklyje, kartu su atitinkamomis „Lux“ir „EV“reikšmėmis.

2 veiksmas: verčių pateikimas ekrane | „Adafruit GFX“biblioteka

Vertybių pateikimas ekrane | „Adafruit GFX“biblioteka
Vertybių pateikimas ekrane | „Adafruit GFX“biblioteka
Vertybių pateikimas ekrane | „Adafruit GFX“biblioteka
Vertybių pateikimas ekrane | „Adafruit GFX“biblioteka
Vertybių pateikimas ekrane | „Adafruit GFX“biblioteka
Vertybių pateikimas ekrane | „Adafruit GFX“biblioteka

Pirmiausia bandžiau visas vertes pateikti vertybėmis, nes būtent tai galiu nustatyti savo „Bronica“, tačiau tai mane veda prie problemos:

Tarkime, kad „Lux“jutiklis išleidžia tiksliai 20480 reikšmę, o tai reikštų, kad jis yra tiksliai EV 13, todėl galėčiau, pavyzdžiui, nustatyti fotoaparatą į f4 ir 1/500 sekundės ir būtų gerai eiti

Toliau tarkime, kad „Lux“jutiklis išvestų 20479 liuksus, 1 liuksą pagal EV13, o tai reikštų 12 EV vertę, tačiau jis yra tik liukso atstumu nuo EV13

Taigi aš nustatyčiau savo fotoaparatą f2.8 ir 1/500 sekundės, o tai per daug ekspozicijos, 1 man sustojus, net man nežinant, kaip arti buvau EV13.

Išvada: mums reikia tam tikro analoginio verčių rodymo, kad bent pamatytume, kaip arti ar toli skaitiklis yra nuo kito ar ankstesnio EV žingsnio.

Pabandęs naudoti integruotas GFX bibliotekos raides ir šriftą, nusprendžiau naudoti dvi pasirinktines grafikas, kurios judės per OLED ekraną.

Vienas - diafragmos reikšmėms, kitas - laikui.

GFX biblioteka naudoja 8 bitų reikšmes grafikai pateikti, todėl sukūriau xls lapą (žr. Paveikslėlį aukščiau).

  • kiekviena vertė turi tą patį taškų kiekį vienoje vertėje
  • laikai ir diafragmos turi lygiai tokį patį reikšmių skaičių eilutėje
  • Kiekvieno baito pradžioje pridėjau būtiną „B“, o pabaigoje - „“
  • Tada eksportavau jį į paprastą tekstą ir voila: pridėjau trečią grafiką

Laiko vertės prasideda 1/8 sekundės, o diafragmos reikšmės prasideda f2.8

Naudodami ankstesnio veiksmo peržiūros lentelę žinome, kad tai reiškia 160 liuksų arba EV6.

Tamsiausios vertės būtų f22 ir 1/500 sekundės

Vėlgi per paieškos lentelę matome, kad tai reiškia 655360 Lux arba EV18

Kol kas viskas gerai.

Taigi EV6 diafragmos grafika turi būti kairėje, laikas - dešinėje ir atvirkščiai - EV18

3 žingsnis: „Lux“vertybių skaitymas ir kompensavimas | VEML7700

„Lux“vertybių skaitymas ir kompensavimas | VEML7700
„Lux“vertybių skaitymas ir kompensavimas | VEML7700
„Lux“vertybių skaitymas ir kompensavimas | VEML7700
„Lux“vertybių skaitymas ir kompensavimas | VEML7700

Slinkdamas „Vishay VEML7700 Adafruit“lentelėje naudojamų duomenų lapą, radau gana nerimą keliantį pranešimą:

Jutiklis veikia tik tiesiškai nuo 0 iki 1000Lux (!)

žiūrėkite ekrano kopiją su oranžine (linijine) linija ir mėlyna (faktinė jutiklio išvesties) linija

Saulės šviesa (EV15) yra apie 80 000 liuksų, o tai reiškia, kad kompensuojant nelinijinę jutiklio dalį ji būtų visiškai nenaudinga kaip šviesos matuoklis.

„Vishay“tai žino, todėl jie savo klientams pateikė kitą pdf, pavadintą „VEML7700 projektavimas programoje“.

Šiame pdf galite rasti formulę, kaip kompensuoti jutiklių netiesiškumą:

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

Kur LUX_CORR yra pataisyta „Lux“vertė, o „LUX“yra jutiklio išvesties vertė.

Tai yra kintamieji, kuriuos naudoju, skirtingi jų lape.

Mane šiek tiek trikdo tai, kad „Adafruit“to nepamena vienu žodžiu savo puslapyje, dokumentuose, bibliotekoje ar kitur.

Taigi pirmomis dienomis man buvo įdomu, kodėl mano šviesos matuoklis, net esant tiesioginiams saulės spinduliams, išleidžia tik maksimalų 20000 liuksų.

Jei pažvelgsite į grafiką su raudona ir mėlyna linija, pamatysite, kodėl: nes jis negali pakilti aukščiau be kompensavimo formulės.

Tačiau jutiklio dokumentuose yra dar viena užuomina:

Ši kompensavimo formulė veikia tik tada, jei jutiklį nustatote į 25 ms, o padidinimo koeficientą - 1/8.

Tai gana lengva padaryti naudojant „Adafruits“biblioteką, pridėjus:

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

tuštumos sąrankoje ()

Taigi nustačius 1/8 ir 25 ms ir pridėjus kompensavimo formulę, galite išmatuoti iki 120000 liuksų, pakankamai, kad padengtų saulės šviesą esant 80-100k liuksui

4 žingsnis: „Arduino“/ C kodas

Kadangi tai priklauso nuo jūsų naudojamo ekrano ir pageidaujamo valdiklio, aš per daug nesileisiu į detales, pridėsiu tik keletą minčių ir patarimų, ypač kai naudojate „Adafruit“bibliotekas ir 128 x 32 pikselių OLED:

tuštumos sąrankoje:

Aš nustatiau VEML bibliotekos dalį:

veml.setGain (VEML7700_GAIN_1_8);

veml.setIntegrationTime (VEML7700_IT_25MS);

veml.setLowThreshold (10000);

veml.setHighThreshold (20000);

veml.interruptEnable (tiesa);

tuštumos kilpoje:

būtinai pridėkite kompensaciją:

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

Norėdami gauti EV iš „Lux“, naudokite šią eilutę:

plūdė EV = log2 ((LUX_CORR/2.5));

perkeliant bitų žemėlapius

norėdami įsitikinti, kad bitų žemėlapiai juda tik tada, kai vertės yra tarp 160Lux ir 655360Lux, kaip nurodyta ankstesniame žingsnyje, apvyniokite jį tokia sąlyga, jei:

jei (LUX_CORR> 159 && LUX_CORR <655361)

Toliau turime susieti EV reikšmes su koordinatėmis, nes EV diapazonas yra dviženklis ir mes norime perkelti juos iš ekrano daugiau nei 128 pikselių per visą ekraną, mums reikia didesnių verčių.

Kadangi jau gavome plūdės skaičių, mes tiesiog padauginame jį iš 100 ir naudojame tą sveikąjį skaičių koordinačių atvaizdavimui

int EV_DSPL = EV*100;

ir:

LAIKAS = žemėlapis (EV_DSPL, 600, 1900, -260, 39); APERTURE = žemėlapis (EV_DSPL, 600, 1900, 39, -260);

Kaip matote mano atveju, mažiausia bitų žemėlapio padėtis būtų -260 pikselių, o didžiausia -39 taškų

Čia taip pat galima pamatyti tai, kad aš pakeičiau koordinates taip, kad abi bitų schemos judėtų priešinga kryptimi

Toliau turime perkelti bitų žemėlapius pagal koordinates:

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

Ir tai viskas, ką reikia padaryti

Kaip premiją aš rodau tiesiogines EV ir liukso reikšmes, kai jutiklis pateikia reikšmes, mažesnes nei 160Lux, tik todėl, kad norėjau pamatyti dalykus, kai jį bandau.

5 žingsnis: sujungimas

Sujungimas
Sujungimas
Sujungimas
Sujungimas

Kadangi tiek ekranas, tiek jutiklis naudoja I2C bendravimui, tikrosios aparatūros kūrimas yra toks paprastas, koks tik gali būti.

Tiesiog prijunkite duomenis, laikrodį ir 3 V linijas prie „Arduino“ir būsite pasiruošę eiti.

Pridėjau grafiką, kaip tai padariau su striptizo plokšte, tačiau, kaip minėta anksčiau, galite naudoti kabelius ar net pastatyti sparną, viskas priklauso nuo to, kurį valdiklį ir ekraną naudojate.

Mano grafikoje balti taškai turėtų būti prijungti prie ekrano ir jutiklio, o geltoni taškai - prie „Trinket“.

Vienintelė išimtis būtų I2C linijos duomenų kaištis, jungiantis prie ekrano, tas kaištis taip pat jungiasi prie „Trinkets“duomenų kaiščio.

Aš nusprendžiau nenaudoti įjungimo/išjungimo jungiklio, bet naudoju mygtuką ir du 3V mygtuko elementus, kad laikinai įjungčiau, kol paspausiu mygtuką. Jis įsijungia per mažiau nei 1/10 sekundės, todėl man tai pakankamai greitai, kad nepagailėčiau mygtuko ir jį sumažinčiau.

Rekomenduojamas: