FY-20A/FY-21AP - Катайский трёхосевой стаб на MEMS гирах и акселерометрах + OSD и автопилот

Wasja

Пришло мое время. Вчера у нас настало лето и время полетов. Заготовил я прогу новописанную под FY-21AP чтобы и телеметрию читала и команды раздавала, самолет двухметровый, чтобы летал и не падал и поехал на поле все это тестировать. Ну значит, взлет, набор на круге по команде с компа, все координаты, скорости красиво пишет, настало время полета по точке (в FY-21 есть ОДНА точка) ну жму координаты деревянного камня, самолет отвечает что уже летит, обвел значит красной рамкой, все как дома на GPS симуляторе и (тут половина форума говорит, что горизонт встал колом, а самолет морковкой, как же) и полетел так бодренько в сторону (Китая?) 70 градусов по компасу (точка, ясно дело в другой стороне). Нажал я Return Home - вернулся. Нажал обратно WP - кружит как надо, где его команда застала. Радиус меняет. Высоту меняет.
Дома отсимулировал, получилось: в Северо-Западном полушарии летит на 70, в Юго-Западном куда-то на 250, в Северо-Восточном идет в заданную точку и там кружит, в Юго-Восточном на 250. Пробовал как в GCS 2.2, так и своем софте, поведение одинаково. И при этом еще говорит абсолютно точно координаты заданной точки, то есть ошибка в железяке похоже. Кто-нибудь сталкивался?

baychi
Wasja:

Дома отсимулировал, получилось: в Северо-Западном полушарии летит на 70, в Юго-Западном куда-то на 250, в Северо-Восточном идет в заданную точку и там кружит, в Юго-Восточном на 250. Пробовал как в GCS 2.2, так и своем софте, поведение одинаково. И при этом еще говорит абсолютно точно координаты заданной точки, то есть ошибка в железяке похоже. Кто-нибудь сталкивался?

Странно сие. Ведь в режиме RTH координаты базы просто подставляются как целевая точка. Я когда с FY21AP своей прогой на столе игрался, подставлял точки - она довольно правильно расстояние считатала и прочее. Правда эмулятор GPS не подключал. Может ошибка все-же во вводе WP через GСS? Чтонить с E/W N/S напутано.

PS: Проверять заново не буду, так как с Фишкой - заваязал. 😃

Wasja

В том-то и дело, что в протоколе точка RTH высчитывается только самим железом по первой минуте после получения спутников и она не может быть изменена с компа. Точка циркуляции при старте соответствующего режима тоже вычисляется железом по текущей координате самолета. Ее как раз и меняет софт чтобы получить функцию “полет к точке” (причем только в режиме циркуляции). Так вот в моем полушарии - Северо-Западном он эту точку меняет на заданную, а летит четко на направление 70 (причем поведение совершенно сходное как в GCS, так и у меня), в российскоеврокитайском Северо-Восточном все в порядке. Боюсь что и мне завязывать придется.

type_2

вот и я себе прикупил 21ap

а не расскажет кто как ее режимы на 3х режимный тумблер повесить? аппаратура - футаба 7с
ни разу не пользовася этим переключателем вообще и не знаю даже в какой канал что втыкать и что выбирать :\

Юрий_Захаров

Алексей, напишите, если что-то нештатно пойдет. Вы ведь приобрели недавно, может уже что-то улучшили производители в последних выпусках.

type_2

у меня процесс долгий. к лету может соберу.
пока просто пощелкал тумблером. увидел что “что-то” переключается, покрутил ручку, увидел что режимы меняются, покачал сам модуль, увидел что сервы работают.
пока все 😃

да и как я узнаю что что-то изменилось. предыдущих версий я не видел

Юрий_Захаров

Если будет всё работать хорошо, вы сообщите и мы все будем знать. Много в этом устройстве было непонято, по-разному оно работало, хотя так не должно быть.

smalltim
Wasja:

Дома отсимулировал, получилось: в Северо-Западном полушарии летит на 70, в Юго-Западном куда-то на 250, в Северо-Восточном идет в заданную точку и там кружит, в Юго-Восточном на 250. Пробовал как в GCS 2.2, так и своем софте, поведение одинаково. И при этом еще говорит абсолютно точно координаты заданной точки, то есть ошибка в железяке похоже. Кто-нибудь сталкивался?

При переходе через экватор и через гринвич в южное и в западное полушарие надо на борту знаки перед числами широты и долготы менять на отрицательные для вычисления азимута на точку. ГПС-то не выдает отрицательные числа координат, он выдает N/S и W/E и положительные числа.
Похоже, они это не сделали.

baychi
smalltim:

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

