Контроллер фотокамеры

Функция предостережения о низком заряде батареи измеряет напряжение побаночно, и выдает звуковой сигнал подключенный к каналу звука ФПВ системы, видео демонстрирующее работу этого сигнала
http://www.youtube.com/watch?v=JqYyxFURo5Q&feature=youtu.be (перелистните к 7 минуте если не хотите смотреть все видео)



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


Прототип печатной платы и первый экз. опробованный






19 вывод - вход канала управляющего выключением фотокамеры - к приемнику
18 вывод - вход канала управления включением фотокамеры и снимками - к приемнику
17 вывод - выход включения фотокамеры - к фотокамере, активный "0"
16 вывод - выход нажатия клавиши фокусировка фотокамеры - к фотокамере, активное состояние "1"
15 вывод - выход дожатия клавиши снимок фотокамеры - к фотокамере, активное состояние "1"


Дополнительно
к выводу 14 подключен провод на котором от фотоаппарата появляется напряжение 3,3вольта при состоянии фотоаппарата "включено"
к выводу 28 подключен резисторный делитель напряжения батареи "на три" 10ком / 5ком
к выводу 27 аналогично банка №2 акб
к выводу 26 аналогично банка №1 акб
с вывода 2 через резисторный делитель 1:10 - аудиовыход сигнализации разряда
между выводами 20 -21 резистор ~15 ком
между выводами 21-22 конденсатор десятки - сотни нанофарад (стабилизация опорного напряжения)

чтобы расчитать резисторный делитель LM117 понадобится exe- программа которую легко нагуглить по ключевым словам "LM117 calculator" или один из многочисленных  онлайн - калькуляторов например такой

в случае nikon l23 с отсеченой платой фотовспышки можно настроить на 3,3 -3,6 вольт

детали:
стабилизатор LM117
контроллер atmega168
кварц 16МГц
конденсаторы кварца 22 пф
конденсаторы по питанию и ресета - сотни нанофарад

Прим: справа и снизу секция макетной платы, для экспериментирования

туду скинуть схему
 
/*
 Управление фотоаппаратом от двух каналов PWM RC
*/
 


//подключено к выходам RC
const int  inpw = 13;         //отвечающему за включение
const int  inshot = 12;       //отвечающему за нажатие фокус и снимок

//подключено к фотоаппарату
const int  incamerapower = 8;   // сенсор включения, к контакту питающему кнопку снимок  
const int  outpw = 11;          // выход к контакту кнопки включения фотоаппарата
const int  outfocus = 10;       // выход к контакту фокус фотоаппарата
const int  outshot = 9;         // Выход к контакту снимок фотоаппарата
 
const int  servomin = 1600;       // минимальная продолжительность PWM импульса "ВКЛ"
const int  servomax = 2500;       // минимальная продолжительность PWM импульса "ВКЛ"
const int servotimeout = 100000;  // таймаут PWM
 

int inplen = 0; 


//Подключено к вилке балансировки 3-х элементной батареи через делитель 1/3
int sensorPin1 = 5;   //плюс батареи 
int sensorPin2 = 4;   //плюс элемента 2
int sensorPin3 = 3;   //плюс элемента 1



int alarmpin = 0;     // подключено к звуковому входу аудиовидео передатчика FPV
float sensordivider = 3;   //коэффициент деления = (r1+r2) /r2  
float voltage1alrm = 9.6 ; //Батарея разряжена
float voltage2alrm = 9.3 ; //Батарея критически разряжена


float sensorvoltage1 = 0;
float sensorvoltage2 = 0;
float sensorvoltage3 = 0;
int alarmtone = 440;  


void setup() {
  pinMode(inpw, INPUT);
  pinMode(inshot, INPUT);
  pinMode(incamerapower, INPUT); 

  pinMode(outpw, OUTPUT);  // set null state for internal pullup by camera
  digitalWrite(outpw, HIGH);
  pinMode(outfocus, OUTPUT);
  digitalWrite(outfocus, LOW);
  pinMode(outshot, OUTPUT); 
  digitalWrite(outshot, LOW);
 
//  Serial.begin(9600);
}
 

