0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 3
1

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

26.11.2014, 16:32. Показов 11042. Ответов 3
Метки нет (Все метки)

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

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

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


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#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);
  }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2014, 16:32
Ответы с готовыми решениями:

Управление кнопкой
Не работает программа! Код с музыкой оставляем, проверенный (сократила ее для сообщения здесь). Не...

управление сервоприводом кнопкой
Доброго времени суток ув.Форумчане! В электротехнике не силен, но вот тут пришлось столкнуться с...

Управление пьезоэлектриком кнопкой
Здравствуйте! Не работает код ,помогите исправить ошибку , вообще нужно что бы при нажатии кнопки...

Управление несколькими реле Nano и кнопкой
Доброго времени суток(давненько я здесь не был)! Во внезапном порыве творческой мысли, было решено...

3
Модератор
3363 / 2136 / 351
Регистрация: 13.01.2012
Сообщений: 8,314
26.11.2014, 16:55 2
Лучший ответ Сообщение было отмечено raxp как решение

Решение

Цитата Сообщение от Zlokorj Посмотреть сообщение
Помогите
мб как-то так (голова квадратная извините если что тупанул)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <Servo.h>
int button = 2;
byte pos;
Servo servo;
unsigned long t1;
unsigned long t2;
unsigned long dt;
 
void setup()
{
  pinMode(button, INPUT);
  servo.attach(9);
  pos = 0;
  t1 = millis();
}
 
void loop(){
  t2 = millis();
 
  if(digitalRead(button) == HIGH) {
    dt = t2 - t1;
    pos += v * dt;
    servo.write(pos);
  }
 
  t1 = t2;
}
Добавлено через 1 минуту
...v - это скорость с которой должно ехать в единицах позиции на мс
0
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 3
27.11.2014, 17:57  [ТС] 3
vxg, не совсем поняла идею кода, при запуске программы серва начала ходить ходуном вертя лопастями в разные стороны. Но все же спасибо, что не остались равнодушными к моей проблеме, решение которой все же нашлось.
Если кому-то пригодится вот простое решение текущей задачи:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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);
}
Если есть замечания, буду рада узнать
0
Модератор
3363 / 2136 / 351
Регистрация: 13.01.2012
Сообщений: 8,314
28.11.2014, 09:24 4
Цитата Сообщение от Zlokorj Посмотреть сообщение
вот
на первый взгляд решение ничем принципиально не отличается от приведенного выше за исключением того что:
-в первом решении не было ничего известно о том что позицию надо ограничивать диапазоном 10..170
-в первом решении не была указана скорость перемещения - судя по второму решению она должна быть равна 1 / 33 - обеспечить адекватное увеличение позиции на такую малую величину можно только если проводить расчеты с использованием плавающей точки или изменить принцип вычисления позиции отсчитывая время от нажатия кнопки)
-в первом решении теоретически возможна ситуация при которой вызовы loop будут идти с такой высокой частотой, что dt всегда будет равной нулю - следовательно в решение необходимо ввести задержку (наверное величины порядка 10 мс будет достаточно)
-во втором решении наверное нет необходимости ограничивать и записывать позицию если она не изменяется - будет разумно перенести эти строки в место где изменяется позиция
-во втором решении нужно быть аккуратными с цифрами +1 и 33 так как они вместе определяют скорость перемещения тогда как в первом решении за это отвечает один параметр v
-во втором решении во время перезапуска позиция не будет меняться - спорный вопрос как оно должно быть на самом деле так как чип не знает фактического позиции - наверное неизменность позиции - это верное решение
-во втором решении некоторые переменные лишние (press, time)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2014, 09:24
Помогаю со студенческими работами здесь

Запуск сервы по времени
Ребят, помогите, есть arduino uno, серва, часы реального времени и две кнопки. Как сделать чтобы в...

Подключение сервы к Iteaduino 2.2
Пытался к этой плате подключить серо привод вот в эти пины, правильно ведь? она не большая. Для...

Управление коллекторным двигателем тактовой кнопкой
Ситуация такая, есть колекторник на 24В , питание +-12В тактовая кнопка и 2 размыкателя. Нужно...

Внешнее управление тактовой кнопкой
Добрый день! Есть прибор, у которого тактовая кнопка при 1-ом нажатии включает функцию, при 2-ом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru