Контрль форсажа меленькой самолетной электро-турбины

kak-dela007@mail.ru
Offline
Зарегистрирован: 28.12.2016
Система контроля форсажа импеллера (авиамодельной электротурбины). 
Форсаж осуществляется по принципу afterbarner - сжигание в сопле. 
 
Дано: АрдуиноUNO, датчик пламени, серво (открывает подачу топлива), зажигание (его на схеме заменяет светодиод), 
источник ШИМ - сигнала (на схеме это Ардупилот -красная плата,  на деле -  будет приемник от рдиоаппаратуры RC). 
 
Приемник подключен к той же шине питания, и посылает ШИМ-сигнал на 2 пина UNO: А1 - уровень оборотов импеллера, А2 - порог уровня оборотов.
Оба регулируются с пульта RC. С дешифровкой ШИМ решил не заморачиваться, а подвести эти сигналы как аналоговые, от 0 до 5-ти вольт, по принципу 
подключения потенциометров. Разделить оба на 4, дабы получить число от 0 до 255. 
 
Нужно сделать: 
 
- Чтобы при превышении "уровнем оборотов" "порога уровня оборотов" (сигнал с А1>А2), включался сервомеханизм (отклонение в любую сторону до упора), 
он открывает подачу топлива. 
- Далее, через задержку (четверть секунды) срабатывает зажигание. И как только появляется сигнал с датчика о пламени, зажигание сразу выключается. 
- После этого, сервомеханизм не должен выходить из крайнего положения (подача топлива открыта) до тех пор, пока уроветь оборотов (А1) не опускается (вручную, с пульта RC) ниже 10%.
- Когда обороты меньше 10%, серво встает в первоначальное положение (топливо перекрыто). 
- Только после этого рабочий цикл может повторяться: снова при превышении А1>А2 срабатывает серво, и через задержку - зажигание (светодиод). 
 
Запрограммировать нужно только плату ArduinoUNO. 
Ранее никогда программированием не занимался, и это мой первый скетч (за исключением миганий диодом и игр с потенциометрами). Конечно эта программа не работает. 
 
Подскажите, пожалуйста, в чем причина? 
Где что я упустил/не правильно составил? Нужно ли подключать какие-то библиотеки? Обязательно ли делать расшифровку ШИМ сигнала?

#define pot1 A1 //Уровень оборотов


#define pot2 A2 // Порог уровня оборотов

#define flame 2 //датчик пламени

#define serwo 9  //Нужна библиотека серво??? Или по +5 будет переходить в крайнее положение

#define iskra 8//нужно толькоо +5/0 


void setup()

{

pinMode(serwo, OUTPUT);  // пин сервы 

pinMode(iskra, OUTPUT);  // пин системы зажигания 

pinMode(pot1, INPUT); //пин уровня оборотов

pinMode(pot2, INPUT); //пин порога уровня зажигания

pinMode(flame, INPUT); //пин датчика опламени
}

void loop()

{

// объявляем переменные x,y,z

int x; //переменная уровня оборотов

int y; //переменная порога уровня оборотов

int z; //переменная накомительная чтобы к ней плюсовалось "1" как превышает 
//порог и обнулялось как ниже границы 10%


// считываем напряжение с потенциометров (выходов приемника):

// будет получено число от 0 до 1023

// делим его на 4, получится число в диапозоне

// 0-255 (дробная часть будет отброшена)

x = analogRead(pot1) / 4; // посчитан уровень оборотов

y = analogRead(pot2) / 4; // посчитан порог уровня оборотов

{
   if (x>y&&x>10) // Если уровень оборотов превысил порог
 {
     z++; //прибавляем к переменной 1 при каждом превышении уровнем оборотов порога
    }
}

{
   if (z>0) //Если уровень оборотов превысил порог

   {
     digitalWrite(serwo, HIGH); // Вколючилась серва
   }
}

// !!!!!!!!!!!Блок управления искрой
{
  if(digitalRead(flame)==LOW&&z>0) // если огня нет (датчик)и обороты хоть раз превысили порог
{
    delay(500); //задержка перед искрой (выяснить достаточна ли??) 
    analogWrite(iskra, HIGH ); //срабатывает зажигание
}
  else
  {
    analogWrite(iskra, LOW ); //в противном случае зажигание выключено 
  }
}
  {
    if(x<10)//есди уровень газа <10%, 
    
   z=0; // переменая Z обнуляется => серво выкл, зажигание выкл
  }
}



