Сервопривод 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, оставив общую землю с сервоприводом и всё заработало как надо!
а до того, значит, земли не были соединены? :) - ну я что-то подобное и подозревал, для того и схема :)
Нет, земля как раз была общая, равно как и плюс. Видимо, ток в цепи был из-за сервы очень большой, так что стоило запитать контроллер отдельно, оставив общую землю - всё завелось