สารบัญ:

เครื่องวัดแสงภาพถ่าย DIY: 5 ขั้นตอน
เครื่องวัดแสงภาพถ่าย DIY: 5 ขั้นตอน

วีดีโอ: เครื่องวัดแสงภาพถ่าย DIY: 5 ขั้นตอน

วีดีโอ: เครื่องวัดแสงภาพถ่าย DIY: 5 ขั้นตอน
วีดีโอ: LDR คืออะไร? LDR ทํางานยังไง? (Light Dependent Resistor) เซนเซอร์แสง ใช่หรือไม่ 2024, กรกฎาคม
Anonim
เครื่องวัดแสงภาพถ่าย DIY
เครื่องวัดแสงภาพถ่าย DIY
เครื่องวัดแสงภาพถ่าย DIY
เครื่องวัดแสงภาพถ่าย DIY

คำแนะนำนี้แบ่งปันแนวคิดบางประการเกี่ยวกับการสร้างเครื่องวัดแสงเหตุการณ์ขนาดเล็กและราคาถูกที่เรียบง่าย

เนื่องจาก Instructables ไม่อนุญาตให้ฉันแทรกวิดีโอของตัวเอง ลองใช้ลิงก์นี้:

www.youtube.com/embed/avQD10fd52s

เป้าหมายสำหรับฉันคือเครื่องวัดแสงเพื่อใช้กับกล้องฟิล์มขนาดกลาง Broonica ETRSi ของฉัน

สิ่งที่ฉันต้องการให้มีคุณลักษณะ:

  • ASA เดียว (100) เพราะผมแทบจะใช้ฟิล์ม ASA 100 เท่านั้น
  • ให้เล็กที่สุด
  • ให้เฉพาะชุดค่าผสมที่ Bronica ของฉันสามารถทำซ้ำได้ ซึ่งหมายความว่า f2.8-f22 และ 1 วินาทีถึง 1/500 วินาที
  • ไม่มีคุณสมบัติไร้สาระยกเว้นเวลาธรรมดาและค่ารูรับแสง

สิ่งที่ฉันใช้:

  • Adafruit(Vishay) VEML 7700 digital Lux-meter (ประมาณ 5$)
  • Adafruit Trinket M0 ไมโครคอนโทรลเลอร์ (ประมาณ 9 เหรียญ)
  • จอแสดงผล OLED ขนาด 128x32 (ประมาณ 10 เหรียญ)
  • ปุ่มกดเพื่อเปิดเครื่องชั่วคราว (เซ็นต์บางส่วน)
  • แผ่นกระดานเล็กๆ เพราะฉันพยายามที่จะไม่ใช้สายเคเบิล แต่คุณสามารถใช้สายเคเบิลได้เช่นกัน

ขั้นตอนที่ 1: การคำนวณพื้นฐาน | ลักซ์ ถึง EV

การคำนวณพื้นฐาน | ลักซ์ ถึง EV
การคำนวณพื้นฐาน | ลักซ์ ถึง EV
การคำนวณพื้นฐาน | ลักซ์ ถึง EV
การคำนวณพื้นฐาน | ลักซ์ ถึง EV

เซ็นเซอร์ที่ฉันซื้อใช้คุณสมบัติสองอย่างที่ช่วยให้ฉันตัดสินใจได้:

  • ส่งออกค่า lux 16 บิตแทนค่าแสง "ไม่มีมิติ"
  • ส่งออกค่าผ่านI2C

มาตรวัดแสงสำหรับการถ่ายภาพใช้ค่าแสง (EV) เซ็นเซอร์ที่ฉันซื้อใช้ค่า Lux ซึ่งเป็นมาตราส่วนที่แตกต่างกันโดยสิ้นเชิง ดังนั้นขั้นตอนแรกคือการรับ EV จากค่า Lux ที่จัดหาให้เซ็นเซอร์

ภาพรวมอย่างรวดเร็วในวิกิพีเดียและคุณสามารถหาสูตรสำหรับการวัดเหตุการณ์และแปลง EV เป็น Lux:

E =2.5 * 2^EV

โดยที่ E ถูกวัดเป็น Lux

เนื่องจากเราได้ค่า Lux จากเซ็นเซอร์แล้วและต้องการค่า EV เราจึงต้องสร้างสูตรใหม่ ซึ่งจะทำให้เราได้:

