Подключение UBLOX M8N к Arduino

AdDa
Offline
Зарегистрирован: 06.05.2019

Имеется вот такой модуль GPS  UBLOX M8N

Подскажите пожалуйста рабочий скетч для работы с ним. Пробовал найденный проект на гитхабе,  Arduino_Parser_Ublox_Neo_M8N  - почему то не работает, к модулю подключается  шлет одни нули, хотя по индикатору на модуле видно, что к спутнику подключился и получает данные (зеленый светодиод горит), переключаешь его к компу, чтоб работал через ucenter - данные шлет нормальные, как ток к ардуино - нули...

sadman41
Offline
Зарегистрирован: 19.10.2016

Скорость не та, поди. В u-center (консоль) блохастый NMEA шлет или свои, мю-строки?

AdDa
Offline
Зарегистрирован: 06.05.2019

Не скорость перепроверял, везде сделано 115200... 
U center шлет 

??:??:??  $GNRMC,,V,,,,,,,,,,N*4D
??:??:??  $GNVTG,,,,,,,,,N*2E
??:??:??  $GNGGA,,,,,,0,00,99.99,,,,,,*56
??:??:??  $GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E
??:??:??  $GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E
??:??:??  $GPGSV,1,1,01,28,,,23*73
??:??:??  $GLGSV,1,1,04,,,,25,,,,25,,,,25,,,,25*61
??:??:??  $GNGLL,,,,,,V,N*7A

Мне бы знать точно, если скетч 100% рабочий, то тогда разбираться что не так, я просто не уверен, что рабочий скетч 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

надо 9600

AdDa
Offline
Зарегистрирован: 06.05.2019

но в скетче 115200....  и конфиг файл для модуля на 115200 настроен 

AdDa
Offline
Зарегистрирован: 06.05.2019

Тут все настроил как мне надо - работает, на скорости 115200.
Перехожу в Arduino 
 

#include "Ublox.h"
#define SERIAL_BAUD 115200
#define GPS_BAUD 115200
#define N_FLOATS 4

Ublox M8_Gps;
// Altitude - Latitude - Longitude - N Satellites
float gpsArray[N_FLOATS] = {0, 0, 0, 0};

void setup() {
   Serial.begin(SERIAL_BAUD);
   Serial1.begin(GPS_BAUD);
 
}

void loop() {
   if(!Serial1.available())
		return;

  while(Serial1.available()){
        char c = Serial1.read();
         if (M8_Gps.encode(c)) {
          gpsArray[0] = M8_Gps.altitude;
          gpsArray[1] = M8_Gps.latitude;
          gpsArray[2] = M8_Gps.longitude; 
          gpsArray[3] = M8_Gps.sats_in_use;
        }
  }
  for(byte i = 0; i < N_FLOATS; i++) {
    Serial.print(gpsArray[i], 6);Serial.print(" ");
  }
  Serial.println("");
}

он мне шлет нули 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ну не знаю, как скетч расшаривает один и тот же порт

AdDa
Offline
Зарегистрирован: 06.05.2019

Есть варианты с другим скетчем , где данные идут не нули? Или вы не пользовались  таким?

sadman41
Offline
Зарегистрирован: 19.10.2016

.

AdDa
Offline
Зарегистрирован: 06.05.2019

Пробовал, ставить 9600 в конфиге и в скетче - тоже самое... 
А подключать надо к ардуино на 3.3. вольта или 5 вольт или разницы нету?

sadman41
Offline
Зарегистрирован: 19.10.2016

Спустите Serial1 и UART блохастого на 9600 для начала. Заработает - будете подымать. Для контроля выводите в Serial тот самый char c сразу после считывания.

У меня модуль тоже на M8 - он на 5V нормально работает. 

На фото, кстати, не восьмерка.

Точно рабочий скетч - это тот, который с одного порта берет, в другой суёт.

AdDa
Offline
Зарегистрирован: 06.05.2019

Так на 115200 в U center работает, зачем спускать на 9600 ?
сейчас по новой попробую....
"На фото, кстати, не восьмерка." вот это поворот! )))А что ?)
китайцы заверяли что M8N , но прошифка не заливается -  флэш памяти нету, так я подумал что М8 просто)))

