цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Основанное на Arduino устройство проверки выдержки (скорости затвора) для пленочных фотоаппаратов


Основанное на Arduino устройство проверки выдержки (скорости затвора) для пленочных фотоаппаратов

Автор: Mike(admin) от 23-11-2021, 23:55

Классические пленочные фотоаппараты имеют механический затвора, не требующий питания от батареи. Однако затворы пленочных фотоаппаратов, которые не использовались в течение многих лет, могут работать некорректно. Тестер выдержки проверяет корректность скорости затвора пленочной камеры, и в данном проекте мы рассмотрим процесс создания такого устройства на основе Arduino.


Основанное на Arduino устройство проверки выдержки (скорости затвора) для пленочных фотоаппаратов

В устройстве проверки скорости затвора используется Arduino в качестве основного контроллера и фототранзистор в качестве датчика освещенности для улавливания света, передаваемого фонариком за корпусом камеры. Зафиксированная выдержка отображается на OLED-дисплее SSD1306.


Принципиальная схема устройства и схема подключения его компонентов представлены на следующих изображениях.


Основанное на Arduino устройство проверки выдержки (скорости затвора) для пленочных фотоаппаратов

Основанное на Arduino устройство проверки выдержки (скорости затвора) для пленочных фотоаппаратов

На макетной плате устройство может выглядеть следующим образом.


Основанное на Arduino устройство проверки выдержки (скорости затвора) для пленочных фотоаппаратов

Основанное на Arduino устройство проверки выдержки (скорости затвора) для пленочных фотоаппаратов

Код устройства проверки скорости затвора представлен далее.



#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET     -1
#define SCREEN_ADDRESS 0x3C

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define RECEIVER_PIN A6
#define TIMEOUT 8000000
#define THRESHOLD 200
#define MIN_DURATION 500

unsigned long analogPulseIn(uint8_t pin, uint8_t state, unsigned long timeoutInMicros, int threshold = THRESHOLD) {

      unsigned long startTime = micros();

      while (true) {
        unsigned int value = analogRead(pin);
        if ((state == HIGH && value < threshold) || (state == LOW && value >= threshold)) {
          break;
        }
        if (micros() - startTime >= timeoutInMicros) {
          return 0;
        }
      }

      while (true) {
        unsigned int value = analogRead(pin);
        if ((state == HIGH && value >= threshold) || (state == LOW && value < threshold)) {
          break;
        }
        if (micros() - startTime >= timeoutInMicros) {
          return 0;
        }
      }

      unsigned long time0 = micros();

      while (true) {
        unsigned int value = analogRead(pin);
        if ((state == HIGH && value < threshold) || (state == LOW && value >= threshold)) {
          break;
        }
        if (micros() - startTime >= timeoutInMicros) {
          return 0;
        }
      }

      unsigned long endTime = micros();
      return (endTime - time0);
}


void displayInitialScreen() {
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,3);

  display.println("Shutter Speed Tester");
  display.display();
}

void displayDuration(unsigned long duration) {
  double msecs = duration / 1000.0;
  String text = String("Time: ") + msecs + String(" msecs");
  display.println(text);
  Serial.println(text);
}

void displaySpeed(unsigned long duration) {
  String text;
  if (duration >= 1000000.0) {
    double secs = duration / 1000000.0;
    text = String("Speed: ") + secs + String(" secs");
  } else {
    double speeed = 1000000.0 / duration;
    text = String("Speed: 1/") + speeed + String(" secs");
  }
  display.println(text);
  Serial.println(text);
}

void displayResult(unsigned long duration) {
  display.clearDisplay();
  displayDuration(duration);
  displaySpeed(duration);
  display.display();  
}

void setup() {
  pinMode(RECEIVER_PIN, INPUT);
  Serial.begin(9600);

  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println("SSD1306 allocation failed");
    for(;;);
  }

  display.clearDisplay();
}

void loop() {
  displayInitialScreen();

  unsigned long duration = analogPulseIn(RECEIVER_PIN, HIGH, TIMEOUT);
  if (duration > MIN_DURATION) {
    displayResult(duration);
    delay(10000);
  }  

  display.clearDisplay();
}

Как пользоваться таким устройством? Поместите камеру на стол. Откройте заднюю крышку камеры. Поместите тестер выдержки перед объективом камеры. Направьте фототранзистор на объектив камеры. Поместите фонарик за камеру.


Основанное на Arduino устройство проверки выдержки (скорости затвора) для пленочных фотоаппаратов

Направьте фонарик через объектив камеры на фототранзистор измерителя выдержки. Включите тестер выдержки. Когда проинициализируется главный экран, спустите затвор камеры. Результат выдержки отобразится на экране тестера выдержки.


Основанное на Arduino устройство проверки выдержки (скорости затвора) для пленочных фотоаппаратов

Если вы хотите использовать другой фототранзистор, внимательно прочтите техническую документацию и выберите правильный фототранзистор. Был также опробован SFH309-4, при этом были получены хорошие результаты без необходимости внесения изменений в схему.




© digitrode.ru


Теги: Arduino, фототранзистор




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий