Управление сервы кнопкой
- Войдите на сайт для отправки комментариев
Сб, 22/11/2014 - 23:27
Доброго времени суток.
Помогите, пожалуйста написать работающий код. Необходимо сделать, чтобы удерживании нажатой тактовой кнопки, сервомашинка поворачивала с 0 на 180 градусов в течение 6 секунд. При отпускании кнопки, серва останавливается. Если кнопка разжимается на 3-й секунде, серва застывает на 90 градусах, при повторном нажании она продолжает поворот.
а сам? хоть начни
Я то начала и много вариантов перебрала, но все равно при нажатии проходит полный цикл и серва поворачивает до конца. Вот один из гиблых вариантов:
01
#include <Servo.h>
02
int
button = 2;
03
int
press = 0;
04
int
pos = 0;
05
Servo servo;
06
07
void
setup
()
08
{
09
pinMode(button, INPUT);
10
servo.attach(9);
11
}
12
13
void
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
}
6с = 6000мс. делим на 180 градусов = 33,33мс на градус
а дальше millis или micros использовать
можно так попробовать. правда на повторное нажатие будет реагировать неадекватно, надо дописывать. но одно долгое нажатие должен правильно отработать
01
#include <Servo.h>
02
int
button = 2;
03
int
press = 0;
04
byte
pos = 0;
05
Servo servo;
06
unsigned
long
time;
07
08
void
setup
()
09
{
10
pinMode(button, INPUT);
11
servo.attach(9);
12
}
13
14
void
loop
(){
15
if
(digitalRead(button) == HIGH) time = millis();
16
while
(digitalRead(button) == HIGH){
17
pos = (millis()-time)/33.33;
18
//pos = (millis()-time)/33; //эта строка быстрее будет считаться
19
pos = constrain(pos, 0, 180);
20
servo.write(pos);
21
}
22
}
Большое спасибо, при длительном нажатии действительно работает как надо. Код немного дописала, чтобы отпускании и при повторном нажатии лопасть не возвращалась в начальное положение.
Только есть одна проблема - время начинает считываться с момента включения ардуины и никак не зависит от состояния кнопки. Если нажать кнопку на 3 секунде после включения платы, то серва повернет сразу на 90 градусов и дальше будет крутить с нужной скоростью, или же при повтороном нажатии кнопки спустя время лопасть повернется на угол, рассчитанный как будто кнопку не разжимали вовсе.
Вот что пока имеется:
01
#include <Servo.h>
02
int
button = 2;
03
int
press = 0;
04
byte
pos = 0;
05
Servo servo;
06
unsigned
long
time;
07
08
void
setup
()
09
{
10
pinMode(button, INPUT);
11
servo.attach(9);
12
}
13
14
void
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, чтобы было легче отслеживать баги?
в setup() поставить Serial.begin(9600);, а там где нужно - делать Serial.println(var);, где var - переменная. Смотреть в Serial monitor, открывается по Ctrl+Shift+M.
Спасибо
Строка 22 зависит только от времени с момента запуска программы, поэтому pos не должна зависеть от millis() напрямую.
может для начала сделать "в лоб" типа такого?
1
void
loop
(){
2
if
(digitalRead(button) == HIGH)
3
{
4
pos = pos +1;
5
}
6
servo.write(pos);
7
delay(33);
8
}
а дальше уже накручивать другие желаемые условия?
кстати для многих серв углы поворота менее 10 и более 70 противопоказаны тк они механически упираются не доезжая. Заставляя серву ехать дальше врядли получится сломать шестерни, но запросто можно спалить моторчик.
Спасибо большое, это действительно работает как надо и ведь так просто. Respect и Уважуха вам
Обращайтесь, тут подскажут ))