Плавный поворот сервы на азимут. и фикс 359-0 град.

zDimaBY
Offline
Зарегистрирован: 10.06.2018
  while (flag) {
    GPSStatys(); // NEO-6m ackData[1] - GPS курс, ackData[2] - дистанция, ackData[3] - азимут, ackData[5] - КМ/ч
    if (millis() - timeoutAV >= 50) {
      timeoutAV = millis();
      target_on = false;
      StatCompass(); // Цыфровий компас ackData[4] - курс
    }
    NRF24L01();
    if (recieved_data[3] > 10) {
      flag = false;
      motorspeed = 28;
    }
    if (ackData[2] > 5) {
      servo2.write(map(180, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
      servo3.write(map(0, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
    }
    if (ackData[2] < 2) {
      if (is_one2) {
        flag = false;
        motorspeed = 28;
        is_one2 = false;
      }
      if (recieved_data[5] == 1) {
        DISTANCE_LAT = eeprom_read_float(0);
        DISTANCE_LNG = eeprom_read_float(4);
        if (is_one3) {
          for (int twoi = 180; twoi > 30; twoi--) {
            servo2.write(map(twoi, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
          }
          for (int threei = 0; threei < 150; threei++) {
            servo3.write(map(threei, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
          }
        }
        target_on = true;
        if (GPS_ON) {
          is_one2 = true;
          GPS_ON = false;
        }
      } else {
        is_one2 = true;
      }
    } else { // вычисление угола поворота на азимут
      if ( ackData[4] > ackData[3] + 40 || ackData[4] < ackData[3] - 40) {
        limitspeed = 50;
        SpeedMotor();
        if ( ackData[4] > ackData[3] ) { /// отклонение большое + - 40
          if (is_one0) {
            turn = 80;
            is_one0 = false;
          }
          is_one1 = true;
          turn++;
          if (turn >= 100) {
            turn = 100;
          }
          motor.write(map(motorspeed, 0, 255, 800, 2550));
          servo1.write(map(turn, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
        } else {
          if (is_one1) {
            turn = 80;
            is_one1 = false;
          }
          is_one0 = true;
          turn--;
          if (turn <= 60) {
            turn = 60;
          }
          motor.write(map(motorspeed, 0, 255, 800, 2550));
          servo1.write(map(turn, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
        }
      } else if ( ackData[4] > ackData[3] + 20 || ackData[4] < ackData[3] - 20) { /// отклонение средние + - 20
        limitspeed = 60;
        SpeedMotor();
        if ( ackData[4] > ackData[3] ) {
          if (is_one0) {
            turn = 80;
            is_one0 = false;
          }
          is_one1 = true;
          turn++;
          if (turn >= 90) {
            turn = 90;
          }
          motor.write(map(motorspeed, 0, 255, 800, 2550));
          servo1.write(map(turn, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
        } else {
          if (is_one1) {
            turn = 80;
            is_one1 = false;
          }
          is_one0 = true;
          turn--;
          if (turn <= 70) {
            turn = 70;
          }
          motor.write(map(motorspeed, 0, 255, 800, 2550));
          servo1.write(map(turn, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
        }
      } else { /// отклонение малое + - 5
        limitspeed = 70;
        SpeedMotor();
        if ( ackData[4] > ackData[3] ) {
          if (is_one0) {
            turn = 80;
            is_one0 = false;
          }
          is_one1 = true;
          turn++;
          if (turn >= 85) {
            turn = 85;
          }
          motor.write(map(motorspeed, 0, 255, 800, 2550));
          servo1.write(map(turn, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
        } else {
          if (is_one1) {
            turn = 80;
            is_one1 = false;
          }
          is_one0 = true;
          turn--;
          if (turn <= 75) {
            turn = 75;
          }
          motor.write(map(motorspeed, 0, 255, 800, 2550));
          servo1.write(map(turn, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
        }
      }
    }
  }

На это хватило ума.. 

Поворот сервы ограничено 60-100 град. Нужно чтобы servo1(правильней) выравнивало угол поворота на азимут также в этом примере есть недостаток когда азимут 359-0 то кораблик кружиться на месте в одну сторону потому-что на практике азимут меняется 350-10 к примеру, и кораблик делает полный разворот. Как пофиксить незнаю.. есть у кого какие предложение ?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А предложения должны быть от нас !? Может вы ошиблись веткой ? Тут обычно предлагает заказчик... А исполнители, очень часто его посылают, потому что заказчик хочет за копейки... А вы вооще.... бесплатно !?

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

Предложение:

можно за доширак.

Morroc
Offline
Зарегистрирован: 24.10.2016

zDimaBY пишет:

Как пофиксить незнаю.. есть у кого какие предложение ?

Учитывать историю и скорость изменения, видимо.

zDimaBY
Offline
Зарегистрирован: 10.06.2018

brokly пишет:

А предложения должны быть от нас !? Может вы ошиблись веткой ? Тут обычно предлагает заказчик... А исполнители, очень часто его посылают, потому что заказчик хочет за копейки... А вы вооще.... бесплатно !?

Дак я и сам программирую, а заказчик возможно не знает цен.. можно например вначале темы закрепить количество строк == рублей или по чем-то измерять == цену.. так и спрашиваю, а заказчик полюбому будет хотеть за копейки. "Хотеть не вредно, вредно не хотеть" как говориться. Вот оценивают например 3 задачи https://kwork.ru/software/9632118/vypolnenie-raboty-na-c-ili-java 500р. https://kwork.ru/software/355630/napishu-sketch-dlya-arduino

Бармалей пишет:

Предложение:

можно за доширак.

500р ? Или сколько.. 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Хапнуть подряд любой ценой, а потом искать таджиков для выполнения - классика жанра))

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Так программист просит помощи программиста )) Или какой-то дед изучает программирование или студент пишет курсовую.. Ментор, ментор гдеже ты.. найдись.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

zDimaBY пишет:

Так программист просит помощи программиста ))

1. Помогают - котенку, когда у него коготок в батарее или занавеске застрял. Все остальное  - услуга. Услуги оказывают за вознаграждение (разное) или по дружбе. Я тебя знаю, родное сердце? ;))

2. Нельзя ли в теме про кораблик использовать морские навигационные термины, а не "азимут"? У комбинации судна и объекта есть три слова: курс, пеленг и курсовой угол. Так что тебе про желаемое направление известно его пеленг или курсовой угол?

На всякий случай: Курс - угол между севером и направлением движения, Пеленг на объект - угол между севером и направлением на объект с центром в месте расположения судна, Курсовой угол (левого или правого борта) - угол между направлением движения и направлением на объект.  А азимуты, они все у геодезистов. ;))

zDimaBY
Offline
Зарегистрирован: 10.06.2018

wdrakula пишет:

zDimaBY пишет:

Так программист просит помощи программиста ))

1. Помогают - котенку, когда у него коготок в батарее или занавеске застрял. Все остальное  - услуга. Услуги оказывают за вознаграждение (разное) или по дружбе. Я тебя знаю, родное сердце? ;))

Сейчас познакомимся пингвинчик ты мой ))) Разве на форуме не могут что-то подсказать или тут только предоставляют свои услуги..  например

Morroc пишет:
zDimaBY пишет:
Как пофиксить незнаю.. есть у кого какие предложение ?
Учитывать историю и скорость изменения, видимо.
думает так можно.. (спасибо)

wdrakula пишет:

zDimaBY пишет:

Так программист просит помощи программиста ))

2. Нельзя ли в теме про кораблик использовать морские навигационные термины, а не "азимут"? У комбинации судна и объекта есть три слова: курс, пеленг и курсовой угол. Так что тебе про желаемое направление известно его пеленг или курсовой угол?

Можно и морские навигационные термины. Мне известно мой курс и пеленг  на объект я не понимаю как держать через серво истинные направления на объект если есть какое либо отклонение.. и как быть с 0-359 град. например пеленг 359 град. на практике есть отклонения ветер и волны тоисть кораблик подумает сделать разворот если будет 0 град.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

zDimaBY пишет:

Сейчас познакомимся

Нет мотивации. Сорри.

zDimaBY пишет:

Можно и морские навигационные термины. Мне известно мой курс и пеленг  на объект я не понимаю как держать через серво истинные направления на объект если есть какое либо отклонение.. и как быть с 0-359 град. например пеленг 359 град. на практике есть отклонения ветер и волны тоисть кораблик подумает сделать разворот если будет 0 град.

ТЫ опять ИП с КУ перепутал. Истинный пеленг - угол между СЕВЕРОМ И ОБЪЕКТОМ. Курсовой угол - между курсом и объектом. Тебе надо держать курс на объект? И кораблик "дурит" около 0° ? Так не принимай решений об изменении курса, пока не накопится ошибка в 5° или 10° . Тебе нужно записать лог на карточку и посмотреть статистику измерений, какое получится среднее отклонение.

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

wdrakula пишет:

 А азимуты, они все у геодезистов. ;))

