Всем привет. Возникла проблема при работе с сервомашинкой. В общем серву нужно подключить к кнопке, чтобы она работала таким образом: нажал на кнопку, серва повернулась на 180, опять нажал,повернулась обратно, то есть 0 градусов. Помогите, пожалуйста, разобраться как это написать в коде... Код (C++): #include <Servo.h> Servo servo; boolean flag = 0; boolean butt; boolean servo_flag = 0; void setup() { Serial.begin(9600); pinMode(13,OUTPUT); pinMode(3,INPUT_PULLUP); servo.attach(4);} void loop() { butt = digitalRead(3); if (butt == 1 && flag == 0 ){ flag = 1; servo_flag = !servo_flag;} if (butt == 0 && flag == 1){ flag = 0;}}
Прежде всего - если у вас пин для кнопки описан как INPUT_PULLUP,, то нажатая кнопка будет butt =0, а не 1. Ну и во -вторых - что не вижу чтобы вы в коде управляли сервой
Нет, это я знаю. Как прописать это в условии, чтобы я нажал на кнопку, серва повернулась, остановилась, нажал еще раз, вернулась в исходное положение
Если я пишу вот таким образом, то серва поворачивается так: нажал на кнопку, держу, серва повернута, отпустил, она обратно. А мне нужно, как я описал выше Код (C++): #include <Servo.h> Servo servo; boolean flag = 0; boolean butt; boolean servo_flag = 0; void setup() { Serial.begin(9600); pinMode(13,OUTPUT); pinMode(3,INPUT_PULLUP); servo.attach(4);} void loop() { butt = digitalRead(3); if (butt == 1 && flag == 0 ){ flag = 1; servo_flag = !servo_flag; servo.write(180);} if (butt == 0 && flag == 1){ flag = 0; servo.write(0);} }
Ну так у вас структура не верна, вам флаг нужно устанавливать и снимать в отдельном if при нажатии кнопки, а по значению флага уже серва должна поворачиваться так или иначе, а у вас там еще и значение кнопки для чего то...
Miha1410 Во-первых, я вам уже написал выше, что у вас кнопка нажата при butt=0, а не наоборот. Почему не исправляете? Если вы не слушаете то, что я пишу - я и писать не буду. Можете обьяснить, зачем в вашем коде переменная servo_flag ? Вы же ее не используете в коде? списали где-то?
"флаг нужно устанавливать и снимать в отдельном if при нажатии кнопки" - у него так и есть. Все нормально тут со структурой, достаточно добавить поворот сервы на нужный угол в ту же скобку, где идет инвертирование флага - и все заработает.
Кнопка, таким образом? Код (C++): #include <Servo.h> Servo servo; boolean flag = 0; boolean butt; boolean servo_flag = 0; void setup() { Serial.begin(9600); pinMode(13,OUTPUT); pinMode(3,INPUT_PULLUP); servo.attach(4);} void loop() { butt = digitalRead(3); if (butt == 0 && flag == 0 ){ flag = 1; servo_flag = !servo_flag; servo.write(180);} if (butt == 0 && flag == 1){ flag = 0; servo.write(0);} }
одно условие для кнопки поменяли, другое нет. Надо менять оба. И, кстати, как кнопка-то физически подключена?
Код (C++): if (butt == 0 && flag == 0 ){ flag = 1; servo_flag = !servo_flag; servo.write(180);} if (butt == 1 && flag == 1){ flag = 0; servo.write(0);}
ок, теперь кнопка прописана правильно. Скажите честно, вы этот код понимаете? Когда срабатывает первое условие, когда второе? Зачем тут переменная flag ? Зачем тут переменная servo_ flag ?
Первое условие, если кнопка нажата и кнопка до этого не была нажата, условие выполняется, флажок = 1, то есть через кнопку проходит сигнал. Второе условие, кнопка отпущена, но флаг имеет значение 1, значит кнопка была нажата и мы посылаем флагу 0, то есть через кнопку сигнал уже не будет идти (это я про свой первый скетч) Flag переменная, которая хранит состояние кнопки А servo_flag это переменная, которую я хотел сюда впихнуть из скеча со светодиодом. Сейчас уже понял, что она не нужна
ну то есть это условие выпоняется тогда, когда кнопку отпустили. Так зачем же вы в этом условии меняете угол сервы? - это как раз приходит к тому, что серва у вас повернута только при нажатой кнопке, а при отпускании возвращается в нулевое положение. нет, не так. Серво-флаг - это переменная, которая меняет свое значение на противоположное при каждом нажатии кнопки. То есть ровно так, как вы хотите поворачивать серву. Чтобы код работал именно так, как вы задумали - всего-то надо добавить оператор, чтоб поворачивать серву на 180, когда серво-флаг "истина" и возвращать на ноль, когда он "ложь"