Работа servo от кнопок.

VictorArx

★★✩✩✩✩✩
22 Мар 2021
471
78
Оформи код соответствующим тэгом
Утро доброе всем! Проблема следующая. Есть servo на 360 градусов(купил на Али) без ограничителя. Написал скетч с двумя кнопками для поворотов в обе стороны. Компиляция нормальная, только servo крутится не управляемый. Что нужно добавить в скетче, какую строчку? Если я подключаю servo на 180 градусов с ограничителем, то всё работает правильно.

#include <Servo.h>



#define ServoPin 5 //пин сервы

#define BUT_1 2 //BUT_1 и BUT_2 - кнопки управления сервой (тут пин 4)

#define BUT_2 4 //BUT_1 и BUT_2 - кнопки управления сервой (тут пин 5)

#define SHAG 5 //шаг поворота сервы, в градусах



Servo myServo;



int angle = 0; //начальный угол



void setup()

{

myServo.attach(ServoPin);

myServo.write(angle); //состояние после включения

pinMode(BUT_1, INPUT); //для считывания состояний кнопок

pinMode(BUT_2, INPUT); //для считывания состояний кнопок

// кнопки соединены с ардуиной стягивающим резистором! (т.е. когда не нажато 0 В)

}

void loop()

{

if (digitalRead(BUT_1)) angle = angle + SHAG; //если первая кнопка увеличим угол

if (digitalRead(BUT_2)) angle = angle - SHAG;//если вторая уменьшим



if (angle > 180) angle = 180; //ограничим угол сервы 0..180

if (angle < 0) angle = 0;



myServo.write(angle); //задаем получившийся угол

delay(300); // подождем перед следующим опросом

}
 

Nikanor

★★✩✩✩✩✩
1 Окт 2020
180
52
1. написать что такое работает правильно, а что не правильно.
2. почитать о дребезге контактов кнопки и правильно прописать в коде работу с кнопками.
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
471
78
C++:
#include <Servo.h>

    

  #define ServoPin 5  //пин сервы

  #define BUT_1 2     //BUT_1 и BUT_2 - кнопки управления сервой (тут пин 4)

  #define BUT_2 4 //BUT_1 и BUT_2 - кнопки управления сервой (тут пин 5)

  #define SHAG 5          //шаг поворота сервы, в градусах

  

  Servo myServo;

  

  int angle = 0;  //начальный угол

    

  void setup()

  {

    myServo.attach(ServoPin);

    myServo.write(angle);     //состояние после включения

    pinMode(BUT_1, INPUT);    //для считывания состояний кнопок

    pinMode(BUT_2, INPUT);    //для считывания состояний кнопок

  // кнопки соединены с ардуиной стягивающим резистором! (т.е. когда не нажато 0 В)

  }

  void loop()

  {

    if (digitalRead(BUT_1)) angle = angle + SHAG; //если первая кнопка увеличим угол

    if (digitalRead(BUT_2)) angle = angle - SHAG;//если вторая уменьшим

  

    if (angle > 180) angle = 180;    //ограничим угол сервы 0..180

    if (angle < 0) angle = 0;

  

    myServo.write(angle); //задаем получившийся угол

    delay(300); // подождем перед следующим опросом

  }
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
471
78
1. написать что такое работает правильно, а что не правильно.
2. почитать о дребезге контактов кнопки и правильно прописать в коде работу с кнопками.
Правильно работает, когда подключена серва 180 градусов с ограничителем. Одна кнопка управляет сервой по часовой , другая кнопка против часовой. Насчёт дребезга контактов знаю, только серва 360 градусов без ограничителя сразу начинает крутиться, как с..., без нажимания кнопок. Так понятно объяснил?
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
471
78
Как вы предполагаете должна работать серва на 360 градусов ?
Спасибо Вам, что ответили. Читал много Ваших публикаций на тему Arduino и не скрою , что даже хотел написать Вам сообщение. Опередили. Теперь по теме. В моём понятии, должна поварачиваться серва в одну сторону максимально и в другую .180 градусов не хватает для поворотного устройства. Поэтому и хочу может , как програмно в скетче че нить замутить. Только начал осваивать МК.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,186
1,280
Москва
А я тут мало помогу, т.к. у меня серв на 360 нет, но на сколько я знаю сервы 360 градусов называют сервами постоянного вращения и как я понял вы задаете скорость с какой она будет вращаться в ту или иную сторону и все. Не угол , на который серва будет выставлена.
 

poty

★★★★★★✩
19 Фев 2020
2,990
895

Согласно этому описанию для сервы на 360 в методе write указывается скорость вращения, а не угол.
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
471
78
А я тут мало помогу, т.к. у меня серв на 360 нет, но на сколько я знаю сервы 360 градусов называют сервами постоянного вращения и как я понял вы задаете скорость с какой она будет вращаться в ту или иную сторону и все. Не угол , на который серва будет выставлена.
Совершенно верно. Меня интересует только вращение в одну и другую сторону с помощью двух кнопок. Только подключаю Arduino серва начинает вращаться сама по себе и не реагирует на кнопки. Если я подключаю серво на 180 градусов , то кнопками можно управлять, но, не хватает угла поворота. Может под енту серву скетч другой замутить, не подскажете?
 

Nikanor

★★✩✩✩✩✩
1 Окт 2020
180
52
серва постоянного вращения (невозможно отследить положение)
90 гр - стоит
>90 гр - вращение в одну сторону
<90 гр - вращение в другую сторону

есть сервы на 270 гр, 360 гр и многооборотные сервы (для моделей яхт. дорогие...)
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
471
78
серва постоянного вращения (невозможно отследить положение)
90 гр - стоит

<90 гр - вращение в другую сторону

есть сервы на 270 гр, 360 гр и многооборотные сервы (для моделей яхт. дорогие...)
Если я правильно понял, в скетче вместо angle =0, нужно поставить 90?
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
471
78
C++:
int buttPlus = 2;
int buttMinus = 4;
int servo = 9;

void setup() {

  pinMode(buttPlus, INPUT);
  pinMode(buttMinus, INPUT);
  Serial.begin(115200);
  pinMode(servo, OUTPUT);
  digitalWrite(servo, LOW);
}
uint16_t one_tick = 1700;
void loop() {
  delay(100);
  if (digitalRead(buttPlus) == HIGH)


  {
    tone(9, 1000);
    Serial.println("tick1");

    delay(50);
    noTone(9);

  }

  if (digitalRead(buttMinus) == HIGH)


  {
    tone(9, 300);
    Serial.println("tick2");
    delay(50);


    noTone(9);


  }

}
Теперь получилось. Управление серво на 360 градусов от кнопок.