ага и, измеряется в РУМБах )))

zDimaBY
Offline
Зарегистрирован: 10.06.2018

wdrakula пишет:

zDimaBY пишет:

Сейчас познакомимся

Нет мотивации. Сорри.

zDimaBY пишет:

Можно и морские навигационные термины. Мне известно мой курс и пеленг  на объект я не понимаю как держать через серво истинные направления на объект если есть какое либо отклонение.. и как быть с 0-359 град. например пеленг 359 град. на практике есть отклонения ветер и волны тоисть кораблик подумает сделать разворот если будет 0 град.

ТЫ опять ИП с КУ перепутал. Истинный пеленг - угол между СЕВЕРОМ И ОБЪЕКТОМ. Курсовой угол - между курсом и объектом. Тебе надо держать курс на объект? И кораблик "дурит" около 0° ? Так не принимай решений об изменении курса, пока не накопится ошибка в 5° или 10° . Тебе нужно записать лог на карточку и посмотреть статистику измерений, какое получится среднее отклонение.


ИП = ИК + КУ. Оно все связано между собой ИК = ИП − КУ, КУ = ИП − ИК. Ок, попробую ограничить.. но подход не правильный всё же..

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Бармалей пишет:

Предложение:

можно за доширак.

ОПЯТЬ !?! Ты что с голоду пухнешь и делать нечего ? Давай найду тебе работы, за доширак.

