Изменение положения двух сервоприводов по нажатию кнопок

ded_60_let
Offline
Зарегистрирован: 01.03.2015

Прочитал тему "Изменение положения сервы по нажатию кнопки" ,хотел там поспрашать умных людей , но посоветовали создать свою тему. Вопрос в чем- залил скетч из выше упомянутой темы от форумчанина   "SU-27-16"-все замечательно работает, но мне нужно  подключить 2 сервы с кнопочным управлением. Как указать что кнопки 1,2 управляют 1 сервой , а 3,4 -второй.Своих мозгов не хватает 

Скетч от SU-27-16

01 #include <Servo.h>
02 #define ServoPin 9  // пин сервы
03 #define BUT_1 4     // BUT_1 и BUT_2 - кнопки управления сервой (тут пин 4)
04 #define BUT_2 5         // BUT_1 и BUT_2 - кнопки управления сервой (тут пин 5)
05 #define SHAG 1          // шаг поворота сервы, в градусах
06 Servo myServo;
07 int angle = 0;          //начальный угол
08 void setup()
09 {
10   myServo.attach(ServoPin);
11   myServo.write(angle);       //состояние после включения
12   pinMode(BUT_1, INPUT);      //для считывания состояний кнопок
13   digitalWrite( BUT_1 , HIGH );   // подтяжка
14   pinMode(BUT_2, INPUT);      //для считывания состояний кнопок
15   digitalWrite( BUT_2 , HIGH );   // подтяжка
16 // кнопки соединены с ардуиной стягивающим резистором! (т.е. когда не нажато 0 В)  изменить !!!!!
17 // кнопки соединены с ардуиной ПОДТЯГИВАЮЩИМ резистором! (т.е. когда не нажато 5 В) !!!!!!!!!!!!!!!!
18 }
19 void loop()
20 {
21   if ( ! digitalRead(BUT_1)) angle = angle + SHAG; //если первая кнопка увеличим угол
22   if ( ! digitalRead(BUT_2)) angle = angle - SHAG; //если вторая уменьшим
23  
24   if (angle > 180) angle = 180;    //ограничим угол сервы 0..180
25   if (angle < 0) angle = 0;
26  
27   myServo.write(angle); //задаем получившийся угол
28   delay(300);           // подождем перед следующим опросом

 

29 }

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

моё решение - не самое лучшее ! не ссылайтесь на миня.....

для двух и более - позжеее

ded_60_let
Offline
Зарегистрирован: 01.03.2015

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

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

хорошо, как чайник чайнику - напишу...

vvadim
Offline
Зарегистрирован: 23.05.2012

почитай для общего развития

http://arduino.ru/forum/obshchii/prezhde-chem-sprosit-pro-servomashinku-...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#include <Servo.h>
#define ServoPin_1 9
#define ServoPin_2 10
#define BUT_1 4
#define BUT_2 5
#define BUT_3 6
#define BUT_4 7
#define SHAG 1
Servo myServo1;
Servo myServo2;
int angle_1 = 0;
int angle_2 = 0;
//=====================================================
void setup()
{
  myServo1.attach(ServoPin_1);
  myServo1.write(angle_1);
  myServo2.attach(ServoPin_2);
  myServo2.write(angle_2);
  pinMode(BUT_1,INPUT);
  digitalWrite( BUT_1,HIGH );
  pinMode(BUT_2,INPUT);
  digitalWrite( BUT_2,HIGH );
  pinMode(BUT_3,INPUT);
  digitalWrite( BUT_3,HIGH );
  pinMode(BUT_4,INPUT);
  digitalWrite( BUT_4,HIGH );
}
//=====================================================
void loop()
{
  if (!digitalRead(BUT_1))
  {
    angle_1 = angle_1 + SHAG;
    if (angle_1>180) angle_1 = 180;
  }
  if (!digitalRead(BUT_2))
  {
    angle_1 = angle_1 - SHAG;
    if (angle_1<0) angle_1 = 0;
  }
  myServo1.write(angle_1);


/* подправить - кнопки 3 и 4 , угол_2 , серво2
  if (!digitalRead(BUT_1))
  {
    angle_1 = angle_1 + SHAG;
    if (angle_1>180) angle_1 = 180;
  }
  if (!digitalRead(BUT_2))
  {
    angle_1 = angle_1 - SHAG;
    if (angle_1<0) angle_1 = 0;
  }
  myServo_1.write(angle_1);
*/


/* подправить - кнопки 5 и 6 , угол_3 , серво3        :)
  if (!digitalRead(BUT_1))
  {
    angle_1 = angle_1 + SHAG;
    if (angle_1>180) angle_1 = 180;
  }
  if (!digitalRead(BUT_2))
  {
    angle_1 = angle_1 - SHAG;
    if (angle_1<0) angle_1 = 0;
  }
  myServo_1.write(angle_1);
*/


  delay(300);
}
//=====================================================

 

ded_60_let
Offline
Зарегистрирован: 01.03.2015

Большое человеческое СПАСИБО. Все отлично зароботало. Подправил где требовалось. Принцип я понял -хотя и не до конца.

Буду дальше двигаться -ардуинка месяц назад в руки попала. Литературу конечно буду читать как vvadim посоветовал -достали тут наверно такие как я )).

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Принцип я понял -хотя и не до конца.

спрашивайте... :) тут все такие, но кто-то поопытнее

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Вот это уже устарело:

  pinMode(BUT_1,INPUT);
  digitalWrite( BUT_1,HIGH );
  pinMode(BUT_2,INPUT);
  digitalWrite( BUT_2,HIGH );
  pinMode(BUT_3,INPUT);
  digitalWrite( BUT_3,HIGH );
  pinMode(BUT_4,INPUT);
  digitalWrite( BUT_4,HIGH );

