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

Функция предостережения о низком заряде батареи измеряет напряжение побаночно, и выдает звуковой сигнал подключенный к каналу звука ФПВ системы, видео демонстрирующее работу этого сигнала

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