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

Тема в разделе "Arduino & Shields", создана пользователем alexnovii, 13 мар 2021.

  1. alexnovii

    alexnovii Нуб

    Здравствуйте! Прошу помощи!!!
    необходимо обеспечить работу сервомотора с регулировкой кнопками +/-....
    с этим все ОК...типовая программа, но также необходимо, чтобы
    при подачи питания на вход, по ПЕРЕДНЕМУ фронту сигнала (с третьего входа), сервомотор
    устанавливался в 0.... вот это ника не осилю(((
    Прошу подсказать!!!

    Схема управления сервомотором такая:
    -кнопка + обороты
    -кнопка - обороты
    -выключатель с фиксацией (для принудительной установки мотора в 0 при
    появлении переднего фронта сигнала. Но при этом с дальнейшей возможностью
    регулировки мотора..
     
  2. parovoZZ

    parovoZZ Гуру

    Так так же - по типовой программе.
     
  3. alexnovii

    alexnovii Нуб

    по типовой никак... на третий выход подключен тумблер с фиксацией...
    т.е. по включению тумблера включается сторонняя схема и мотор устанавливается в 0.
    но при этом необходимо обеспечить возможность управлять мотором +/-....

    т.е. ПРИ ПОДАЧЕ СИГНАЛА на третий вход, сигнал преобразовывается (используя ПЕРЕДНИЙ
    ФРОНТ или ОДНОВИБРАТОР) и подает сигнал на установку мотора в 0
    как это сделать в ардуино?
     
  4. akl

    akl Гуру

    типовую программу в студию.
     
  5. alexnovii

    alexnovii Нуб

    прикладываю программу...

    volatile int i = 30; // объявляем переменную целого типа для хранения значения угла поворота оси серводвигателя, начальный угол 30гр.
    #include <Servo.h> // подключаем заголовочный файл для управления серводвигателем
    Servo servo; // указываем имя для нашего серводвигателя
    void setup()
    { servo.attach(9); // подключаем серво
    pinMode(5, INPUT_PULLUP);// управляем мотором от 0 до 180
    pinMode(6, INPUT_PULLUP);// управляем мотором от 180 до 0
    pinMode(3, INPUT_PULLUP);// устанавливаем мотор на 0град
    }

    void loop()
    { servo.write(i); // устанавливаем позицию оси сервомотора в ‘i’ градусов
    if (digitalRead(3) == LOW) {
    CHANGE; i = 0; delay(200);
    }
    if (digitalRead(5) == LOW)
    { if (i < 180)
    {i++; // если кнопка, подключенная к pin5, нажата и угол поворота (в градусах) меньше 180
    delay(50);
    }
    }
    if (digitalRead(6) == LOW)
    {
    if (i > 0)
    {
    i--; // если кнопка, подключенная к pin6, нажата и угол поворота (в градусах) больше 0
    delay(50);
    }
     
  6. alexnovii

    alexnovii Нуб

    пин 5 и 6 -простые нажимные кнопки.
    пин 3 -тумблер с фиксацией. Необходимо при его включении "сбросить" серво на 0 гр. И в дальнейшем,
    независимо от его состояния осуществлять регулировку серво при помощи пин 5 и 6...
    Т.е. нужно преобразовать включение по пин3 в одиночный импульс для сброса сервы...
     
  7. akl

    akl Гуру

    вот так попробуй
    должно обнуляться при каждом изменении состояния кнопки.

    Код (C++):

    volatile int i = 30; // объявляем переменную целого типа для хранения значения угла поворота оси серводвигателя, начальный угол 30гр.
    #include <Servo.h> // подключаем заголовочный файл для управления серводвигателем
    Servo servo; // указываем имя для нашего серводвигателя
    char button_wasup =0;

    void setup()
    { servo.attach(9); // подключаем серво
      pinMode(5, INPUT_PULLUP);// управляем мотором от 0 до 180
      pinMode(6, INPUT_PULLUP);// управляем мотором от 180 до 0
      pinMode(3, INPUT_PULLUP);// устанавливаем мотор на 0град

      if (digitalRead(3) == LOW){
      button_wasup =0;
      }else{
      button_wasup =1;
      }
    }

    void loop(){
      servo.write(i); // устанавливаем позицию оси сервомотора в ‘i’ градусов
      if (digitalRead(3) == LOW && button_wasup) {
      button_wasup=0;
      i = 0; delay(200);
      }
      if (digitalRead(3) == HIGH && !button_wasup) {
      button_wasup=1;
      i = 0; delay(200);
      }
      if (digitalRead(5) == LOW)
      { if (i < 180)
      { i++; // если кнопка, подключенная к pin5, нажата и угол поворота (в градусах) меньше 180
      delay(50);
      }
      }
      if (digitalRead(6) == LOW)
      {
      if (i > 0)
      {
      i--; // если кнопка, подключенная к pin6, нажата и угол поворота (в градусах) больше 0
      delay(50);
      }
      }
    }
    }
     
    Последнее редактирование: 14 мар 2021
  8. alexnovii

    alexnovii Нуб

    СПАСИБО БОЛЬШОЕ!!!!:):):) ВСЁ ЗАРАБОТАЛО!!!
     
  9. alexnovii

    alexnovii Нуб

    Здравствуйте! Вновь обращаюсь за помощью!
    Собрал схему, всё работает, как надо!
    Но, после запуска ДВС, на котором установлена схема, происходят самопроизвольное, спорадическое срабатывание обоих серво....
    В чем причина? "Боится" ли серво вибрацию? Прошу подсказать....
     
  10. akl

    akl Гуру

    это во время работы стартера происходит? или вообще в любой момент после запуска? от стартера просаживается напряжение, ардеина при этом может перезагружаться или просто глючить. можно попробовать в самое начало функции сетап поставить delay(5000);
     
  11. Рокки1945

    Рокки1945 Гуру

    питалово надо стабилизированное
     
  12. akl

    akl Гуру

    если со стартером это не связано, то могут быть наводки на провода кнопок. тогда нужно сделать фильтрацию и экранирование и антидребезг какой-нить
     
  13. alexnovii

    alexnovii Нуб

    стартер не влияет.... думал, помехи по питанию...
    -отключил генератор ДВС...
    -проложил провода управления на сервы подальше от катушки зажигания..
    -подключил питание от внешнего источника....
    Ничего не помогло...
    Уменьшил все цепи управления до минимума...
    Кнопки управления вообще отключал..от ардуино, а сервопривода так и двигаются...
     
  14. alexnovii

    alexnovii Нуб

    по питанию... штатно использую преобразователь/стабилизатор 12/5В... для питания Ардуино Уно и сервоприводов... Если верить тестеру, то питание 4,8-5В стабильно... Или для Ардуино лучше побольше напряжение? В сети, при работе генератора ДВС напряжение до 14,2В...
     
  15. alexnovii

    alexnovii Нуб

    при остановленном ДВС все работает как надо.
    при запущенном ДВС проявляются скачкообразные самопроизвольные движения:(
    завтра попробую воссоздать эту схему на другом ДВС...
     
  16. Vovka

    Vovka Гик

    есть одна бяка: в питающей сети бывают выбросы аж до 160В!
    так что ставьте по питанию импульсник и фильтр
     
  17. alexnovii

    alexnovii Нуб

    использовал понижающий модуль... на 5В.. такого типа
    http://dvrobot.ru/241/259/260/273.html

    попробовал подключить питание с телефонной зарядки...результат такой же..

    Фильтр какого плана, предлагаете? можете примерную ссылку сбросить?
     
  18. parovoZZ

    parovoZZ Гуру

    Каким образом delay спасёт от перезагрузки и глюков? Работа на просаженном питании - это целое искусство не подвластное ардруинщикам. Настраивается делитель частоты, уровни POR (BOR). Грамотно продумывается работа вачдога, чтобы зависший МК не натворил делов.

    убрать все сопли. На соплях в условиях ЭМИ микропроцессорная и микроконтроллерная техника не работает, кто бы что не говорил и не писал на заборах типа ютуба и прочих дурино ресурсах. Всё внешнее управление только высокотоковыми цепями, возможно специальными драйверами.
     
  19. akl

    akl Гуру

    от перезагрузки не спасет - но например - просело питание - ардуина перезагрузилась - и вместо того чтобы что-то делать она ждет 5 секунд - если напряжение продолжает скакать - ардуина перезагружается и опять упирается дилей и так до тех пор пока напряжение не стабилизируется.
    Но у ТС проблема похоже не в этом.
     
  20. parovoZZ

    parovoZZ Гуру

    а прикинь, это лифт? Или ЭБУ. Такие проблемы решаются не так.