AlexeySh
Offline
Зарегистрирован: 16.01.2017
Все не так. Начнем с серво. Здесь пример команд управления поворотным серво:

#include <Servo.h>

#define servoPin 9 

Servo fuelServo; 

void setup() 
{
  fuelServo.attach(servoPin); // Подключаем серво к пин 9
  fuelServo.write(90); // Ставим серво в среднем положении. Эту строку можно не использовать
} 

void loop() 
{ 
  fuelServo.write(180); // Поворачиваем до конца в одну сторону 

  fuelServo.write(90); // Поворачиваем в среднее положение
} 

 

 

 

kak-dela007@mail.ru
Offline
Зарегистрирован: 28.12.2016

После добавления библиотеки <Servo.h>, сервомеханизм начал двигаться - спасибо AlexeySh. Правда при сигнале с датчика пламени - принимает крайнее положение (чего быть не должно). Но после каких-то изменений в программе этот эффект пропал. Теперь серва даже реагирует при изменении сигнала уровня оборотов, правда это выражается только в подергивании. 

Пришел к выводу, что с входящим сигналом ШИМ надо что-то делать. 

Нашел несколько вариантов: 

1) Декодировать входящий ШИМ вручную (с помощью функций PulseIn и еще каких-то)  - пока не понятно как это делать. 

2) Перекодировтаь PWM в  общий PPM с помощью программы энкодера (напримет такой, как используют в Ардупилоте, как советуют вот здесь.

По этому варианту тоже не ясно, как его применить на  UNO

3)  Сгладить ШИМ сигнал с помощью фильтра (чтобы подать на аналоговые выходы сигнал от 0 до +5в), как советуют здесь  . Но где взять его схему подключения и какие номиналы деталей?

Уверен, что первые 2 способоа предпочтительнее третьему, т.к. в них работа, думается, будет качественней. 

Пока код имеет вот такой вид 

 

Пока программа не работает. 


#include <Servo.h>  //Подключение библиотеки cервы

#define servoPin 9 // назначае пин сервы

Servo fuelServo; //Имя сервы

#define pot1 A1 //Уровень оборотов

#define pot2 A2 // Порог уровня оборотов

#define flame 2 //датчик пламени

#define iskra A3//нужно толькоо 0/+5в


void setup()

{

  fuelServo.attach(servoPin); // Подключаем серво к пин 9

  pinMode(iskra, OUTPUT);  // пин системы зажигания

  pinMode(pot1, INPUT); //пин уровня оборотов

  pinMode(pot2, INPUT); //пин порога уровня зажигания

  pinMode(flame, INPUT); //пин датчика опламени
}

// объявляем переменные x,y,z

  int x = analogRead(pot1) / 4; // посчитан уровень //переменная уровня оборотов

  int  y = analogRead(pot2) / 4; // посчитан порог уровня оборотов //переменная порога уровня оборотов

  // считываем напряжение с потенциометров (выходов приемника):

  // будет получено число от 0 до 1023

  // делим его на 4, получится число в диапозоне

  // 0-255 (дробная часть будет отброшена)




void loop()

{
  
   static int z; //переменная накомительная чтобы к ней плюсовалось "1" как превышает

    if (x > y) // Если уровень оборотов превысил порог
    
      z++; //прибавляем к переменной 1 при каждом превышении уровнем оборотов порога

{
      if (z > 0) //Если уровень оборотов превысил порог

      fuelServo.write(180); // Вколючилась серва (подача топлива)
}
  // !!!!!!!!!!!Блок управления искрой
  
    if (digitalRead(flame) == LOW && z > 0) // если огня нет (датчик)и обороты хоть раз превысили порог
     
      analogWrite(iskra, HIGH ); //срабатывает зажигание
    
    else
    
      analogWrite(iskra, LOW ); //в противном случае зажигание выключено
    }

