Проблема с дребезжанием сервы.

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

  1. ARGON1

    ARGON1 Нуб

    Добрый день.хочу сделать автоматическое открывание и закрывание дверцы кормушки по таймеру(с помощью датчика реального времени),с возможностью ручного открывания по кнопке.Все работает,однако присутствует постоянное дребезжание сервы,которое приводит к сгоранию оной.Буду благодарен за помощь в решении проблемы.

    Используется плата искра нео,тройка шилд,,серво привод https://amperka.ru/product/servo-fs5113r. Питание платы идет через блок питания 5v(через usb порт),питание нервы через отдельный блок питания 6v.
    Серва подключается так.
    красный провод- к блоку питания
    коричневый провод-к блоку питания-к контакту g
    желтый провод -к контакту d

    скрипт такой

    Код (C++):

    // библиотека для работы I²C
    #include <Wire.h>
    // библиотека для работы с часами реального времени
    #include "TroykaRTC.h"
    //i переменная для повората серв по кнопке
    int i=0;
    // EEPROM — энергонезависимая память
    // библиотека для записи и считывания информации с EEPROM
    #include <EEPROM.h>
    //задаем пин кнопки
    #define FIRST_KEY_PIN 10 // первый пин с клавишей (англ. «key»)

    #define BUZZER_PIN 12
    // размер массива для времени с учётом завершающего нуля
    #define LEN_TIME 12
    // размер массива для даты с учётом завершающего нуля
    #define LEN_DATE 12
    // размер массива для дня недели с учётом завершающего нуля
    #define LEN_DOW 12

    // создаём объект для работы с часами реального времени
    RTC clock;
    #include <Servo.h>
    Servo myservo;
    int val;
    void setup()
    {
    // открываем последовательный порт
    Serial.begin(9600);
    // инициализация часов
    clock.begin();
    // метод установки времени и даты в модуль вручную
    // clock.set(10,25,45,27,07,2005,THURSDAY);
    // метод установки времени и даты автоматически при компиляции
    clock.set(__TIMESTAMP__);

    pinMode(BUZZER_PIN, OUTPUT);


    }

    void loop()
    {
    // массив для хранения текущего времени
    char time[LEN_TIME]={0};
    // массив для хранения текущей даты
    char date[LEN_DATE]={0};
    // массив для хранения текущего дня недели
    char dow[LEN_DOW]={0};

    // запрашиваем данные с часов
    clock.read();

    // сохраняем текущее время в массив time
    clock.getTimeStr(time, LEN_TIME);
    // сохраняем текущую дату в массив date
    clock.getDateStr(date, LEN_DATE);
    // сохраняем текущий день недели в массив dow
    clock.getDOWStr(dow, LEN_DOW);

    // выводим в serial порт текущее время, дату и день недели
    Serial.print(time);
    Serial.print("--");
    Serial.print(date);
    Serial.print("--");
    Serial.println(dow);

    // ждём одну секунду
    delay(300);


    int hour=clock.getHour();
    int minute=clock.getMinute();
    int second=clock.getSecond();
    //устанавливаем время открывания двери
    // утреннее кормление,серво 0 открыто,160 закрыто
    if (hour==8 & minute==1 & second==00)

    {pinMode(0, INPUT);
    myservo.attach(0);
    myservo.write (0);
    tone(BUZZER_PIN, 4500, 5000);
    delay(1000);
    myservo.detach();
    pinMode(0, OUTPUT);
    digitalWrite(0, LOW);}

    if (hour==8 & minute==21 & second==00)
    {tone(BUZZER_PIN, 4500, 5000);
    delay(5000);
    pinMode(0, INPUT);
    myservo.attach(0);
    myservo.write (160);
    delay(1000);
    myservo.detach();
    pinMode(0, OUTPUT);
    digitalWrite(0, LOW);}
    // дневное кормление

    if (hour==15 & minute==1 & second==00)

    {tone(BUZZER_PIN, 4500, 5000);
    pinMode(0, INPUT);
    myservo.attach(0);
    myservo.write (0);
    delay(1000);
    myservo.detach();
    pinMode(0, OUTPUT);
    digitalWrite(0, LOW);}

    if (hour==15 & minute==21 & second==00)
    {tone(BUZZER_PIN, 4500, 5000);
    delay(5000);
    pinMode(0, INPUT);
    myservo.attach(0);
    myservo.write (160);
    delay(1000);
    myservo.detach();
    pinMode(0, OUTPUT);
    digitalWrite(0, LOW);}
    //вечернее кормление
    if (hour==20 & minute==1 & second==00)

    {tone(BUZZER_PIN, 4500, 5000);
    pinMode(0, INPUT);
    myservo.attach(0);
    myservo.write (0);
    delay(1000);
    myservo.detach();
    pinMode(0, OUTPUT);
    digitalWrite(0, LOW);}

    if (hour==20 & minute==21 & second==00)

    {tone(BUZZER_PIN, 4500, 5000);
    delay(5000);
    pinMode(0, INPUT);
    myservo.attach(0);
    myservo.write (160);
    delay(1000);
    myservo.detach();
    pinMode(0, OUTPUT);
    digitalWrite(0, LOW);}
    //ручное управление с помошью кнопки


    // считываем значение с кнопки. Возможны всего 2 варианта:
    // * высокий сигнал, 5 вольт, истина — кнопка отпущена
    // * низкий сигнал, земля, ложь — кнопка зажата
    boolean keyUp = digitalRead(FIRST_KEY_PIN);

    // проверяем условие «если не кнопка отпущена». Знак «!»
    // перед булевой переменной означает отрицание, т.е. «не».


    /*
    * Оператор X % Y дает остаток от деления X на Y. Если X меньше Y, т.е. целая часть результата деления равна 0, оператор % будет возвращать X. Таким образом:
    Пока brightness + 1 меньше 256, в brightness записывается значение brightness + 1
    Как только brightness + 1 принимает значение 256, результатом (brightness + 1) % 256 становится 0 и на следующей итерации loop() всё начинается сначала.
    Оператор % работает только с целыми операндами.Оператор X % Y дает остаток от деления X на Y. Если X меньше Y, т.е. целая часть результата деления равна 0, оператор % будет возвращать X. Таким образом:
    Пока brightness + 1 меньше 256, в brightness записывается значение brightness + 1
    Как только brightness + 1 принимает значение 256, результатом (brightness + 1) % 256 становится 0 и на следующей итерации loop() всё начинается сначала.
    Оператор % работает только с целыми операндами.
    */


    if (!keyUp)
    {pinMode(0, INPUT);
    myservo.attach(0);
    myservo.write (0+i);
    tone(BUZZER_PIN, 4500, 5000);
    delay(1000);
    i = (i + 160) % 320;
    myservo.detach();
    pinMode(0, OUTPUT);
    digitalWrite(0, LOW);}
    {Serial.print(i);}

    }

     
     
    Последнее редактирование модератором: 10 авг 2016
  2. ostrov

    ostrov Гуру

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

    Потому: проверьте питание, оикуда оно идет вообще? И поиграйте настройками min-max при инициализации сервы.
     
    Последнее редактирование: 10 авг 2016
    acos нравится это.
  3. ostrov

    ostrov Гуру

    Да, и еще, не используйте пин 0, он же для UART, который в вашей программе задействован для печати в сериал порт!
     
  4. acos

    acos Официальный гик Администратор

    Используется Iskra Neo, для неё на этой ноге Serial1, а он не используется.
    ТС не указал пару моментов - расстояние между искрой и сервой ~2м. Я грешу на помехи.
     
  5. ARGON1

    ARGON1 Нуб

    проблема скорее всего в блоке питания,который идет на плату.Я использую блок питания 500мА,5 v.Если вместо него ,в качестве питания подключаю макбук аир,дребезжание отсутсвует.Теперь вопрос,какой блок питания подобрать
     
  6. ARGON1

    ARGON1 Нуб

    я уже пробовал подключать серву близко (10 см) к плате.дребезг остается.пин переписал на 1,ситуация не изменилась
     
  7. ostrov

    ostrov Гуру

    Точно, про Искру я не заметил.

    0,5А мало конечно.
     
  8. ARGON1

    ARGON1 Нуб

    А сколько нужно?
     
  9. ostrov

    ostrov Гуру

    Я не знаю, надо в даташите смотреть.
     
  10. ARGON1

    ARGON1 Нуб

    Подключил блок питания 12v,2000мА.Дребезг исчез!!! Ура.)Всем спасибо за участие!
     
  11. acos

    acos Официальный гик Администратор

    Я бы предостерёг именно от 12 В. Я так понимаю теперь Ардуино питается от БП, а серва от ардуины?
    Нагрузка на регулятор напряжения в таком случае большая. Он будет сильно греться. Ему и так нужно превратить в тепло лишние 7В, а тут ещё и серва. Лучше в такой схеме использовать БП хотя бы на 9 В, а ещё лучше - на 7.5
     
  12. ARGON1

    ARGON1 Нуб

    Нет,я по прежнему использую 2 блока питания.12v записывает ардуину,а 6v отдельно стерву.Так нормально будет?
     
  13. acos

    acos Официальный гик Администратор

    А, понял. Так нормально.