sadman41
Offline
Зарегистрирован: 19.10.2016

На железке NEO-7M написано.

AdDa
Offline
Зарегистрирован: 06.05.2019

ааа , ну это да фото с алиэкспресса  у меня 8ка написана)

sadman41
Offline
Зарегистрирован: 19.10.2016

А вообще - сдается мне, что вывод массива не на месте. Ему бы внутри if (..encode()) находится. Иначе лупит он почем зря, путает карты принимающему порту. При равной скорости неясно, кто одеяло перетянет на себя - Serial или Serial1.

AdDa
Offline
Зарегистрирован: 06.05.2019

поставил 9600 - все тоже самое...
вот так написать if (M8_Gps.encode())  ??? 

sadman41
Offline
Зарегистрирован: 19.10.2016

Начните с простого скетча - читаем с Serial1, печатаем в Serial. Без библиотек. Скорость Serial1 должна быть меньше, чем у Serial. Иначе в трубу Б не будет успевать вытекать то, что через трубу А втекает.

AdDa
Offline
Зарегистрирован: 06.05.2019
#define SERIAL_BAUD 38400
#define GPS_BAUD 9600
void setup() {
   Serial.begin(SERIAL_BAUD);
   Serial1.begin(GPS_BAUD);
 
}

void loop() {
        char c = Serial1.read();
    Serial.print(c, 6);Serial.print(" ");
 
  Serial.println("");
}

Ну что то показывает.... 
 

1550104015152 
1550104015503 
252 
0 
1550104015210 
0 
215 
241 
1550104015334 
1550104015145 
32 
14 
1550104015503 
1550104015254 
212 
325 
1550104015503 
0 
15 
252 
1 
0 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

if (Serial1.available() ... ) - это ни о чём Вам не не говорит?

http://arduino.ru/Reference/Serial/Read

AdDa
Offline
Зарегистрирован: 06.05.2019

Вот что я понял... 
байты идут, но проходя через библиотеку M8_Gps.encode(incomingByte) байтов нету... 
 при таком раскладе 

void loop() {
   if(!Serial1.available())
		return;

  while(Serial1.available()){
        char c = Serial1.read();
        incomingByte = Serial1.read();
         if (M8_Gps.encode(incomingByte)) {
          gpsArray[0] = M8_Gps.altitude;
          gpsArray[1] = M8_Gps.latitude;
          gpsArray[2] = M8_Gps.longitude; 
          gpsArray[3] = M8_Gps.sats_in_use;
        }
  }
  for(byte i = 0; i < N_FLOATS; i++) {
    Serial.print(gpsArray[i], 6);Serial.print(" ");
  }
  
  Serial.println("Байты без библиоткеи");
  Serial.println(incomingByte, DEC);

}
 

Я получаю 

0.000000 0.000000 0.000000 0.000000 
Байты без библиоткеи
25
0.000000 0.000000 0.000000 0.000000 
Байты без библиоткеи
0
0.000000 0.000000 0.000000 0.000000 
Байты без библиоткеи
36
0.000000 0.000000 0.000000 0.000000 
Байты без библиоткеи
0
0.000000 0.000000 0.000000 0.000000 
Байты без библиоткеи
5
0.000000 0.000000 0.000000 0.000000 
Байты без библиоткеи
1

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Кстати, вы точно на mega2560 пытаете? Или в крайней случает на 328PB у неё вроде два сериала

sadman41
Offline
Зарегистрирован: 19.10.2016
#define SERIAL_BAUD 38400
#define GPS_BAUD 9600
void setup() {
  Serial.begin(SERIAL_BAUD);
  Serial1.begin(GPS_BAUD);
}

void loop() {
  if (Serial1.available() > 0) {
    char c = Serial1.read();
    Serial.print(c);
  }
}

 

AdDa
Offline
Зарегистрирован: 06.05.2019

да, на мега

AdDa
Offline
Зарегистрирован: 06.05.2019

sadman41 пишет:

#define SERIAL_BAUD 38400
#define GPS_BAUD 9600
void setup() {
  Serial.begin(SERIAL_BAUD);
  Serial1.begin(GPS_BAUD);
}

