Телеметрия (часть 1)

maza

smalltim, мне кажется информация о количестве спутников лишняя.
Для служебной инфы наверное надо внедрить кнопку, по которой будет отображатся всякая информация.
А вообще отличные результаты!

mitmit

Привет Smalltim, результаты Вашей работы впечатляют, а можно какнить заказать такую штучку у Вас? Я вот прямо готов.
Кстати, иметь высоту и скорость от GPS неплохо, не все любят навешивать доп датчики давления и т.п. А расход mAh умеет показывать?

Dikoy
smalltim:

Пора интегрировать код GPS в Атмегу, но есть пара вопросов.

Можно задать несколько вопросов гуру по GPS?

  1. Не все. Обычно скорость 9600, но бывает и 19200 и 4800. У некоторых приёмников (типа LEA-LA) настраивается лапками, у более продвинутых можно управлять конфигом через порт. В любом случае, надо смотреть доку на конкретный приёмник.

  2. Это правильнее называть строками. Обычный набор строк RMC, GGA, VTG. Остальные по желанию производителя.

  3. Скорее не некоторые, а все 😃

  4. Я обычно вывожу режим ориентации none/2D/3D. Это более информативно, чем число спутников. Число спутников ничего не значит - они могут быть, но приёмник их не пользует. А вот от режима ориентации зависит всё - релевантность высоты, точность по горизонтали.

  5. Никаких. Приёмники начинают слать пакеты сразу же. Обычно по дефолту они шлют всё, что умеют. Далее можно влезть в настройки и отключить ненужное, чтобы МК не дёргать лишними данными Вот, я снимал с LEA-4H в разных режимах:

Начальное, состояние, ещё не определено НИЧЕГО:
$GPGGA,0,00,99.99,*48
$GPGSA,A,1,99.99,99.99,99.99*30
$GPGSV,1,1,01,05,35*7B
$GPGLL,V,N*64
$GPZDA,00,00*48
$GPRMC,V,N*53
$GPVTG,N*30
Определено время, дата:
$GPGGA,130309.00,0,00,99.99,*6E
$GPGSA,A,1,99.99,99.99,99.99*30
$GPGSV,1,1,01,05,33*7D
$GPGLL,130309.00,V,N*42
$GPZDA,130309.00,04,03,2008,00,00*63
$GPRMC,130310.00,V,040308,N*72
$GPVTG,N*30
Три спутника зелёные, но определения ещё нет:
$GPGGA,130551.00,0,03,13.44,*64
$GPGSA,A,1,12,05,14,13.47,13.44,1.00*01
$GPGSV,2,1,05,12,07,027,36,05,07,043,38,17,28,14,29,056,38*4F
$GPGSV,2,2,05,02,26*7A
$GPGLL,130551.00,V,N*49
$GPZDA,130551.00,04,03,2008,00,00*68
$GPRMC,130552.00,V,040308,N*72
$GPVTG,N*30
Есть 2D ориентация.
$GPGGA,130559.00,5402.49037,N,03816.97447,E,1,03,13.47,486.4,M,13.6,M,*60
$GPGSA,A,2,12,05,14,13.51,13.47,1.00*06
$GPGSV,2,1,05,12,07,027,37,05,07,043,38,17,29,14,29,056,39*4E
$GPGSV,2,2,05,02,27*7B
$GPGLL,5402.49037,N,03816.97447,E,130559.00,A,A*6D
$GPZDA,130559.00,04,03,2008,00,00*60
$GPRMC,130600.00,A,5402.49098,N,03816.97437,E,0.904,234.07,040308,A*67
$GPVTG,234.07,T,M,0.904,N,1.675,K,A*37
Есть 3D ориентация.
$GPGGA,131721.00,5402.25746,N,03816.70816,E,1,06,3.75,229.6,M,13.6,M,*52
$GPGSA,A,3,12,05,14,01,30,17,4.91,3.75,3.17*0D
$GPGSV,3,1,11,20,53,281,18,31,43,109,12,07,023,32,32,31,096,17*7E
$GPGSV,3,2,11,23,26,227,19,05,08,038,36,14,25,056,33,01,55,064,34*74
$GPGSV,3,3,11,30,06,056,28,17,23,302,35,11,53,224,22*47
$GPGLL,5402.25746,N,03816.70816,E,131721.00,A,A*6B
$GPZDA,131721.00,04,03,2008,00,00*6C
$GPRMC,131722.00,A,5402.25751,N,03816.70816,E,0.018,040308,A*71
$GPVTG,T,M,0.018,N,0.033,K,A*2A
Ещё пример 3D ориентации:
$GPGGA,131259.00,5402.26208,N,03816.70657,E,1,05,3.75,241.7,M,13.6,M,*53
$GPGSA,A,3,12,05,30,17,14,5.76,3.75,4.38*0E
$GPGSV,3,1,10,20,51,280,20,31,42,112,19,12,07,025,34,32,32,095,18*7B
$GPGSV,3,2,10,05,08,040,37,30,05,057,24,17,23,304,31,14,27,056,33*77
$GPGSV,3,3,10,11,55,226,21,23,26*48
$GPGLL,5402.26208,N,03816.70657,E,131259.00,A,A*66
$GPZDA,131259.00,04,03,2008,00,00*66
$GPRMC,131300.00,A,5402.26217,N,03816.70658,E,0.152,241.34,040308,A*64
$GPVTG,241.34,T,M,0.152,N,0.281,K,A*30

