Arduino fail safe quadrocopter

Нет ответов
Protez1999
Offline
Зарегистрирован: 08.07.2012

появилась необходимость использования дешовых пультов в квадрике . Но как на зло у многих из этих пультов нет режима failsave. По итогу посидев немного за ардуинкой решено было его сделать.

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

http://youtu.be/eg9urrR7ack


#include <Servo.h>
Servo servaProverka;

int servoPin = 11;


int PPMin = 2; // Сигнал с пульта 
int PPMin2 = 3; // сигнал  
////////////////////////////////////////////
int PPMin5 = 7; // сигнал  

int PPMin7 = 14; // включение  

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))) {Serial.print ("      FS FS FS   "); ;}
if((z>-3)&&(z<3)) {digitalWrite(16,1);}
else {digitalWrite(16,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;
 
 servaProverka.write(150); //ставим нужный угол
 /* Serial.print ("  encoder2:  "); 
  Serial.print (encoder2 );
 
   Serial.print ("  z2:"); 
  Serial.println(z2);
   
  Serial.print ("      z:    "); 
  Serial.println(z);
 */

  
  delay(1);
}