Помощь в программировании

Тема в разделе "Arduino & Shields", создана пользователем Miha1410, 10 апр 2022.

  1. Miha1410

    Miha1410 Нуб

    Всем привет. Возникла проблема при работе с сервомашинкой. В общем серву нужно подключить к кнопке, чтобы она работала таким образом: нажал на кнопку, серва повернулась на 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;}}
     
  2. b707

    b707 Гуру

    Прежде всего - если у вас пин для кнопки описан как INPUT_PULLUP,, то нажатая кнопка будет butt =0, а не 1.
    Ну и во -вторых - что не вижу чтобы вы в коде управляли сервой
     
  3. Miha1410

    Miha1410 Нуб

    Я вот и хочу спросить, как это написать в условии? (я про серву)
     
  4. b707

    b707 Гуру

    не знаете, как повернуть серву на заданный угол?
     
  5. Miha1410

    Miha1410 Нуб

    Нет, это я знаю. Как прописать это в условии, чтобы я нажал на кнопку, серва повернулась, остановилась, нажал еще раз, вернулась в исходное положение
     
  6. Miha1410

    Miha1410 Нуб

    Если я пишу вот таким образом, то серва поворачивается так: нажал на кнопку, держу, серва повернута, отпустил, она обратно. А мне нужно, как я описал выше
    Код (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);}

     
    }
     
  7. Nekto_nikto

    Nekto_nikto Гик

    Ну так у вас структура не верна, вам флаг нужно устанавливать и снимать в отдельном if при нажатии кнопки, а по значению флага уже серва должна поворачиваться так или иначе, а у вас там еще и значение кнопки для чего то...
     
  8. b707

    b707 Гуру

    Miha1410
    Во-первых, я вам уже написал выше, что у вас кнопка нажата при butt=0, а не наоборот. Почему не исправляете? Если вы не слушаете то, что я пишу - я и писать не буду.
    Можете обьяснить, зачем в вашем коде переменная servo_flag ? Вы же ее не используете в коде? списали где-то?
     
  9. b707

    b707 Гуру

    "флаг нужно устанавливать и снимать в отдельном if при нажатии кнопки" - у него так и есть.
    Все нормально тут со структурой, достаточно добавить поворот сервы на нужный угол в ту же скобку, где идет инвертирование флага - и все заработает.
     
  10. Miha1410

    Miha1410 Нуб

    Кнопка, таким образом?
    Код (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);}


    }
     
  11. b707

    b707 Гуру

    одно условие для кнопки поменяли, другое нет. Надо менять оба.
    И, кстати, как кнопка-то физически подключена?
     
  12. Miha1410

    Miha1410 Нуб

    Обычная тактовая кнопка. Один к земле, другой к 3 цифровому
     
  13. Miha1410

    Miha1410 Нуб

    Код (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);}
     
  14. b707

    b707 Гуру

    ок, теперь кнопка прописана правильно.
    Скажите честно, вы этот код понимаете?
    Когда срабатывает первое условие, когда второе?
    Зачем тут переменная flag ?
    Зачем тут переменная servo_ flag ?
     
  15. Miha1410

    Miha1410 Нуб

    Понимаю
     
  16. b707

    b707 Гуру

    а ответы на вопросы?
     
  17. Miha1410

    Miha1410 Нуб

    Первое условие, если кнопка нажата и кнопка до этого не была нажата, условие выполняется, флажок = 1, то есть через кнопку проходит сигнал.
    Второе условие, кнопка отпущена, но флаг имеет значение 1, значит кнопка была нажата и мы посылаем флагу 0, то есть через кнопку сигнал уже не будет идти (это я про свой первый скетч)
    Flag переменная, которая хранит состояние кнопки
    А servo_flag это переменная, которую я хотел сюда впихнуть из скеча со светодиодом. Сейчас уже понял, что она не нужна
     
  18. b707

    b707 Гуру

    ну то есть это условие выпоняется тогда, когда кнопку отпустили. Так зачем же вы в этом условии меняете угол сервы? - это как раз приходит к тому, что серва у вас повернута только при нажатой кнопке, а при отпускании возвращается в нулевое положение.

    нет, не так.
    Серво-флаг - это переменная, которая меняет свое значение на противоположное при каждом нажатии кнопки. То есть ровно так, как вы хотите поворачивать серву.
    Чтобы код работал именно так, как вы задумали - всего-то надо добавить оператор, чтоб поворачивать серву на 180, когда серво-флаг "истина" и возвращать на ноль, когда он "ложь"
     
  19. Miha1410

    Miha1410 Нуб

    Спасибо за помощь! Вроде бы разобрался