Управление сервоприводами с кнопки

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем pro100vlad, 25 авг 2015.

  1. pro100vlad

    pro100vlad Нуб

    Всем привет, я тут новенький) и привела меня сюда одна проблемка)) у меня есть шлем железного человека, и я хотел бы сделать открывающуюся переднюю часть, называется забрало) и для этого у меня все есть. Но проблема в скейтче, я его как бы сделал, но что то не так, не могли бы вы посмотреть на скейтч и подсказать мне в чем проблема, но исправлять не нужно) я сам хочу додумать, просто наведите на путь истинный) Еще не сказал суть, когда кнопку нажимаю, забрало должно открыться, когда повторно нажимаю, закрыться. Можно сделать так, когда кнопку нажал, затем отпустил, забрало открылось, опять нажал, отпустил, оно закрылось.
    Так вот сам скейтч
    #include <Servo.h>

    Servo myServo1;
    Servo myServo2;

    int switchPin = 2;
    int flag = 0;

    void setup()
    {
    pinMode(switchPin, INPUT);
    myServo1.attach(8);
    myServo2.attach(5);
    myServo1.write(150);
    myServo2.write(50);
    }
    void loop()
    {
    if(digitalRead(switchPin) == HIGH && flag == 0)
    {
    myServo1.write(50);
    myServo2.write(150);
    flag = 1;
    }
    if(digitalRead(switchPin) == LOW && flag == 1)
    {
    myServo1.write(150);
    myServo2.write(50);
    flag = 0;
    }
    }
    где синим отмечено, там что то не правильно, не могу понять как сделать
    и вот схему тоже посмотрите)
    [​IMG]
     
  2. Alex19

    Alex19 Гуру

    В электронике практически не разбираюсь (жизнь еще не заставила). Просто, всегда повторяю по примерам, подключение кнопки - http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku или тут, здесь получше видно - https://www.arduino.cc/en/Tutorial/Button.

    Пояснить, почему именно так, не смогу.

    По коду.
    Что у Вас происходит, при 1 нажатии кнопки, мы падаем в if(digitalRead(switchPin) == HIGH && flag == 0). Как только упали, выполнили команды и присвоили flag 1. После, даже если держим ни чего не происходит. Как только отпустили упали в if(digitalRead(switchPin) == LOW && flag == 1).

    Данная техника, позаимствована из примера, по из указных мной ссылке. Вот только там инвертирование и все отлично работает.

    В первом if
    digitalWrite(13,!digitalRead(13));

    А во втором, просто обнуление flag.

    Самый простой вариант, заведите переменную и при каждом нажатии, увеличивайте ее на 1-цу, а дальше проверяйте, если 1 - открыть, если 2 - закрыть и обнулить переменную. Затем можно усложнить, нажали и пока не отпустили не открывается. Далее еще сложнее, оставить if как есть и менять значение через функцию.

    Так же рекомендую посмотреть на форуме рекомендации по книгам.

    Если, не решите, можете посмотреть готовый ответ тут.
    Удачи.

    UPD. Да по готовому ответу, 1 пост, последний блок кода.
     
    Последнее редактирование: 26 авг 2015
  3. pro100vlad

    pro100vlad Нуб

    Спасибо за совет, попробую сделать еще одну переменную, но чуть позже, сейчас дела, как сделаю, отпишусь) может видео сниму)) готовый ответ пока не смотрел)
     
  4. Unixon

    Unixon Оракул Модератор

    Код (Text):

    void loop()
    {
      if(digitalRead(switchPin))
      {
       if (flag)
       {
        myServo1.write(150);
        myServo2.write(50);
       }
       else
       {
        myServo1.write(50);
        myServo2.write(150);
       }
       flag = !flag;
       while (digitalRead(switchPin));
      }
    }
     
     
  5. pro100vlad

    pro100vlad Нуб

    хмм, все работает) но я ничего не понял) спасибо за помощь))
     
  6. pro100vlad

    pro100vlad Нуб

    Итак, есть одна проблема, 2 сервопривода, не хотят хорошо работать с одной кроны, ибо они начинают трястись, издавать звуки. Подсоединил один к ардуино, работает хорошо, без всяких звуков. О скейтче, сделал скейтч который мне скинули, хотел проверить работает он или нет)) так и оставил его) но надо еще доработать на дребезги, иногда серво туда и обратно поворачивается за один клик. Итог: купить еще одну крону, доделать скейтч, но я его не смогу доделать, т.к. я в нем вообще не разобрался)
     
  7. pro100vlad

    pro100vlad Нуб

    void loop()
    {
    if(digitalRead(switchPin))
    {
    if (flag)
    {
    myServo1.write(50);
    myServo2.write(150);
    delay (500);
    }
    else
    {
    myServo1.write(150);
    myServo2.write(50);
    delay (500);
    }
    flag = !flag;
    while (digitalRead(switchPin));
    }
    }
    вот теперь класс)) работает как надо)
     
  8. vvr

    vvr Инженерище