ТС, программируешь сам - программируй и спрашивай в других темах с демонстрацией напрограммированного.

Пришел сюда искать исполнителя, сразу, забудь что ты программируешь. Приготовь деньги. Твои знания тебе УЖЕ не помогли, раз ты тут :)

zDimaBY
Offline
Зарегистрирован: 10.06.2018

brokly пишет:

Бармалей пишет:

Предложение:

можно за доширак.

ОПЯТЬ !?! Ты что с голоду пухнешь и делать нечего ? Давай найду тебе работы, за доширак.

ТС, программируешь сам - программируй и спрашивай в других темах с демонстрацией напрограммированного.

Пришел сюда искать исполнителя, сразу, забудь что ты программируешь. Приготовь деньги. Твои знания тебе УЖЕ не помогли, раз ты тут :)

Я и не говорил что не буду платить.. наоборот сюда сюда писал чтобы за это заплатить. Но я уже сделал пример то что нужно. но не понимаю как при courseroll = 350, azimuth = 10 сделать 

22:58:27.891 -> delta -20
22:58:27.891 -> infopot2 60
и при courseroll = 355, azimuth = 10 должно быть
22:58:27.891 -> delta -15
22:58:27.891 -> infopot2 65
при courseroll = 0, azimuth = 10
22:58:27.891 -> delta -10
22:58:27.891 -> infopot2 70
 
help me please guys//
int courseroll = 350, azimuth = 10, delta, infopot1, infopot2;

void setup() {
  Serial.begin(9600);
  delta = courseroll - azimuth;
  Serial.print("delta ");
  Serial.println(delta);
  if (delta > 0) {
    infopot1 = 80 + delta;
    Serial.print("infopot1 ");
    Serial.println(constrain(infopot1, 80, 100));
  } else {
    infopot2 = 80 - abs(delta);
    Serial.print("infopot2 ");
    Serial.println(constrain(infopot2, 60, 80));
  }
}
void loop() {
}