Проме приведенных ссылок по теме нашел еще вот это. Но как собрать всё воедино - пока не понимаю. 

Чувствую, что мягко говоря, не всё ровно у меня с переменными, т.к. блок управления искрой - тоже не работает. (который из себя представляет по сути усовершенствованную программу мигания диодом, зависящую от входящих сигналов). Светодиод даже для приличия не маргнул не разу. 

Подскажите, куда копать? 

kak-dela007@mail.ru
Offline
Зарегистрирован: 28.12.2016

Загрузил скетч вот из этого проекта 

Но почему-то в сериал мониторе показывает только один канал (первый), на втором - 0. В лучшем случает второй канал покажет в самом начале работы монитора, но тогда на первом - 0. Хотя подключил всё точь вточь как описано. Единственное - приемник другой (Devo). Но не думаю, что у него от Frsky принципиально сигнал отличается (сервы одни и те же работают на обоих приемниках). С чем это может быть связано? Как это исправить? Считываются ли на самом деле значения? 

В монитре предлагаемого автором приложения PuTTY - то же, что и в ардуиновском 

Делал быстрое форматирование, не помогло. Есть еще вторя ардуина, попробую на ней. 

kak-dela007@mail.ru
Offline
Зарегистрирован: 28.12.2016

Друзья, помогайте! 
Чувствую, что продвижение есть, но очень медленными темпами! 
У кода сейчас следующий вид: 

#include <Servo.h>  //Подключение библиотеки Сервы

Servo fuelServo; // Объявляем имя сервы

#define rcPin1 8   // Pin 8 Connected to CH1 of Transmitter;
#define rcPin2 9   // Pin 9 Connected to CH2 (обороты)

#define servoPin 6 // назначае пин сервы

#define flame 2 //датчик пламени

#define iskra 5//нужно толькоо 0/+5в


int ch1 = 0;  // Receiver Channel 1 PPM value
int ch2 = 0;  // Receiver Channel 2 PPM value

void setup() {
  
  fuelServo.attach(servoPin); // Подключаем серво к пин 6
  
  pinMode(iskra, OUTPUT);  // пин системы зажигания 
  pinMode(rcPin1, INPUT);
  pinMode(rcPin2, INPUT);
  pinMode(flame, INPUT); //пин датчика опламени
  Serial.begin(9600);
}

void loop() 
{

///////////////////////
{
  // Read in the length of the signal in microseconds
  ch1 = pulseIn(rcPin1, HIGH, 20000);  // (Pin, State, Timeout)
  ch2 = pulseIn(rcPin2, HIGH, 20000);

  Serial.print("Channel #1: ");
  Serial.println(ch1);
  Serial.print("Channel #2: ");
  Serial.println(ch2);
  Serial.println("------------");
}


static int z = 0; //переменная накомительная чтобы к ней плюсовалось "1" как превышает 
//порог и обнулялось как ниже границы 10%

// !!!!!!!!!!!!!!Блок управления серво!!!!!!!!!!!!!!!!!!!!!!!!!

   if(ch2>ch1&&ch2>1200) // Если уровень оборотов превысил порог

     z++; //прибавляем к переменной 1 при каждом превышении уровнем оборотов порога

   if (z>0) //Если уровень оборотов превысил порог
   
     fuelServo.write(180); // Вколючилась серва
     
 if (ch2<1200) //есди уровень газа <10%, 
   
   z=0; // переменая Z обнуляется => серво выкл, зажигание выкл
}

//!!!!!!!!!!!!!!!!Блок управления зажиганием !!!!!!!!!!!!!!!!!!!!
   

Подключение изменилось - сигналы с приемника заведены на пины 8,9. Серва теперт подключена к пину 6. 

Дешифровал входящй ШИМ с помощью функции pulseIn. Об этом говорит то, что серва начала реагировать на изменение сигнала при  достижении уровня второго сигнала (моё сравнение заработало). Правда, сигнал по одному из пинов, очевидно, не считывается. Как это вылечить? Сделал всё точь в точь как у автора ( в предыдущем посте на него сслылался). 

