Универсальный фототригер

Тема в разделе "Arduino & Shields", создана пользователем sanik, 22 мар 2014.

  1. sanik

    sanik Гик

    Доброго времени суток! Уважаемые форумчане, помогите пожалуйста в создании универсального устройства. Я фотолюбитель увлекаюсь фотографией и всем что с этим связано однажды наткнулся на устройство очень необходимое мне в данный момент, не помню в каком уголке сети, триггер работает, но слишком мало в нем функций, я решил попробывать расширить его возможности. Но смотрю я опять запутался с кодом помогите разобраться почему он не работает? Код получился большой загружу двумя частями. В коде все по максимальному закомментировано и должно быть понятно.
    Код (Text):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27,16,2);
    #define ENABLE_SOUND_TRIGGER
    #define ENABLE_LASER_TRIGGER
    #define ENABLE_DIST_TRIGGER
    #define CAM_TRIGGER_PIN 7 //реле затвора
    #define CAM_FOCUS_PIN 11// реле фокусировки
    #define FLASH_TRIGGER_PIN 8 //вспышка1
    #define fFLASH_TRIGGER_PIN 13 //вспышка2
    #define LASER_PIN 2 // питание лазера отключаем во время экспонирования
    #define Rred_DiodPIN 4
    #define Blue_DiodPIN 12
    #define WORKLIGHT_RELAY 9 // реле освещения
    #define START_PIN 5
    #define BTN_PLUS 6
    #define BTN_MINUS 10
    #define BTN_Set 3

    #define DEBOUNCE_INTERVAL 10

    // Задаем используемые аналоговые выходы
    #define LASER_TRIGGER_ANALOG_PIN 1
    #define SOUND_TRIGGER_ANALOG_PIN 0
    #define DIST_TRIGGER_ANALOG_PIN 2

    #define PRINT_MESSAGES // Для отладки и настройки датчиков
    // уровни датчиков
    #define LASER_THRESHHOLD 795 // порог срабатывания laser
    #define SOUND_THRESHHOLD 800 // порог срабатывания sound
    //#define DISTsetup 0 // порог срабатывания DISTsetup =0;

    long flashDelayMS =0; // Установка задержки
    long DISTsetup =0; //  установка порога срабатывания
    //  давилка дребезга
    uint8_t debounce(int pin, long int interval = DEBOUNCE_INTERVAL)
    {
    long int prev_millis = millis();
    uint8_t state = digitalRead(pin);
    uint8_t new_state = !state;
    while (state != new_state)
    {
      if ((millis()-prev_millis)>DEBOUNCE_INTERVAL)
      {
      prev_millis = millis();
      new_state = digitalRead(pin);
      }
    }
    return state;
    }
    // режимы
    #define STANDBY        0
    #define ACTIVElaser    1
    #define ACTIVEsound    2
    #define ACTIVEdist      3
    #define MODE_INIT      4
    #define MODE_SETUP      5
    #define MODE_SELECT    6
    #define THRESHHOLDdist  7

    int mode = MODE_INIT;
    void setup()
    {
      lcd.init();lcd.backlight();lcd.clear();
      pinMode(START_PIN, INPUT);
      pinMode(BTN_PLUS, INPUT);
      pinMode(BTN_MINUS, INPUT);
      pinMode(BTN_Set, INPUT);
      pinMode(CAM_TRIGGER_PIN, OUTPUT); // затвор камеры
      pinMode(CAM_FOCUS_PIN, OUTPUT); // фокусировка
      pinMode(FLASH_TRIGGER_PIN, OUTPUT); // вспышка1
      pinMode(fFLASH_TRIGGER_PIN, OUTPUT); // вспышка2
      pinMode(LASER_PIN, OUTPUT); // питание лазера
      digitalWrite(LASER_PIN, HIGH);
      pinMode(Rred_DiodPIN, OUTPUT);// индикатор активации
      digitalWrite(Rred_DiodPIN, LOW);
      pinMode(Blue_DiodPIN,OUTPUT);// индикатор вспышки
      digitalWrite(Blue_DiodPIN, LOW);
      pinMode(WORKLIGHT_RELAY, OUTPUT); // рабочий свет
      digitalWrite(WORKLIGHT_RELAY, HIGH);
      //#ifdef PRINT_MESSAGES
    //  Serial.begin(9600);  // Для отладки и настройки датчиков
      //#endif
    }
    void hello()
    {
      lcd.setCursor(0, 0);lcd.print("  FotoTrigger    ");delay(700);
      lcd.setCursor(0, 1);lcd.print(" Speed Sunchro  ");
      delay(1800);lcd.clear();
      lcd.setCursor(0, 0);lcd.print("  Delay setting  ");delay(100);
      lcd.setCursor(0, 1);lcd.print("                ");
    }

     
     
    Последнее редактирование: 4 апр 2014
  2. sanik

    sanik Гик

    Код (Text):
    void loop()
    {
      switch (mode)
      {
        case MODE_INIT:
        {
          hello();
          mode = STANDBY;
          break;
        }
     
      case MODE_SETUP:
      if (debounce(BTN_Set))
      {
        mode = MODE_SELECT;
      }
      break;
      case MODE_SELECT: //Установка задержки
      lcd.setCursor(0, 0);lcd.print("  Delay setting ");
      if (debounce(BTN_PLUS)) // чтение кнопки +
      {
        if (flashDelayMS < 1000) flashDelayMS ++; // установка задержки +
        lcd.setCursor(0,1);lcd.print("  Set Flash"); lcd.print(flashDelayMS);
      }
      if (debounce(BTN_MINUS))// чтение кнопки -
      {
        if (flashDelayMS > 0) flashDelayMS --; // установка задержки-
        lcd.setCursor(0,1); lcd.print("  Set Flash"); lcd.print(flashDelayMS);
      }
      if (debounce(BTN_Set))
      {
        mode = THRESHHOLDdist; // установка порога срабатывания
      }
      break;
      case THRESHHOLDdist:
      {
        lcd.setCursor(0, 0);lcd.print("  Delay setting ");
        if (debounce(BTN_PLUS)) // чтение кнопки +
        {
          if (DISTsetup < 1000) DISTsetup ++; // установка чуствительности +
          lcd.setCursor(0,1);lcd.print(" sensitivity"); lcd.print(DISTsetup);
        }
        if (debounce(BTN_MINUS))// чтение кнопки -
        {
          if (DISTsetup > 0) DISTsetup --; // установка чуствительности -
          lcd.setCursor(0,1);lcd.print(" sensitivity"); lcd.print(DISTsetup);
        }
        if (debounce(BTN_Set))
        {
          mode = STANDBY;
        }
        break;
      }
      case STANDBY:
      mode = ACTIVElaser;
      lcd.setCursor(0, 0);lcd.print("  Laser        ");
      if ((mode == ACTIVElaser) && ((debounce (START_PIN))))
      {
        laser();
      }
      else if ((mode == ACTIVElaser) &&((debounce(BTN_PLUS))))
      {
        lcd.setCursor(0, 0);lcd.print("  Sound        ");
        mode = ACTIVEsound;
      }
      else if ((mode == ACTIVEsound) &&((debounce(START_PIN))))
      {
        sound();
        mode = ACTIVEsound;
      }
      else if ((mode == ACTIVEsound) &&((debounce(BTN_PLUS))))
      {
        lcd.setCursor(0, 0);lcd.print("  Universal  ");
        mode = ACTIVEdist;
      }
      else if ((mode == ACTIVEdist) &&((debounce(START_PIN))))
      {
        dist();
      }
      else if ((mode == ACTIVEdist) &&((debounce(BTN_PLUS))))
      {
        mode = ACTIVElaser;
      }
      else if (debounce(BTN_Set))
      {
        mode = MODE_SETUP;
      }
      break;
      }
    }
     
     
  3. sanik

    sanik Гик

    Что же никто мне не поможет?:(
     
  4. Unixon

    Unixon Оракул Модератор

    Как мы узнаем, что именно работает не так? Может быть, оно так и было задумано...
     
  5. sanik

    sanik Гик

    Изначально был такой код : Он рабочий
    Код (Text):
    //Переключение между разными типами триггера
    #define ENABLE_LASER_TRIGGER
    #define ENABLE_SOUND_TRIGGER

    //Пороговые значения для срабатывания триггера
    //Определяются в зависимости от окружающих факторов
    #define LASER_THRESHHOLD 500
    #define SOUND_THRESHHOLD 100

    //Выводит сообщения, помогает при определинии
    //пороговых необходимых пороговых значений
    #define PRINT_MESSAGES

    // Задает используемые цифровые выходы
    #define CAMERA_FLASH_PIN 4
    #define LASER_PIN 5

    // Задает используемые аналоговые выходы
    #define LASER_TRIGGER_ANALOG_PIN 0
    #define SOUND_TRIGGER_ANALOG_PIN 1

    void setup()
    {
      pinMode(CAMERA_FLASH_PIN, OUTPUT);
      digitalWrite(CAMERA_FLASH_PIN, LOW);
      pinMode(LASER_PIN, OUTPUT);
      digitalWrite(LASER_PIN, LOW);

    #ifdef ENABLE_LASER_TRIGGER
      digitalWrite(LASER_PIN, HIGH);  // включить лазер
    #endif

    #ifdef PRINT_MESSAGES
      Serial.begin(9600); // открыть серийный порт
    #endif
    }

    void loop()
    {
      int soundVal;
      int laserVal;

     
    }
    Потом я его как смог переделал работает, но не очень хорошо , Хотелось бы чтоб через управление переключались режимы лазер отдельно или звук отдельно и хотел добавить еще один режим с настраиваемым порогом через кнопки.. Понял что нужно добавлять антидребезг на кнопки и попытался сделать режимы через case Но увы плохо разбираюсь, я думаю что ошибка где то как раз в этом цикле. Вот код который у меня работает в нем есть возможность настройки задержки но режимы работают совместно
    Код (Text):
    #include <LiquidCrystal_I2C.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27,16,2);
    #define ENABLE_SOUND_TRIGGER
    #define ENABLE_LASER_TRIGGER
    // #define ENABLE_DIST_TRIGGER
    #define CAM_TRIGGER_PIN 11 //реле затвора
    #define CAM_FOCUS_PIN 7// реле фокусировки
    #define FLASH_TRIGGER_PIN 8 //вспышка1
    #define LASER_PIN 2 // питание лазера отключаем во время экспонирования
    #define Rred_DiodPIN 4
    #define Blue_DiodPIN 12
    #define WORKLIGHT_RELAY 9 // реле освещения
    #define BUTTON_PIN 5
    #define PIN_BTN_PLUS 6
    #define PIN_BTN_MINUS 10
    #define PIN_BTN_R 3
    // Задаем используемые аналоговые выходы
    #define LASER_TRIGGER_ANALOG_PIN 1
    #define SOUND_TRIGGER_ANALOG_PIN 0

    // режимы
    #define STANDBY 0
    #define ACTIVE 1
    // уровни датчиков
    #define LASER_THRESHHOLD 100 // порог срабатывания вместо 100 0 добавить переменную long LASERsetup =0;
    #define SOUND_THRESHHOLD 15 // порог срабатывания вместо 15 0 добавить переменную long SOUNDsetup =0;


    #define PRINT_MESSAGES

    int mode = STANDBY;

    long flashDelayMS =0; // Установка задержки

    void setup()
    {

      lcd.init();lcd.backlight();lcd.clear();
      lcd.setCursor(0, 0);lcd.print("  FlashTrigger    ");delay(700);
      lcd.setCursor(0, 1);lcd.print(" Speed Sunchro  ");
      delay(1800);lcd.clear();


      pinMode(BUTTON_PIN, INPUT);
      pinMode(PIN_BTN_PLUS, INPUT);
      pinMode(PIN_BTN_MINUS, INPUT);
      pinMode(PIN_BTN_R, INPUT);
    // pinMode(PIN_BTN_SELECT, INPUT);// добавить кнопку
      pinMode(CAM_TRIGGER_PIN, OUTPUT); // затвор камеры
      pinMode(CAM_FOCUS_PIN, OUTPUT); // фокусировка
      pinMode(FLASH_TRIGGER_PIN, OUTPUT); // вспышка1
    // pinMode(fFLASH_TRIGGER_PIN, OUTPUT); // вспышка2
      pinMode(LASER_PIN, OUTPUT); // питание лазера
      digitalWrite(LASER_PIN, HIGH);
      pinMode(Rred_DiodPIN, OUTPUT);// индикатор активации
      digitalWrite(Rred_DiodPIN, LOW);
      pinMode(Blue_DiodPIN,OUTPUT);// индикатор вспышки
      digitalWrite(Blue_DiodPIN, LOW);
      pinMode(WORKLIGHT_RELAY, OUTPUT); // рабочий свет
      digitalWrite(WORKLIGHT_RELAY, HIGH);


    // #ifdef PRINT_MESSAGES
      Serial.begin(9600);
    // #endif
    }



      // Для отладки и настройки датчиков
    // #ifdef PRINT_MESSAGES
    //Serial.print("Sound: ");
    // Serial.println(soundVal, DEC);
    // Serial.print("Laser: ");
    //Serial.println(int laserVal, DEC);
    // #endif
    #endif
    }
     
    Последнее редактирование: 4 апр 2014
  6. sanik

    sanik Гик

    Работа проста при включении после заставки, режим STANDBY в этом режиме ждем нажатие кнопки start, или кнопкой + переключаем режимы триггера между sound, laser , universal переключение по кругу при нажатии кнопки set входим в case с настройками устанавливаем, задержку нажимаем set далее настраиваем уровень порога, нажимаем set выход из настроек, ждем нажатие start или + по умолчанию устанавливается режим лазер .Как это сделать? Помогите пожалуйста!
     
  7. нече не понял..
    есть фототригер на звук, тот что на просторах интернета http://mattrichardson.com/Arduino-Photo-Trigger/ там все правильно.

    а как оно должно работать у вас я не пойму, зачем это все разом подключать и использовать? и что этим фотографировать?
    да и нужно выкинуть реле и поставить оптроны.
     
  8. sanik

    sanik Гик

    У меня и стоят оптроны реле в этом коде срабатывает при режиме STANDBY оно влючает рабочий свет чтоб не в темноте копаться. Тема и названа универсальный хочешь звук ( что кстати мне редко нужно) хочешь лазер или другой какой либо датчик вешай...
     
  9. Unixon

    Unixon Оракул Модератор

    sanik, это уже не первый раз же, в прошлом обсуждении на этом же моменте встряли.

    У вас в голове есть некоторая умозрительная картина, как всё должно быть устроено. По ней вы пишете код и показываете его нам. Т.е. есть желаемое и есть действительное. Первое известно исключительно вам. Второе вот здесь чуть выше лежит. Вот вы видите, что желаемое и действительное не совпадают, но не можете найти 10 отличий. А потом спрашиваете у нас, в чем они заключаются. Но на этот вопрос нельзя ответить, потом у как известен только код, а замысел неизвестен, не с чем сравнить.
     
    Dmitriy Kunin нравится это.
  10. Dmitriy Kunin

    Dmitriy Kunin Гик

    Не сочтите за брюзжание, скорее наоборот, этот проект мной отложен до лучших времён, и может быть после этого обсуждения родится...
    Вопрос надо начинать не с кода.
    Любой технический вопрос надо начинать с фразы: "Я хочу!"
    Правда может случится, что мы так ничего и не узнаем, потому как вы осознав задачу сами её решите и никому не расскажете :)
    Напишите список функций с пометками реализовано и работает, не работает, нет ваще надо добавить.
    Как всё это должно выглядеть, можно по коду восстановить схему устройства, но скорее всего это будет третья схема, первая автора, вторая ваша...
     
  11. Dmitriy Kunin

    Dmitriy Kunin Гик

    Эк мы синхронно одно и тоже :)
     
  12. так раскидайте желаемое по функциям и вызывайте их по мере надобности.
     
    Последнее редактирование: 26 мар 2014
  13. sanik

    sanik Гик

    Дело в том что все кусочки по отдельности работают там все налажено Единственное на что меня не хватает это все соединить в один код .Задумка такая Включаем дежурный режим, загорается рабочий свет WORKLIGHT_RELAY 9 Подается питание на лазер LASER_PIN 2 и в это время предоставляется выбор режимов кнопкой BTN_PLUS последовательно нажал 1ый режим(void sound()) нажал 2ой режим(void laser()) нажал 3ий режм (void dist()) нажал снова 1ый режим а при нажатии кнопки BTN_Set входим в пошаговое меню настроек 1 шаг настройка задержки flashDelayMS кнопками BTN_PLUS и BTN_MINUS далее при нажатии кнопки BTN_Set 2 шаг настройка порога срабатывания DISTsetup кнопками BTN_PLUS и BTN_MINUS снова нажимаем кнопку BTN_Set выходим в дежурный режим. Еще если в дежурном режиме нажал кнопку START_PIN то по умолчанию выполняется (void laser()); Тоесть получается в дежурном режиме отслеживаем две кнопки START_PIN и BTN_PLUS Думаю что так понятней .
     
  14. sanik

    sanik Гик

    Проблема в том что я этого не умею делать :(
     
  15. sanik

    sanik Гик

    Вот вроде понял как надо отслеживать кнопки старт и сет а вот с переключениями загвоздка

    Код (Text):
    void loop()
    {
      switch (mode)
      {
        case MODE_STANDBY:
        mode = STANDBY;
        if (debounce(BTN_Set))
        {
          mode = SETUP;
        }
        case MODE_SETUP:
        lcd.setCursor(0, 0);lcd.print("  Delay setting ");
        if (debounce(BTN_PLUS)) // чтение кнопки +
        {
          if (flashDelayMS < 1000) flashDelayMS ++; // установка задержки +
          lcd.setCursor(0,1);lcd.print("  Set Flash"); lcd.print(flashDelayMS);
        }
        if (debounce(BTN_MINUS))// чтение кнопки -
        {
          if (flashDelayMS > 0) flashDelayMS --; // установка задержки-
          lcd.setCursor(0,1); lcd.print("  Set Flash"); lcd.print(flashDelayMS);
        }
        if (debounce(BTN_Set))
        {
          mode = THRESHHOLDdist; // установка порога срабатывания
        }
        break;
        case THRESHHOLDdist:
        {
          lcd.setCursor(0, 0);lcd.print("  Delay setting ");
          if (debounce(BTN_PLUS)) // чтение кнопки +
          {
            if (DISTsetup < 1000) DISTsetup ++; // установка чуствительности +
            lcd.setCursor(0,1);lcd.print(" sensitivity"); lcd.print(DISTsetup);
          }
          if (debounce(BTN_MINUS))// чтение кнопки -
          {
            if (DISTsetup > 0) DISTsetup --; // установка чуствительности -
            lcd.setCursor(0,1);lcd.print(" sensitivity"); lcd.print(DISTsetup);
          }
          if (debounce(BTN_Set))
          {
            mode = STANDBY;
          }
          break;
          if (debounce(BTN_PLUS))
          {
            mode = ACTIVElaser;
            lcd.setCursor(0, 0);lcd.print("  Laser        ");
          }
          case ACTIVElaser:
          if ((mode == ACTIVElaser) && ((debounce (START_PIN))))
          {
            laser();
          }
         
     
  16. sanik

    sanik Гик

    Вот как и бещал в прошлый раз видео того что получилось


    А это видео для чего все делалось

    .
    Нашелся человек который помог мне.
     
  17. эхх.. надо тоже слайдер делать, железо почти готово, только движек не найду ((
     
  18. sanik

    sanik Гик

    Я все движки заказывал на EBAY у меня сделано универсальное крепление и движки меняются на раз два три секунд пять, движки несколько штук 8RPM 10RPM 15RPM 25RPM 70RPM очень удобно :)
     
  19. смысла нет, электроотвертка стоит столько же и не нужно ждать..
    ладно, не будем отходить от темы, чем не нравится описание языка на http://arduino.ru/Reference/FunctionDeclaration ?
     
  20. sanik

    sanik Гик

    Я далек от программирования мне непонятно описание. Все что не пробовал не получается. Получается только одну часть сделать а объединить не выходит наверное плохо развита логика сложно это все для меня. Не могу разобраться где ставить скобки где нет. Кое как разобрался в case да и то не получается полностью все предусмотреть. :(