Современнее, короче и смыслопонятнее будет:

  pinMode(BUT_1,INPUT_PULLUP);
  pinMode(BUT_2,INPUT_PULLUP);
  pinMode(BUT_3,INPUT_PULLUP);
  pinMode(BUT_4,INPUT_PULLUP);

 

Пошли дальше, то-есть немного выше:

#define ServoPin_1 9
#define ServoPin_2 10
#define BUT_1 4
#define BUT_2 5
#define BUT_3 6
#define BUT_4 7

С сервами всё понятно.  А кнопки как обозваны? полностью безмыссленно! Если наша первая кнопка что-то добавляет к положению сервы то так её и обзываем: "Кнопка_которая_добавляет_ к_положению_первой_сервы_какой-то_ там_ шаг"

Или короче  на языке авторов языка ( англ. )  вариант:   ServoBtn_1_plus или Servo_1_btn_plus

тут всё индивидуально... как кому понятнее чтобы не вспоминать что за  BUT_3 была такая.

#define ServoPin_1 9
#define ServoPin_2 10
#define ServoBtn_1_plus 4
#define ServoBtn_1_minus 5
#define ServoBtn_2_plus 6
#define ServoBtn_2_minus 7

И чтобы совсем никогда не путаться продолжаем:

#define S1_plus !digitalRead(ServoBtn_1_plus)  

И тогда S1_plus становится из набора каких-то там дигитал ридов каких-то дигитал пинов событием !

С которым можно работать так: а не произошло ли у нас  S1_plus ( коротко и ясно)

И все ифы  будут : иф (S1_plus)

А самый большой плюс всего этого- когда у вас в программе 100500 раз напихано

!digitalRead(ServoBtn_1_plus) 

и вы решили убрать "!" ( есть отдельные фанаты, которые считают что нажатие на кнопку- это подача единицы и только единицы! но не в коем случае не нуля, и ради этого готовы впаивать внешний резистор привязки на землю вместо включения внутреннего на питание) вам не надо 100500 раз искать и менять что-то: достаточно в ОДНОМ месте, в самом начале скетча, вверху убрать этот !. И всё.

 

vvadim
Offline
Зарегистрирован: 23.05.2012

Не, для нас чайников это уже слишком!

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Не дрейфь, я тоже чайник.  Но опытный     :) Почти как ded_60_let, но немного моложе.

vvadim
Offline
Зарегистрирован: 23.05.2012

а как при такой конструкции с дребезгом бороться

#define S1_plus !digitalRead(ServoBtn_1_plus)  
ded_60_let
Offline
Зарегистрирован: 01.03.2015

Как бы не усложняли (упрощяли) - меня вполне устраивает исходный код .Главное -он делает то , что мне надо и больше не надо. 

Конечно надо развиваться , но то что мне человек помог побороть то ,в чем я не копенгаген -ему большое спасибо. Я думаю ,что форум как раз для этого и создан. То что специалисты обсуждают то ,что кто то  наваял -это здорово.В спорах -истина .Буду с вниманием мотать на седой ус.

vvadim
Offline
Зарегистрирован: 23.05.2012

это не критика, а наоборот помощь - корректно оформляя свой вопрос ты повышаешь шанс получить ответ

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

можно и через DDRx , PORTx...... но для ТС это ранова-то пока

а как при такой конструкции с дребезгом бороться

в этом коде с этим успешно борется задержка на 300 миллисекунд ( но это не совсем хорошо )

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Зато вполне успешно. Можете конденсатором подстраховаться

ded_60_let
Offline
Зарегистрирован: 01.03.2015

При задержке в 300 не дождежся пока серва что-то отработает.Поставил 30 - бодренько так отрабатывает.Никакого влияния дребезга не увидел

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ded_60_let пишет:

При задержке в 300 не дождежся пока серва что-то отработает.Поставил 30 - бодренько так отрабатывает.Никакого влияния дребезга не увидел

а как дребезг на серве с этим кодом будет проявляться ? вы знаете или думаете что знаете ? :)

убрать задержку и шаг поворота сделать 5....10 градусов - вот тогда будет хорошо видно "дребезг"

ded_60_let
Offline
Зарегистрирован: 01.03.2015

Если убрать задержку серва будет отрабатывать от упора до упора.А про дребезг я тому ,что даже если он и есть ,то  мне не мешает нисколько. А про знаю или нет- конечно нихрена не знаю т.к. начинающий чайник. 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

:) при замыкании контактов кнопки возникает не один фронт сигнала, а несколько ( дребезг в относительно высоковольтных переключателях = ИСКРЕНИЕ ) 

при шаге сервы 5 гр на одно нажатие кнопки надеемся получить поворот на 5 гр

из-за дребезга одно нажатие кнопки превращается в 6.....30 нажатий - и получим поворот сервы на угол 30.....150 градусов :(

...как чайник - чайнику, никаких нравоучений :)

Если убрать задержку серва будет отрабатывать от упора до упора

.....нужно очень быстрое отпускание кнопки - тогда и заметите дребезг :)

защита от этого - или программная, или "железяковская" как сказал trembo

программисты - за первое, аппаратчики - за второе..... :)

lordik50
Offline
Зарегистрирован: 18.05.2017

нужна мне помощь. Собираю масштабную модель танка ПТ-76 танк готов уже ездиет и плавает. Крышки водометов работают на сервах и крышка передняя против волны тоже серво, спомощью вашил скетчей подклучил на кнопки класс работает, долго искал спасибо инету но вот дальше нужна помощь как все подклучить на пульт через NRF модуль, нужен скетч а я пока толькот начинаю работать с ардуином также там стоят два мотора на гусеницы и два водомёта, и еще нужен поворот башни и откат ствола, помагите со скетчем на пульт.