이 Project는 대학교 3학년 때, 수강하였던 "임베디드 시스템"이라는 교과목으로 강의 수강 중 제출해야 되는 과제였다.
주제는 따로 정해진 것이 없었으며, Interrupt를 활용하여 임베드디 시스템을 제작하는 것이였다.
따라서 평소 좋아하던 필름 카메라를 이용한 주제를 고안했으며, 그 결과 "필름 카메라 전용 Light Meter 및 손 떨림 방지 장치"을 구현하기로 하였다!!
평소, 색다른 색감과 촬영에 재미를 느낄 수 있는 필름 카메라를 자주 사용한다. 하지만 필름 카메라는 스마트 폰 카메라와 달리 Lux, 노출값(EV) 등 촬영 당시의 정보들을 측정할 수 없다는 단점이 있다.
"조리개값"이나 "노출 설정" 등의 사진의 질을 향상시킬 수 있는 중요한 요소인데, 이러한 정보를 볼 수 없다는 점이 큰 단점으로 느껴졌다.
또한 최근 출시되는 카메라와 달리, 손 떨림 방지 기능이 없어 촬영 당시에 이를 신경 쓰지 않으면 흐릿한 결과물을 볼 수 있게 된다. 이 또한 필름을 현상한 후, 큰 아쉬움이 느껴져 손 떨림을 잡아줄 수 있는 기능도 함께 구현하기로 하였다.
최종적으로 위 두 문제를 해결할 수 있는 장치를 만드는 것을 프로젝트 주제로 선정하게 되었다.
프로젝트 주요 주제 및 구현 기능
기존 필름 카메라 시장에서 유사한 장비들은 존재하지만, 촬영일자를 기록해주거나 노출값을 바탕으로 조리개 값이나 셔터 스피드 값을 알려주는 장치들만 있으며 이러한 장비들도 모든 카메라에 적용할 수 없다는 단점이 있다.
따라서 현재 가지고 있는 카메라에 적합한 "Light Meter"와 "손 떨림 방지 장치"의 필요성을 느꼈다.
프로젝트의 주요 목표인 Light Meter와 손 떨림 방지 장치를 만들기 위해서는 필름 카메라의 촬영 원리를 어느 정도 알고 있어야 구현이 가능하며, 아래는 사진에서 필요한 3요소이다.
위 사진에서 알 수 있듯이 조리개, ISO, 셔터스피드, 이 3개의 값만 있으면 사진을 찍을 수 있다.
타겟이 되는 카메라는 "Yashica Electro 35CC"라는 카메라로 A.V.(조래개)식 카메라이다.
이 카메라는 조리개 값과 ISO를 사용자가 직접 설정하여 사용하는 카메라로, 카메라 내부의 회로에서 셔터스피드를 결정하여 촬영을 하게 된다.
이미 조리개와 ISO, 이 두 가지 값을 알고 있기에 아래의 수식들을 통해 셔터스피드를 구할 수 있다.
첫 번째 수식은 조리개 값과 셔터스피드 값의 합은 노출 값인 것이고, 두 번째 수식은 빛의 양인 Lux 값을 이용하여 노출 값을 구하는 수식이다.
연산에 필요한 값 : 조리개, 필름 ISO(ASA), EV(LUX), Shutter Speed(EV = 조리개 값 + 셔터 스티드 값)
두 수식을 이용하여 셔터스피드를 구할 수 있는데, 이 값을 이용하면 사진을 찍을 당시 어느 정도의 떨림에 대한 민감도를 가져야 하는지를 알 수 있어 결과물에 큰 영향을 미칠 수 있다.
Raspberry Pi 4B를 사용함에 있어, 프로젝트에서 I2C 모듈이 많이 사용되어 특정 라이브러리 없이 제어하기는 상당히 버거웠으며 이를 해결하기 시도하였지만 실패하였다.
따라서 Raspberry Pi 4B가 아닌 "ESP32-WROOM-32E"라는 32bit, 3.3V의 프로세서를 사용하여, 기존에 사용하던 센서를 동일하게 가져와 사용하였다.
위 회로에서 "ADS1115"는 Raspberry Pi 4B 내에 ADC 기능이 없기에 사용하였으며, 아래의 ESP32는 ADC를 내장하고 있기에 사용하지 않았다.
Shutter Button을 누르면 Laser Module을 통해 촬영할 피사체를 지시하게 되어, 초점을 잡는데 더욱 편리하다.
가변저항으로 조리개 값, ISO 값을 입력할 수 있도록 하였고, Lux 값을 받아올 BH1750(Light Meter Sensor)을 통하여 연산을 거쳐 셔터 스피드에 대한 값을 I2C LCD에 출력시킨다.
프레임의 손잡이에 정전식 Touch Sensor를 내장하여 사용자가 손잡이를 잡았을 때 손 떨림 방지 기능을 구현하며, 평소에는 작동하지 않도록 만들어 배터리를 절약할 수 있도록 설계하였다.
사용자가 Touch Sensor를 활성화 시키면 Tilt Sensor에서 입력값을 활용하여 설정한 감도와 비교한 후, 뒤틀림이 크면 손잡이에 내장된 Tilt State LED를 작동시켜 사용자에게 손 떨림을 인지시켜 사진이 덜 흔들리도록 유도한다.
Project에 사용된 "Yashica Electro 35 CC" 필름 카메라는 하단부에 삼각대와 연결하기 위한 나사선이 있으며, 1/4 볼트와 결합되는 크기이다.
1/4 크기의 볼트를 사용하여 프레임과 필름카메라를 결합하도록 구상하였으며, 프레임은 3D 프린터를 사용을 고려하여 설계하였다.
프레임 중앙에 구멍을 볼 수 있는데, 이를 통해 카메라 바디와 프레임을 결합할 목적으로 설계되었다.
또한 Project 산출물을 야외에서 사용한다는 가정 하에, 안정적인 전원을 공급할 수 있도록 TP4056이라는 배터리 충전 모듈을 사용하기로 구상하였으며 배터리는 3000mAh를 사용하였다.
Raspberry Pi 4B의 정격 전류는 1250mAh로 3000mAh 배터리를 사용하였을 때 단순 연산으로 2시간 20분 정도 사용할 수 있다는 것을 알 수 있다.
ESP32의 정격 전류는 최대 500mAh로 Raspberry Pi 4 B보다 훨신 더 많은 시간동안 사용할 수 있을 것이다.
배터리를 사용하여 전원부를 설계한 것을 보아 운용 시간이 제한되는 것을 알 수 있다.
각종 Sensor 값을 Polling 방식으로 처리하여 프로세서를 낭비하는 것이 아닌, Interrupt를 통한 입력값 처리를 통해 프로세서의 전력소비를 최소화하는 것이다.
따라서 ESP32가 더욱 효율적으로 프로세서를 사용하여 전력소비를 최소화하는 것을 목표로 S/W를 구성하는 것이 목표이다.
만약 가능하다면 이 또한 전력소모의 최소화를 위해 저전력으로 구현할 수 있는 방안을 시도해 볼 것이다.
Project의 Frame은 3D Printer를 사용하여 구성했고, 내부의 물리적인 BUS 회로를 만들어 메인 프로세서와 회로를 구성하였다.
ESP32-WROOM-32E는 Arduino와 동일한 IDE에서 프로그래밍이 가능하여 Arduino IDE에서 개발환경을 구축하여 프로젝트를 진행하였다. I2C 통신을 기반으로 하는 센서들은 모두 라이브러리를 통해 제어하였다.
제작한 코드를 전부 다 올리기에는 코드의 길이가 너무 길어, 핵심 기능만 정리하였다.
- Laser Module, Tilt Sensor Setting
if (digitalRead(Shutter_Button) == LOW)
digitalWrite(Laser_Module, HIGH);
else
digitalWrite(Laser_Module, LOW);
if (digitalRead(Touch_Sensor) == HIGH) {
if (digitalRead(Tilt_Sensor) == HIGH)
digitalWrite(Tilt_State_Led, HIGH);
else
digitalWrite(Tilt_State_Led, LOW);
} else
digitalWrite(Tilt_State_Led, LOW);
- Lux, EV, Shutter Speed Calculation
int ISO_Data = map(analogRead(ISO_Selector), 0, 4095, 0, 5);
ISO_Value(ISO_Data); //ISO_Data -> ISO_Value() -> ISO
int Aperature_Data = map(analogRead(Aperature_Selector), 0, 4095, 0, 6);
Aperature_Value(Aperature_Data); //Aperature_Data -> Aperature_Value() -> Aperature
Lux = lightMeter.readLightLevel();
EV = log10(Lux * ISO / Calibration_Value) / log10(2);
Shutter_Speed = (pow(2, EV) / pow(Aperature, 2));
- Aperature, ISO Value Selector Function
void Aperature_Value(int value1) {
/****** Aperature Select Function ******/
if (value1 == 0)
Aperature = 1.8;
else if (value1 == 1)
Aperature = 2.8;
else if (value1 == 2)
Aperature = 4;
else if (value1 == 3)
Aperature = 5.6;
else if (value1 == 4)
Aperature = 8;
else if (value1 == 5)
Aperature = 11;
else if (value1 == 6)
Aperature = 16;
}
void ISO_Value(int value1) {
/****** ISO Select Function ******/
if (value1 == 0)
ISO = 25;
else if (value1 == 1)
ISO = 50;
else if (value1 == 2)
ISO = 100;
else if (value1 == 3)
ISO = 200;
else if (value1 == 4)
ISO = 400;
else if (value1 == 5)
ISO = 500;
}
완성된 "필름 카메라 전용 Light Meter 및 손 떨림 방지 장치"을 통해 셔터스피트의 결과값과 손 떨림 방지 기능을 확인해보는 실험을 하였다.
위 실험에서 ISO(ASA)가 200이며 조리개 값이 5.6으로 고정된 상태에서 주변 환경만 변화를 주어, 카메라가 측정하는 조도량에 영향을 주었다. 주변 환경이 밝아짐에 따라, 1/7s에서 1/1.08으로 Shutter Speed가 영향을 받은 것을 볼 수 있다.
실험 결과는 아래의 Shutter Speed - Aperature와 EV 관계와 비슷한 변화 형태를 확인할 수 있다.
사진 출처 : Exposure Value Explained – Plus EV Charts(Shutter Speed와 Aperature 변화에 따른 EV 변화)
ISO : 200, 동일 환경(EV)
좌 - F : 1.8, S : 1/10 우 - F : 16.0, S : 7.8
동일 환경(EV)
좌 - ISO : 200, F : 11.0, S : 1.5 우 - ISO : 25, F : 5.6, S : 7.5
위 사진처럼 조리개의 수치가 낮아지면 필름에 많은 빛이 들어올 수 있어 Shutter Speed가 작아진다는 것을 볼 수 있으며, 조리개 수치가 높아지면 빛이 적게 들어와 오랜 시간 셔터를 열고 있어야 하기에 Shutter Speed가 높아진다.
실험 결과도 위 사진과 비슷한 변화를 보여주고 있기에 Light Meter에 관한 기능은 정상적으로 잘 작동한다는 것을 알 수 있었다.
Light Meter 뿐만 아니라, 아래의 그림들을 통해 손 떨림 방지 기능도 잘 작동한다는 것을 실험을 통해 알 수 있었다.
Aperature, ISO Selector 동작
주변 환경 변화에 따른 Shutter Speed 변화
Touch Sensor가 활성화 될 때만 동작하는 손 떨림 방지 LED 동작
Frame 측면에 위치한 정전식 Touch Sensor가 손바닥(손가락)을 인식할 때만 동작하도록 설계하였다.
전반적으로 모든 기능들이 정상적으로 동작하는 것을 볼 수 있다!!
평소 관심사였던 카메라를 프로젝트의 주제를 선정하는 것이 상당히 큰 재미로 다가왔으며, 이번 프로젝트를 통해 다양한 센서를 제어해보고 임베디드의 이론적인 부분도 함께 얻어갈 수 있는 시간이 되었다.
하지만 기존의 목표로 하였던 Raspberry Pi 4를 메인 프로세서로 사용하지 못하여서 다른 프로세서로 프로젝트를 구현한 것이 크게 아쉬움이 남는다. 🙈