Управление задержкой сервы с помощью энкодера

zxgame

✩✩✩✩✩✩✩
15 Дек 2022
18
0
Добрый день! Подскажите , пожалуйста, пытаюсь сделать управление задержкой сервы (что то вроде клапана, пока приходится прошивать время в ручную), решил попробовать задержку регулировать энкодером с помощью библиотеки Гайвера. Не пойму как можно выцеплять данные из цикла энкодера и передавать их серве. Код приблизительно такой:
C++:
#include <Servo.h> // подключаем библиотеку для работы с сервоприводом

 // объявляем переменную servo типа "servo1"
#define CLK 2
#define DT 3
#define SW 4
#include "GyverEncoder.h"

Encoder enc1(CLK, DT, SW);
int val = 0;
Servo servo1;
void setup() {
   servo1.attach(11);
  Serial.begin(9600);
  enc1.setType(TYPE2);
}
void loop() {
 servo1.write(0); //
   delay(val); //

   servo1.write(45); //
   delay(val); //
 
  // обязательная функция отработки. Должна постоянно опрашиваться
  enc1.tick();
 
  if (enc1.isTurn()) {     // если был совершён поворот (индикатор поворота в любую сторону)
    // ваш код
  }
 
  if (enc1.isRight())  val++;         // если был поворот
  if (enc1.isLeft())  val--;
 
}
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
419
126
@zxgame,
Как вы собираетесь делать индикацию нового значения задержки при изменении?
 

zxgame

✩✩✩✩✩✩✩
15 Дек 2022
18
0
@zxgame,
Как вы собираетесь делать индикацию нового значения задержки при изменении?
Да мне хоть бы сделать чтобы регулировалась задержка, это уже будет супер. Я ради такого и ручным таймером померею, я и так каждый раз прошиваю задержки вручную. А так семисегментным тм1637 думал
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
419
126
@zxgame,
Сначала надо придумать алгоритм на человеческом языке, а потом программировать.
Можно например обойтись одной кнопкой. При включении устройства в setup измерять время между двумя нажатиями, это и будет время задержки. Если времена задержки маленькие, то можно делить время между нажатиями на какой то коэффициент.
Как удобно регулировать энкодером в слепую, я предложить не берусь.
(Я так понимаю, что Serial не доступен для использования при регулировке).
 

poty

★★★★★★✩
19 Фев 2020
3,169
926

@zxgame, не очень понятно чего хочется добиться? Delay обеспечивает задержку в миллисекундах, не уверен, что сервопривод в принципе способен за миллисекунды отработать 45 градусов.
tick для энкодера должна постоянно опрашиваться, использование delay здесь недопустимо. Либо переходите на millis (или аппаратные таймеры), либо подключайте прерывания для энкодера.
 
  • Лойс +1
Реакции: Старик Похабыч

zxgame

✩✩✩✩✩✩✩
15 Дек 2022
18
0
@Bruzzer, Подскажите, пожалуйста, а допустим если просто сделать с помощью кнопки - одина кнопка клик увеличивает задержку на секунду, вторая - уменьшает на секунду. Мне точного значения не надо, клапан-серва будет чуть чаше или реже открываться и визуально уже будем смотреть. Для этого будет достаточно добавить в луп такой код?
C++:
void loop() {
servo1.write(0); //
   delay(val); //

   servo1.write(45); //
   delay(300); //

  if (btn1.click()) val = val +1000 ;

}
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
419
126
@zxgame,
Если в коде используется delay(), то надо изменить способ вызова tick
Или в yield или по прерыванию или по таймеру.
Если у вас UNO или NANO, то проще всего добавить функцию yield() (она потом автоматически будет вызываться в delay)
C++:
void yield() {
    btn1.tick();
}
В новых версиях EncButton надо вызывать tickRaw(); и потом в основном цикле clear(); после проверок нажатий
См. https://github.com/GyverLibs/EncButton
Там же есть ссылки на симулятор wokwi, где можно добавить в код yield, delay(), удалить и посмотреть на результат.

Так же стоит добавить проверки, что val не выходит за границы допустимого ( в том числе не меньше 0 при уменьшении).
И если val может быть больше 30 секунд, то лучше сделать его не int а long
if (btn1.click()) val = val +1000 ;
 

zxgame

✩✩✩✩✩✩✩
15 Дек 2022
18
0
C++:
Там же есть ссылки на симулятор wokwi,
Огромное спасибо, к своему стыду не знал о данном симуляторе. Это просто супер!