Самодельный fail save на ардуино

Появилась необходимость использования дешовых пультов в квадрике . Но как на зло у многих из этих пультов нет режима failsave. По итогу посидев немного за ардуинкой решено было его сделать.
Идея такая - читаем каналы пульта и если например за 15 секунд(можно уменьшить до 5 сек.) команда не меняется включается режим failsave. Вот в принципе и все. Поэтому достаточно иметь 4 канальную аппу для полетов на квадре особо не боясь потерять ее( тьху тьху). Штукенция больше заточена под DJI контролер потому что в них достаточно переключится на 5 канале и не надо лезть в канал газа. Электроника вещь такая что можно ожидать от нее всего чего угодно. Поэтому мы сможем воздействовать тока на один пятый канал.

  • 976
Comments
Compage

Это подходит для стандартных приемников Tyrnigy 8? Если да, тогда ждем код)

Protez1999

Перед использованием нужно вывести серву на нужный угол и проверить на своей аппе . тестировал на 9хр с фриской

#include <Servo.h>
Servo servaProverka;

int PPMin = 2; //
int PPMin2 = 3; //
////////////////////////////////////////////
int PPMin5 = 4; //
int PPMin7 = 5; //
int servoPin = 11;

int RCval; // длительность импульса
int adj_val; // назначает что значение должно быть 0-255

int RCval2; // длительность импульса
int adj_val2; // назначает что значение должно быть 0-255

int RCval5; // длительность импульса
int adj_val5; // назначает что значение должно быть 0-255

int RCval7; // длительность импульса
int adj_val7; // назначает что значение должно быть 0-255

int ledPin16 = 16;
int ledPin15 = 15;
//ось THR
int encoder=0;
int x=0;
int y=0;
int z=-50;
//ось пр
int encoder2=0;
int x2=0;
int y2=0;
int z2=-50;

int scet=50; // количетво операций подсчета

void setup()
{Serial.begin(9600);
servaProverka.attach(servoPin);
pinMode(PPMin, INPUT); //
pinMode(PPMin2, INPUT); //
pinMode(PPMin5, INPUT); //
pinMode(PPMin7, INPUT);//

}

void loop()
{

if(x==scet) y=encoder/x;
if(x==scet) z=adj_val-y;
//////////////////////
if(x==scet) y2=encoder2/x;
if(x==scet) z2=adj_val2-y2;
//////////////////////////////////////
if(((z>-3)&&(z<3))&&((z2>-3)&&(z2<3))) {digitalWrite(13,1);servaProverka.write(150!!!угол в режим FS);}
else {digitalWrite(13,0);}

//if((z2>-3)&&(z2<3)) {digitalWrite(15,1);}
//else {digitalWrite(15,0);}

RCval = pulseIn(PPMin, HIGH, 20000); //газ
adj_val = map(RCval, 780, 1880, 0, 255); //
RCval2 = pulseIn(PPMin2, HIGH, 20000); //руль
adj_val2 = map(RCval2, 780, 1880, 0, 255); //

RCval5 = pulseIn(PPMin5, HIGH, 20000); //ближний дальний
adj_val5 = map(RCval5, 780, 1880, 0, 255); //

RCval7 = pulseIn(PPMin7, HIGH, 20000); //руль
adj_val7 = map(RCval7, 780, 1880, 0, 255); //

x++;
encoder=adj_val+encoder;
encoder2=adj_val2+encoder2;

if (x>scet) encoder2=0;
if (x>scet) encoder=0;
if (x>scet) x=0;

//ставим нужный угол
/* Serial.print (" encoder2: ");
Serial.print (encoder2 );

Serial.print (" z2:");
Serial.println(z2);

Serial.print (" z: ");
Serial.println(z);
*/

delay(1);
}