Сервопривод MG996R функционирует некорректно

Gucker
Offline
Зарегистрирован: 11.08.2022

Ситуация следующая: я занялся программированием сервоприводов на ESP32, даже собрал картонный макет, используя маленькие сервочки SG90 с алиэкспресса - всё работает. Покупаю в одном интернет-магазине более крупные MG996R, а управляются они теми же сигналами, что и маленькие. Подключаю - в моей программе они трясутся на месте, иногда сдвигаются в нужную сторону, но потом возвращаются на 90 градусов. Суть программы в том, что при зажатии кнопки значение увеличивается и отправляется в серву, обеспечивая поворот только пока зажата кнопка (f и r, физически это кнопки с алиэкспресса уже с штырьками для макетной платы, назвал так для удобства). Менял и блок питания, и даже перепаял тот провод, что питает макетную плату - толку чуть. Затем дописал сдвиг на строго заданный угол с трёх других кнопок (w, s, b) - заработало, двигается быстро, падения напряжения почти не происходит. Вот и складывается вопрос - это сервы какие-то неправильные, я криворукий и написал плохой код (Я полнейший самоучка, не судите строго), или я криворукий и подключил что-то неправильно?

P.S. Программа правильно работает даже если переподключить сигнальный провод от большой сервы на маленькую. Библиотека же специально для ESP32, сам не понимаю, почему файл так же именуется, что и для ардуино.

#include <Servo.h>


Servo myservo; 
Servo myservo1;
Servo serv; 

int f = 12;
int r = 14;
int w = 25;
int s = 26;
int b = 32;
int pos = 90;
int pos1 = 0;

void setup() {
  myservo.attach(13);
  serv.attach(33);
  pinMode (f,INPUT);
  pinMode(r,INPUT);
  pinMode(w,INPUT);
  pinMode(s,INPUT);
  pinMode(b,INPUT);
  
}

void loop() {
  if (digitalRead(f) == HIGH){
    if(pos < 179){
      pos +=1;
    myservo.write(pos);}
    delay(50);
  }
  if (digitalRead(r) == HIGH){
     if(pos > 1){
    pos -=1;
    myservo.write(pos);}
    delay(50);
  }
     if(digitalRead(w) == HIGH){
      pos1 = 0;
      serv.write(pos1);
     }
     if(digitalRead(s) == HIGH){
      pos1 = 90;
      serv.write(pos1);
     }
     if(digitalRead(b) == HIGH){
      pos1 = 180;
      serv.write(pos1);
     }
     }

 

b707
Offline
Зарегистрирован: 26.05.2017

нарисуйте схему подключения с указанием всех пинов, можно просто на листочке от руки (но четко) и сфоткать

Gucker
Offline
Зарегистрирован: 11.08.2022

Схема очень простая, просто кнопки и серва, ещё раз, стоит поменять вот эту MG996R на SG90 - и всё заработает как надо, а вторая инициализированная серва нужна была ещё когда эта программа управляла парой SG90

b707
Offline
Зарегистрирован: 26.05.2017

Я же вас просил нарисовать схему с указанием всех пинов. А что у вас? Разве серва подключается одним проводом? А где питание, где земля, куда они подключены на ардуино. Какой блок питания и как он подключен. Общее ли питание у серв и ардуино?

И еще тысяча вопросов. ответить на которые можно было одной схемой, если бы она была ПОЛНОЙ

Gucker
Offline
Зарегистрирован: 11.08.2022

Извиняюсь. Блок питания стандартный от телефона, просто кабель usb развёл и припаял к проводкам из набора с макетной платой, не исключаю, что мои кривые ручонки, не уважающие электротехнику, могли сделать что-то очень не так.

Gucker
Offline
Зарегистрирован: 11.08.2022

Подключил ESP32 к USB, оставив общую землю с сервоприводом и всё заработало как надо! Я только не понял, почему в таком случае всё работало и как было с заданными значениями, но я предположу, что просто пытал током бедную ESP так, что она не могла нормально инкрементировать настолько быстро. Спасибо, что заставили составить схему и подумать над питанием!

b707
Offline
Зарегистрирован: 26.05.2017

Gucker пишет:

Подключил ESP32 к USB, оставив общую землю с сервоприводом и всё заработало как надо!

а до того, значит, земли не были соединены? :) - ну я что-то подобное и подозревал, для того и схема :)

Gucker
Offline
Зарегистрирован: 11.08.2022

Нет, земля как раз была общая, равно как и плюс. Видимо, ток в цепи был из-за сервы очень большой, так что стоило запитать контроллер отдельно, оставив общую землю - всё завелось