Вертолетчик
mitmit:

Привет Smalltim, результаты Вашей работы впечатляют, а можно какнить заказать такую штучку у Вас? Я вот прямо готов.
Кстати, иметь высоту и скорость от GPS неплохо, не все любят навешивать доп датчики давления и т.п. А расход mAh умеет показывать?

Присоединяюсь. Тоже хочется прикупить такой девайс. Если это не возможно, то нельзя ли документацию подробную, не за бесплатно конечно.

maza

Какую документацию вы хотите? Читайте в теме, все необходимые файлы для постройки выложены.

Вертолетчик
maza:

Какую документацию вы хотите? Читайте в теме, все необходимые файлы для постройки выложены.

По подключению GPS компаса…

SGordon

А компас еще тока подключают, как я понял …

Хотел как всегда уточнить, планируется ли новая платка или будет очередной проводок к меге?

Dikoy
Вертолетчик:

По подключению GPS компаса…

Там не компас. GPS приёмник вычисляет курс математически, по точкам. При нулевой скорости его так мотать будет, что ой 😃 Считается, что все параметры, завязаные на скорости, начинают быть релевантными начиная с 5-10 км/ч. По этому я бы привязал показания GPS к датчику скорости (по давлению) и на малых скоростях просто не показывать часть оных.

Вертолетчик

Люди, поделитесь рабочей программой EAGLE. Накачал кучу, ни одна путем не пашет! 😠

maza

Тут где то писалось что он в определенную папку должен быть установлен, не помню какую вот только…
но мне точно помогало.

smalltim

>Хотел как всегда уточнить, планируется ли новая платка или будет очередной проводок к меге?

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

>Тут где то писалось что он в определенную папку должен быть установлен, не помню какую вот только…
но мне точно помогало.

Да в любую папку, только без русских букв и не длинную. Ну, например, c:\avia или d:\vasya\pupkin

>все параметры, завязаные на скорости, начинают быть релевантными начиная с 5-10 км/ч.

Да, при очень маленькой скорости относительно земли я собираюсь гасить стрелку. То же самое с указателем на базу: если самик ближе, скажем, 10 метров, то указатель гасится.

… блин, всё никак не могу придумать, как половчее циферки из ASCII в 32-битные целые переводить, да чтоб код был покомпактнее, да чтоб не завязываться на фиксированное количество знакомест, а то разные GPS приемники разное количество точек после запятой выдают. Кстати, посчитал, 4 разрядов после запятой достаточно, 5-й, выдаваемый напромер u-bloxами отброшу. Одна десятитысячная доля минуты в широте дает 18 см по земле, куда еще точнее, когда сам GPS приемник точность плюс-минус 2-3 метра выдает ? 😃

smalltim

Dikoy:

Смотрю на Ваши данные. Блин, если GPS приемник вздумает произвольно из 2D в 3D и обратно переключаться в полете, в зависимости от расположения спутников, то показания широны-долготы будут скакать, и судя по Вашим данным, сильно, на 500 метров туда-сюда. Надо будет запоминать базовые координаты в режиме 2D и в 3D, и в зависимости от текущего режима приемника, сравнивать текущие координаты с 2D или c 3D координатами.

smalltim

Поругайте, вот какая схема нарисовалось в плане подсчета расстояния до базы.
В текущем варианте максимальное расстояние - около 47 км, разрешение - около 0.7 м
По привычке всё пишу на английском. но там и так всё понятно.

;
; Range calculation algorithm sketch
; Набросок алгоритма подсчета расстояния до базы
;
; Lat: ddmm.MMMMN  (N - optional digit, mblox uses it, globalsat does not)
; Lon: dddmm.MMMMN (N - optional digit, mblox uses it, globalsat does not)
;
; Integer Lat = (dd*60  + mm)*256*10 + MMMM*(2560/10000); iLat=dd;
; Integer Lon = (ddd*60  + mm)*256*10 + MMMM*(2560/10000)
;
; Results are 2560ths of minutes, Least Significant Bit is 1/2560th of minute = 111.1 km /(60*2560) = 0.72335 m
;
; dLat = startLat - currentLat; perfectly fits to 4 bytes,
; dLon = startLon - currentLon; also perfectly fits to 4 bytes.

