Сервопривод MG996R функционирует некорректно
- Войдите на сайт для отправки комментариев
Ситуация следующая: я занялся программированием сервоприводов на 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);
}
}
нарисуйте схему подключения с указанием всех пинов, можно просто на листочке от руки (но четко) и сфоткать
Схема очень простая, просто кнопки и серва, ещё раз, стоит поменять вот эту MG996R на SG90 - и всё заработает как надо, а вторая инициализированная серва нужна была ещё когда эта программа управляла парой SG90
Я же вас просил нарисовать схему с указанием всех пинов. А что у вас? Разве серва подключается одним проводом? А где питание, где земля, куда они подключены на ардуино. Какой блок питания и как он подключен. Общее ли питание у серв и ардуино?
И еще тысяча вопросов. ответить на которые можно было одной схемой, если бы она была ПОЛНОЙ
Извиняюсь. Блок питания стандартный от телефона, просто кабель usb развёл и припаял к проводкам из набора с макетной платой, не исключаю, что мои кривые ручонки, не уважающие электротехнику, могли сделать что-то очень не так.
Подключил ESP32 к USB, оставив общую землю с сервоприводом и всё заработало как надо! Я только не понял, почему в таком случае всё работало и как было с заданными значениями, но я предположу, что просто пытал током бедную ESP так, что она не могла нормально инкрементировать настолько быстро. Спасибо, что заставили составить схему и подумать над питанием!
Подключил ESP32 к USB, оставив общую землю с сервоприводом и всё заработало как надо!
а до того, значит, земли не были соединены? :) - ну я что-то подобное и подозревал, для того и схема :)
Нет, земля как раз была общая, равно как и плюс. Видимо, ток в цепи был из-за сервы очень большой, так что стоило запитать контроллер отдельно, оставив общую землю - всё завелось