Проблема по переводу серво в режим работы от кнопки "по требованию"

clickaider
Offline
Зарегистрирован: 08.01.2014

Доброго времени суток!

Возникла проблема, касаемая серво - не получается перевести режим работы серво "из крайнего левого в крайнее правое положение" в пошаговый режим. Что подразумевается под пошаговым: нажал кнопку - происходит поворот, отпустил кнопку - движение остановилось ровно на том положении, когда была отпущена кнопка. Т.е. подобие шагового мотора, но на серво.

Подскажите, что можно внести в код, чтоб достичь желаемого результата?

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

#include <Servo.h>
Servo servol; // присвоение имени серво
int button1 = 0; // пин для одного положения серво
int press1 = 0; // состояние пина 0
int button2 = 1; // пин для другого положения серво
int press2 = 0; // состояние пина 1
const int g = 0;
int n = 0;
const int b = 0;
int pos = 0; // начальная позиция серво (в данный момент нигде е используется)

void setup()
{
  pinMode(button1, OUTPUT);
  pinMode(button2, OUTPUT);
  servol.attach(7);
  digitalWrite(0, LOW); // при нажатии пин 0 переходит в режим HIGH
  digitalWrite(1, LOW); // при нажатии пин 1 переходит в режим HIGH
}

void loop()
{
  press1 = digitalRead(button1); // считывание  состояния пина 0
  if (press1 == HIGH)
{
 delay(50); // анти-дребезг
 servol.write(20); // крайнее положение на 20 градусов
}     
  press2 = digitalRead(button2); // считывание состояния пина 1
  if (press2 == HIGH)
  {
    delay(50); // анти-дребезг
    servol.write(160); // крайнее положение на 160 градусов
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012
void loop()
{ 
  static byte ang = 20;

  if (digitalRead(button1) == HIGH) // считывание  состояния пина 0
  {
    delay(50); // анти-дребезг
    ang--;
    if(ang < 20) ang = 20; // крайнее положение на 20 градусов
  } 

  if (digitalRead(button2) == HIGH) // считывание состояния пина 1
  {
    delay(50); // анти-дребезг
    ang++;
    if(ang > 160) ang = 160; // крайнее положение на 160 градусов
  }

  servol.write(ang);
}

 

clickaider
Offline
Зарегистрирован: 08.01.2014

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

Спасибо огромное!