Контрль форсажа меленькой самолетной электро-турбины
- Войдите на сайт для отправки комментариев
Чт, 19/01/2017 - 08:17
Система контроля форсажа импеллера (авиамодельной электротурбины).
Форсаж осуществляется по принципу 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 обнуляется => серво выкл, зажигание выкл } }
После добавления библиотеки <Servo.h>, сервомеханизм начал двигаться - спасибо AlexeySh. Правда при сигнале с датчика пламени - принимает крайнее положение (чего быть не должно). Но после каких-то изменений в программе этот эффект пропал. Теперь серва даже реагирует при изменении сигнала уровня оборотов, правда это выражается только в подергивании.
Пришел к выводу, что с входящим сигналом ШИМ надо что-то делать.
Нашел несколько вариантов:
1) Декодировать входящий ШИМ вручную (с помощью функций PulseIn и еще каких-то) - пока не понятно как это делать.
2) Перекодировтаь PWM в общий PPM с помощью программы энкодера (напримет такой, как используют в Ардупилоте, как советуют вот здесь.
По этому варианту тоже не ясно, как его применить на UNO
3) Сгладить ШИМ сигнал с помощью фильтра (чтобы подать на аналоговые выходы сигнал от 0 до +5в), как советуют здесь . Но где взять его схему подключения и какие номиналы деталей?
Уверен, что первые 2 способоа предпочтительнее третьему, т.к. в них работа, думается, будет качественней.
Пока код имеет вот такой вид
Проме приведенных ссылок по теме нашел еще вот это. Но как собрать всё воедино - пока не понимаю.
Чувствую, что мягко говоря, не всё ровно у меня с переменными, т.к. блок управления искрой - тоже не работает. (который из себя представляет по сути усовершенствованную программу мигания диодом, зависящую от входящих сигналов). Светодиод даже для приличия не маргнул не разу.
Подскажите, куда копать?
Загрузил скетч вот из этого проекта
Но почему-то в сериал мониторе показывает только один канал (первый), на втором - 0. В лучшем случает второй канал покажет в самом начале работы монитора, но тогда на первом - 0. Хотя подключил всё точь вточь как описано. Единственное - приемник другой (Devo). Но не думаю, что у него от Frsky принципиально сигнал отличается (сервы одни и те же работают на обоих приемниках). С чем это может быть связано? Как это исправить? Считываются ли на самом деле значения?
В монитре предлагаемого автором приложения PuTTY - то же, что и в ардуиновском
Друзья, помогайте!
Чувствую, что продвижение есть, но очень медленными темпами!
У кода сейчас следующий вид:
Подключение изменилось - сигналы с приемника заведены на пины 8,9. Серва теперт подключена к пину 6.
Дешифровал входящй ШИМ с помощью функции pulseIn. Об этом говорит то, что серва начала реагировать на изменение сигнала при достижении уровня второго сигнала (моё сравнение заработало). Правда, сигнал по одному из пинов, очевидно, не считывается. Как это вылечить? Сделал всё точь в точь как у автора ( в предыдущем посте на него сслылался).
Поэтому серва срабатывает при малейшем изменении сигнала, и обратно при достижении границы (1200) не возвращается, как прописано в условаии if. (а может и не поэтому).
Блок управления зажиганием пока убрал.
Всё, серва заработала, и PWM читается с обоих пинов 8,9!
Изменил таймаут в этиз строках на значение в 2 раза больше от максимума, который показывает сериал монитор
35
ch1 = pulseIn(rcPin1, HIGH, 20000);
// (Pin, State, Timeout)
36
ch2 = pulseIn(rcPin2, HIGH, 20000);
Алгоритм открытия подачи топлива заработал как надо!
Осталось запрограммировать включение зажигания.
Почти получилось добиться желаемого результата.
Единственное, что не понимаю как сделать - это добиться работы зажигания в течение 1 секунды, при любых условиях (даже при действии условия, запускающего зажигание). А повторное включение зажигания должно происходить только при повторном выполнении условия. В общем, зажигание должно работать не дольше 1 секунды и выключаться. Кто знает как это сделать???
С помощью delay и millis получается добитьсся только мигания. А надо чтобы сработало и выключилось насовсем.
Добавляете две переменных. В одной запоминаете состояние зажигания. В другой момент включения. При включении выставляете первую переменную в 1. И запоминаете момент включения во второй переменной. В основном цикле проверяете эти переменные. Если уже включена, то сравниваете время сейчас с моментом включения. Если прошла одна секунда, то выключаете. Кратко как то так.
Если нужно чтобы сработало и больше не включалось, то выставляете в единицу ещё одну переменную при включении. И проверяете при включении если она уже была выставлена, то больше не включаете.
Всё что хотел сделать - получилось! Плюс - добавил повторное срабатывание цикла один раз, когда топливо гаснет. Осталось только немного отладить - когда гаснет огонь - серва тоже пытается выключиться, но потом сразу включается и включается искра. Но датчик не успевает среагировать (или серва не успевает повернуться). Из-за этого система входит в резонанс, и в конце концов - гаснет. Видео по ссылке.
https://vimeo.com/201198410
Считаю что мнение о том, что на серву слишком больная нагрузка - было ошибочным. Теперь вот думаю как избавиться от этой дерготни (наверно надо как-то сделать, чтобы серва при погасшем огне не сразу выключалась, а хотя бы через полсекунды, а у меня сейчас там прямая зависимость: если на датчике LOW, то и серва тоже встает на 90 градусов.)
П.С.:пины немного изменил, но это большой роли не играет, т.к. почти всё там можно подключать к любым пинам.
Код
Друзья, помогайте!
Чувствую, что продвижение есть, но очень медленными темпами!
И это пишет человек, разместивший первое сообщение два дня назад!
Не торопитесь, через пару месяцев будет видно, "медленные" темпы или еще какие.
Друзья, помогайте!
Чувствую, что продвижение есть, но очень медленными темпами!
И это пишет человек, разместивший первое сообщение два дня назад!
Не торопитесь, через пару месяцев будет видно, "медленные" темпы или еще какие.
Спасибо, на добром слове!)
Но естетсвенно, вопросов пока много...
Например столкнулся с тем, что при увеличении считываемых ШИМ-каналов до 4х, по одному из них сериал монитор упорно показывает "0". Если в прошлый раз, когда каналов было 2 подобная ситуация вылечилась увеличением таймаута, то сейчас этим не лечится. В чем может быть проблема? Зачем вообще нужен этот таймаут?
На Ютубе нашел у людей до 6-ти каналов, причем у некоторых вообще нет никакого таймаута, и всё работает.
Код
Причем выводиться упорно не хочет значение только 4-го канала (строки 86,87).
Судя по всему, программа переменную swit не считает.
Подключение - проверял, дело именно в программе.
Отбой по последнему сообщению, нашел ошибку!
В 78 строке вместо названия пина switPin указана переменная swit. Исправил, всё заработало)