EV = บันทึก2 (E/2.5)

นั่นคือการคำนวณครั้งแรกที่ต้องทำเพื่อให้ได้ค่าภาพถ่ายจากเครื่องวัดแสง

ในตารางค้นหาที่แนบมา คุณสามารถดูค่าทั้งหมดที่จะใช้ในเครื่องวัดแสงนี้ พร้อมกับค่า Lux และ EV

ขั้นตอนที่ 2: นำเสนอค่าบนจอแสดงผล | ห้องสมุด Adafruit GFX

นำเสนอคุณค่าบนจอแสดงผล | ห้องสมุด Adafruit GFX
นำเสนอคุณค่าบนจอแสดงผล | ห้องสมุด Adafruit GFX
นำเสนอคุณค่าบนจอแสดงผล | ห้องสมุด Adafruit GFX
นำเสนอคุณค่าบนจอแสดงผล | ห้องสมุด Adafruit GFX
นำเสนอคุณค่าบนจอแสดงผล | ห้องสมุด Adafruit GFX
นำเสนอคุณค่าบนจอแสดงผล | ห้องสมุด Adafruit GFX

ครั้งแรกที่ฉันพยายามนำเสนอค่าเป็นขั้นตอนทั้งหมด เพราะนั่นคือสิ่งที่ฉันสามารถตั้งค่า Broonica ของฉันได้ แต่นั่นทำให้ฉันมีปัญหา:

สมมติว่าเซ็นเซอร์ Lux ส่งออกค่าเท่ากับ 20,808 นั่นหมายความว่า EV 13 อย่างแน่นอน ตัวอย่างเช่นฉันสามารถตั้งค่ากล้องของฉันไว้ที่ f4 และ 1/500 วินาทีและน่าจะไปได้ดี

ต่อไป สมมติว่าเซ็นเซอร์ Lux จะส่งออก 20479 Lux, 1 Lux ภายใต้ EV13 ซึ่งจะส่งออกค่า EV ที่ 12 แต่อยู่ห่างจาก EV13 เพียง Lux

ดังนั้น ฉันจะตั้งกล้องไว้ที่ f2.8 และ 1/500 วินาที ซึ่งจะเปิดรับแสงมากเกินไป 1 สต็อป โดยที่ฉันไม่รู้ด้วยซ้ำว่าฉันอยู่ใกล้กับ EV13 แค่ไหน

สรุป: เราต้องการการแสดงค่าแบบแอนะล็อกบางประเภทอย่างน้อยเพื่อดูว่ามิเตอร์อยู่ใกล้หรือไกลแค่ไหนจากขั้นตอน EV ถัดไปหรือก่อนหน้า

หลังจากลองใช้ตัวอักษรและแบบอักษรในตัวของไลบรารี GFX แล้ว ฉันตัดสินใจใช้กราฟิกแบบกำหนดเองสองตัวที่จะเคลื่อนผ่านหน้าจอ OLED

หนึ่งสำหรับค่ารูรับแสง หนึ่งสำหรับครั้ง

ไลบรารี GFX ใช้ค่า 8 บิตเพื่อนำเสนอกราฟิก ดังนั้นฉันจึงสร้างชีต xls (ดูภาพด้านบน)

  • ทุกค่ามีจำนวนพิกเซลต่อค่าเท่ากันทุกประการ
  • เวลาและรูรับแสงมีค่าต่อแถวเท่ากันทุกประการ
  • ฉันเพิ่ม "B" ที่จำเป็นที่จุดเริ่มต้นของแต่ละไบต์และ ", " ที่ส่วนท้าย
  • จากนั้นฉันก็ส่งออกเป็นข้อความธรรมดาและ voila: ฉันได้แนบกราฟิกที่สาม

ค่าเวลาเริ่มต้นที่ 1/8 วินาที และค่ารูรับแสงเริ่มต้นที่ f2.8

การใช้ตารางค้นหาของขั้นตอนก่อนหน้านี้ทำให้เราทราบว่าค่านี้หมายถึง 160 Lux หรือ EV6

ค่าที่มืดที่สุดคือ f22 และ 1/500 ของวินาที

อีกครั้งผ่านตารางค้นหาเราจะเห็นว่าหมายถึง 655360 Lux หรือ EV18

จนถึงตอนนี้ดีมาก

