Что лишнее?

Тема в разделе "Arduino & Shields", создана пользователем Motrosoff, 21 июн 2016.

  1. Motrosoff

    Motrosoff Гик

    Ребят вот код! только он работает не так как нужно! А именно так! Две кнопки и серво, нажимаю на кнопку и серво крутит в одну сторону, нажимаю на другую кнопку, в обратную....вот только приходится держать кнопку постоянно до определённого угла!!! Что тут дописать или что тут убрать нужно, что бы серво крутилась от простого нажатия на кнопку на уже заданный заранее угол и не держать кнопку постоянно нажатой!
    P.S. новичок, и пока теряюсь в коде!!(
    Код (C++):
    #include <Servo.h>
    #define ServoPin 9     // пин сервы
    #define BUT_1 4        // BUT_1 и BUT_2 - кнопки управления сервой (тут пин 4)
    #define BUT_2 5            // BUT_1 и BUT_2 - кнопки управления сервой (тут пин 5)
    #define SHAG 1          // шаг поворота сервы, в градусах
    Servo myServo;
    int angle = 0;          //начальный угол
    void setup()
    {
      myServo.attach(ServoPin);
      myServo.write(angle);       //состояние после включения
      pinMode(BUT_1, INPUT);       //для считывания состояний кнопок
      digitalWrite( BUT_1 , HIGH );   // подтяжка
      pinMode(BUT_2, INPUT);      //для считывания состояний кнопок
      digitalWrite( BUT_2 , HIGH );   // подтяжка
    // кнопки соединены с ардуиной стягивающим резистором! (т.е. когда не нажато 0 В)  изменить !!!!!
    // кнопки соединены с ардуиной ПОДТЯГИВАЮЩИМ резистором! (т.е. когда не нажато 5 В) !!!!!!!!!!!!!!!!
    }
    void loop()
    {
      if ( ! digitalRead(BUT_1)) angle = angle + SHAG; //если первая кнопка увеличим угол
      if ( ! digitalRead(BUT_2)) angle = angle - SHAG; //если вторая уменьшим

      if (angle > 180) angle = 180;    //ограничим угол сервы 0..180
      if (angle < 0) angle = 0;

      myServo.write(angle); //задаем получившийся угол
      delay(300);           // подождем перед следующим опросом
    }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    #include <Servo.h>
    #define ServoPin            9                   // пин сервы
    #define BUT_1               4                   // BUT_1 и BUT_2 - кнопки управления сервой (тут пин 4)
    #define BUT_2               5                   // BUT_1 и BUT_2 - кнопки управления сервой (тут пин 5)
    //#define SHAG              1                   // шаг поворота сервы, в градусах
    #define BUTTON_PRESSED(pin) (!digitalRead(pin)) // макрос для удобства чтения кода
    Servo myServo;
    int minAngle = 0;            //предельный угол
    int maxAngle = 180;          //предельный угол
    int angle;                   //угол поворота

    void setup()
    {
      myServo.attach(ServoPin);
      myServo.write(angle);           //состояние после включения
      pinMode(BUT_1, INPUT_PULLUP);   //для считывания состояний кнопок + внутренняя подтяжка
      pinMode(BUT_2, INPUT_PULLUP);   //для считывания состояний кнопок + внутренняя подтяжка
    }

    void loop()
    {
      angle = 222;
      if (BUTTON_PRESSED(BUT_1)) angle = minAngle; //если первая кнопка увеличим угол
      if (BUTTON_PRESSED(BUT_2)) angle = maxAngle; //если вторая уменьшим
      if (angle != 222)                            // крутим серву только если была нажата кнопка
      {
        if (angle > 180) angle = 180;    //ограничим угол сервы 0..180
        if (angle < 0) angle = 0;
        myServo.write(angle); // задаем получившийся угол
        delay(800);           // подождем перед следующим опросом
      }
    }
     
    Motrosoff нравится это.
  3. Motrosoff

    Motrosoff Гик

    О....здарова)) Это ты опять тут?!))) Ходють тут всякие:) Спасибо большое!!!!!
     
  4. Motrosoff

    Motrosoff Гик

    Так это получается..я нажал она повернулась, отпустил вернулась на место? Так то нужно что бы нажал отпустил она повернулась на угол ,примерно 45град. ... и там осталась до тех пор пока я не нажму на другую кнопку
     
  5. yul-i-an

    yul-i-an Гик

    А както так не получится?
    Код (C++):
      if ( ! digitalRead(BUT_1)) {
        wail (angle == minAngle){//ждем пока не дойдем до minAngle
        angle=+step;
        (angle<0)? angle=0: (angle>180)? angle=180: angle=angle;//проверка выхода за диапазон
        myServo.write(angle); //задаем получившийся угол
        delay(300);           // подождем перед следующим опросом
        } //если первая кнопка увеличим угол
    }
    А вообще нужно функцию написать в которую передавать угол и шаг, а она сама серву будет устанавливать и избавится от delay.
    Сырой пример
    Код (C++):
    void servo (int angle, int step){
        byte state;
        wail (state == angle){//ждем пока не дойдем до 45
        state=+step;
        myServo.write(state); //задаем получившийся угол
        delay(300);           // подождем перед следующим опросом
        }
    }
     
    Последнее редактирование: 22 июн 2016
  6. Motrosoff

    Motrosoff Гик

    Не ну круто круто....вот только я ещё сам "сыроват" в коде...и как это скрестить с моим примером ?..я не знаю..честно(
     
  7. yul-i-an

    yul-i-an Гик

    Я сам с сервами не работал, не приходилось. Вот код напишите рабочий, а потом можно будет посмотреть как его упростить и какие функции написать.
     
  8. Motrosoff

    Motrosoff Гик

    Хорошо!