Завязано всё на датчике ВМР 180. Все прописано в коде, а код походу написан при помощи какой то среды, для меня там тяжело отследить алгоритм.
красная линия на графике - это напряжение на воспламенителе?
действительно рано подано напряжение, непонятно, на что сработал датчик
Сейчас попробую сделать скрин с Exel с данными и попробую код вставить
- - - Добавлено - - -
вот скрин с файла записаного с альтиметра
А это код
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <BMP085.h>
File _sd1DF;
String _sd1TS;
BMP085 _bmp085 = BMP085();
long _bmp085A = 0;
long _FLPArray43228430[5];
long _FLPArray56316734[3];
int _SUETFLPATemp = 0;
bool _trgrt2 = 0;
bool _trgrt2I = 0;
bool _pzs2OES = 0;
bool _gen2I = 0;
bool _gen2O = 0;
unsigned long _gen2P = 0UL;
bool _SFLPAS1;
bool _gen4I = 0;
bool _gen4O = 0;
unsigned long _gen4P = 0UL;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _SFLPAS2;
bool _trgr1 = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
long _SUETFLPA1;
bool _sd1SVOS1 = 0;
bool _trgr3 = 0;
void setup()
{
Wire.begin();
_bmp085.init(MODE_ULTRA_LOW_POWER, 0, true);
pinMode(7, INPUT);
digitalWrite(7, HIGH);
pinMode(1, OUTPUT);
pinMode(0, OUTPUT);
pinMode(2, OUTPUT);
pinMode(8, OUTPUT);
pinMode(6, OUTPUT);
SD.begin(4);
SPI.begin();
pinMode(10, OUTPUT);
}
void loop()
{ if (_trgrt2) {
_bmp085.getAltitude(&_bmp085A);
}
if (0) _trgr1 = 0;
if (!( (digitalRead (7)))) _trgr1 = 1;
if (1) {
if (! _gen2I) {
_gen2I = 1;
_gen2O = 1;
_gen2P = millis();
}
} else {
_gen2I = 0 ;
_gen2O = 0;
}
if (_gen2I) {
if ( _isTimer ( _gen2P , 100 )) {
_gen2P = millis();
_gen2O = ! _gen2O;
}
}
if (( (_gen2O) && (_trgr1) ))
{
if ((!_pzs2OES)) {
tone(3, 1000);
_pzs2OES = 1;
}
} else {
if (_pzs2OES) {
noTone(3);
_pzs2OES = 0;
}
}
if (0) _trgr3 = 0;
if (( (((_SUETFLPA1) / (5)) < ((_FLPArray56316734[0]))) && (((_SUETFLPA1) / (5)) >= (300)) )) _trgr3 = 1;
if (_trgr3) {
if (! _gen1I) {
_gen1I = 1;
_gen1O = 1;
_gen1P = millis();
}
} else {
_gen1I = 0 ;
_gen1O = 0;
} if (_gen1I && _gen1O) _gen1O = !( _isTimer( _gen1P , 1000 ));
if (((_SUETFLPA1) / (5)) >= (300)) {
_tim1O = 1;
_tim1I = 1;
} else {
if (_tim1I) {
_tim1I = 0;
_tim1P = millis();
} else {
if (_tim1O) {
if ( _isTimer(_tim1P, 1000)) _tim1O = 0;
}
}
}
if (( (_trgrt2) && (_tim1O) ))
{ if (! _sd1SVOS1) {
_sd1TS = "bmp180;";
_sd1TS += "LongInteger;"; _sd1TS += ";";
_sd1TS += (String((_SUETFLPA1) / (5)));
_sd1TS += ";";
_sd1TS += ((String("cm ")) + ((String((byte(_gen1O))))));
_sd1TS += ";";
_sd1DF = SD.open("test.csv", FILE_WRITE);
if (_sd1DF) {
_sd1DF.println(_sd1TS);
_sd1DF.close();
}
_sd1SVOS1 = 1;
}
}
else
{
if ( _sd1SVOS1) {
_sd1SVOS1 = 0;
}
}
if (1) {
if (! _gen4I) {
_gen4I = 1;
_gen4O = 1;
_gen4P = millis();
}
} else {
_gen4I = 0 ;
_gen4O = 0;
}
if (_gen4I) {
if ( _isTimer ( _gen4P , 25 )) {
_gen4P = millis();
_gen4O = ! _gen4O;
}
}
if (_gen4O) {
if (_trgrt2I) {
_trgrt2 = 0;
} else {
_trgrt2 = 1;
_trgrt2I = 1;
}
} else {
_trgrt2 = 0;
_trgrt2I = 0;
};
digitalWrite(2, !(( (_gen2O) && (_trgr1) )));
digitalWrite(8, _trgr1);
if (_trgrt2) {
if (!_SFLPAS2) {
_SFLPAS2 = 1;
for (_SUETFLPATemp = 0; _SUETFLPATemp < 2; _SUETFLPATemp = _SUETFLPATemp + 1 ) {
_FLPArray56316734[_SUETFLPATemp ] = _FLPArray56316734[_SUETFLPATemp + 1];
} _FLPArray56316734[2] = (_SUETFLPA1) / (5);
}
} else {
_SFLPAS2 = 0;
}
digitalWrite(0, !(_gen1O));
digitalWrite(6, _gen1O);
if (_trgrt2) {
if (!_SFLPAS1) {
_SFLPAS1 = 1;
for (_SUETFLPATemp = 0; _SUETFLPATemp < 4; _SUETFLPATemp = _SUETFLPATemp + 1 ) {
_FLPArray43228430[_SUETFLPATemp ] = _FLPArray43228430[_SUETFLPATemp + 1];
} _FLPArray43228430[4] = _bmp085A;
}
} else {
_SFLPAS1 = 0;
}
_SUETFLPA1 = 0;
for (_SUETFLPATemp = 0; _SUETFLPATemp < 5; _SUETFLPATemp = _SUETFLPATemp + 1) {
_SUETFLPA1 = _SUETFLPA1 + _FLPArray43228430[_SUETFLPATemp];
}
digitalWrite(1, !(( (_trgrt2) && (_tim1O) )));
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime >= startTime) {
return (currentTime >= (startTime + period));
} else {
return (currentTime >= (4294967295 - startTime + period));
}
}
- - - Добавлено - - -
У меня сложилось впечатление, что при выбросе парашюта, ракета по инерции делает оборот вокруг него, а если прикинуть что длинна строп от датчика составляет порядка 2 метра. То на то и выходит (после активации резкое снижение, а потом возрастаное высоты, как бы описывание круга вокруг парашюта)
Я не шарю как закинуть полный файл Exel и код.
код не нужен, никто в нём не разберётся
дело не в кувыркании
вопрос в том, на какое событие отреагировал датчик апогея?
обычно барометрический датчик определяет, что высота начала уменьшаться, и выбрасывает парашют
а здесь парашют выброшен раньше, чем высота начала уменьшаться
почему?
Как раз всё наоборот, только высота ушла в минус, и сработал вышибной.
Мне кажется все таки дело в самом датчике, так как у него довольна большая погрешность, если память не изменяет+- 0,7 метра. На большой скорости значения не успевают уйти в отрицательную сторону от пред идущих, но вот если разница в значениях уменьшается из - за уменьшения скорости подъема, то в определенный момент система регистрирует падение, хотя всё устройство еще продолжает подниматься.
Я думаю вся проблема в датчике BMP180. Хотя если учесть отсутствие в необходимости хирургическую точности и довольна простую конструкцию считаю, что в общем все работает в допуске.
А вообще обращусь наверное к создателю кода, чтобы помог в корректировке параметров.
если код написан так, что он реагирует на единичный случайный шум, то это плохой код
должно быть усреднение и правильный алгоритм
высота ведь медленно изменяется не только около апогея, но и на старте
значит парашют может вылететь и здесь
Нет.
Запись и контроль высоты начинается с 3 метров (эти значения высоты регулируются). А на высоте 3 метра скорость уже довольно приличная. Это высотомер мне предоставил Александр Бражинков, её он разрабатывал с несколькими единомышлиниками, с ним я связался через Авиабазу. После тестов я обнаружил некоторые проблемы с записью данных и он их поправил. Так что используемую ССР считаю довольна таки качественной, но все же есть место для корректировки.
хорошо, что разработчик отзывается, значит все недочёты можно устранить
успешных новых полётов!)
Продолжаем летать .
https://youtu.be/7M_Okamcc58
В рамках эксперимента изначально было сделано два двигателя одинаковой длинны.
Первый был изготовлен в бессопловом исполнении, второй с соплом (длинна канала меньше на 2,5 см. так как это расстояние было занято соплом). Двигателя были заправлены топливом одной партии. Запуск проводился почти при одинаковых погодных условиях. Вчера был лёгенький сквознячек.
Из запусков стало ясно , что наличие сопла даёт нормальный прирост в подъеме, при меньшем объеме топлива.
* бессопловик поднял на высоту 560 метров, с соплом 640 метров.
небольшая поправка, на графике указал длину канала 17,5. Истина - 17см.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)