Серва MG996r с обратной связью.

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

Всем привет.

Пытаюсь сделать обратную связь на сервомотор MG996r.

Прочитал статью на Хабре https://habr.com/ru/company/amperka/blog/127773/. Там у автора серва DFRobot, в качестве энкодера стоит переменный резистор. Автор припаял провод на бегунок и меряет напругу на нем.

Я попытался повторить. Какой у меня энкодер не знаю, у Чипа и Дипа похожего не нашел, информации по моему энкодеру не нашел. По аналогии со статьей на Хабре подпоял проводок к среднему выводу энкодера.

Написал скетч где в цикле перебираю угол от 45 до 135 с задержкой 1 сек. (задержка чтобы успеть напругу посмотреть) Запускаю скечт и пытаюсь мерять на напряжение на припаяном проводке, но как только прикасаюсь щупом к проводу серва начинает дергаться.

Что я делаю не так?

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

.

Вот сам энкодер. По надписям ничего не нагуглилось. Вскрывать не хочу т.к. не разборный, только ломать.

Ну вроде похож на переменный резистор.

rkit
Offline
Зарегистрирован: 23.11.2016

Ну стоит полагать, что пытаешься шупать мультиметром чуствительную цепь ОС.

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

Подключил проводок на аналоговою ногу другой ардуины, земли соединил, получил в сериал порт такие значения:

210
230
248
263
277
297
313
328
347
365
380
398
412
432
451
464
475
497
 
Угол от 45 до 135 с шагом в 5 градусов.
 
Допустимо ли такое вмешательство?
 
Почему такой разброс в значениях?
КонстантинБ
Offline
Зарегистрирован: 02.11.2017

Нашел свободный аналоговый пин на своей ардуине.

Написал такой скетч:

#include <Servo.h>

Servo servo;

void setup()
{
  Serial.begin(9600);
  servo.attach(6);
  servo.write(45);
}

void loop()
{
  for (int i = 45; i < 135; i+=5)
  {
    servo.write(i);
    delay(1000);
    Serial.println(analogRead(7));
    delay(1000);
  } 
}

Получил такие значения в СОМ:

198 - значение 1
18   - разница 2 и 1
216 - значение 2
18
234
13
247
17
264
17
281
14
295
16
311
17
328
16
344
15
359
18
377
13
390
19
409
13
422
18
440
16
456
15
471
 
КонстантинБ
Offline
Зарегистрирован: 02.11.2017

Продолжаем.

Повернул серву в 0, с энкодера получил значение 46. Повернул в 180 - получил 586.

Делаю МАР: 46, 585, 0, 180.

Теперь поворачиваю серву от 0 до 180 градусов с шагом 10.

Вывожу в СОМ данные по обратной связи и получаю значения:

0
11
22
29
40
51
61
70
80
90
100
110
119
130
139
150
159
169
179
0
11
21
31
41
50
60
70
81
90
100
109
120
129
139
149
159
170
180
0
12
21
31
40
51
60
70
80
90
100
109
119
130
139
150
159
170
180
0
10
21
31
41
51
60
70
80
90
100
109
119
130
140
150
159
169
179
1
11
21
31
42
51
60
70
81
89
100
110
120
129
139
149
159
170
179
1
12
20
31
41
51
61
70
81
90
100
109
120
130
140
150
158
170
181
 
6 проходов. Расхождения 1-2 градуса. Но серва ведь, согласно кода, должна стремиться к круглому значению. Т.е. если по коду 90 градусов, то и серва должна перейти в 90 а не в 89.
 
Вопрос: почему появляются расхождения?
Может быть что значения с энкодера которые получаю я отличаются от значения которые получает контроллер сервы.
 
На всякий случай код:
#include<Servo.h>

Servo Axis;

void setup()
{
  Serial.begin(9600);
  Axis.attach(8);
}

void loop()
{
  for (int i = 0; i <= 180; i += 10)
  {
    Axis.write(i);
    delay(1000);
    Serial.println(map(analogRead(1), 46, 586, 0, 180));
    delay(500);
  }
}

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Инструмент для измерения углов - транспортир.
Вы же измеряете напряжение не совсем точным прибором.

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

sadman41 пишет:
Инструмент для измерения углов - транспортир.

Надо сказать, что серва не совсем точно отрабатывает 180 градусов. Это видно даже без обратной связи. С настройками импульса пока не возились. 

sadman41 пишет:
Вы же измеряете напряжение не совсем точным прибором. 

Напряжение измеряет сама ардуина, там точность измерения до сотых долей вольта.

---------------------------------

Ну то есть такие расхождения допустимы?

sadman41
Offline
Зарегистрирован: 19.10.2016

КонстантинБ пишет:

sadman41 пишет:
Инструмент для измерения углов - транспортир.

Надо сказать, что серва не совсем точно отрабатывает 180 градусов. Это видно даже без обратной связи. С настройками импульса пока не возились. 

Так это не шаговый двигатель, а подруливающая серва для моделизма.

КонстантинБ пишет:

Напряжение измеряет сама ардуина, там точность измерения до сотых долей вольта.

Ну то есть такие расхождения допустимы?

Тут чужого мнения не требуется. Берете осциллограф, садитесь на пин ардуины и смотрите, как там напряжение болтается туда-сюда. Потом смотрите на схему ардуины, в которой земли аналоговой части и цифровой объединены. Делаете выводы.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Григорий, если ты учавствовал, то тебе сюда http://arduino.ru/forum/otvlechennye-temy/razdacha-slonov#comment-554082

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

sadman41 пишет:

Делаете выводы.

Сделал вывод что бОльшего от данной сервы в связке с ардуино не добиться. Спасибо за ответ.

vvadim
Offline
Зарегистрирован: 23.05.2012

хоббийная серва это не устройство высокоточного позиционирования.
не высокого качества потенциометр на 5 ком не может точно отслеживать положение.
довольно болтающаяся кинематика.

хотите точности - шаговый двигатель с нормальным не дешёвым драйвером.
или сервопривод с энкодером в ос (цена не гуманная и с управлением нужно сурьёзно повозиться)