Переключение 3 камер и 2 передатчиков по одному каналу PWM
Для чего это нужно
Для удобства в мультироторном FPV-аэрофото аппарате установлено несколько камер
- камера с широким углом обзора для управления полетом
- камера с узким углом обзора для поиска объекта съемки
- вид с видеовыхода фотоаппарата для точного наведения на объект съемки
для обеспечения надежности передачи видеоинформации используется один из двух передатчиков работающих на разных частотах, с различной мощностью.
Нижеприведенное устройство позволяет использовать один канал приемника для коммутации всех этих устройств при помощи двух переключателей на пульте.
В качестве “мозга” декодера может быть использована любая ардуино- плата, например такая которая изначально была задумана для выбора режимов автопилота на стороне передатчика,
Устройство состоит из двух плат :
-
“Декодер PWM”
-
“плата реле”
Программа дешифратора PWM
Скетч для ардуино принимающий на вход 1 PWM канал и в зависимости от его значения выбирающий один из шести режимов:
int pinRelay1 = 5;
int pinRelay2 = 6;
int pinRelay3 = 7;
volatile unsigned long StartTime = millis();
volatile unsigned long Pulse;
volatile int Mode=1; // 1 to 6 0 - pwm out of range and six modes
volatile int OldMode;
volatile int OldModePulses;
static int ModeRanges[6];
void setup()
{
//under
ModeRanges[1] = 1100;
ModeRanges[2] = 1300;
ModeRanges[3] = 1500;
ModeRanges[4] = 1700;
ModeRanges[5] = 1900;
ModeRanges[6] = 2100;
pinMode (pinRelay1, OUTPUT);
digitalWrite(pinRelay1,LOW);
pinMode (pinRelay2, OUTPUT);
digitalWrite(pinRelay2,LOW);
pinMode (pinRelay3, OUTPUT);
digitalWrite(pinRelay3,LOW);
attachInterrupt(1, ch_state, CHANGE); //two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3). may be used for inerrupt
Serial.begin(115200);
}
void loop()
{
Serial.print(“Mode:”);
Serial.print(Mode, DEC);
Serial.print(" Pulse:");
Serial.println(Pulse, DEC);
delay(1000);
}
void ch_state()
{
unsigned long CurTime = micros();
bool state = digitalRead(3);
if (state==LOW && CurTime > StartTime)
{
Pulse = CurTime - StartTime;
checkMode();
}
else
StartTime = CurTime;
}
void checkMode()
{
int NewMode =1;
for (int i=1 ; i <= 6; i++)
{
if (Pulse < ModeRanges[i] ) { NewMode = i; break; }
}
if (Pulse > ModeRanges[6] + 200) NewMode = 1;
setMode(NewMode);
//Mode = NewMode;
}
void setMode(int NewMode) //check for pulse range 5 times in some range before switch
{
if (OldMode != NewMode)
{ OldModePulses = 0;
OldMode = NewMode; }
else
OldModePulses = OldModePulses + 1;
if (OldModePulses >= 25)
{ Mode = NewMode;
OldModePulses = 25;
SwRelays();
}
}
void SwRelays()
{
if (Mode == 1 || Mode == 3 || Mode == 5 ) //transmitter 1 power on else transmitter 2 power on
digitalWrite(pinRelay1,LOW);
else
digitalWrite(pinRelay1,HIGH);
if (Mode <= 2 ) // video 1 on (else 2 or 3 used)
digitalWrite(pinRelay2,LOW);
else
digitalWrite(pinRelay2,HIGH);
if (Mode > 4 ) // video 3 on (else 2 used)
digitalWrite(pinRelay3,LOW);
else
digitalWrite(pinRelay3,HIGH);
}
Как подключить
Для удобства настройки аппаратуры отладочная информация выводится в последовательный порт (на скорости 115200)
сигнальный провод от приемника следует подключить к пину ардуино D3
обмотки трех реле подключаются к выходам D5 D6 D7
Как работает скетч:
- в массив ModeRanges[] устанавливаются необходимые границы для уровней ппм сигнала в микросекундах. эти значения следует менять лишь если вы решили изменить количество режимов или подогнать длительность под возможности вашей аппаратуры
- в процессе загрузки программы выполняется процедура attachInterrupt(1, ch_state, CHANGE);
которая указывает что пр каждом изменении уровня сигнала на D3 нужно запустить подсчет длительности импульса - сам подсчет выполняется в процедуре ch_state эта функция определяет принадлежность значения импульса к определенному диапазону и вызывает процедуру предотвращающую переключение при “помехе” setMode
- setMode при приеме 25 одинаковых значений (во избежание ложных срабатываний) изменяет глобальную переменную Mode которую можно использвать в любом месте вашего кода, не привязываясь к непрерывному циклу измерений
- В данном примере функция SwRelays вызывается изнутри setMode однако это необязательно если скорость ракции на переключение не критична - в этом случае ее вызов можно переместить процедуру Loop
Вот что получилось:
Как настроить передатчик
Для независимого переключения двух передатчиков и используется 2 позиционный тумблер, трех камер - трехпозиционный. Оба смикшированы в одном канале следующим образом:
расходы выбранного канала установлены таким образом чтобы минимальный PWM был 1000ms а максимальный 2000ms при этом в нижнем положении трехпозиционного тумблера должно быть 1000 в среднем 1400 в максимальном 1800. включение двухпозиционного тумблера прибавляет 200ms к любой из позиций трехпозионного тумблера.
соответственно получаем 6 комбинаций из двух тумблеров
1000 - mode 1
1200 - mode 2
1400 - mode 3
1600 - mode 4
1800 - mode 5
2000 - mode 6
Настройка миксов 2х и 3хпозиционных переключателей на 5 канал futaba
Плата реле и коммутации
Плата коммутации передатчиков и камер разработана для одного слоя, но потребуется несколько перемычек.
под все камеры и передатчики разведена вся коммутация и питание, что позволяет легко менять передатчики и камеры местами, использовать два различных напряжения питания и избегать возможности перепутать его (в вилке подключения устройства используйте в зависимости от необходимости либо v1 либо v2 контакт)
файлы Eagle для изготовления печатной платы можно скачать у меня