GPS Bee + Mega Sensor Shield+ Arduino Mega 2560

Тема в разделе "Arduino & Shields", создана пользователем Misha00000, 4 авг 2013.

  1. Misha00000

    Misha00000 Нуб

    Купил себе GPS Bee.
    Подскажите как с ней работать используя Mega Shield.
    По описанию данные должны быть в NMEA. Хотелось бы их просто транслировать на компьютер.
    Или подскажите где можно почитать про shield и работу с gps.
    Заранее спасибо.
     
  2. DenisNP

    DenisNP Нерд

    Mega Shield, как я понял, это просто расширяющий интерфейс для подключения всяких там Bee и подобных. То есть такая удобная прослойка. Разницы в работе с Bee между ней и Wireless Shield не должно быть.

    А для работы с GPS советуют вроде как библиотеку, потому что иначе придется занимать стандартный Serial.

    Есть еще туториал на английском и близкая к теме статья на русском.
     
    Misha00000 нравится это.
  3. Misha00000

    Misha00000 Нуб

    если смотреть английский туториал, то должно хватить этого кода
    Код (C):
    int ledPin = 13;                  // LED test pin
    int byteGPS=-1;

    void setup() {
      // initialize serial communication:
      Serial.begin(9600);
      // initialize the LED pins:
      pinMode(ledPin, OUTPUT);
    }

    void loop() {
       digitalWrite(ledPin, HIGH);  // check if script works
       byteGPS=Serial.read();        // Read a byte of the serial port
       if (byteGPS == -1) {        // See if the port is empty yet
         delay(100);                  // Otherwise wait a little
       } else {
          Serial.write(byteGPS);      // Write GPS Bee output to Serial
       }
    }
    Из этой части я так понимаю
    , что данные он читает которые ему идут по usb, так?
    значит нужно указывать другой serial порт. Если нужно, то какой?
    У меня получается 3 слота Bee. Разве не нужно как-то указывать к какому слоту я его подключал? Или это не важно?
     
  4. Sergey991

    Sergey991 Нерд

    Здравствуйте.. У меня была очень похожая задачка с расшифрованием NMEA посылки. Вот код ОЧЕНЬ ХОРОШИЙ
    Код (C):
    #include <TinyGPS.h>
    TinyGPS gps;
    void gpsdump(TinyGPS &gps);
    void printFloat(double f, int digits = 2);

    void setup()
    {
      Serial.begin(9600); //Сюда будут приходить расшифрованные данные
      Serial1.begin(4800); //GPS
    }

    void loop()
    {
      bool newdata = false;
      unsigned long start = millis();
      while (millis() - start < 1) {
        if (Serial1.available()) {
          char c = Serial1.read();
          if (gps.encode(c)) {
            newdata = true;
          }
        }
      }

      if (newdata) {
        Serial.println("-------------");
        gpsdump(gps);
        Serial.println("-------------");
        Serial.println();
      }
    }

    void gpsdump(TinyGPS &gps)
    {
      long lat, lon;
      float flat, flon;
      unsigned long age, date, time, chars;
      int year;
      byte month, day, hour, minute, second, hundredths;
      unsigned short sentences, failed;

      gps.get_position(&lat, &lon, &age);
      Serial.print("Lat/Long(10^-5 deg): ");
      Serial.print(lat);
      Serial.print(", ");
      Serial.print(lon);
      Serial.print(" Fix age: ");
      Serial.print(age);
      Serial.println("ms.");
      gps.f_get_position(&flat, &flon, &age);
      Serial.print("Lat/Long(float): ");
      printFloat(flat, 5);
      Serial.print(", ");
      printFloat(flon, 5);
      Serial.print(" Fix age: ");
      Serial.print(age);
      Serial.println("ms.");
      gps.get_datetime(&date, &time, &age);
      Serial.print("Date(ddmmyy): ");
      Serial.print(date);
      Serial.print(" Time(hhmmsscc): ");
      Serial.print(time);
      Serial.print(" Fix age: ");
      Serial.print(age);
      Serial.println("ms.");
      gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
      Serial.print("Date: ");
      Serial.print(static_cast<int>(month));
      Serial.print("/");
      Serial.print(static_cast<int>(day));
      Serial.print("/");
      Serial.print(year);
      Serial.print("  Time: ");
      Serial.print(static_cast<int>(hour));
      Serial.print(":");
      Serial.print(static_cast<int>(minute));
      Serial.print(":");
      Serial.print(static_cast<int>(second));
      Serial.print(".");
      Serial.print(static_cast<int>(hundredths));
      Serial.print("  Fix age: ");  
      Serial.print(age);
      Serial.println("ms.");
      Serial.print("Alt(cm): ");
      Serial.print(gps.altitude());
      Serial.print(" Course(10^-2 deg): ");
      Serial.print(gps.course());
      Serial.print(" Speed(10^-2 knots): ");
      Serial.println(gps.speed());
      Serial.print("Alt(float): ");
      printFloat(gps.f_altitude());
      Serial.print(" Course(float): ");
      printFloat(gps.f_course());
      Serial.println();
      Serial.print("Speed(knots): ");
      printFloat(gps.f_speed_knots());
      Serial.print(" (mph): ");
      printFloat(gps.f_speed_mph());
      Serial.print(" (mps): ");
      printFloat(gps.f_speed_mps());
      Serial.print(" (kmph): ");
      printFloat(gps.f_speed_kmph());
      Serial.println();
      gps.stats(&chars, &sentences, &failed);
      Serial.print("Stats: characters: ");
      Serial.print(chars);
      Serial.print(" sentences: ");
      Serial.print(sentences);
      Serial.print(" failed checksum: ");
      Serial.println(failed);
    }
    void printFloat(double number, int digits)
    {
      if (number < 0.0) {
        Serial.print('-');
        number = -number;
      }
      double rounding = 0.5;
      for (uint8_t i=0; i<digits; ++i)
        rounding /= 10.0;
      number += rounding;
      unsigned long int_part = (unsigned long)number;
      double remainder = number - (double)int_part;
      Serial.print(int_part);
      if (digits > 0)
        Serial.print(".");
      while (digits-- > 0) {
        remainder *= 10.0;
        int toPrint = int(remainder);
        Serial.print(toPrint);
        remainder -= toPrint;
      }
    }
    То есть если newdata = true то влазием в void gpsdump а там уже дело техники.
    нам приходит высота. время скорость широта долгота дата колчиество доступных спутников и тд.
    P.S. Жду спасибки =_=
     
    Misha00000 нравится это.
  5. Sergey991

    Sergey991 Нерд

    ОТпишитесь когда опробуете..
     
  6. Misha00000

    Misha00000 Нуб

    Спасибо за хороший код.
    Но у меня проблема такая, что ничего не выводится. Я не понимаю какой сериал писать. Пробовал 1,2,3 ничего.
    На gps просто красный огонек горит. На шеилде у меня 3 слота. Я например подключил к Com1. Нужно ли это куда-то прописывать. С Arduino я новичек.
     
  7. Sergey991

    Sergey991 Нерд

    Так начинать надо с того чтобы GPS спутники нашел. Когда он горит красным огоньком тогда он ищет спутники.
    Попробуйте вынести ваш модуль на балкон и дождитесь когда красный огонек будет мигать (это значит что он нашел спутники и передает данные на выход).
    Вот код который принимает данные с одного порта и в таком же виде передает на другой
    Код (C):

    void setup()  
    {
      Serial.begin(9600); //USB
      Serial1.begin(4800); //GPS
    }

    void loop()
    {
      if (Serial1.available())
        Serial.write(Serial1.read());
      if (Serial.available())
        Serial1.write(Serial.read());
    }
    Получать вы будете (после нахождения спутников) NMEA Посылки. Отпишитесь.
     
    Misha00000 нравится это.
  8. Misha00000

    Misha00000 Нуб

    Еще раз спасибо.
    Единственное я изменил 4800 на 9600 на gps, а то каракозябы получались, но спутники полностью искать не хочет.
    Некоторые программы показывают меня на карте точно, но местоположение, иногда, скачет на несколько километров, а красный огонек все горит, хотя уже 2-ой час поисков на улице.
     
  9. Nabla

    Nabla Нуб

    а вот куда он отправляет данные?
    где их смотреть?
     
  10. Megakoteyka

    Megakoteyka Оракул Модератор

    Попробуйте поискать фирменный софт для приемника - с его помощью можно попробовать сбросить альманах приемника - возможно, это поможет (но потом может потребоваться до 40 минут на первое определение положения, если я ничего не путаю).
     
  11. Димон

    Димон Нуб

    Здравствуйте имеется http://www.aliexpress.com/item/GPS-...39-Free-Shipping-Dropshipping/1404056586.html использую ваш код на
    Arduino Mega 2560
    горит только зелый светодиод спутники не ловит на балконе антенна при открытом порте на ардуино РТ ТХ молчит программа естественно тоже не видит
     
  12. lerik2703

    lerik2703 Гик

    а как вы шилд соединили с ардуино?
     
  13. Димон

    Димон Нуб

    17042014159.jpg
     
  14. lerik2703

    lerik2703 Гик

    если вы умете читать сктчи ,то там есть строка Serial1.begin(4800);//GPS которая говорит что GPS приемник подключен к 2-му сериал порту (19 (RX) и 18 (TX) пины) а не как 1-му (0 (RX) и 1 (TX))
     
  15. Димон

    Димон Нуб

    спс подключил перемычки но толку никакого такое впечатление что жпс мертвый тупо горит зелый светодиод и все
     
  16. lerik2703

    lerik2703 Гик

    возможно, не понятно зачем там переключалка 3.3<>5 вольт, обычно приемники питаются от 2.7-3.6 вольт...
     
  17. Mitrandir

    Mitrandir Гуру

    Сбоку нечто походее на стабилизатор, который из 5 вольт делает 3.3 как раз под ним два smd кондея.
     
  18. Димон

    Димон Нуб

    наверно стабилизатор на плате выключает чтоб запитывать от нужного питания на ардуино 3.3 и 5 в перепутано если на шилд смотреть
    Я так понял если поставить 1 пин будет работать как во втором варианте --- подключен к 2-му сериал порту (19 (RX) и 18 (TX) пины) а не как 1-му (0 (RX) и 1 (TX))
     
  19. lerik2703

    lerik2703 Гик

    в смысле пин 1?
     
  20. Димон

    Димон Нуб

    Serial1.begin(4800);//GPS которая говорит что GPS приемник подключен к 2-му сериал порту (19 (RX) и 18 (TX) пины) а не как 1-му (0 (RX) и 1 (TX))