FY-20A/FY-21AP - Катайский трёхосевой стаб на MEMS гирах и акселерометрах + OSD и автопилот
у меня процесс долгий. к лету может соберу.
пока просто пощелкал тумблером. увидел что “что-то” переключается, покрутил ручку, увидел что режимы меняются, покачал сам модуль, увидел что сервы работают.
пока все 😃
да и как я узнаю что что-то изменилось. предыдущих версий я не видел
Если будет всё работать хорошо, вы сообщите и мы все будем знать. Много в этом устройстве было непонято, по-разному оно работало, хотя так не должно быть.
ок 😃
Дома отсимулировал, получилось: в Северо-Западном полушарии летит на 70, в Юго-Западном куда-то на 250, в Северо-Восточном идет в заданную точку и там кружит, в Юго-Восточном на 250. Пробовал как в GCS 2.2, так и своем софте, поведение одинаково. И при этом еще говорит абсолютно точно координаты заданной точки, то есть ошибка в железяке похоже. Кто-нибудь сталкивался?
При переходе через экватор и через гринвич в южное и в западное полушарие надо на борту знаки перед числами широты и долготы менять на отрицательные для вычисления азимута на точку. ГПС-то не выдает отрицательные числа координат, он выдает N/S и W/E и положительные числа.
Похоже, они это не сделали.
При переходе через экватор и через гринвич в южное и в западное полушарие надо на борту знаки перед числами широты и долготы менять на отрицательные для вычисления азимута на точку.
В протоколе, который принимает и передает Фишка 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-ке порядок не тот, что у Интеля. 😃
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
Какие байты менять? И почему тогда она возвращает правильное значение (равно как и я читаю все координаты с телеметрии без проблем с теми же формулами)?
Какие байты менять?
Думаю, ошибка в 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, следовательно это:
dat(6) = (x - x Mod 256 + &H8000) / 256
Правильно. (Хотел посоветовать убрать + &H8000).
PS: Что это за язык?
Это Visual Basic. + &H8000 не стоит убирать, тогда он будет одинаковые данные посылать в прибор для обоих полушарий. Хотя… в этом что-то есть. Обидно, тратил время на прогу (хоть и для себя) а самое интересное она делать не умеет.
Обидно, тратил время на прогу (хоть и для себя) а самое интересное она делать не умеет.
А если запросить, координаты, что выдает? Попробуйте моей приблудой: files.mail.ru/0XPZL0
По запросу координаты не выдает, все точки (текущая, дом, циркуляция) у нее в потоке телеметрии и закодированы соответственно 8 битами (4lat+4lon). Если значение отрицательное, то прибавляет + &H8000 к первому биту. Координаты всегда выдает верные или заданные с земли.
все точки (текущая, дом, циркуляция) у нее в потоке телеметрии и закодированы соответственно 8 битами (4lat+4lon). Если значение отрицательное, то прибавляет + &H8000 к первому биту
Конкретно в том месте, где Вы находитесь, текущие координаты выдает E или W?
смотрите как он это пишет
То есть Вы ввели N, W, а она подменила W на E (сбросила битик)?
Вот собака! Это похоже на ограничение ПКТ только для своего четвертьшария…
Если это не моя ошибка, конечно. 😃 А если точку ввести Вашей программой, а глянуть моей?
на каком языке код, может переведу к себе в basic?
C++ под среду Visual Studio 6.
Исходники положил здесь: files.mail.ru/37HUUI
Если Вы пользуетесь VisualBasic-ом, среда - одна и та-же.
А!!! 545 градусов - это моя ошибка. 😃
Не тот битик сбрасывал. Здесь поправил: files.mail.ru/YWCHBF
В исходнике gsmmodem.cpp найдите пару 0x7ffff, уберите лишнюю f…
А!!! 545 градусов - это моя ошибка.
Ну, допустим, но такую точку она по крайней мере адекватно отображает. В остальном никак, правда ошибка (или?) харда. Программа выйдет с красивой заглушкой на остальные полушария. Теперь еще пару летных и опубликую здесь sites.google.com/site/glassgamma/. 31 не покупаю. Александр, еще раз спасибо.
Не знаю ,было или нет , вот обнаружил интерестную инфу по переделке обыкновенной FY-20 в copter control , …openpilot.org/…/5567-coptercontrol-runs-on-the-fy…
!
вот обнаружил интерестную инфу по переделке обыкновенной FY-20 в copter control
О, как мило! Теперь понятно, что дальше делать с этим китайским непотребством.
ИМХО, гораздо приятнее учиться на своих ошибках, чем страдать от изысков фейтеховской поддержки. 😃
PS: Там фактически дана схема FY-20.
Сегодня собрал всю начинку для Ская- fy21+ ap21 c подключением видео(fatshark). Стабилизация работает, режимы переключаются( правда в RC входит с небольшой задержкой). Проблема в том что по непонятной причине пропадает видео. Если положить палец снизу на плату видеопередатчика в том месте где находиться видеоразьем- все появляется. Не пропай отпадает- пробовал два разных передатчика, симптомы те-же. Может проблема в проводах от камеры к АР117 и от АР до видеопередатчика?(штатный кабель камеры +10см до АР и 20 после).
Если на вход передатчика включаешь камеру- видео есть:)))))
Может проблема в проводах от камеры к АР117 и от АР до видеопередатчика?
ИМХО, проблемма либо в разводке общего (минуса), либо в с лабом сигнале с камеры, либо в ВЧ наводках. В первом случе видео должно зависеть от тока, взятого с акка. Во втором - дело случайное. Попробуйте одеть ферритовое колечко/муфту на кабель к передатчику.
Не знаю ,было или нет , вот обнаружил интерестную инфу по переделке обыкновенной FY-20 в copter control
Очень заманчиво. Фишка без дела валяется, а вроде и решение есть. Только для меня там информации маловато, чтобы повторить. Кто-нибудь это пробовал делать?
Очень заманчиво. Фишка без дела валяется, а вроде и решение есть. Только для меня там информации маловато, чтобы повторить. Кто-нибудь это пробовал делать?
Вроде ничего сложного… Из новых деталей юсб разьем и какаято микросхема справа от удемонтированых крутилок , и проволочные перемычки.
Вроде ничего сложного… Из новых деталей юсб разьем и какаято микросхема справа от удемонтированых крутилок , и проволочные перемычки.
А где прошивка, да и чем шить?