Нестабильная работа сервопривода mg996r

Тема в разделе "Arduino & Shields", создана пользователем Alex20280, 28 окт 2020.

  1. Alex20280

    Alex20280 Нерд

    Здравствуйте,

    Решил повторить один проект из интернета, сделать кормушку для котейки.
    Она срабатывает по времени и от нажатии кнопки. Тут все нормально
    Но возникла одна проблема в работе сервопривода MG996R. Для выдачи порции сервопривод должен проделать несколько итераций. Обычно он срабатвывает нормально, но иногда сервопривод начинает тормозить во время движения, как будто ему не хватает мощности.
    Вот видео:


    Сревопривод должен все время открываться на полную (как в первые секунды видео), но потом он замедляется и не поворачивается полностью, а иногда вообще может не повернуться.
    Питание идет от сети, через понижающий преобразователь dc-dc XL4015. На него из блока питания 12V, 2.3A подается питание, снижается до 7В и подается напрямую на серву, минуя ардуино нано.
    Подскажите, в чем может быть проблема? Спасибо.
    Вот код проекта:
    Код (C++):
    #include <Wire.h>
    #include <DS3231.h>
    #define DS3231_I2C_ADDRESS 0x68
    DS3231  rtc(SDA, SCL);

    byte decToBcd(byte val) // Convert normal decimal numbers to binary coded decimal
    {
      return( (val/10*16) + (val%10) );
    }

    byte bcdToDec(byte val) // Convert binary coded decimal to normal decimal numbers
    {
      return( (val/16*10) + (val%16) );
    }

    #include <Servo.h>
    Servo feedServo;
    #define ctsPin 3   // button
    #define PIN_SERVO 5


    Time t;
    int feed1hour = 01;
    int feed1minute = 45;
    int feed2hour = 07;
    int feed2minute = 45;
    int feed3hour = 13;
    int feed3minute = 45;
    int feed4hour = 19;
    int feed4minute = 45;
    int feedQty = 4;
    int feedRate = 800;   //a pwm rate the triggers forward on the servo 75
    int feedReversal = 300;

    void setup(){
     
      Serial.begin(9600);
     
      rtc.begin();
      //setDS3231time(00,07,03); // set the initial time here: DS3231 seconds, minutes, hours, day, date, month, year

      pinMode(ctsPin, INPUT);
    }


    void setDS3231time(byte second, byte minute, byte hour)
    {
      Wire.beginTransmission(DS3231_I2C_ADDRESS);
      Wire.write(0);
      Wire.write(decToBcd(second));
      Wire.write(decToBcd(minute));
      Wire.write(decToBcd(hour));
      Wire.endTransmission();
    }

    void loop()
    {
    t = rtc.getTime();
    //timeCheck();
       
    //Manual feed button
    int ctsValue = digitalRead(ctsPin);
    if (ctsValue == HIGH){
    feed();
    }
    if (t.hour == feed1hour && t.min == feed1minute && t.sec == 0)  {
        feed();                                                                  
          } else if (t.hour == feed2hour && t.min == feed2minute && t.sec == 0)  {
        feed();
          } else if (t.hour == feed3hour && t.min == feed3minute && t.sec == 0)  {
        feed();                                                                  
         } else if (t.hour == feed4hour && t.min == feed4minute && t.sec == 0)  {
        feed();
        }

    }

    void feed() {
       feedServo.attach(PIN_SERVO);
       for(int i = 0; i<10; i++) {
        feedServo.write(360);
          delay(1000);  
          feedServo.write(10);
          delay(1200);
       }
         feedServo.write (60);//500
         feedServo.detach();
    }

    void timeCheck (){
    Serial.print(t.hour);
    Serial.print("-");
    Serial.print(t.min);
    Serial.print("-");
    Serial.println(t.sec);
    delay (1000);
    }
     
  2. parovoZZ

    parovoZZ Гуру

    вешай на конец кабеля терминатор. Килоом так десять.
     
    Alex20280 нравится это.
  3. Alex20280

    Alex20280 Нерд

    А можете по подробнее что и куда именно подключать? А то я не особо силен в электрике. Спасибо.
     
  4. vvr

    vvr Инженерище

    feedServo.write(360); - а это откуда взялось ?
    в библиотеке крутит до 180.