Інтервалометр з LCD для Sony NEX

  • Час 21-08-2015, 14:06
  • Автор admin
  • Коментарів 0 Комент.
  • Силка url

Інтервалометр - пристрій, призначений для зйомки тривалих процесів, так зване TimeLapse-фото. Як правило, інтервалометр являє собою окрему коробочку, на якій виставляється пауза між знімками і який через ІК дає команду фотокамери на спуск затвора. При цьому, в самому фотоапараті повинен бути включений режим управління від пульта ДУ.

За допомогою интервалометра, ви приміром можете зняти розпуск квітки, а потім змонтувати отримані кадри у відеоролик. Застосувань у фотомистецтві интервалометру можна знайти безліч.

У даній статті мова піде про виготовлення интервалометра з LCD-екранчиком на базі плати Arduino. Період між знімками в секундах задається в меню. Тестувалося на фотоапараті Sony NEX 5N, але я думаю він повинен підійти для будь-яких беззеркалок NEX і дзеркалок Sony Alpha, т. к. пульти ІК у них сумісні.

Необхідні комплектуючі:
Arduino Nano (або будь-яка сумісна Arduino-плата)
Serial LCD (можна використовувати і звичайний LCD)
Модуль джойстика (Joystick Module)
ІНФРАЧЕРВОНИЙ світлодіод і резистор ~200 Ом
Вимикач живлення
Корпус
Батарейка крона 9В

Перші 3 компонента і корпус я купував на eBay.

Принципова схема интервалометра:

Інтервалометр з LCD для Sony NEX

Serial LCD має 4 висновки: GND, VCC, SDA, SCL. Лінія SDA (data) підключається до Analog In 4, а SCL (clock) до Analog In 5. Vcc підключається до 5V Arduino, а до GND GND Arduino.

Для підключення джойстика необхідно 5 проводів: вісь X (Analog IN 0), Y (Analog IN 1), Z кнопка (до Digital IN 2), харчування Vcc і загальний GND.

Схема підключення всіх компонентів виглядає наступним чином:

Інтервалометр з LCD для Sony NEX

Живиться схема від батареї 9В. Плюсової висновок батарейки підключається до входу Vin контролера Arduino. Плата Arduino містить вбудований перетворювач напруги 5В, які необхідні нам для живлення LCD.

Анод ІК світлодіоди підключається через токоограничительный резистор під'єднаний до 10 висновку Arduino. Катод до GND. Резистор і висновки світлодіода я помістив в термоусадочну трубку. Сам провід живлення ІК світлодіоди помістив в гнучку білу довгу трубку.

Інтервалометр з LCD для Sony NEX

Після того, як була зібрана схема на макетної платі, я помітив, що LCD дисплей нормально ініціалізується тільки після натискання кнопки Reset на Arduino, ніякі програмні хитрощі не допомагали. Мабуть це недоробка Serial LCD бібліотеки. Можливо, що в іншому LCD з цим буде все нормально. Але мені довелося вивести зовнішню кнопку Reset.

Інтервалометр з LCD для Sony NEX

Для интервалометра потрібен нормальний корпус. Це було самої складної і довгої частиною проекту. На початку, я вирізав всі необхідні отвори під LCD, джойстик, кнопку і провід ІЧ-світлодіоди:

Інтервалометр з LCD для Sony NEX

Потім зробив кріплення під джойстик, LCD, батарейку і плату Arduino. Використовував звичайний рекламний пластик і суперклей.

Інтервалометр з LCD для Sony NEX

Для притиску батарейки, щоб вона не гуляла, використовував шматок непотрібного матеріалу для шумоізоляції авто (Акцент 10).

Інтервалометр з LCD для Sony NEX

Всі в зборі:

Інтервалометр з LCD для Sony NEX

Підсумок роботи:

Інтервалометр з LCD для Sony NEX

Програма

Програма відображає меню і відпрацьовує взаємодія з ним. Також, ЗА передбачена функція вимкнення підсвічування дисплея, для економії батарейки. При натисканні на будь-яку кнопку підсвічування знову включається. Вихідний код представлений нижче, я постарався максимально детально його прокоментувати.

