Как подключить к Arduino эхолот Humminbird?

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Bif+, 12 фев 2019.

  1. burd-ig

    burd-ig Нерд

    Вот поверьте, я как преподаватель, отношусь всегда к Умным людям с большой буквы.
    Меня не нужно убеждать в этом. Если бы были конструктивные ответы, общение было бы гораздо интереснее...
    Парсинг мне нужен в данный момент даже не для конечной цели.
    Я сейчас выясняю, какие сообщения NMEA в протоколе предпочтительнее использовать.
    Пока выводил в сериал разными кодами сообщения GNGLL и GNGGA заметил разницу в отклонениях от точки где находится мой GPS модуль.
    Хочу убить двух зайцев:
    1. Сделать анализ этих сообщений. Фильтровать лишние сообщения по первым признакам несоответствия нужным данным.
    2. Код сам появится для парсинга и фильтрации
    Но тупо уперся в команду Serial.read()
     
  2. burd-ig

    burd-ig Нерд

    С точки зрения языка СИ второе предложение относится к первому, так как нет адреса обращения :)
     
  3. b707

    b707 Гуру

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

    Самое главное - что вся ветка вообще не имеет смысла. Быстрее библиотеки вы вряд ли напишете. Причина того, что она вам кажется "медленной" - в том что вы не умеете с ней работать. Как я уже третий раз говорю, самая медленная часть в получении данных с GPS - это передача по Сериал. то есть часть. которая ни от библиотеки, ни от вашего кода вообще не зависит. И библиотека достаточно быстра, чтобы успевать обрабатывать приходящие данные - а быстрее ей быть незачем, как я уже пытался вам обьяснить в анекдоте про "быстрые часы".

    Все.
    Если созреете общаться "конструктивно" - я готов. Если же будете дальше настаивать на том. что вы сами знаете что делать - сами и разбирайтесь.
     
  4. burd-ig

    burd-ig Нерд

    18-20 строчек, в зависимости от того какие данные парсим и, вуаля, данные в потоке!!! Код готов! Какие еще библиотеки?
    Я пока станок с микроконтроллером собирал, в процессе код сам появился!!! Главное представлять, что на осциллографе и как с ним работать :)
    Kod.JPG :)
     
  5. burd-ig

    burd-ig Нерд

    На картинке первая строчка - текстовое сообщение,
    вторая строчка - числовое значение координат переведенных в десятичные минуты
    Parsing.JPG
     
  6. ИгорьК

    ИгорьК Гуру

    Чет мне кажется, что вы недостаточно конкретно излагаете суть своей проблемы (если таковая осталась).
     
  7. parovoZZ

    parovoZZ Гуру

    @ИгорьК
    Здарова! Где пропадал?

    А во что там можно упереться? Читай напрямую регистр data по флагу или через прерывание.
     
  8. Bif+

    Bif+ Гик

    Добрый день, уважаемые форумчане!
    Судя по количеству просмотров, эта тема интересна многим. Продолжаю заниматься автопилотом для рыбалки на катере. Пока была жесткая самоизоляция, собрал АП по точкам GPS. Особо мудрить с кодом не стал, а просто внес некоторые изменения в код канадского парнишки, о чем я писал ранее. Убрал автокалибровку компаса и добавил код от АП на компасе, который выкладывал выше и подцепил имеющийся в АП по изобате (глубине) LCD. Код не очень большой – 15 кб, поэтому сохранил весь – мало ли что еще позже придумаю. Как я уже писал, мудрить не стал и все соорудил на трех Nano, даже схему не рисовал, а сразу сделал разводку платы в Laoute, т.к. в каждом коде все прописано. Ну и, конечно же, симбиоз высоких технологий - лазера и утюга в помощь! Разместил все в таком же корпусе как и ранее, изготовленный из профиля и оцинкованного листа, но меньше по размерам. Собрал быстро, за три вечера еще в начале мая, а вот опробовал только в начале июня, когда ослабили режим самоизоляции. На поле записал трек на SDкарту, обработал на ноуте, залил код и снова в поле. По примятой траве довольно просто было ориентироваться - хорошо виден, ранее записанный трек. По светодиодам видно, куда надо повернуть, чтобы выйти на записанную точку. Для поля точность 1,5 – 2м, но здесь нет влияния ветра и течения. Меня как-то упрекнули, что много времени уделил оконечному каскаду(железу) и не очень коду. Согласен!, что программист из меня, как и балерина… Но теперь я могу любой нужный мне прибамбас с любым кодом установить без проблем. Хотя проблемы с кодом остаются и их надо решать. Пример: сейчас – записываю трек на SD, обрабатываю на ноуте, вставляю в код и заливаю в Нану, а хотелось бы – записал, и программой считываем и двигаемся по точкам, и не только от первой точки к крайней (вверх) и наоборот (вниз), но чтобы и из любой ближайшей хоть вверх, хоть вниз. Никак не могу вырваться на водные просторы, но когда опробую на воде, то итоги «выдам в студию».
    Код (C++):

    // выход от NEO 6M на pin2 в GPS плату Arduino Uno.
    //с платы Arduino Uno GPS выход ТХ pin1 на вход в Main pin7(link),
    //компас А4, А5 на плате Main. Монитор порта для компаса 115200 bod
    // два мотора + серводвигатель

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 16, 2);
    #include <HMC5883L.h>
    #include <ADXL345.h>
    #include <SoftwareSerial.h>
    #include <SoftEasyTransfer.h>
    #include <PWMServo.h>
    #include <Average.h>

    //Motor Control
    int maxspeed;
    //maxspeed - motgain * 30 > 0
    //MOTGAIN 4
    int motgain = 4;
    int anglerange = 30;
    int rightpin = 12;//10;
    int leftpin = 9;
    int led = 13;
    int overavg = 10;
    int steerarray[10];
    int throttlearray[10];
    //------------------------------------------
    #define DEBUG
    #define   B 10            
    #define   N 11              //тумблером подаём +5в(gps в прямом напр
    //LOW - в обратн напр
    byte angle = 89;            //опытным путем устанавливаем начальный угол сервы,
                                //при котором перо руля будет параллельно движению

    int vector = 0;             // устанавливаем начальный курс для старта,

    PWMServo servo1;
    //============================================
    //GPS
    static int r = 6371;
    const float Pi = 3.14159;
    int accuracy = 5;
    unsigned long lasttime = 0;

    SoftEasyTransfer rx;

    SoftwareSerial link(7, 8);

    struct RECEIVE_DATA_STRUCTURE {
      float latitude;
      float longitude;
    };
    HMC5883L compass;
    ADXL345 accelerometer;
    int ADXL345 = 0x53;
    // переменные для калмана
    float varVolt =  3.5;    // среднее отклонение
    float varProcess = 0.05; // скорость реакции на изменение
    float Pc = 0.0;
    float G = 0.0;
    float P = 1.0;
    float Xp = 0.0;
    float Zp = 0.0;
    float Xe = 0.0;
    // ------------

    float heading1;
    float heading2;
    int heading3;
    int bearing;

    RECEIVE_DATA_STRUCTURE gpsin;

    void setup() {
      Serial.begin(115200);
      Wire.begin();
      pinMode(rightpin, OUTPUT);
      pinMode(leftpin, OUTPUT);
      pinMode(led, OUTPUT);

      link.begin(38400);
      rx.begin(details(gpsin), &link);
      digitalWrite(led, HIGH);

      // Initialize Initialize HMC5883L
      Serial.println("Initialize HMC5883L");
      while (!compass.begin())
       {
         delay(500);
       }

      lcd.init();                  // Инициализация дисплея
      lcd.backlight();             // Подключение подсветки

      //----------------------------------------------

      pinMode(B, OUTPUT);
      pinMode(2, INPUT);               // назначаем пин кнопки D2
      pinMode(N, INPUT);               //пин 11 движение в прям-обр напр
      pinMode(3, OUTPUT);              // подключаем  5v для кнопки
      digitalWrite(3, HIGH);
      servo1.attach(SERVO_PIN_B);       // назначаем пин D10 сервоприводу
      // pinMode(A1, OUTPUT);
      pinMode(A2, OUTPUT);               // А1,А2,А3 для светодиодов
      pinMode(A3, OUTPUT);

      //=============================================
      // Set measurement range
      compass.setRange(HMC5883L_RANGE_1_3GA);

      // Set measurement mode
      compass.setMeasurementMode(HMC5883L_CONTINOUS);

      // Set data rate
      compass.setDataRate(HMC5883L_DATARATE_30HZ);

      // Set number of samples averaged
      compass.setSamples(HMC5883L_SAMPLES_8);

      // Set calibration offset. See HMC5883L_calibration.ino
      compass.setOffset(292, -200);

      // Initialize ADXL345

      if (!accelerometer.begin())
      {
         delay(500);
      }

      accelerometer.setRange(ADXL345_RANGE_2G);

      // Смещение калибровки
      // https://howtomechatronics.com/tutorials/arduino/how-to-track-orientation-with-arduino-and-adxl345-accelerometer/
      //X-axis
      Wire.beginTransmission(ADXL345);
      Wire.write(0x1E);  // X-axis offset register
      Wire.write(0);
      Wire.endTransmission();
      delay(10);
      //Y-axis
      Wire.beginTransmission(ADXL345);
      Wire.write(0x1F); // Y-axis offset register
      Wire.write(0);
      Wire.endTransmission();
      delay(10);

      //Z-axis
      Wire.beginTransmission (ADXL345);
      Wire.write(0x20); // Z-axis offset register
      Wire.write(1);
      Wire.endTransmission();
      delay(10);

    }

    // No tilt compensation

    float noTiltCompensate(Vector mag)
    {
      float heading = atan2(mag.YAxis, mag.XAxis);

      return heading;
    }

    // Tilt compensation

    float tiltCompensate(Vector mag, Vector normAccel)
    {

      float roll;
      float pitch;

      roll = asin(normAccel.YAxis);
      pitch = asin(-normAccel.XAxis);

      if (roll > 0.78 || roll < -0.78 || pitch > 0.78 || pitch < -0.78)
      {
        return -1000;
      }

      float cosRoll = cos(roll);
      float sinRoll = sin(roll);
      float cosPitch = cos(pitch);
      float sinPitch = sin(pitch);

      // Tilt compensation

      float Xh = mag.XAxis * cosPitch + mag.ZAxis * sinPitch;
      float Yh = mag.XAxis * sinRoll * sinPitch + mag.YAxis * cosRoll - mag.ZAxis * sinRoll * cosPitch;

      float heading = atan2(Yh, Xh);

      return heading;
    }

    // Correct angle

    float correctAngle(float heading)
    {
      if (heading < 0) {
        heading += 2 * PI;
      }
      if (heading > 2 * PI) {
        heading -= 2 * PI;
      }
      return heading;
    }

    void loop()
    {
      if (digitalRead(N) == HIGH)     //при включеном тумблере
                                      // движ в прямом напр (против течен)
      {

      Navigate(49.231450, -122.695659, 80);
      Navigate(49.231472, -122.695568, 80);
      Navigate(49.231535, -122.695523, 80);
      Navigate(49.231600, -122.695572, 80);
     
       }
     
      if (digitalRead(N) == LOW)
           //при выключеном тумблере
           // движ в обр напр(по течению)
      {
        Navigate(49.231600, -122.695572, 80);
        Navigate(49.231535, -122.695523, 80);
        Navigate(49.231472, -122.695568, 80);
        Navigate(49.231450, -122.695659, 80);
    // и т.д.
      }
    }

      //Control();
     
    void Control() {
      while (pulseIn(5, HIGH, 100000) > 0) {
        int throttle = pulseIn(4, HIGH, 20000);
        int steer = pulseIn(5, HIGH, 20000);
        if (throttle > 1000 && steer > 1000) {
          Override(throttle, steer);
        }
        delay(50);
      }
    }

    void Navigate(float lat2, float long2, int velocity) {
      maxspeed = velocity;
      while (GetDistanceInM(gpsin.latitude, gpsin.longitude, lat2, long2) > accuracy) {
        if (rx.receiveData()) {
          lasttime = millis();
        }
        while (pulseIn(5, HIGH, 100000) > 0) {    //считываем с 5 в схеме вход от пульта
          int throttle = pulseIn(4, HIGH, 20000); //с 4 в схеме вход от пульта
          int steer = pulseIn(5, HIGH, 20000);    //с 5 в схеме вход от пульта
          if (throttle > 1000 && steer > 1000) {
            Override(throttle, steer);
          }
          delay(50);
        }
        if ((millis() - lasttime) < 2000) {
          int bearing = GetBearing();
          int heading3 = GetHeading(gpsin.latitude, gpsin.longitude, lat2, long2);
          int leftmot = MotorSpeed(bearing, heading3, 1);
          int rightmot = MotorSpeed(bearing, heading3, 0);
          if (leftmot < 0) {
            leftmot = 0;
          }
          if (rightmot < 0) {
            rightmot = 0;
          }
          RunMotor(leftmot, 1);
          RunMotor(rightmot, 0);
          //
          Serial.print(bearing);
          Serial.print("  ");
          Serial.print(heading3);
          Serial.print("  ");
          Serial.print((int)GetDistanceInM(gpsin.latitude, gpsin.longitude, lat2, long2));
          Serial.print("  ");
          Serial.print(leftmot);
          Serial.print("  ");
          Serial.print(rightmot);
          Serial.print("   ");
         
          //-------------------------------------//--------------
     
    f4r1c и NoViChok+ нравится это.
  9. Bif+

    Bif+ Гик

    Код (C++):
         int  azimuth = heading3;
          int   vector = bearing;
          //if (vector == 0)                // ждем нажатия кнопки (задаем курс)
          //{
          // motor_off();
          //}


          if (digitalRead(2) == HIGH)     //при нажатии на кнопку (тест)
          {
            vector = azimuth;             //устанавливаем серво = 89 гр.-руль прямо
            // digitalWrite(A1, HIGH);
          }
          else
          {
            // digitalWrite(A1, LOW);
          }

          //создание переменной для управления сервой

          int g = vector - azimuth;//azimuth - vector;       // измеряем величину и направление отклонения от курса
          while (g >= 180)
            g -= 360;
          while (g < -180)
            g += 360;
          int s = fabs (g) * 3;         // переменная угла поворота сервы  от G
          s = constrain(s, 1, 35);       // ограничиваем значения S диапазоном поворота руля (35* определен экспериментально)

          // блок управления мотор-редуктором

          if (g == 0) {
            servo1.write(angle);    //---поехали...
            digitalWrite(A2, HIGH);     //светодиод
            digitalWrite(A3, HIGH);
          }
          if (g < 0) {
            servo1.write(angle + s);    //---Установка влево
            digitalWrite(A2, HIGH);     //светодиод
            digitalWrite(A3, LOW);
          }
          if (g > 0) {
            servo1.write(angle - s);    //---Установка вправо
            digitalWrite(A3, HIGH);     //светодиод
            digitalWrite(A2, LOW);
          }
          // блок диагностики работы программы
          //------------------------------------------
          #ifdef DEBUG                  // выводим на LCD ---------

          lcd.setCursor(0, 0);          // Установка курсора в начало первой строки LCD
          lcd.print("Y");               // вывод текста на первой строке
          lcd.print(vector);
          lcd.print(" ");

          lcd.print("A");               // вывод текста на первой строке после A -азимут
          lcd.print(azimuth);
          lcd.print(" ");
          lcd.print("M");
          lcd.println((int)GetDistanceInM(gpsin.latitude, gpsin.longitude, lat2, long2));

          lcd.setCursor(0, 1);          // Установка курсора в начало второй строки LCD
          lcd.print("G");
          lcd.print(g);
          lcd.print(" ");
          lcd.print("S ");
          lcd.print(s);
          lcd.print(" ");
          lcd.print("ang ");
          lcd.print(servo1.read());

          #endif                        
          //=======================================
    /*  
          Serial.print("AZ: ");
          Serial.print(azimuth);
          Serial.print("   ");

          Serial.print("vect: ");
          Serial.print(vector);
          Serial.print("    ");

          Serial.print("G: ");
          Serial.print(g);
          Serial.print("    ");

          Serial.print("S: ");
          Serial.print(s);
          Serial.print("   ");

          Serial.print("angle: ");
          Serial.print(servo1.read());
          Serial.print("   ");

          Serial.println();
    */

          // delay(100);
          //=====================================//================

        }
        else {
          RunMotor(0, 1);
          RunMotor(0, 0);
          Serial.println("No GPS Signal");
        }
      }
      Serial.println("NavLoop Return");
      RunMotor(0, 1);
      RunMotor(0, 0);

    }

    void Override(int throttle, int steering) {   //дроссель и управление
      int left;
      int right;
      if (throttle > 1600)
      {
        throttle = (int)(0.51 * (throttle - 1500));
        if (steering > 1500) {
          right = (int)(throttle - 0.51 * (steering - 1500));
          if (right < 0)
          {
            right = 0;
          }
          left = throttle;
        }
        else {
          left = (int)(throttle + 0.51 * (steering - 1500));
          if (left < 0)
          {
            left = 0;
          }
          right = throttle;
        }
      }
      else {
        left = 0;
        right = 0;
      }
      RunMotor(right, 0);
      RunMotor(left, 1);
      Serial.print(left);
      Serial.print("  ");
      Serial.println(right);
    }

    void RunMotor(int val, int option) {
      if (option == 0) {
        //Right Motor
        analogWrite(rightpin, val);
      }
      else {
        //Left Motor
        analogWrite(leftpin, val);
      }
    }

    int GetBearing() {

      // Read vectors

      Vector mag =  compass.readNormalize();
      Vector acc = accelerometer.readScaled();

      // Calculate headings

      heading1 = noTiltCompensate(mag);
      heading2 = tiltCompensate(mag, acc);

      if (heading2 == -1000)
      {
        heading2 = heading1;
      }

      // Formula: (deg + (min / 60.0)) / (180 / M_PI);

      float declinationAngle = (6.7) / (180 / M_PI);
      heading1 += declinationAngle;
      heading2 += declinationAngle;

      // Correct for heading < 0deg and heading > 360deg

      heading1 = correctAngle(heading1);
      heading2 = correctAngle(heading2);

      // Convert to degrees-----------------------------------
      heading1 = heading1 * 180 / M_PI;   // noTiltCompensate (mag)
      heading2 = heading2 * 180 / M_PI;   // tiltCompensate (mag, acc)

      if (heading2 < 0)
      {
        heading2 += 2 * PI;
      }

      if (heading2 > 2 * PI)
      {
        heading2 -= 2 * PI;
      }

      // Convert to degrees

      int val = heading2;

      int filter(val);

      {
        //функция фильтрации
        Pc = P + varProcess;
        G = Pc / (Pc + varVolt);
        P = (1 - G) * Pc;
        Xp = Xe;
        Zp = Xp;
        Xe = (G * (val - Zp)) + Xp; // "фильтрованное" значение
        return (Xe);

      }
      // int heading3 = ((0,8*heading3) + (0,2*Xe))/2;

      heading3 = ((int) Xe);//Xe;
      bearing = (int)((heading3) + 270) % 360;
      return bearing;

    }

    int MotorSpeed(int bearing, int heading3, int option) {
      heading3 = heading3 % 360;
      bearing = bearing % 360;
      if (heading3 == bearing)
      {
        return (maxspeed);
      }
      int o1 = (int)heading3 - (int)bearing;
      int o2 = (int)bearing - (int)heading3;
      int direction = ((360 - ((int)heading3 - (int)bearing)) % 360);
      if (direction < 180) {
        if (direction > anglerange)
        {
          //Right Motor
          if (option == 0) {
            return maxspeed;
          }
          //Left Motor
          else {
            return 0;
          }
        }
        else
        {
          //Right Motor
          if (option == 0) {
            return maxspeed;
          }
          //Left Motor
          else {
            return maxspeed - (direction * motgain);
          }
        }
      }
      else if (direction >= 180)
      {
        if ((360 - direction) > anglerange)
        {
          //Right Motor
          if (option == 0) {
            return 0;
          }
          //Left Motor
          else {
            return maxspeed;
          }
        }
        else
        {
          //Right Motor
          if (option == 0) {
            return maxspeed - ((360 - direction) * motgain);
          }
          //Left Motor
          else {
            return maxspeed;
          }
        }
      }
      return 0;
    }

    static float GetHeading(float lat1, float long1, float lat2, float long2)
    {
      //Current Latitude, Current Longitude
      //Projected Latitude, Projected Longitude
      //To get reverse heading, add 180
      lat1 = ConvertToRadians(lat1);
      lat2 = ConvertToRadians(lat2);
      long1 = ConvertToRadians(long1);
      long2 = ConvertToRadians(long2);
      float dLon = long2 - long1;
      float y = sin(dLon) * cos(lat2);
      float x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon);
      return ConvertToStaticDegrees(atan2(y, x));
    }
    static float GetDistanceInM(float lat1, float long1, float lat2, float long2)
    {
      //Current Latitude, Current Longitude
      //Projected Latitude, Projected Longitude
      lat1 = ConvertToRadians(lat1);
      lat2 = ConvertToRadians(lat2);
      long1 = ConvertToRadians(long1);
      long2 = ConvertToRadians(long2);
      float dLat = lat2 - lat1;
      float dLon = long2 - long1;
      float a = haversin(dLat) + cos(lat1) * cos(lat2) * haversin(dLon);
      float c = 2 * atan2(sqrt(a), sqrt(1 - a));
      return r * c * 1000; // Distance in M
    }
    static float ConvertToDegrees(float rad)
    {
      float degrees = rad / (Pi / 180);
      if (degrees <= -180) {
        return degrees + 360;
      }
      else {
        return degrees;
      }
    }
    static float ConvertToStaticDegrees(float rad)
    {
      float degrees = rad / (Pi / 180);
      if (degrees <= 0) {
        return degrees + 360;
      }
      else {
        return degrees;
      }
    }
    static float ConvertToRadians(float angle)
    {
      return (Pi / 180) * angle;
    }
    static float haversin(float input)
    {
      return (sin(input / 2)) * (sin(input / 2));
    }
    Фото выдам позже.
     
    f4r1c и NoViChok+ нравится это.
  10. Bif+

    Bif+ Гик

  11. NoViChok+

    NoViChok+ Нерд

    Добрый день! Рад,что работа продолжается.Переодически слежу хотя присуствую на форуме редко. Код уж слишкои длинный
     
  12. NoViChok+

    NoViChok+ Нерд

    Что это?
     
  13. Bif+

    Bif+ Гик

    Взаимодействие двух плат: 1- (Main), код вверху; плата - 2 (GPS), код ниже.
    Код (C++):

    // выход от NEO 6M на pin2 в эту GPS плату Arduino Uno(Nano).
    //с этой платы ( GPS ) выход ТХ с pin1 на вход в плату Main на pin7(link)

    #include <EasyTransfer.h>
    #include <SoftwareSerial.h>
    #include "TinyGPS++.h"

    TinyGPSPlus gps;
    SoftwareSerial g(2, 3);

    EasyTransfer tx;

    struct SEND_DATA_STRUCTURE{
      float latitude;
      float longitude;
    };

    SEND_DATA_STRUCTURE loc;

    void setup() {
      Serial.begin(38400);
      g.begin(9600);
      tx.begin(details(loc), &Serial);
    }

    void loop() {
      while (g.available() > 0) {
        gps.encode(g.read());
      }
      if (millis() > 5000 && gps.charsProcessed() < 10)
      {
        digitalWrite(13, HIGH);
      }
      else {
        digitalWrite(13, LOW);
      }
      if (gps.location.isValid()){
        loc.latitude = gps.location.lat();
        loc.longitude = gps.location.lng();

        digitalWrite(13, HIGH);
        if (gps.location.age() < 2000) {
          //if (!tx.sendData()){
          //
          //}
          tx.sendData();

        }
      }
      delay(50);
      digitalWrite(13, LOW);

    }
     
    f4r1c нравится это.
  14. f4r1c

    f4r1c Нуб

    День добрый, а можно код платы SD? То не понятно как то :)
     
  15. Bif+

    Bif+ Гик

    Смотрите пост 163 выше.
     
  16. Bif+

    Bif+ Гик

    Добрый вечер!

    Наконец-то удалось выехать на водные просторы! Пока катер стоял на прицепе, включил всю систему АП. NEO 6Mдовольно быстро нашел спутники и на LCDвысветилось направление и расстояние до домашней полянки, где я ранее испытывал АП по GPS. Но когда спустился на воду, то NEO 6M отказался работать. Хорошо, что выносная антенна с кабелем 3м. Пришлось закрепить антенный блок на самую верхнюю точку - держатель топового огня. Точки первого трека записывал через 20 сек, это очень часто и «int accuracy = 5;» - переключение на следующую точку, не дойдя до текущей 5м, тоже «не есть хорошо», учитывая то, что при троллинге на скорости 3,6 км/час за 20 сек. проходим 20м и длинна катера 6м. Но система отработала хорошо, если не считать того, что по течению немного большее рыскание катера, чем обычно и точность выхода на точку от 2 до 4х метров. Решил, что записывать точки буду через 40 сек и изменю «int accuracy = 15;» . Трек записал, обработал, залил и столкнулся с проблемой магнитометра – азимут 356 градусов никак не хотел отрабатывать, т.е. нужна правильная калибровка компаса. Пришлось вернуться на первый трек. При боковом ветре трек с более частыми точками отрабатывается лучше. Записать и обработать 20 точек не сложно, но это 400м, а если трек 2-3км, т.е. 2-3тыс точек? Записал 15 точек с интервалом 100 сек. Затем вообще отказался от интервала времени записи и записывал точки при изменении курса. Примерно на 2 км получилось 13 точек, вполне терпимо. Двигаясь по GPSточкам, переключался на АП по изобате и на АП по компасу. Если идти в диапазоне глубин 6-7.5м, т.е. точки записи GPS, АП по GPSпродолжает следить и отрабатывать трек и при обратном переключении работает без пропуска точек. Итогами испытаний АП доволен, так, что работа над АП продолжается.
     
    NoViChok+ нравится это.
  17. NoViChok+

    NoViChok+ Нерд

    Наверна ошибка, правельно 100-150 точек или чтото другое?
     
  18. Bif+

    Bif+ Гик

    Вы правы: 100-150! Это я так, утрированно. 100 точек обработать, да еще занести их в программу в прямом и обратном порядке тоже сложно, хотя это сделать и сохранить код, а потом менять такие коды на других участках тоже можно. Но хотелось бы, чтобы это делала программа самостоятельно. Есть над чем работать!
     
  19. NoViChok+

    NoViChok+ Нерд

    Хотелось бы видео или фотки как ратотает
     
  20. Bif+

    Bif+ Гик

    Добрый вечер!
    Вчера снова выезжал на водные просторы. С начала все было замечательно, но затем поднялся приличный ветер в борт и погнал хорошую волну. Пропустил одну точку GPS и пришлось возвращаться на неё чуть ли не в обратную сторону. Парусит и сносит, и говорить о глубине и троллинге нет смысла. Такая же история и с АП на компасе, а вот по изобате ещё как-то царапается. Выход вижу только в одном – нужен ПИД регулятор!