Сервы и кнопки.

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

  1. Всем добрейшего!
    Помогите пожалуйста разобраться с задачкой. Опыта, что в кодинге, что в цифровой автоматике- ноль.

    Дано:
    МультиСерв
    Пять приводов
    Пять тактовых кнопок

    Вопрос:
    Как заставить каждую из серв, вставать на определённый угол
    По нажатию привязанной к Серве кнопки?
    Разъясните тупому, как это можно сделать?
     
  2. DrProg

    DrProg Вечный нерд

    Программа опрашивает кнопки в цикле. Увидев нажатие дает команду серве встать на определенный угол. При отпускании не знаю что или возвращаться назад или ждать другую кнопку будет, сами определитесь. И опять на опрос кнопок. Всё.
     
  3. Это-то мне как раз ясно. Не ясно, каким образом это прописать.
    Пытался назначить две кнопки на одну серву- кнопки не опрашиваются, серва дергается.

    #include <Servo.h>

    int button_left = 2; //кнопка левого положения
    int button_right = 3; //кнопка правого положения
    int val = 0; //переменная состояния кнопки
    Servo servo1;


    void setup()
    {
    pinMode(button_left, INPUT);
    pinMode(button_right, INPUT);
    servo1.attach(8);

    }

    void loop()
    {
    val = digitalRead(button_left);
    if (val == HIGH) //при нажатии кнопки левого положения
    {
    servo1.write(90); //повернуть серву в положение 90
    }
    val = digitalRead(button_right);
    if (val == HIGH) //при нажатии кнопки правого положения
    {
    servo1.write(60); //повернуть серву в положение 60
    }
    }

    Подозреваю, что что-то упустил, только не могу понять что именно.
     
  4. DrProg

    DrProg Вечный нерд

    Схему подключения кнопки в студию.
     
  5. Milerael

    Milerael Нерд

    Попробуйте подключить кнопки еще и к плюсу через резисторы на 10 кОм

    а еще попробуйте сделать значения, получаемые с кнопки формата boolean
     
  6. DrProg

    DrProg Вечный нерд

    Сделайте так:
    Код (C++):
    pinMode(button_left, INPUT_PULLUP);
    и со второй тоже.
     
    ИгорьК нравится это.
  7. с pinMode(button_left, INPUT_PULLUP); появилась реакция на кнопки.
    Теперь, если одна из кнопок нажата, серва занимает заданное положение, если кнопку отпустить, серва беспорядочно машет рычагом. Подтяжка к + не меняет ситуации.
    Подозреваю, что оперировать кнопками нужно через switch case, но не могу понять, как им пользоваться.
     
  8. DrProg

    DrProg Вечный нерд

    switch работает если одна переменная принимает несколько значений. У вас же две переменные, которые принимают 0 или 1. Попробуйте сделать опрос кнопок с подавлением дребезга хотя бы так:
    Код (C++):
    val = digitalRead(button_left);
    if (val) //при нажатии кнопки левого положения
    {
    servo1.write(90); //повернуть серву в положение 90
    delay(10);
    }
    Можно даже увеличить задержку чтобы серва успела встать в положение.
     
    ИгорьК нравится это.
  9. Попробовал. изменений никаких.
     
  10. AlexU

    AlexU Гуру

    Для схемы из поста #5.
    Все кнопки нужно подтянуть к '+':
    Код (C++):
    pinMode(button_left, INPUT_PULLUP);
    pinMode(button_right, INPUT_PULLUP);
    В начальном состоянии пины будут в состоянии HIGH, при нажатии кнопки соответствующий пин перейдёт в LOW:
    Код (C++):
    val = digitalRead(button_left);
    if (val == LOW) { // при нажатой кнопке левого положения
      servo1.write(60); //повернуть серву в положение 60
      delay(10);
    }
    Аналогично сделать и для второй кнопки (и остальных).