Управление сервы кнопкой

Тема в разделе "Arduino & Shields", создана пользователем Zlokorj, 26 ноя 2014.

  1. Zlokorj

    Zlokorj Нуб

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

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

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

    Код (Text):
    #include <Servo.h>
    int button = 2;
    int press = 0;
    byte pos = 0;
    Servo servo;
    unsigned long time;

    void setup()
    {
      pinMode(button, INPUT);
      servo.attach(9);
    }

    void loop(){
      if(digitalRead(button) == HIGH) {
        time = millis();
      }
      else {
        servo.write(pos);
      }
      while (digitalRead(button) == HIGH && pos <= 179){
        pos = (millis()-time)/33;
        pos = constrain(pos, 0, 180);
        servo.write(pos);
      }
    }
     
  2. Unixon

    Unixon Оракул Модератор

    У вас код никак не различает первое нажатие и последующие. Добавьте счетчик нажатий и используйте его значение в условиях. При повторном нажатии нужно учитывать начальное смещение сервы с прошлого раза.
     
  3. Zlokorj

    Zlokorj Нуб

    Решение данной задачи нашлось и достаточно простое (и счетчик не пригодился ):
    Код (Text):
    #include <Servo.h>
    int button = 2;
    int press = 0;
    byte pos = 10;
    Servo servo;
    unsigned long time;

    void setup()
    {
      pinMode(button, INPUT);
      servo.attach(9);
    }

    void loop(){
      if(digitalRead(button) == HIGH)
      {
        pos = pos +1;
        }
      pos = constrain(pos, 10, 170);
      servo.write(pos);
      delay(33);
    }
    Если есть замечания, буду рада узнать :)
     
  4. vvr

    vvr Инженерище

    В задаче написано одно, а ваш код просто поворачивает серву
     
  5. Zlokorj

    Zlokorj Нуб

    может я не совсем правильно озвучила задачу, но мне и нужно было поворачивать серву в момент нажатия кнопки с определенной скоростью, что и позволяет сделать выше указанный код. Единственное, где я отклонилась от исходной задачи, так это изменила интервал поворота с 0-180 на 10-170
     
  6. Unixon

    Unixon Оракул Модератор

    Поздравляю с удачным хаком! Решение исходной задачи получено как побочный эффект совсем другого и более простого кода.
     
    vvr нравится это.