#include "Wire.h" #include "LiquidCrystal_I2C.h" #define axis_X 0 // вісь Х підключена до Analog 0 #define axis_Y 1 // вісь Y підключена до Analog 1 #define axis_Z 2 // вісь Z (кнопка джойстика) підключена до Digital 2 #define pinIRLED 10 // пін ІЧ-світлодіоди #define LEDgreen 13 // вбудований LED onboard #define autoOFF 10 // к-ть секунд через яке вимикається підсвічування дисплея при бездіяльності LiquidCrystal_I2C lcd(0x27,16,2); // установка I2C адреси LCD в 0x27, а також вказуємо що 16 символів, 2 рядки int value_X, value_Y, value_Z = 0; // змінні для зберігання значень осей int pos = 0; // поточна позиція (0 - установка delay, 1 - робота) int interval = 1; // пауза між знімками (в секундах) int cntPict = 0; // кількість відправлених пакетів, в режимі робота boolean working = false; unsigned long currentTime; unsigned long TimeShot, TimeLCDOff; void setup() { pinMode(axis_Z, INPUT); // кнопка джойстика pinMode(pinIRLED, OUTPUT); // ІНФРАЧЕРВОНИЙ світлодіод lcd.init(); // ініціалізація LCD lcd.backlight(); // включаємо підсвічування LCD lcd.clear(); // очищення LCD show_menu(); // функція відображення меню currentTime = millis(); // зчитуємо час, що минув з моменту запуску програми TimeShot = currentTime; // таймер знімка TimeLCDOff = currentTime; // таймер для підсвічування //Serial.begin(115200); } void loop() { value_X = analogRead(axis_X); // зчитуємо аналогове значення осі Х value_Y = analogRead(axis_Y); // зчитуємо аналогове значення Y value_Z = digitalRead(axis_Z); // зчитуємо цифрове значення осі Z (кнопка) value_Z = value_Z ^ 1; // інвертуємо значення if(working == false){ if(value_Y gt; 540){ // джойстик вгору pos = 0; lcd.backlight(); // включаємо підсвічування TimeLCDOff = currentTime; // у TimeLCDOff записуємо нове значення show_menu(); } else if(value_Y lt; 500){ // джойстик вниз pos = 1; lcd.backlight(); // включаємо підсвічування TimeLCDOff = currentTime; // у TimeLCDOff записуємо нове значення show_menu(); } if(value_X gt; 530){ // джойстик вліво lcd.backlight(); // включаємо підсвічування TimeLCDOff = currentTime; // у TimeLCDOff записуємо нове значення if(pos == 0){ --interval; if(value_X gt; 900) interval = interval-10; // джойстик сильно вліво if(interval lt; 1) interval = 1; } show_menu(); } else if(value_X lt; 490){ // джойстик вправо lcd.backlight(); // включаємо підсвічування TimeLCDOff = currentTime; // у TimeLCDOff записуємо нове значення if(pos == 0) { ++interval; if(value_X lt; 100) interval = interval+10; // джойстик сильно вправо } show_menu(); } } if(value_Z == 1){ // якщо натиснули кнопку джойстика lcd.backlight(); // включаємо підсвічування TimeLCDOff = currentTime; // у TimeLCDOff записуємо нове значення if(working == true){ working = false; // перериваємо режим "робота" pos = 0; show_menu(); // якщо були в робочому режимі, то перериваємо } if(pos == 1) show_working(); // включаємо режим роботи } delay(200); currentTime = millis(); // зчитуємо час, що минув з моменту запуску програми if(working == true){ if(currentTime gt;= (TimeShot + (interval*1000))){ // порівнюємо поточний таймер зі змінною loopTime + delay digitalWrite(LEDgreen, HIGH); // моргнемо вбудованим LED delay(100); digitalWrite(LEDgreen, LOW); takePicture(); // посилаємо ІК пакет TimeShot = currentTime; // у loopTime записуємо нове значення ++cntPict; // збільшуємо лічильник знімків show_working(); // оновлюємо LCD } } if(currentTime gt;= (TimeLCDOff + (autoOFF*1000))){ // порівнюємо поточний таймер з константою TimeLCDOff + delay lcd.noBacklight(); // вимикаємо підсвічування } } void show_menu() { cntPict = 0; // обнуляем лічильник знімків lcd.clear(); lcd.setCursor(0, pos); lcd.print("*"); // маркер поточної позиції lcd.setCursor(1, 0); lcd.print("delay:"); lcd.setCursor(8, 0); lcd.print(interval); lcd.setCursor(1, 1); lcd.print("go work"); } void show_working() { lcd.clear(); lcd.setCursor(3, 0); lcd.print("working..."); lcd.setCursor(2, 1); lcd.print("shots:"); lcd.setCursor(9, 1); lcd.print(cntPict); working = true; } void pulseON(int pulseTime) { unsigned long endPulse = micros() + pulseTime; // create the microseconds to pulse for while( micros() lt; endPulse) { digitalWrite(pinIRLED, HIGH); // turn IR on delayMicroseconds(13); // half the clock cycle for 38Khz (26.32ГѓпїЅ10-6s) - e.g. the 'on' part of our wave digitalWrite(pinIRLED, LOW); // turn IR off delayMicroseconds(13); // delay for the other half of the cycle to generate wave/ oscillation } } void pulseOFF(unsigned long startDelay) { unsigned long endDelay = micros() + startDelay; // create the microseconds to delay for while(micros() lt; endDelay); } void takePicture() { for (int i=0; i lt; 2; i++) { // імпульс посилаємо двічі pulseON(2336); pulseOFF(646); ....... ....... // Всю функцію не привожу, тому що вона дуже довга.. } }

Робота з интервалометром дуже проста - після його включення з'являється меню з двох пунктів: delay і go work. При виборі delay, джойстиком вліво і вправо можна налаштувати період між знімками в секундах. Причому, якщо трохи відхилити джойстик, то кількість змінюється на 1, а якщо до кінця, то на 10. Т. о. це полегшує установку великого значення. Після того, як встановлений період, необхідно перейти в пункт go work і натиснути кнопку джойстика. Почнеться робота интервалометра, при якому ІНФРАЧЕРВОНИЙ світлодіод буде посилати імпульси для спрацьовування затвора в камеру. ІНФРАЧЕРВОНИЙ світлодіод при цьому необхідно розташувати напроти ІК-приймача камери (у Sony NEX 5 він знаходиться спереду, зразу під кнопкою спуску). У мене нормально працює на відстані до 50 см.
В режимі роботи з'являється напис working..., а на другому рядку - лічильник кількості зроблених знімків:

Інтервалометр з LCD для Sony NEX

Для економії батареї, через 10 секунд вимикається підсвічування дисплея (час вимикання задається в настройках). Для того, щоб вийти з робочого режиму, необхідно натиснути кнопку джойстика.

Прикріплені файли:
  • intervalometer_sony.rar (174 Кб)
Tags

Коментарі до новини