Контроллер фотокамеры
Функция предостережения о низком заряде батареи измеряет напряжение побаночно, и выдает звуковой сигнал подключенный к каналу звука ФПВ системы, видео демонстрирующее работу этого сигнала
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