В протоколе, который принимает и передает Фишка GPS координаты кодируются как:
struct GPS_coord { // Координаты GPS
Word curLat; // широта град
Word curLatFrac; // широта доли градусов
Word curLong; // долгота град
Word curLongFrac; // широта доли градусов
};

Сама Фишка, запомнив координаты базы, делает RTH нормально - проверено неоднократно.

Так что ИМХО дело тут в наземке, как она преобразует текст в эту структуру.
Я делал так:

// Преобразования GPS кординат
void GPS_coord::toText(char *str) // преобразовать в текст
{
int g1,m1,g2,m2;
double lat=(swapW(curLat)&0x7ffff); // в минутах
double lon=(swapW(curLong)&0x7ffff);

char la=‘N’,ln=‘E’;
if(curLat & 128) la=‘S’;
if(curLong & 128) ln=‘W’;

g1=int(lat/60); g2=int(lon/60); // переведем в градусы
m1=fmod(lat,60); m2=fmod(lon,60); // выделим минуты
lat=swapW(curLatFrac)*0.006; lon=swapW(curLongFrac)*0.006; // секунды и их доли
sprintf(str,“%3d°%02d’%04.1f’‘%c;%3d°%02d’%04.1f’'%c”,g1,m1,lat,la,g2,m2,lon,ln);
}

int GPS_coord::fromText(char *str) // преобразовать из текста
{
double lat=0,lon=0;
char la=‘N’,ln=‘E’;
Word w;
char *cp;
int g1=0,m1=0,g2=0,m2=0;

sscanf(str,“%d”,&g1);
cp=strchr(str,‘°’); if(!cp) return 0;
sscanf(cp+1,“%d”,&m1);
cp=strchr(cp,‘\’‘); if(!cp) return 0;
lat=atof(cp+1);
cp=strchr(cp+1,’\‘’); if(!cp) return 0;
if(cp[1] != ‘\’‘) return 0;
la=cp[2];
cp=strchr(cp+1,’;‘); if(!cp) return 0;
sscanf(cp+1,“%d”,&g2);
cp=strchr(cp+1,‘°’); if(!cp) return 0;
sscanf(cp+1,“%d”,&m2);
cp=strchr(cp,’\‘’); if(!cp) return 0;
lon=atof(cp+1);
cp=strchr(cp+1,‘\’‘); if(!cp) return 0;
if(cp[1] != ‘\’’) return 0;
ln=cp[2];
w=lat/0.006; curLatFrac=swapW(w);
w=g1*60+m1; curLat=swapW(w);
w=lon/0.006; curLongFrac=swapW(w);
w=g2*60+m2; curLong=swapW(w);
if(la == ‘S’) curLat |=128;
if(la == ‘W’) curLong |=128;
return 1;
}

PS: swapW() - маняет байтики местами, так как на STM-ке порядок не тот, что у Интеля. 😃

Wasja
baychi:

PS: swapW() - маняет байтики местами, так как на STM-ке порядок не тот, что у Интеля.

Ух ты! С этого момента поподробней (я в Си не очень): когда я меняю Waipoint, я посылаю в порт такую команду:
FyCommand = {&HA5, &H5A, китайцу помолимся
12, это сколько скажу total data length
&HC2, это команда на изменение точки

latitude dat(2), dat(3), dat(4), dat(5),

longitude dat(6), dat(7), dat(8), dat(9),

(12 + &HC2 + dat(2) + dat(3) + dat(4) + dat(5) + dat(6) + dat(7) + dat(8) + dat(9)) Mod 256, &HAA} контрольная сумма, которую он не считает, конец

оператор mod это остаток от деления

'East longitude (это проходит отлично)

x = целые минуты
dat(6) = (x - x Mod 256) / 256
dat(7) = x Mod 256

y = десятитысячные минуты
dat(8) = (y - y Mod 256) / 256
dat(9) = y Mod 256

'west longitude (а в этом случае он возвращает в потоке телеметрии правильное значение заданной точки и летит на 70 потому и думаю, что это железяка - хотя когда она сама себе задает точку циркуляции или дома, все в полном порядке).

x = целые минуты
dat(6) = (x - x Mod 256 + &H8000) / 256
dat(7) = (x + &H8000) Mod 256

y = десятитысячные минуты
dat(8) = (y - y Mod 256) / 256
dat(9) = y Mod 256

Какие байты менять? И почему тогда она возвращает правильное значение (равно как и я читаю все координаты с телеметрии без проблем с теми же формулами)?

baychi
Wasja:

Какие байты менять?

Думаю, ошибка в dat(2) и dat(6) - там в старших битах кодируется полушарие и запад/восток.
Логика простая:

char la=‘N’,ln=‘E’;
if(dat(2) & 128) la=‘S’ ( else ‘N’😉
if(dat(6) & 128) ln=‘W’; (else ‘E’).
Не знаю как для Испании, а для Москвы надо N и E (то есть 0-е старшие биты). 😃
Ан нет - у Вас там W, следовательно это:

Wasja:

dat(6) = (x - x Mod 256 + &H8000) / 256

Правильно. (Хотел посоветовать убрать + &H8000).

PS: Что это за язык?

Wasja

Это Visual Basic. + &H8000 не стоит убирать, тогда он будет одинаковые данные посылать в прибор для обоих полушарий. Хотя… в этом что-то есть. Обидно, тратил время на прогу (хоть и для себя) а самое интересное она делать не умеет.

baychi
Wasja:

Обидно, тратил время на прогу (хоть и для себя) а самое интересное она делать не умеет.

А если запросить, координаты, что выдает? Попробуйте моей приблудой: files.mail.ru/0XPZL0

Wasja

По запросу координаты не выдает, все точки (текущая, дом, циркуляция) у нее в потоке телеметрии и закодированы соответственно 8 битами (4lat+4lon). Если значение отрицательное, то прибавляет + &H8000 к первому биту. Координаты всегда выдает верные или заданные с земли.

baychi
Wasja:

все точки (текущая, дом, циркуляция) у нее в потоке телеметрии и закодированы соответственно 8 битами (4lat+4lon). Если значение отрицательное, то прибавляет + &H8000 к первому биту

Конкретно в том месте, где Вы находитесь, текущие координаты выдает E или W?

Wasja

W, конечно, но смотрите как он это пишет
похоже с вашей программой ведет себя адекватней (сложно понять без карты и не в поле), на каком языке код, может переведу к себе в basic? Ага,перевел, вроде понятней, буду завтра по карте смотреть, спасибо.

baychi
Wasja:

смотрите как он это пишет

То есть Вы ввели N, W, а она подменила W на E (сбросила битик)?
Вот собака! Это похоже на ограничение ПКТ только для своего четвертьшария…
Если это не моя ошибка, конечно. 😃 А если точку ввести Вашей программой, а глянуть моей?

Wasja:

на каком языке код, может переведу к себе в basic?

C++ под среду Visual Studio 6.
Исходники положил здесь: files.mail.ru/37HUUI
Если Вы пользуетесь VisualBasic-ом, среда - одна и та-же.

А!!! 545 градусов - это моя ошибка. 😃
Не тот битик сбрасывал. Здесь поправил: files.mail.ru/YWCHBF
В исходнике gsmmodem.cpp найдите пару 0x7ffff, уберите лишнюю f…

Wasja
baychi:

А!!! 545 градусов - это моя ошибка.

Ну, допустим, но такую точку она по крайней мере адекватно отображает. В остальном никак, правда ошибка (или?) харда. Программа выйдет с красивой заглушкой на остальные полушария. Теперь еще пару летных и опубликую здесь sites.google.com/site/glassgamma/. 31 не покупаю. Александр, еще раз спасибо.

baychi
hudognik:

вот обнаружил интерестную инфу по переделке обыкновенной FY-20 в copter control

О, как мило! Теперь понятно, что дальше делать с этим китайским непотребством.
ИМХО, гораздо приятнее учиться на своих ошибках, чем страдать от изысков фейтеховской поддержки. 😃

PS: Там фактически дана схема FY-20.

Вася-Вася

Сегодня собрал всю начинку для Ская- fy21+ ap21 c подключением видео(fatshark). Стабилизация работает, режимы переключаются( правда в RC входит с небольшой задержкой). Проблема в том что по непонятной причине пропадает видео. Если положить палец снизу на плату видеопередатчика в том месте где находиться видеоразьем- все появляется. Не пропай отпадает- пробовал два разных передатчика, симптомы те-же. Может проблема в проводах от камеры к АР117 и от АР до видеопередатчика?(штатный кабель камеры +10см до АР и 20 после).
Если на вход передатчика включаешь камеру- видео есть:)))))

baychi
Вася-Вася:

Может проблема в проводах от камеры к АР117 и от АР до видеопередатчика?

ИМХО, проблемма либо в разводке общего (минуса), либо в с лабом сигнале с камеры, либо в ВЧ наводках. В первом случе видео должно зависеть от тока, взятого с акка. Во втором - дело случайное. Попробуйте одеть ферритовое колечко/муфту на кабель к передатчику.

nemo61
hudognik:

Не знаю ,было или нет , вот обнаружил интерестную инфу по переделке обыкновенной FY-20 в copter control

Очень заманчиво. Фишка без дела валяется, а вроде и решение есть. Только для меня там информации маловато, чтобы повторить. Кто-нибудь это пробовал делать?