void loop() {
 checkpower() ;
 photo();


void checkpower() {
  delay (300);
  float batcnt = 3.0000;
  // измеряем напряжение на каждой батарее:
 
  sensorvoltage1 = analogRead(sensorPin1)/ 1024.0 * 5.0 * sensordivider;
  sensorvoltage2 = analogRead(sensorPin2)/ 1024.0 * 5.0 * sensordivider;
  sensorvoltage3 = analogRead(sensorPin3)/ 1024.0 * 5.0 * sensordivider;

//Serial.print("Power voltage1 V is :  ");
//Serial.println(sensorvoltage1 , DEC);
//Serial.print("Power voltage1 V is :  ");
//Serial.println(sensorvoltage2 , DEC);
//Serial.print("Power voltage1 V is :  ");
//Serial.println(sensorvoltage3 , DEC);
// delay (5000);
//println();
 
 
       if (sensorvoltage1 - sensorvoltage2 <= voltage2alrm / batcnt  
        || sensorvoltage2 - sensorvoltage3 <= voltage2alrm / batcnt  
        || sensorvoltage3                  <= voltage2alrm / batcnt
        )
   { 
      if ( sensorvoltage1 - sensorvoltage2 <= voltage1alrm / batcnt  
        || sensorvoltage2 - sensorvoltage3 <= voltage1alrm / batcnt  
        || sensorvoltage3                  <= voltage1alrm / batcnt 
        )
      {     tone(alarmpin, alarmtone / 1.5  ) ;  }
      else
      {     tone(alarmpin, alarmtone, 100  );}
   }
   else
   { noTone(alarmpin);}
 
}


void photo (){
 
 if (digitalRead(incamerapower) == HIGH) 
 {  // фотоаппарат уже включен, этим сигналом только выключаем!
 inplen = pulseIn(inpw, HIGH, servotimeout ) ;
// Serial.print("Camera is powered, pw servo ln is:  ");
//Serial.println(inplen, DEC);
     if (inplen >= servomin  && inplen <= servomax ) 
    {
      delay (200);
      inplen = pulseIn(inpw, HIGH, servotimeout ) ;
         if (inplen >= servomin  && inplen <= servomax ) 
         {
            digitalWrite(outpw, LOW);
            delay (1000);
            digitalWrite(outpw, HIGH);
            delay (3000);
            }
      }
 }
 
 
 inplen = pulseIn(inshot, HIGH, servotimeout ) ;
     // Serial.print("shot servo ln is:  ");
     // Serial.println(inplen, DEC);
 if (inplen >= servomin  && inplen <= servomax ) 
 {
     if (digitalRead(incamerapower) != HIGH) 
     {  // Если фотоаппарат выключен то вместо первого снимка просто включаем
  
            digitalWrite(outpw, LOW);
            delay (1000);
            digitalWrite(outpw, HIGH);  
            delay (3000);  
    }
      else //если уже был включен то делаем снимок
     {
     digitalWrite(outfocus, HIGH); //  подаем высокий уровень на контакт кнопки фокус
     delay (200); 
      
      if (pulseIn(inshot, HIGH, servotimeout ) >= servomin  && pulseIn(inshot, HIGH, servotimeout ) <= servomax ) {
            delay (300); // тут можно задать время для фокусировки
            digitalWrite(outshot, HIGH);
            delay (200);
            
            while (pulseIn(inshot, HIGH, servotimeout ) >= servomin  && pulseIn(inshot, HIGH, servotimeout ) <= servomax ) 
              { // держим снимок пока не будет отпущена кнопка на пульте
              checkpower();
              }
            
            digitalWrite(outshot, LOW); //сначала подаем 0 на снимок
            delay (50);
            digitalWrite(outfocus, LOW); //затем на фокус
                     
        }
        else  
        {    
        digitalWrite(outfocus, LOW);  // если нажатие было короткое и снимка 
                                      // не случилось то фокус надо отпустить 
        }     
     }  //end shot  
  } 

}

Приложен файл разводки печатной платы в формате программы DipTrace

ċ
photo_v8.pde
(5k)
Alexey Kozin,
30 сент. 2011 г., 0:21
ċ
servo2swith.dip
(39k)
Alexey Kozin,
30 сент. 2011 г., 1:47
Comments