Поэтому серва срабатывает при малейшем изменении сигнала, и обратно при достижении границы (1200) не возвращается, как прописано в условаии if. (а может и не поэтому). 

Блок управления зажиганием пока убрал. 

kak-dela007@mail.ru
Offline
Зарегистрирован: 28.12.2016

Всё, серва заработала, и PWM читается с обоих пинов 8,9! 

Изменил таймаут в этиз строках на значение в 2 раза больше от максимума, который показывает сериал монитор

35   ch1 = pulseIn(rcPin1, HIGH, 20000);  // (Pin, State, Timeout)
36   ch2 = pulseIn(rcPin2, HIGH, 20000);

Алгоритм открытия подачи топлива заработал как надо! 

Осталось запрограммировать включение зажигания. 

kak-dela007@mail.ru
Offline
Зарегистрирован: 28.12.2016

Почти получилось добиться желаемого результата.  

Единственное, что не понимаю как сделать - это добиться работы зажигания в течение 1 секунды, при любых условиях (даже при действии условия, запускающего зажигание). А повторное включение зажигания должно происходить только при повторном выполнении условия. В общем, зажигание должно работать не дольше 1 секунды и выключаться.  Кто знает как это сделать??? 

 

#include <Servo.h>  //Подключение библиотеки Сервы

Servo fuelServo; // Объявляем имя сервы

#define rcPin1 8   // Pin 8 Connected to CH1 of Transmitter;
#define rcPin2 9   // Pin 9 Connected to CH2 (обороты)

#define servoPin 6 // назначае пин сервы

#define flame 2 //датчик пламени

const int ledPin =  5;      // номер выхода, подключенного к светодиоду
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода
long previousMillis = 0;        // храним время последнего переключения светодиода
long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)



int ch1 = 0;  // Receiver Channel 1 PPM value
int ch2 = 0;  // Receiver Channel 2 PPM value

void setup() {
  
  fuelServo.attach(servoPin); // Подключаем серво к пин 6
 
 // задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin, OUTPUT);     
  
  pinMode(rcPin1, INPUT);
  pinMode(rcPin2, INPUT);
  pinMode(flame, INPUT); //пин датчика опламени
  Serial.begin(9600);
}

void loop() 
{

///////////////////////
{
  // Read in the length of the signal in microseconds
  ch1 = pulseIn(rcPin1, HIGH, 37880);  // (Pin, State, Timeout) 37880= 2x1894 (две длины импульса)
  ch2 = pulseIn(rcPin2, HIGH, 37880); 

  Serial.print("Channel #1: ");
  Serial.println(ch1);
  Serial.print("Channel #2: ");
  Serial.println(ch2);
  Serial.println("------------");
 
}


static int z = 0; //переменная накомительная чтобы к ней плюсовалось "1" как превышает 
//порог и обнулялось как ниже границы 10%

// !!!!!!!!!!!!!!Блок управления серво!!!!!!!!!!!!!!!!!!!!!!!!!


 
   if(ch2>=ch1&&ch2>1100) // Если уровень оборотов превысил порог

     z++; //прибавляем к переменной 1 при каждом превышении уровнем оборотов порога

   if (z>0) //Если уровень оборотов превысил порог
   {
     fuelServo.write(180); // Вколючилась серва
   }
 else

 {
   fuelServo.write(90); // Ставим серво в среднем положении. Эту строку можно не использовать
 }

     
 if (ch2<1100) //есди уровень газа <10%, 
   
   z=0; // переменая Z обнуляется => серво выкл, зажигание выкл

// Блок управления искрой!!!!!!!!!!!!!!!!!!!!!!!!!


   if  ((ch2>=ch1)&&(digitalRead( flame ) )) //Основное условие зажиганя

digitalWrite(ledPin, HIGH);

else

 digitalWrite( ledPin, LOW );

}
   

С помощью delay и millis получается добитьсся только мигания. А надо чтобы сработало и выключилось насовсем.

 

 

 

AlexeySh
Offline
Зарегистрирован: 16.01.2017