ดังนั้นใน EV6 กราฟิกรูรับแสงจะต้องอยู่ทางซ้ายสุด เวลาอยู่ทางขวาสุด และในทางกลับกันใน EV18

ขั้นตอนที่ 3: การอ่านและการชดเชยค่า Lux | VEML7700

การอ่านและการชดเชยค่า Lux | VEML7700
การอ่านและการชดเชยค่า Lux | VEML7700
การอ่านและการชดเชยค่า Lux | VEML7700
การอ่านและการชดเชยค่า Lux | VEML7700

ขณะเลื่อนดูแผ่นข้อมูลของ Vishay VEML7700 Adafruit ที่ใช้สำหรับบอร์ดของพวกเขา ฉันพบประกาศที่ค่อนข้างน่ารำคาญ:

เซ็นเซอร์ทำงานเชิงเส้นระหว่าง 0 ถึง 1000Lux (!) เท่านั้น

ดูภาพหน้าจอที่มีเส้นสีส้ม (เชิงเส้น) และเส้นสีน้ำเงิน (เอาต์พุตเซ็นเซอร์จริง)

แสงแดด (EV15) อยู่ที่ประมาณ 80,000 Lux ซึ่งหมายความว่าหากไม่มีการชดเชยส่วนที่ไม่เป็นเส้นตรงของเซ็นเซอร์ มันก็จะไร้ประโยชน์โดยสิ้นเชิงในฐานะเครื่องวัดแสง

Vishay รู้ดีว่าดังนั้นพวกเขาจึงให้ไฟล์ PDF อื่นแก่ลูกค้าของพวกเขาที่เรียกว่า Designing VEML7700 Into an Application

ใน pdf นี้ คุณสามารถค้นหาสูตรเพื่อชดเชยความไม่เป็นเชิงเส้นของเซ็นเซอร์ได้:

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

โดยที่ LUX_CORR คือค่า Lux-Value ที่แก้ไขแล้ว และ LUX คือค่าที่เซ็นเซอร์ส่งออก

นี่คือตัวแปรที่ฉันใช้ ตัวแปรที่ใช้ในชีตต่างกัน

สิ่งที่ทำให้ฉันรำคาญเล็กน้อยคือ Adafruit ไม่ได้พูดถึงสิ่งนี้ด้วยคำเพียงคำเดียวในหน้า เอกสารประกอบ ห้องสมุด หรือที่อื่นๆ

สองสามวันแรกฉันสงสัยว่าทำไม lightmeter ของฉันให้เอาต์พุตสูงสุด 20000 Lux สูงสุดแม้ในแสงแดดโดยตรง

หากคุณดูที่กราฟที่มีเส้นสีแดงและสีน้ำเงิน คุณจะเห็นสาเหตุ: เพราะถ้าไม่มีสูตรการชดเชยจะสูงขึ้นไม่ได้

แต่มีคำใบ้อื่นซ่อนอยู่ในเอกสารของเซ็นเซอร์:

สูตรการชดเชยนี้ใช้ได้เฉพาะเมื่อคุณตั้งค่าเซ็นเซอร์ไว้ที่ 25ms และอัตราขยาย 1/8

ทำได้ค่อนข้างง่ายด้วยไลบรารี Adafruits โดยเพิ่ม:

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

ในการตั้งค่าโมฆะของคุณ ()

ดังนั้นหลังจากตั้งค่าเป็น 1/8 และ 25ms และเพิ่มสูตรการชดเชยแล้ว คุณสามารถวัดค่าได้สูงถึง 120000 ลักซ์ ซึ่งเพียงพอที่จะครอบคลุมแสงแดดที่ 80-100k Lux

ขั้นตอนที่ 4: Arduino / C-code

เนื่องจากขึ้นอยู่กับจอแสดงผลที่คุณใช้และตัวควบคุมที่คุณต้องการ ฉันจะไม่ลงรายละเอียดมากเกินไป มีเพียงความคิดและคำแนะนำเล็กน้อยที่ควรเพิ่ม โดยเฉพาะอย่างยิ่งเมื่อใช้ไลบรารี Adafruit และ OLED ขนาด 128x32 px:

ในการตั้งค่าโมฆะ:

ฉันตั้งค่าส่วนไลบรารี VEML เป็น:

veml.setGain(VEML7700_GAIN_1_8);

veml.setIntegrationTime(VEML7700_IT_25MS);

