Декодер PWM и плата реле

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

Нижеприведенное устройство позволяет использовать один канал приемника для комутации всех этих устройств при помощи двух переключателей на пульте.


В качестве "мозга" декодера может быть использована любая ардуино- плата, например такая которая изначально  была задумана для выбора режимов автопилота на стороне передатчика,



Программа дешифратора 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 для изготовления печатной платы тут
использованы вилки с шагом 2,5 мм типа chu  на 3,4,5 контактов и гнезда типа SWF
реле как в ардупилоте AXICOM
Ардуино-плата для декодирования сигнала и управления реле использована как в этом примере



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


Comments