Добавляете две переменных. В одной запоминаете состояние зажигания. В другой момент включения. При включении выставляете первую переменную в 1. И запоминаете момент включения во второй переменной. В основном цикле проверяете эти переменные. Если уже включена, то сравниваете время сейчас с моментом включения. Если прошла одна секунда, то выключаете. Кратко как то так.

Если нужно чтобы сработало и больше не включалось, то выставляете в единицу ещё одну переменную при включении. И проверяете при включении если она уже была выставлена, то больше не включаете.

kak-dela007@mail.ru
Offline
Зарегистрирован: 28.12.2016

Всё что хотел сделать - получилось! Плюс - добавил повторное срабатывание цикла один раз, когда топливо гаснет. Осталось только немного отладить - когда гаснет огонь - серва тоже пытается выключиться, но потом сразу включается и включается искра. Но датчик не успевает среагировать (или серва не успевает повернуться). Из-за этого система входит в резонанс, и в конце концов - гаснет. Видео по ссылке. 

https://vimeo.com/201198410

Считаю что мнение о том, что на серву слишком больная нагрузка - было ошибочным. Теперь вот думаю как избавиться от этой дерготни (наверно надо как-то сделать, чтобы серва при погасшем огне не сразу выключалась, а хотя бы через полсекунды, а у меня сейчас там прямая зависимость: если на датчике LOW, то и серва тоже встает на 90 градусов.)

П.С.:пины немного изменил, но это большой роли не играет, т.к. почти всё там можно подключать к любым пинам. 

Код

 

#include <Servo.h>  //Подключение библиотеки Сервы

Servo fuelServo; // Объявляем имя сервы

#define rcPin1 8   // Pin 8 Connected to CH1 - порог уровня оборотов
#define rcPin2 9   // Pin 9 Connected to CH2 - обороты

#define servoPin 6 // назначае пин сервы

#define flame 2 //датчик пламени

const int ledPin =  5;      // номер выхода, подключенного к зажиганию
int ledState = LOW;             // этой переменной устанавливаем состояние зажигания
long previousMillis = 0;        // храним время последнего переключения зажигания
long interval = 2000;           // интервал между включение/выключением зажигания
int i = 0; //  Переменная запоминает было ли включение зажигания
static int One = 0; //Переменная для совершения цикла зажигания один раз


int ch1 = 0;  // Receiver Channel 1 PPM value (объявляем переменные каналов сперв. знач = 0)
int ch2 = 0;  // Receiver Channel 2 PPM value

void setup() {

  fuelServo.attach(servoPin); // Подключаем серво к пин 6

  // задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin, OUTPUT);

  pinMode(rcPin1, INPUT);
  pinMode(rcPin2, INPUT);
  pinMode(flame, INPUT); //пин датчика опламени
  Serial.begin(9600);
}

