Скачки задержки

AlexSH
Offline
Зарегистрирован: 28.02.2018

Здравствуйте. Я делаю поворотную платформу для съемки timelapse/панорам. Устройство предполагает задание задержки между шагами сервы с потенциометра. Проблема в том, что задержка, которую я задаю, очень сильно прыгает и это очень сильно сказывается на плавности картинки. То, как это выглядит при выводе в серийный порт, видно на скрине. Как это исправить?

Скетч:

#include <Servo.h>
 
Servo myservo;  
 
int pos = 0;    
int del;
int potpin = 0;
unsigned long timing;
 
void setup() 
{
myservo.attach(3);
Serial.begin (9600);
}
 
void loop() 
{
for (pos = 10; pos <= 170; pos += 1) {
del = analogRead(potpin);
del = map(del, 0, 1023, 60, 23000); 
Serial.println(del);
myservo.write(pos); 
delay (del);
}
  for (pos = 170; pos >= 10; pos -= 1) {
del = analogRead(potpin); 
del= map(del, 0, 1023, 60, 23000);
Serial.println(del);
myservo.write(pos);
delay (del);  
}
}
 
ЗЫ: Программа наверняка написана нерационально, прошу сильно тряпками не кидаться, я только начал осваивать ардуино)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AlexSH пишет:
видно на скрине.
не видно.

Вставьте код как положено. А данные из мониторе скопипастьте также, как код. Тогда видно будет, посмотрим.

AlexSH
Offline
Зарегистрирован: 28.02.2018
#include <Servo.h>

Servo myservo;  

int pos = 0;    
int del;
int potpin = 0;
unsigned long timing;

void setup() 
{
myservo.attach(3);
Serial.begin (9600);
}

void loop() 
{
for (pos = 10; pos <= 170; pos += 1) {
del = analogRead(potpin);
del = map(del, 0, 1023, 60, 23000); 
Serial.println(del);
myservo.write(pos); 
delay (del);
}
  for (pos = 170; pos >= 10; pos -= 1) {
del = analogRead(potpin); 
del= map(del, 0, 1023, 60, 23000);
Serial.println(del);
myservo.write(pos);
delay (del);  
}
}

Данные порта:

60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
23000
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
216
60
60
60
60
60
60
60
60
60
60
216
60
60
60
60
60
60
60
60
60
60
194
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
216
60
60
60
60
60
60
60
60
60
60
216
60
60
60
60
60
60
60
60
60
60
172
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
172
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
1046
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
1113
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
216
60
60
60

 

ven-til
Offline
Зарегистрирован: 13.02.2018

а зачем снимать значение с потенциометра по время работы программы? Вы во время съемки таймлапса планируете менять скорость?

AlexSH
Offline
Зарегистрирован: 28.02.2018

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Присоединяюсь к предыдущему замечанию.

А про выбросы.

Ваши выброс очень похожи не "дребезг потенциометра", т.е. при вращении ручки (а если потенциометр дешёвый и раздолбанный, так часто и "от сквозняка") иногда ненадолго пропадает контакт и средний провод провисает в воздухе.

Можно взять очень дорогой потенциометр, но на 100% это проблему не решит (тем более, что в гаражах, и наших, и китайских давно научились слово Bourns писать на пластике).

Ваше всё в данном случае - простой программный ФНЧ - он должен решить проблему.

Охххх так у Вас там delay! Тогда это скорее всего не дребезг! Тогда Вы просто успеваете повернуть ручку на ХЗ сколько пока программа в delay сидит. Избавляйтесь от delay!

ven-til
Offline
Зарегистрирован: 13.02.2018

ЕвгенийП пишет:

Охххх так у Вас там delay! Тогда это скорее всего не дребезг! Тогда Вы просто успеваете повернуть ручку на ХЗ сколько пока программа в delay сидит. Избавляйтесь от delay!

А может и наводки какие. Схема небось пока на коленке собрана.

Охххх, как минимум нужно отказаться от delay. И раз уж это поворотный механизм для панорам или таймлапса, то сначала настраиваем скорость, а потом включаем механизм  в работу, а не во время работы. Например в setup считываем значение потенциометра , пока 0 не выходим из setup, если не ноль то ждем. Если тоже самое значение сохранялось пять сек, то это значение берется как рабочее и переходим в loop. В loop к потенциометру не обращаемся.

ven-til
Offline
Зарегистрирован: 13.02.2018

Хотя в loop уже можно delay оставить, если там больше ничего другого не будет.

AlexSH
Offline
Зарегистрирован: 28.02.2018

Я понимаю, что delay при таких задержках-зло. Я пробовал millis, но что-то не срослось. Не понимаю, как с ним работать в этом случае.

ven-til
Offline
Зарегистрирован: 13.02.2018
AlexSH
Offline
Зарегистрирован: 28.02.2018

Спасибо, разберусь. Сейчас я переместил считывание данных в void loop, всё стабильно. Но каждый раз делать ресет очень неудобно, серва дергается и значение сложно подобрать. Надеюсь это поможет.

ven-til
Offline
Зарегистрирован: 13.02.2018

Можно и в loop настройки сделать, можно и из цикла панорамирования выход сделать если потенциометр в 0 вернуть и не двигать несколько секунд. Надо ставить задачу со всеми хотелками и потом уже думать как реализовать.

ven-til
Offline
Зарегистрирован: 13.02.2018

Можно и в loop настройки сделать, можно и из цикла панорамирования выход сделать если потенциометр в 0 вернуть и не двигать несколько секунд. Надо ставить задачу со всеми хотелками и потом уже думать как реализовать.