; If I throw out high two bytes and keep only 2 low bytes of dLat(dLon),
; I'll get max dLat(dLon)=65536/2560=25.6 minutes which is (25.6/60)*111.1 = 47 km. More than enough
;
; cos(Lat)=COS_TABLE(integer Lat degrees value = iLat); COS_TABLE = 90 WORD values, range=0..65535
;
;
;
;
; okay, now:
;
; dY=dLat*111.1111 km/deg = dLat* 1.8518km/minute = dLat*0.72335 m = (dLat * 47405) >> 16  (meters)
;													^		^
;													16bits  16 bits (0.72335*65536)
;
; dX=cos(Lat)*dLon*111.1111 km/deg = cos(Lat)* dLon*0.72335 m = ((COS_TAB(iLat)*dLon >> 16) * 47405) >> 16  (meters)
;
;
;
; Range = SQRT(dX*dX+dY*dY)  (meters);
;

Вуаля. Будут потери точности из-за целочисленной математики, табличного косинуса и сферической модели земли, но это какие-то доли процента, даже лень считать.

SGordon

Можно ли у Вас еще уточнить, с каким модулем работаете, и где приобретался, если не секрет …

smalltim
SGordon:

Можно ли у Вас еще уточнить, с каким модулем работаете, и где приобретался, если не секрет …

GlobalSat EM-408 OEM (Sirf III) TTL, интернет-магазин sportall.ru

Dikoy
smalltim:

… блин, всё никак не могу придумать, как половчее циферки из ASCII в 32-битные целые переводить, да чтоб код был покомпактнее, да чтоб не завязываться на фиксированное количество знакомест, а то разные GPS приемники разное количество точек после запятой выдают. Кстати, посчитал, 4 разрядов после запятой достаточно, 5-й, выдаваемый напромер u-bloxами отброшу. Одна десятитысячная доля минуты в широте дает 18 см по земле, куда еще точнее, когда сам GPS приемник точность плюс-минус 2-3 метра выдает ? 😃

У меня такая функция:
float mas_to_float(char *str, unsigned char len) {
float scale, result;
char *start;
result=0.0;
start = str;
str += len;

while (*str!=‘.’)
{
result=(result+(*str-‘0’))/10.0;
–str;
};

scale=1.0;
while (–str>=start)
{
result=result+scale*(*str-‘0’);
scale=scale*10.0;
};

if (*start==‘-’) result=-result;
return result;
}

Она короче Сишной atof и быстрее.
А быстро переводить не получится… Даже если десятичное умножение заменить сдвигами.

Dikoy

Насчёт пятого разряда, это вы зря 😉

smalltim:

Dikoy:

Смотрю на Ваши данные. Блин, если GPS приемник вздумает произвольно из 2D в 3D и обратно переключаться в полете, в зависимости от расположения спутников, то показания широны-долготы будут скакать, и судя по Вашим данным, сильно, на 500 метров туда-сюда. Надо будет запоминать базовые координаты в режиме 2D и в 3D, и в зависимости от текущего режима приемника, сравнивать текущие координаты с 2D или c 3D координатами.

Не поможет 😦 В 2D режиме сама точность хуже, сохранение ничего не даст.
Эти данные я снимал из окна. В полёте спутники теряются очень редко (если модуль и антенна правильные). Так что я бы забил и в 2D режиме просто не использовал данные, сохраняя предыдущий вектор.
Боюсь, математика, которая нужна для фильтрации таких событий, в мегу8 не влезет… Во первых, по времени, во вторых - по объёму. Мне пришлось писать свою математику и ставить фильтры, в итоге всё занимеает около 60 кБ… Но работает шустро зато.

Вуаля. Будут потери точности из-за целочисленной математики, табличного косинуса и сферической модели земли, но это какие-то доли процента, даже лень считать.

Табличный косинус - стандартное решение 😉 Все так делают, при определённой доле извращенства погрешность можно свести почти к нулю.
А насчёт целочисленной математики - вы же работаете от стартовой точки. Почему бы не взять её за ноль и не работать на добавках 😉 Даже умноженые на 10000 величины широт/долгот не выйдут за 16 бит, а регистры у АВР 16-битные 😉 Так получится сильно скорее.
Вот тут полезный материал: nauka.nsk.ru/e-books/Bond/naviga6/niva6_01.htm

Кузнецов

Мда… Приехал…
Вижу…Никаких мыслей…
Надо беседовать с вертолетчиками…