void loop() {
  if (Serial1.available() > 0) {
    char c = Serial1.read();
    Serial.print(c);
  }
}

 

Данные идут

sadman41
Offline
Зарегистрирован: 19.10.2016

Тогда см. моё сообщение #14 и своё #19. Разгадка там.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Скомпилировалось и для атмеги 328pb, надо теперь попробовать с модулем...

sadman41
Offline
Зарегистрирован: 19.10.2016

328PB нормально наваливает в терминал с GPS-модулем на 115200 в пустом цикле. А вот когда до обработки дело доходит, уже не так всё шоколадно.

AdDa
Offline
Зарегистрирован: 06.05.2019

Заработало, спасибо!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AdDa пишет:

Заработало, спасибо!

Вы бы поправленный скетч выложили

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

совсем совсем давно 9600 была стандартная скорость для GPS, а вот интересно это из-за мультисистемности модулей увеличили до 115200? На 9600 не успевает читать?

sadman41
Offline
Зарегистрирован: 19.10.2016

NMEA-0183 вообще на 4800Bps ориентируется ;) И только с NMEA-0183HS начинается 38,400Bps

А в районе 115200 приходится юзать при большом Update Rate, которое требуется для навигации объекта, движущегося с большой скоростью. Данные надо чаще выводить, а стало быть - и быстрее. Если на месте стоять или на велосипеде ехать - 115200 не нужно совершенно. 

AdDa
Offline
Зарегистрирован: 06.05.2019

ua6em пишет:

AdDa пишет:

Заработало, спасибо!

Вы бы поправленный скетч выложили

Вот этот вариант рабочий,... 
 

#include "Ublox.h"
#define SERIAL_BAUD 38400
#define GPS_BAUD 9600
#define N_FLOATS 4 
Ublox M8_Gps;
// Altitude - Latitude - Longitude - N Satellites
float gpsArray[N_FLOATS] = {1, 1, 1, 1};

void setup() {
   Serial.begin(SERIAL_BAUD);
   Serial1.begin(GPS_BAUD);
 
}

void loop() {
   if(!Serial1.available())
		return;

  while(Serial1.available()){
        char c = Serial1.read(); 
         if (M8_Gps.encode(c)) {
          gpsArray[0] = M8_Gps.altitude;
          gpsArray[1] = M8_Gps.latitude;
          gpsArray[2] = M8_Gps.longitude; 
          gpsArray[3] = M8_Gps.sats_in_use;
            for(byte i = 0; i < N_FLOATS; i++) {
    Serial.print(gpsArray[i], 6);Serial.print(" ");
  }
        }
  }


}

Сейчас сделаю человеко понятный вид в столбик и перепроверю на скорости 115200 ... мне то на ней надо ) 

 и выложу окончательный

sadman41
Offline
Зарегистрирован: 19.10.2016

В данном случае while(Serial1.available()) уже не нужен, так как его дублирует if(!Serial1.available()) return;

AdDa
Offline
Зарегистрирован: 06.05.2019

Все , на 115200 все работает, данные идут, всем спасибо за помощь и участие)
 

#include "Ublox.h"
#define SERIAL_BAUD 115200
#define GPS_BAUD 115200
#define N_FLOATS 4

Ublox M8_Gps;
// Altitude - Latitude - Longitude - N Satellites
float gpsArray[N_FLOATS] = {0, 0, 0, 0};

void setup() {
   Serial.begin(SERIAL_BAUD);
   Serial1.begin(GPS_BAUD);
 
}

void loop() {
   if(!Serial1.available())
    return;

  while(Serial1.available()){
        char c = Serial1.read();
         if (M8_Gps.encode(c)) {
          gpsArray[0] = M8_Gps.altitude;
          gpsArray[1] = M8_Gps.latitude;
          gpsArray[2] = M8_Gps.longitude; 
          gpsArray[3] = M8_Gps.sats_in_use;
          for(byte i = 0; i < N_FLOATS; i++) {
            Serial.print(gpsArray[i], 6);Serial.print(" ");
            }  
            Serial.println("");
        } 
  }  
}