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

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

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

hudognik
nemo61:

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

Вроде ничего сложного… Из новых деталей юсб разьем и какаято микросхема справа от удемонтированых крутилок , и проволочные перемычки.

zis
hudognik:

Вроде ничего сложного… Из новых деталей юсб разьем и какаято микросхема справа от удемонтированых крутилок , и проволочные перемычки.

А где прошивка, да и чем шить?

hudognik

Прошивкой коптер контрола через их прогамму для компа…

zis
hudognik:

Прошивкой коптер контрола через их прогамму для компа…

А прилепленная микросхема очень похожа на чип памяти для которого тоже нужна прошивка.

baychi
zis:

прилепленная микросхема очень похожа на чип памяти для которого тоже нужна прошивка.

Это внешняя FLASH-ка. Туда лог пишется.