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

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

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

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

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

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

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

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

01#include <Servo.h>
02int button = 2;
03int press = 0;
04int pos = 0;
05Servo servo;
06 
07void setup()
08{
09  pinMode(button, INPUT);
10  servo.attach(9);
11}
12 
13void loop()
14{
15  press = digitalRead(button);
16  if (press == HIGH)
17  {
18    for(pos = 0; pos > 180; pos += 1)
19    {
20      servo.write(pos);
21      delay(2000);
22    }
23  }
24}

 

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

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

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

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

 

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

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

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

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

01#include <Servo.h>
02int button = 2;
03int press = 0;
04byte pos = 0;
05Servo servo;
06unsigned long time;
07 
08void setup()
09{
10  pinMode(button, INPUT);
11  servo.attach(9);
12}
13 
14void loop(){
15  if(digitalRead(button) == HIGH) {
16    time = millis();
17  }
18  else {
19    servo.write(pos);
20  }
21  while (digitalRead(button) == HIGH && pos <= 179){
22    pos = (millis()-time)/33;
23    pos = constrain(pos, 0, 180);
24    servo.write(pos);
25  }
26}

И подскажите пожалуйста как в 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() напрямую.

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

1void loop(){
2  if(digitalRead(button) == HIGH)
3   {
4    pos = pos +1;
5    }
6  servo.write(pos);
7  delay(33);
8}

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

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

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

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

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

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