veml.setLowThreshold(10000);

veml.setHighThreshold(20,000);

veml.interruptEnable(จริง);

ในวงโมฆะ:

อย่าลืมเพิ่มค่าตอบแทน:

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

ในการรับ EVs จาก Lux ให้ใช้บรรทัดนี้:

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

การย้ายบิตแมป

เพื่อให้แน่ใจว่าบิตแมปจะย้ายเฉพาะเมื่อค่าอยู่ระหว่าง 160Lux และ 655360Lux ตามที่ระบุไว้ในขั้นตอนก่อนหน้า ให้รวมไว้ใน if clause เช่นนั้น:

ถ้า (LUX_CORR > 159 && LUX_CORR <655361)

ต่อไป เราต้องแมปค่า EV กับพิกัด เนื่องจากช่วงของ EV เป็นตัวเลขสองหลัก และเราต้องการย้ายค่าเหล่านี้ออกจากจอแสดงผลมากกว่า 128px ทั่วทั้งจอแสดงผล เราจึงต้องการค่าที่มากขึ้น

เนื่องจากเราได้จำนวนทศนิยมแล้ว เราก็แค่คูณมันด้วย 100 แล้วใช้จำนวนเต็มนั้นทำแผนที่พิกัด

int EV_DSPL = EV*100;

และ:

เวลา = แผนที่ (EV_DSPL, 600, 1900, -260, 39); APERTURE = แผนที่ (EV_DSPL, 600, 1900, 39, -260);

อย่างที่คุณเห็นในกรณีของฉัน ตำแหน่งต่ำสุดของบิตแมปจะเป็น -260px และสูงสุดจะเป็น39px

สิ่งที่สามารถเห็นได้ตรงนี้ก็คือ ฉันเปลี่ยนพิกัดเพื่อให้บิตแมปทั้งสองเคลื่อนที่ไปในทิศทางตรงกันข้าม

ต่อไปเราต้องย้ายบิตแมปตามพิกัดโดย:

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

และนั่นคือทั้งหมดที่ต้องทำ

เป็นโบนัสที่ฉันแสดงค่า EV และ Lux แบบตรงเมื่อเซ็นเซอร์ส่งออกค่าที่ต่ำกว่า 160Lux เพียงเพราะฉันต้องการเห็นสิ่งต่าง ๆ เมื่อทำการทดสอบ

ขั้นตอนที่ 5: นำมันมารวมกัน

เอามารวมกัน
เอามารวมกัน
เอามารวมกัน
เอามารวมกัน

เนื่องจากทั้งจอแสดงผลและเซ็นเซอร์ใช้ I2C ในการสื่อสาร การสร้างฮาร์ดแวร์จริงจึงเป็นเรื่องง่ายอย่างที่ควรจะเป็น

เพียงเชื่อมต่อ Data, Clock ground และสาย 3V กับ Arduino คุณก็พร้อมแล้ว

ฉันได้เพิ่มกราฟิกว่าฉันทำกับแผ่น Stripboard ได้อย่างไร แต่อย่างที่กล่าวไว้ก่อนหน้านี้ว่าคุณสามารถใช้สายเคเบิลหรือแม้แต่สร้างปีกสำหรับมันได้ ทั้งหมดนี้ขึ้นอยู่กับตัวควบคุมและจอแสดงผลที่คุณใช้

บนกราฟิกของฉัน จุดสีขาวควรจะเชื่อมต่อกับจอแสดงผลและเซ็นเซอร์ และจุดสีเหลืองเชื่อมต่อกับเครื่องประดับเล็ก

ข้อยกเว้นเพียงอย่างเดียวคือพินข้อมูลของสาย I2C ที่เชื่อมต่อกับจอแสดงผล พินนั้นยังเชื่อมต่อกับพินข้อมูลของเครื่องประดับ

ฉันเลือกที่จะไม่ใช้สวิตช์เปิด/ปิด แต่ใช้ปุ่มกดและเซลล์ปุ่ม 3V สองเซลล์แทนเพื่อเปิดเครื่องชั่วคราวตราบเท่าที่ฉันกดปุ่ม มันเพิ่มพลังภายในเวลาไม่ถึง 1/10 วินาที ดังนั้นมันจึงเร็วพอสำหรับฉันที่จะสำรองปุ่มและทำให้เล็กลง

แนะนำ: