События‎ > ‎

Подключение GPS модуля SkyLab SKM53

Отправлено 25 июл. 2012 г., 14:37 пользователем Олег Евсегнеев   [ обновлено 25 июл. 2012 г., 14:54 ]
Сегодня был подвергнут небольшому тестированию очередной жизненно важный орган квадрокоптера - GPS модуль. 

SkyLab SKM53
Ассортимент готовых к использованию GPS модулей весьма невелик. Из всех найденных мной на ebay.ru модулей, SkyLab SKM53 оказался самым дешевым. К тому же, все отзывы найденные мной были положительные. С доставкой из США данное устройство обошлось в $31.

Из характеристик модуля следует отметить потребление тока всего 30мА в режиме слежения (Tracking) и 40мА в режиме позиционирования (Acquisition). Время холодного пуска - 36с и горячего пуска - 1с. 66 каналов для позиционирования и 22 канала для слежения. Даташит можно взять тут.

Модуль имеет 6 контактов с очевидным предназначением: 
  1. RXD - соединяем с tx контроллера;
  2. TXD - соединяем с rx контроллера или вообще ни с чем не соединяем;
  3. RST - сброс, не соединяем (низкий активный уровень);
  4. NC - тоже пустой контакт;
  5. GND - земля;
  6. VCC - 5v, 150ma
SkyLab SKM53 подключение
В официальном даташите рекомендуется также повесить конденсатор 10uf на вход питания для развязки. Якобы это снизит уровень помех и тем самым повысит качество приема. Конденсатор на всякий случай был установлен.

Контакты модуля немного меньше стандарта 0.1", поэтому в комплекте имеется небольшая pcb переходная площадка для стандартных пинов. Поразмышляв о дизайне корпуса квадрокоптера и полистав google было решено припаять площадку не совсем тривиальным способом. Теперь коннектор не торчит в стороны, и модуль занимает меньше места.

После сборки схемы был проведен первый тест. Для начала хотелось просто получить NMEA предложения из модуля.

Как видно из видео, модуль вполне себе работает, данные поступают. Следующий шаг - разбор NMEA предложения и получение конкретных значений широты и долготы. Для разбора данных была использована библиотека TinyGPS, портированная с Arduino на mbed одним умельцем. 

Сразу же обнаружилась неприятная проблема. GPS возвращает данные с частотой 1Гц, и чтобы не занимать основной цикл постоянным опросом последовательного порта, было решено производить опрос раз в секунду. То есть ждем 1 секунду и сливаем все данные из буфера порта. Но не тут то было, у встроенного FIFO буфера размер всего 16 байт (судя по месту обрезания NMEA). В результате, получаем только по 16 байт от каждого пакета NMEA предложений. 

Проблема была решена использованием модернизированной библиотеки для работы с последовательным портом (MODSERIAL) с программным буфером 256 байт (по-умолчанию). Для работы с LCD использована TextLCD. Код получившейся тестовой программы представлен ниже.

GPS SKM53 read

#include "mbed.h"
#include "TinyGPS.h"
#include "MODSERIAL.h"
#include "TextLCD.h"

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
Serial pc(USBTX, USBRX); // tx, rx
MODSERIAL gps(p9, p10); // tx, rx
TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2); // rs, e, d4-d7

TinyGPS m_gps;
Timer tmr;

unsigned long sat, SAT;
double lat, lon;
double LAT, LON;

int start = 0;
char side_lat = '\0';
char side_lon = '\0';

Timeout t3;

void t2out(void) { led2 = 0; }
void blip2(void) { led2 = 1; t3.attach(&t2out, 0.2); }
 
void t3out(void) { led3 = 0; }
void blip3(void) { led3 = 1; t3.attach(&t3out, 0.2); }

bool feedgps(){
    while( gps.readable() ){
        if( m_gps.encode(gps.getc()) ){
            return true;
        }
    }
    return false;
}

int main() {
    tmr.start();
    pc.baud(115200);
    gps.baud(9600);
    led1 = 1;
    led2 = 0;
    led3 = 0;
    while(1) {
        if( tmr.read_ms() - start > 500 ){
            start = tmr.read_ms();
            if( feedgps() ){
                blip2();
                m_gps.f_get_position(&lat, &lon);
                sat = m_gps.sat_count();
                if( sat )
                    blip3();
                
                if( sat != SAT  || lat != LAT || lon != LON){
                    SAT = sat; LAT = lat; LON = lon;
                    side_lat = LAT > 0 ? 'N' : 'S';
                    side_lon = LON > 0 ? 'E' : 'W';
                        
                    lcd.locate(0,0);
                    lcd.printf("%.2f%c - %.2f%c", LON, side_lon, LAT, side_lat);
                    lcd.locate(0,1);
                    lcd.printf("%d sat", SAT/100);
                }
            }
        }
    }
}

Программа выводит значения широты и долготы на двухстрочный LCD дисплей. А также отображается количество зафиксированных спутников.

Результаты полевых испытаний

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

Вторая попытка увенчалась успехом. Модуль вместе с mbed и дисплеем были запитаны от 4 х AA батарей (больше 6В кстати) и помещен в авто. Практически сразу были зафиксированы 4 спутника, а при выезде на свободное пространство - 9. К сожалению, если выключить питание на час, модулю требуется опять выполнять холодный запуск, а следовательно опять требуется чистое небо.

В общем, для исходной цели навигации квадрокоптера, модуль вполне подходит. В ближайшее время ожидается прибытие радио модулей APC220, испытания будут проведены незамедлительно.
Comments