GPS модуль. как померить скорость?

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем Ilichevai, 4 янв 2018.

Метки:
  1. Ilichevai

    Ilichevai Нуб

    Всем привет.
    Хочу получить скорость и в зависимости от ее величины делать определенные манипуляции, например, зажечь светодиод.
    Вижу 2 пути решения.
    1) Если использовать стандартную библиотеку Esprino, взятый по ссылкам ниже,
    http://wiki.amperka.ru/продукты:troyka-gps-glonass
    https://www.espruino.com/GPS
    Код (Javascript):
    Serial3.setup(115200, {rx: P0, tx: P1});
    var gps = require("GPS").connect(Serial3, function(data) {
      console.log(data);
    });
    то выводится следующие данные:
    Код (Javascript):
    { "time":"16:35:29", "lat":53.068403,"lon":-4.076282,"fix":1,"satellites":7,"altitude":1085.0 }
     
    соответственно зная широту, долготу и время в момент T1 и T0 то можно посчитать пройденное расстояние, а из него получить скорость c точностью 0,3%, что мне достаточно. код здесь https://www.movable-type.co.uk/scripts/latlong.html
    Проблема
    Как из этого добра получить широту и долготу в T0 и T1 и передать переменной?
    Код (Javascript):
    Serial3.setup(115200, {rx: P0, tx: P1});
    var gps = require("GPS").connect(Serial3, function(data) {
      console.log(data);
    });
    В консоль данные выводятся, а вот переменной передаваться упорно не хотят.
    Если сделать как-нибудь так
    Код (Javascript):
    Serial3.setup(115200, {rx: P0, tx: P1});
    var gps = require("GPS").connect(Serial3, function(data) {
      T1=data;
    return T1;
    })
    console.log(gps);

    ;
    то выводятся пустые значения. Видимо контроллер не успевает за платой или происходит, что то типа того.
    Может быть в массив как-то можно все складывать, или запрогать получение ответа от контроллера перед выводом, или еще что то придумать. Не знаю, как эти данные правильно вытащить из выражения выше .

    2) Если общаться с Serial.
    Имеем:
    Использовал такой код
    Код (C++):
    Serial3.setup(115200, {rx: P0, tx: P1});
    var bufer='';
    Serial3.on('data',function(data){
    bufer +=data;
    var lines = bufer.split('$');
    bufer =lines [lines.length-1];
    if (lines.length >1){
    for (l=0;l<lines.length-1;l++){ print(lines[l]);}}});
     
    Проблема
    Как результат,он выводит все, что передает GPS контроллер но здесь http://www.gpsinformation.org/dale/nmea.htm
    я сообщений с таким кодами не нашел и соответственно не понимаю какая позиция, что значит и как это все дело грамотно распарсить, чтобы вытянуть скорость.

    для С++есть куча библиотек и готовых решений, а тут что-то пошло не так =(
     
  2. Ilichevai

    Ilichevai Нуб

    В общем идя по пути 1 с помощью зарубежных комрадов я накодил вот такую штуку, но бывают какие-то странные выбросы если спутников не видит =( типа 45 км/ ч в состоянии покоя). надо как-то побороть искажения хз как. В целом на машине протестил с показаниями яндекс навигатора визуально совнадает.

    Код (Javascript):
    //********* конектимся к GPS приемнику
    Serial3.setup (115200, {rx: P0, tx: P1});

    var R = 6371e3; // радиус земли в метрах
    var Led= require('@amperka/led').connect(A1);//вводим светодиод

    var lastData; // все данные полученные от GPS в T0
    var lastData2; //секунды в T0***
    var lastLon;  // широта в T0
    var lastLat; //  долгота в T0
    var LastTime; // предыдущее время
    var toRad=Math.PI/180; // переводим в радианы
    var i=0;//ограничитель выводов инфы в консоль


    var gps = require ("GPS"). connect (Serial3, function (data) {

      if (lastData,i<50) {            //ограничиваем 50-ю измерениями, чтобы проанализировать надо убрать результат
       // do stuff here - eg. the difference between the two readings
      //****** расстояние
        var Lon=data.lon*toRad; // lon в  t1
        var Lat=data.lat*toRad; //lat в  t1
        var diffLon=Math.abs(Lon-lastLon*toRad); //ищем дельту
        var diffLat= Math.abs(Lat-lastLat*toRad); //ищем дельту
    //************************************** блок расчета расстояния      

    var a= Math.sin(diffLat/2) * Math.sin(diffLat/2) +
            Math.cos(Lat) * Math.cos(lastLat*toRad) *
            Math.sin(diffLon/2) * Math.sin(diffLon/2);
     
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var distansP = R * c;
    //****** время между измерениями
    var tTime= data.time.split(':'); // массив чч мм
    tTime=tTime[2];
    var diffTime=tTime-LastTime;
        //****** скорость
        var speed1= distansP/diffTime; // м/с
        var speed2= speed1*3.6; // км/ч
    //********************зажигаем диод если скорость больше 60  
        if(speed2>40){
       
          Led.turnOn();
        }
        else{Led.turnOff();}
    console.log(speed2,speed1); // выводим скорость в консоль

    //console.log ('1',Math.sin(diffLat/2),diffLat/2,'2',Math.cos(Lat),  '3',Math.cos(lastLat*toRad),lastLat*toRad,'4',Math.sin(diffLon/2),'5',Math.sin(diffLon/2),'6',Math.sqrt(a),a,'7',Math.sqrt(1-a),'8',diffTime );
      }
    // передаем предыдущие показания
    lastData=data;
    lastLon=data.lon; //в градусах
    lastLat=data.lat; //в градусах

    LastTime=  data.time.split(':'); //сохраняем предыдущее значение времени в массив
    LastTime= LastTime[2]; // вытаскиваем изменение секунд

    //  lastData = data.time.split(':');
    //lastData2 = lastData[2];
    //  lastLon= data.lon;
      i=i+1; /ограничитель выводов инфы в консоль. надо убрать чтоб работало в авто.
    });
     
     
    Последнее редактирование: 7 янв 2018