Переключение 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 для изготовления печатной платы можно скачать у меня

  • 3167
Comments
chanov

А разве не стоит в коде вообще избегать задержек - delay(1000); ?

alexeykozin

основной код измеряющий интервал и управляющий реле работает на “прерывании”
когда меняется уровень сигнала на d3 независимо от того в каком месте выполнялся код в цикле loop происходит прерывание выполнения, и выполняется процедура ch_state
если в момент прерывания идет delay то прерывается он.

собственно код в loop вообще не нужен в работе, он только для удобства отладки, открываем сериал монитор и смотрим при настройке аппы длительность импульсов.
устройство не вымышленное, реально работает, четко и надежно. сверял показания измерений на цифровом сервотестере - все четко

chanov

Уже сбегал в гугл, глянул =) Просто только месяц назад начал ардуинку ковырять и пока всё на изменении времени горожу, не знал что дилэй вырубается прерыванием …
Сейчас вот уже смотрю код с “Переключатель режимов ардупилота” …

fidller

интересная штука, думал о подобном, а в продажу планируете пустить?

masonx

goodluckbuy.com/skylark-3-channels-camera-switcher…

тоже интерессный дивайс на тему переключения трех камер

alexeykozin

Штучка весьма “специфична”, делалась под заказ.
если делать на продажу - надо закзывать заводскую платку, а имеет смысл от 10 штук (заказ печатных плат обойдется 2000-3000руб)
а десяток желающих получить чтоль спцифичную штучку врядли найдется.

с другой стороны платка специально разведена с большими зазорами, в один слой и повторить ее методом “лазерно утюжной технологии” совсем не сложно
единственное что мне показалось “запарным” обжимать вилки под устройства, те щипцы что смог найти в москве не очень подходят…
остальные детали недороги, доступны в продаже.
Вобщем кто надумает делать всячески помогу

если говорить о скетче то логику управления по одному каналу можно развивать и дальше, например три нагрузки в режиме “вкл-выкл” при этом трехпозиционный переключатель выбирает каким каналом командовать, а кнопка вместо двухпозиционного меняет состояние.
если развивать идею дальше то в один аналоговый канал ру можно уплотнить гораздо больше “медленных” нагрузок, проблема стала лишь с возможностями микширования каналов в аппаратуре

трехканальный переключаетель моему заказчику не подошел по причине недостатка свободных каналов в аппаратуре, у него достаточно дорогой 10 канальный передатчик и переход на 12 канальный весьма ощутим по деньгам. а крайний полет без резервного фпв передатчика чуть не стоил весьма дорогого аппарата.

ВитГо

с уплотнением не все так просто будет… нужно будет хорошо продумывать алгоритм уплотнения.
я это уже проходил 😃

ИльяПРо

Подскажите пожалуйста, а что за реле использовали?

alexeykozin


axicom im03

ИльяПРо

Спасибо:) а можно использовать например твердотельные реле или оптопары? например такое реле
www.chipdip.ru/product/kr293kp1a/

DiscoMan

Релюшки вообще использовать необязательно. Если коммутируем только видео-выходы, а по питанию камеры подключены постоянно, то запросто можно обойтись свичем 4066.