void loop()
{

  ///////////////////////
  {
    // Read in the length of the signal in microseconds
    ch1 = pulseIn(rcPin1, HIGH, 37880);  // Функцпя pulseIn обрабатывает сигнал PWM
    ch2 = pulseIn(rcPin2, HIGH, 37880); // (Pin, State, Timeout) 37880= 2x1894 (две длины импульса)

    Serial.print("Channel #1: ");
    Serial.println(ch1);
    Serial.print("Channel #2: ");   // блок вывода значенй ШИМ на каналах на сериал монитор
    Serial.println(ch2);
    Serial.println("------------");

  }


  static int z = 0; //переменная накомительная чтобы к ней плюсовалось "1" как превышает
  //порог и обнулялось как ниже границы 10% - (обнуление прописано в блоке зажигания)
  // нужна для алгоритма сервы и зажигания


  // !!!!!!!!!!!!!!Блок управления сервой!!!!!!!!!!!!!!!!!!!!!!!!!


  if (ch2 >= ch1 && ch2 > 1100) // Если уровень оборотов превысил порог

    z++; //прибавляем к переменной 1 при каждом превышении уровнем оборотов порога

  if (z > 0) //Если уровень оборотов однажды превысил порог
  {
    fuelServo.write(180); // Вколючилась серва
  }
  else

  {
    fuelServo.write(90); // Ставим серво в среднем положении.
  }


  if (ch2 < 1100) //есди уровень оборотов <10%,

    z = 0; // переменая Z обнуляется => серво выкл, зажигание выкл



  // !!!!!!!!!!!!!!!!!!!!!!!!!!Блок управления зажиганием!!!!!!!!!!!!!!!!!!!!!!!!!
  // устанавливаем состояния выхода, чтобы включить или выключить светодиод
  digitalWrite(ledPin, ledState);

  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();

  if (One == 1)  // Есть цикл один раз выполнялся,
    ledState = LOW, fuelServo.write(90); //то второй раз не заработает (здесь причиа дергания сервы вовремя повторого ключения зажигаия)

  if  ((One == 0) && (z > 0) && (digitalRead( flame ) )) // Если цикл ещё не выполнялся,
    // ИИ уровень оборотов > порога ИИ огня нет

    ledState = HIGH, fuelServo.write(180), i = 1; // включаем зажигание, включаем серву,
  // запоминаем переменную включения зажигания

  if ((i = 1) && (currentMillis - previousMillis > interval)) //Если зажигание включено,
    // ИИ прошло время больше интервала (2с)

  {


    ledState = LOW, fuelServo.write(90), previousMillis = currentMillis,  One = 1, i = 0; // ВЫкл зажигание,
    // ВЫкл серво, сохраняем время последнего переключения,
    //   переменная однократного исполнения цикла получает=1, обнуляем переменную зажигания




  }

  //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Блок обнуленя переменной "One"!!!!!!!!!!!!!!!!!!!!!!!////////
  if ((One == 1 && (z == 0))) //Если цикл один раз выполнялся, и уровень оборотов пересек нижнюю границу

    One = 0; // то переменная одноразового совершения цикла обнулется (цикл можно выполнить снова)


  //!!!!!!!!!!!!!Блок выключения искры при быстром вспыхивании!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  if (!digitalRead( flame ))     // Если горит огонь (топливо быстро загорелось), то
    ledState = LOW;   // искра погаснет сразу, не дожидаясь истечения таймаута



  // !!!!!!!!!!!!!!!!!!Блок удержания сервы при огне и выключения (Если не зажглось)!!!!!!!!!!!!!!
  static int u = 0; //Переменная хранения состояния удержания сервы (по сути состояния всего форсажа)


  if ((z > 0) && (!digitalRead( flame ))) // Если обороты однажды превысили порог и > 1100,и горит огонь
    fuelServo.write(180), u = 1; // Серва включена, состояние записано


  //!!!!!!!!!!!!!!!!!!!Блок повторного зажигания (если потухло)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  if ((u == 1) && (One = 1) && (digitalRead( flame ))) //Если серво удерживается (форсаж работает),
    // ИИ зажигание однажды срабатывало ИИ огонь внезапно потух

    One = 0, u = 0; // цикл зажигания сработает еще один раз,


}  //Крайняя фигурная скобка

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

kak-dela007@mail.ru пишет:

Друзья, помогайте! 
Чувствую, что продвижение есть, но очень медленными темпами! 

И это пишет человек, разместивший первое сообщение два дня назад!

Не торопитесь, через пару месяцев будет видно, "медленные" темпы или еще какие.

kak-dela007@mail.ru
Offline
Зарегистрирован: 28.12.2016

andriano пишет:

kak-dela007@mail.ru пишет:

Друзья, помогайте! 
Чувствую, что продвижение есть, но очень медленными темпами! 

И это пишет человек, разместивший первое сообщение два дня назад!

Не торопитесь, через пару месяцев будет видно, "медленные" темпы или еще какие.

Спасибо, на добром слове!) 

Но естетсвенно, вопросов пока много... 

Например столкнулся с тем, что при увеличении считываемых ШИМ-каналов до 4х, по одному из них сериал монитор упорно показывает "0". Если в прошлый раз, когда каналов было 2 подобная ситуация вылечилась увеличением таймаута, то сейчас этим не лечится. В чем может быть проблема? Зачем вообще нужен этот таймаут? 

