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

zlokorj
Offline
Зарегистрирован: 22.11.2014

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

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а сам? хоть начни

zlokorj
Offline
Зарегистрирован: 22.11.2014

Я то начала и много вариантов перебрала, но все равно при нажатии проходит полный цикл и серва поворачивает до конца. Вот один из гиблых вариантов:

#include <Servo.h>
int button = 2;
int press = 0;
int pos = 0;
Servo servo;

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

void loop()
{
  press = digitalRead(button);
  if (press == HIGH)
  {
    for(pos = 0; pos > 180; pos += 1)
    { 
      servo.write(pos);
      delay(2000);
    }
  }
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

6с = 6000мс. делим на 180 градусов = 33,33мс на градус

а дальше millis или micros использовать

можно так попробовать. правда на повторное нажатие будет реагировать неадекватно, надо дописывать. но одно долгое нажатие должен правильно отработать

#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();
  while (digitalRead(button) == HIGH){
    pos = (millis()-time)/33.33;
    //pos = (millis()-time)/33; //эта строка быстрее будет считаться
    pos = constrain(pos, 0, 180);
    servo.write(pos);
  }
}

 

zlokorj
Offline
Зарегистрирован: 22.11.2014

Большое спасибо, при длительном нажатии действительно работает как надо. Код немного дописала, чтобы отпускании и при повторном нажатии лопасть не возвращалась в начальное положение.

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

Вот что пока имеется:

#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);
  }
}

И подскажите пожалуйста как в Arduino IDE можно выводить логи значений переменных, к примеру time, чтобы было легче отслеживать баги?

std
Offline
Зарегистрирован: 05.01.2012

zlokorj пишет:
как в Arduino IDE можно выводить логи значений переменных

в setup() поставить Serial.begin(9600);, а там где нужно - делать Serial.println(var);, где var - переменная. Смотреть в Serial monitor, открывается по Ctrl+Shift+M.

zlokorj
Offline
Зарегистрирован: 22.11.2014

Спасибо

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Строка 22 зависит только от времени с момента запуска программы, поэтому pos не должна зависеть от millis() напрямую.

может для начала сделать "в лоб" типа такого?

void loop(){
  if(digitalRead(button) == HIGH) 
   {
    pos = pos +1;
    }
  servo.write(pos);
  delay(33);
}

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

кстати для многих серв углы поворота менее 10 и более 70 противопоказаны тк они механически упираются не доезжая. Заставляя серву ехать дальше врядли получится сломать шестерни, но запросто можно спалить моторчик.

zlokorj
Offline
Зарегистрирован: 22.11.2014

Спасибо большое, это действительно работает как надо и ведь так просто. Respect и Уважуха вам

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Обращайтесь, тут подскажут ))