Управление сервы кнопкой
- Войдите на сайт для отправки комментариев
Сб, 22/11/2014 - 23:27
Доброго времени суток.
Помогите, пожалуйста написать работающий код. Необходимо сделать, чтобы удерживании нажатой тактовой кнопки, сервомашинка поворачивала с 0 на 180 градусов в течение 6 секунд. При отпускании кнопки, серва останавливается. Если кнопка разжимается на 3-й секунде, серва застывает на 90 градусах, при повторном нажании она продолжает поворот.
а сам? хоть начни
Я то начала и много вариантов перебрала, но все равно при нажатии проходит полный цикл и серва поворачивает до конца. Вот один из гиблых вариантов:
#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); } } }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); } }Большое спасибо, при длительном нажатии действительно работает как надо. Код немного дописала, чтобы отпускании и при повторном нажатии лопасть не возвращалась в начальное положение.
Только есть одна проблема - время начинает считываться с момента включения ардуины и никак не зависит от состояния кнопки. Если нажать кнопку на 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, чтобы было легче отслеживать баги?
в setup() поставить Serial.begin(9600);, а там где нужно - делать Serial.println(var);, где var - переменная. Смотреть в Serial monitor, открывается по Ctrl+Shift+M.
Спасибо
Строка 22 зависит только от времени с момента запуска программы, поэтому pos не должна зависеть от millis() напрямую.
может для начала сделать "в лоб" типа такого?
void loop(){ if(digitalRead(button) == HIGH) { pos = pos +1; } servo.write(pos); delay(33); }а дальше уже накручивать другие желаемые условия?
кстати для многих серв углы поворота менее 10 и более 70 противопоказаны тк они механически упираются не доезжая. Заставляя серву ехать дальше врядли получится сломать шестерни, но запросто можно спалить моторчик.
Спасибо большое, это действительно работает как надо и ведь так просто. Respect и Уважуха вам
Обращайтесь, тут подскажут ))