Плавный поворот сервы на азимут. и фикс 359-0 град.
- Войдите на сайт для отправки комментариев
Сб, 05/06/2021 - 19:29
001 | while (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 к примеру, и кораблик делает полный разворот. Как пофиксить незнаю.. есть у кого какие предложение ?
А предложения должны быть от нас !? Может вы ошиблись веткой ? Тут обычно предлагает заказчик... А исполнители, очень часто его посылают, потому что заказчик хочет за копейки... А вы вооще.... бесплатно !?
Предложение:
можно за доширак.
Как пофиксить незнаю.. есть у кого какие предложение ?
Учитывать историю и скорость изменения, видимо.
А предложения должны быть от нас !? Может вы ошиблись веткой ? Тут обычно предлагает заказчик... А исполнители, очень часто его посылают, потому что заказчик хочет за копейки... А вы вооще.... бесплатно !?
Дак я и сам программирую, а заказчик возможно не знает цен.. можно например вначале темы закрепить количество строк == рублей или по чем-то измерять == цену.. так и спрашиваю, а заказчик полюбому будет хотеть за копейки. "Хотеть не вредно, вредно не хотеть" как говориться. Вот оценивают например 3 задачи https://kwork.ru/software/9632118/vypolnenie-raboty-na-c-ili-java 500р. https://kwork.ru/software/355630/napishu-sketch-dlya-arduino
Предложение:
можно за доширак.
500р ? Или сколько..
Хапнуть подряд любой ценой, а потом искать таджиков для выполнения - классика жанра))
Так программист просит помощи программиста )) Или какой-то дед изучает программирование или студент пишет курсовую.. Ментор, ментор гдеже ты.. найдись.
Так программист просит помощи программиста ))
1. Помогают - котенку, когда у него коготок в батарее или занавеске застрял. Все остальное - услуга. Услуги оказывают за вознаграждение (разное) или по дружбе. Я тебя знаю, родное сердце? ;))
2. Нельзя ли в теме про кораблик использовать морские навигационные термины, а не "азимут"? У комбинации судна и объекта есть три слова: курс, пеленг и курсовой угол. Так что тебе про желаемое направление известно его пеленг или курсовой угол?
На всякий случай: Курс - угол между севером и направлением движения, Пеленг на объект - угол между севером и направлением на объект с центром в месте расположения судна, Курсовой угол (левого или правого борта) - угол между направлением движения и направлением на объект. А азимуты, они все у геодезистов. ;))
Так программист просит помощи программиста ))
1. Помогают - котенку, когда у него коготок в батарее или занавеске застрял. Все остальное - услуга. Услуги оказывают за вознаграждение (разное) или по дружбе. Я тебя знаю, родное сердце? ;))
Сейчас познакомимся пингвинчик ты мой ))) Разве на форуме не могут что-то подсказать или тут только предоставляют свои услуги.. например
Так программист просит помощи программиста ))
2. Нельзя ли в теме про кораблик использовать морские навигационные термины, а не "азимут"? У комбинации судна и объекта есть три слова: курс, пеленг и курсовой угол. Так что тебе про желаемое направление известно его пеленг или курсовой угол?
Можно и морские навигационные термины. Мне известно мой курс и пеленг на объект я не понимаю как держать через серво истинные направления на объект если есть какое либо отклонение.. и как быть с 0-359 град. например пеленг 359 град. на практике есть отклонения ветер и волны тоисть кораблик подумает сделать разворот если будет 0 град.
Сейчас познакомимся
Нет мотивации. Сорри.
Можно и морские навигационные термины. Мне известно мой курс и пеленг на объект я не понимаю как держать через серво истинные направления на объект если есть какое либо отклонение.. и как быть с 0-359 град. например пеленг 359 град. на практике есть отклонения ветер и волны тоисть кораблик подумает сделать разворот если будет 0 град.
ТЫ опять ИП с КУ перепутал. Истинный пеленг - угол между СЕВЕРОМ И ОБЪЕКТОМ. Курсовой угол - между курсом и объектом. Тебе надо держать курс на объект? И кораблик "дурит" около 0° ? Так не принимай решений об изменении курса, пока не накопится ошибка в 5° или 10° . Тебе нужно записать лог на карточку и посмотреть статистику измерений, какое получится среднее отклонение.
А азимуты, они все у геодезистов. ;))
ага и, измеряется в РУМБах )))
Сейчас познакомимся
Нет мотивации. Сорри.
Можно и морские навигационные термины. Мне известно мой курс и пеленг на объект я не понимаю как держать через серво истинные направления на объект если есть какое либо отклонение.. и как быть с 0-359 град. например пеленг 359 град. на практике есть отклонения ветер и волны тоисть кораблик подумает сделать разворот если будет 0 град.
ТЫ опять ИП с КУ перепутал. Истинный пеленг - угол между СЕВЕРОМ И ОБЪЕКТОМ. Курсовой угол - между курсом и объектом. Тебе надо держать курс на объект? И кораблик "дурит" около 0° ? Так не принимай решений об изменении курса, пока не накопится ошибка в 5° или 10° . Тебе нужно записать лог на карточку и посмотреть статистику измерений, какое получится среднее отклонение.
ИП = ИК + КУ. Оно все связано между собой ИК = ИП − КУ, КУ = ИП − ИК. Ок, попробую ограничить.. но подход не правильный всё же..
Предложение:
можно за доширак.
ОПЯТЬ !?! Ты что с голоду пухнешь и делать нечего ? Давай найду тебе работы, за доширак.
ТС, программируешь сам - программируй и спрашивай в других темах с демонстрацией напрограммированного.
Пришел сюда искать исполнителя, сразу, забудь что ты программируешь. Приготовь деньги. Твои знания тебе УЖЕ не помогли, раз ты тут :)
Предложение:
можно за доширак.
ОПЯТЬ !?! Ты что с голоду пухнешь и делать нечего ? Давай найду тебе работы, за доширак.
ТС, программируешь сам - программируй и спрашивай в других темах с демонстрацией напрограммированного.
Пришел сюда искать исполнителя, сразу, забудь что ты программируешь. Приготовь деньги. Твои знания тебе УЖЕ не помогли, раз ты тут :)
Я и не говорил что не буду платить.. наоборот сюда сюда писал чтобы за это заплатить. Но я уже сделал пример то что нужно. но не понимаю как при courseroll = 350, azimuth = 10 сделать
01
int
courseroll = 350, azimuth = 10, delta, infopot1, infopot2;
02
03
void
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
}
18
void
loop
() {
19
}