На Ютубе нашел у людей до 6-ти каналов, причем у некоторых вообще нет никакого таймаута, и всё работает. 

Код 
 

#include <Servo.h>  //Подключение библиотеки Сервы

Servo fuelServo; // Объявляем имя сервы

#define rcPin1 8   // Pin 8 Connected to CH1 - порог уровня оборотов
#define rcPin2 9   // Pin 9 Connected to CH2 - обороты
#define tataPin 10  // Пуск, соединяется с приемником
#define switPin 11  // Переключение пуска, соед с приемником

/////////////////////////////Пины пуска \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

#define AirsoftPin1 7
#define AirsoftPin2 12

////////////////////////////Пины пуска_2\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

#define RokPin0 A0
#define RokPin1 A1
#define RokPin2 A2
#define RokPin3 A3
#define RokPin4 A4
#define RokPin5 A5

#define servoPin 6 // назначае пин сервы

#define flame 2 //датчик пламени

const int ledPin =  5;      // номер выхода, подключенного к зажиганию
int ledState = LOW;             // этой переменной устанавливаем состояние зажигания
long previousMillis = 0;        // храним время последнего переключения зажигания
long interval = 2000;           // интервал между включение/выключением зажигания
int i = 0; //  Переменная запоминает было ли включение зажигания
static int One = 0; //Переменная для совершения цикла зажигания один раз


int ch1 = 0;  // Receiver Channel 1 PPM value (переменая порога уровня оборотов с перв. знач = 0)
int ch2 = 0;  // Receiver Channel 2 PPM value (переменная оборотов)

int tata = 0;  // Переменная кнопки спуска
int swit = 0;  // переменная переключателя (Пуск/Пуск2)

void setup() {

  fuelServo.attach(servoPin); // Подключаем серво к пин 6

  pinMode(ledPin, OUTPUT);  // режим пина зажигания (светодиода)

  pinMode(rcPin1, INPUT); // Пин уровня оборотов (для срабатывания)
  pinMode(rcPin2, INPUT); // Пин оборотов (газа)
  pinMode(flame, INPUT); //пин датчика опламени
  Serial.begin(9600);

  pinMode (tataPin, INPUT);
  pinMode (switPin, INPUT);

  pinMode (AirsoftPin1, OUTPUT);
  pinMode (AirsoftPin2, OUTPUT);

  pinMode    (RokPin0, OUTPUT);
  pinMode    (RokPin1, OUTPUT);
  pinMode    (RokPin2, OUTPUT);
  pinMode    (RokPin3, OUTPUT);
  pinMode    (RokPin4, OUTPUT);
  pinMode    (RokPin5, OUTPUT);


}

void loop()
{

  ///////////////////////
  {
    // Read in the length of the signal in microseconds
    ch1 = pulseIn(rcPin1, HIGH, 37880);  // Функцпя pulseIn обрабатывает сигнал PWM
    ch2 = pulseIn(rcPin2, HIGH, 37880); // (Pin, State, Timeout) 37880= 2x1894 (две длины импульса)
    tata = pulseIn (tataPin, HIGH, 37880);
    swit = pulseIn(swit, HIGH, 37880);

    Serial.print("Channel #1: ");
    Serial.println(ch1);
    Serial.print("Channel #2: ");   // блок вывода значенй ШИМ на каналах на сериал монитор
    Serial.println(ch2);
    Serial.print ("Channel #3: ");
    Serial.println(tata);
    Serial.print ("Channel #4: ");
    Serial.println(swit);
    Serial.println("------------");                             

  }

 

Причем выводиться упорно не хочет значение только 4-го канала (строки 86,87).

   Serial.print ("Channel #4: ");
    Serial.println(swit);

Судя по всему, программа переменную  swit не считает. 

Подключение - проверял, дело именно в программе. 

kak-dela007@mail.ru
Offline
Зарегистрирован: 28.12.2016

Отбой по последнему сообщению, нашел ошибку!

В 78 строке вместо названия пина switPin указана переменная swit. Исправил, всё заработало)