Серво MG90S внезапно начинает вращаться как обычный электромотор

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

Пробовал подключить другой серв SG90S, с ним такой проблемы не воспроизвёл.

Вопрос в том, если это неисправный сервик, можно ли его как-то починить? Кто-то сталкивался?

Вот скетч, может быть неисправный я :smile:

#define PIN_TRIG 4
#define PIN_ECHO 5
#define PIN_SERV 9
#define START_ANGLE 170
// подключение библиотеки Servo
#include <Servo.h>
// создать объект servo
Servo servo1;

// макс значение угла поворота
const int angle_max=10;
int length=10;
long duration, cm;

void setup() {
   // подключить управление сервоприводом к пину pin_servo
   Serial.begin(9600);

   pinMode(PIN_TRIG, OUTPUT);
   pinMode(PIN_ECHO, INPUT);
   servo1.attach(PIN_SERV);
   servo1.write(START_ANGLE);
}

void loop() {
      // Сначала генерируем короткий импульс длительностью 2-5 микросекунд.
      digitalWrite(PIN_TRIG, LOW);
      delayMicroseconds(5);
      digitalWrite(PIN_TRIG, HIGH);

      // Выставив высокий уровень сигнала, ждем около 10 микросекунд. В этот момент датчик будет посылать сигналы с частотой 40 КГц.
      delayMicroseconds(10);
      digitalWrite(PIN_TRIG, LOW);

      //  Время задержки акустического сигнала на эхолокаторе.
      duration = pulseIn(PIN_ECHO, HIGH);

      // Теперь осталось преобразовать время в расстояние
      cm = (duration / 2) / 29.1;

      // Задержка между измерениями для корректной работы скеча
      
      if(cm < length) {
        servo1.write(angle_max);
        delay(1000);
      } else {
        servo1.write(START_ANGLE);
      }

      Serial.println(length);
      delay(250);
}

Всё питается от блока питания 6В, общее питание на ардуину и серво. Датчик расстояния проверяет, если расстояние меньше 10см, то серво поворачивается на 170 градусов, если больше, обратно на 10.

За пределы рабочего диапазона вылез

Проверьте скетчем:

/* Sweep
 by BARRAGAN <http://barraganstudio.com>
 This example code is in the public domain.

 modified 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

Потенциометр в серве может не контачить.
И кто такие комменты в скетче писал?))

ТС, ваш скетч неполный.

Проверял скетч от @lilik и понял, что если ардуино питается от usb, а серв от блока питания, проблем нет.
А потом я отключил ардуино от юсб и подключил от блока питания 6 вольт к ардуион на vin, в результате чего привод два раза пробежался от 0 до 90 и потом начал крутиться на 360.

Как можно запитаться от одного БП , чтобы не чудил серво?

@Pyotr комменты из скетча про дальнометр от амперки что ли…

void loop() {
      // Сначала генерируем короткий импульс длительностью 2-5 микросекунд.
      digitalWrite(PIN_TRIG, LOW);
      delayMicroseconds(5);
      digitalWrite(PIN_TRIG, HIGH);

      // Выставив высокий уровень сигнала, ждем около 10 микросекунд. В этот момент датчик будет посылать сигналы с частотой 40 КГц.
      delayMicroseconds(10);
      digitalWrite(PIN_TRIG, LOW);

строки 3 и 4 не нужны.
датчик будет посылать сигналы с частотой 40 КГц после строки 9.

Туда не менее 7 вольт подавать нужно

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

Проще блок на 5 Вольт найти и питать через входо-выход +5 В.