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

zDimaBY
Offline
Зарегистрирован: 10.06.2018
001while (flag) {
002  GPSStatys(); // NEO-6m ackData[1] - GPS курс, ackData[2] - дистанция, ackData[3] - азимут, ackData[5] - КМ/ч
003  if (millis() - timeoutAV >= 50) {
004    timeoutAV = millis();
005    target_on = false;
006    StatCompass(); // Цыфровий компас ackData[4] - курс
007  }
008  NRF24L01();
009  if (recieved_data[3] > 10) {
010    flag = false;
011    motorspeed = 28;
012  }
013  if (ackData[2] > 5) {
014    servo2.write(map(180, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
015    servo3.write(map(0, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
016  }
017  if (ackData[2] < 2) {
018    if (is_one2) {
019      flag = false;
020      motorspeed = 28;
021      is_one2 = false;
022    }
023    if (recieved_data[5] == 1) {
024      DISTANCE_LAT = eeprom_read_float(0);
025      DISTANCE_LNG = eeprom_read_float(4);
026      if (is_one3) {
027        for (int twoi = 180; twoi > 30; twoi--) {
028          servo2.write(map(twoi, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
029        }
030        for (int threei = 0; threei < 150; threei++) {
031          servo3.write(map(threei, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
032        }
033      }
034      target_on = true;
035      if (GPS_ON) {
036        is_one2 = true;
037        GPS_ON = false;
038      }
039    } else {
040      is_one2 = true;
041    }
042  } else { // вычисление угола поворота на азимут
043    if ( ackData[4] > ackData[3] + 40 || ackData[4] < ackData[3] - 40) {
044      limitspeed = 50;
045      SpeedMotor();
046      if ( ackData[4] > ackData[3] ) { /// отклонение большое + - 40
047        if (is_one0) {
048          turn = 80;
049          is_one0 = false;
050        }
051        is_one1 = true;
052        turn++;
053        if (turn >= 100) {
054          turn = 100;
055        }
056        motor.write(map(motorspeed, 0, 255, 800, 2550));
057        servo1.write(map(turn, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
058      } else {
059        if (is_one1) {
060          turn = 80;
061          is_one1 = false;
062        }
063        is_one0 = true;
064        turn--;
065        if (turn <= 60) {
066          turn = 60;
067        }
068        motor.write(map(motorspeed, 0, 255, 800, 2550));
069        servo1.write(map(turn, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
070      }
071    } else if ( ackData[4] > ackData[3] + 20 || ackData[4] < ackData[3] - 20) { /// отклонение средние + - 20
072      limitspeed = 60;
073      SpeedMotor();
074      if ( ackData[4] > ackData[3] ) {
075        if (is_one0) {
076          turn = 80;
077          is_one0 = false;
078        }
079        is_one1 = true;
080        turn++;
081        if (turn >= 90) {
082          turn = 90;
083        }
084        motor.write(map(motorspeed, 0, 255, 800, 2550));
085        servo1.write(map(turn, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
086      } else {
087        if (is_one1) {
088          turn = 80;
089          is_one1 = false;
090        }
091        is_one0 = true;
092        turn--;
093        if (turn <= 70) {
094          turn = 70;
095        }
096        motor.write(map(motorspeed, 0, 255, 800, 2550));
097        servo1.write(map(turn, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
098      }
099    } else { /// отклонение малое + - 5
100      limitspeed = 70;
101      SpeedMotor();
102      if ( ackData[4] > ackData[3] ) {
103        if (is_one0) {
104          turn = 80;
105          is_one0 = false;
106        }
107        is_one1 = true;
108        turn++;
109        if (turn >= 85) {
110          turn = 85;
111        }
112        motor.write(map(motorspeed, 0, 255, 800, 2550));
113        servo1.write(map(turn, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
114      } else {
115        if (is_one1) {
116          turn = 80;
117          is_one1 = false;
118        }
119        is_one0 = true;
120        turn--;
121        if (turn <= 75) {
122          turn = 75;
123        }
124        motor.write(map(motorspeed, 0, 255, 800, 2550));
125        servo1.write(map(turn, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH));
126      }
127    }
128  }
129}

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

Поворот сервы ограничено 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//
01int courseroll = 350, azimuth = 10, delta, infopot1, infopot2;
02 
03void setup() {
04  Serial.begin(9600);
05  delta = courseroll - azimuth;
06  Serial.print("delta ");
07  Serial.println(delta);
08  if (delta > 0) {
09    infopot1 = 80 + delta;
10    Serial.print("infopot1 ");
11    Serial.println(constrain(infopot1, 80, 100));
12  } else {
13    infopot2 = 80 - abs(delta);
14    Serial.print("infopot2 ");
15    Serial.println(constrain(infopot2, 60, 80));
16  }
17}
18void loop() {
19}