NodeMcu v3 Esp8266 и Servo MG90S

R0mikk

✩✩✩✩✩✩✩
6 Фев 2021
1
0
Есть проблема с сервоприводом, на NodeMcu и Arduino Nano одинаковый код, но выполняеться по разному.
На нодемсу сервопривод крутится только до 90 градусов, а на нано целые 180. В чем проблема?
Библиотека стандартная Servo.h, пример из библиотеки.Питание серво идет отдельно +5v. Пин серво на Нодемсу GPIO 13, менял порт не помогало, брал библиотеку AlexGyver'а, та же фигня.

C++:
#include <Servo.h>
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
uint32_t turnTimer;
bool flag;
int position1 = 180;
int position2 = 0;
void setup() {
  myservo.attach(13);  // attaches the servo on GIO2 to the servo object
}

void loop() {
  int pos;

  if (millis() - turnTimer >= 2000) {
    turnTimer = millis();
    flag = !flag;
    if (flag) myservo.write(position1);
    else myservo.write(position2);
  }
}
 

Nikolaya040xy

✩✩✩✩✩✩✩
24 Май 2022
1
0
@R0mikk, точно такая же проблема. Если посмотреть сигнал осциллографом то у Arduino он значительно шире чем у ESP 8266.
 

bort707

★★★★★★✩
21 Сен 2020
2,895
860
длительности подстроить в библиотеке не пробовали? они настраиваются
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Немного о том как работает сервопривод:
1) Сервопривод двигает мотором в зависимости от длительности импульса подаваемого с МК.
2) МК подает импульсы с определенной частотой.
3) Если старый и новый импульс по длине совпадают, то сервопривод будет в режиме удержания
4) Если импульсы перестанут приходить , то сервопривод будет в отключенном состоянии - т.е. его можно будет сдвинуть рукой.
5) Одного импульса как правило недостаточно для поворота: на небольшой угол может сработать, а если задать угол относительно большой, то по инерции серва проедет дальше чем надо. Моя практика показывает, что достаточно 5-7 импульсов что бы серва точно встала в нужное положение.
6) Выдавая короткие импульсы на пин (включить, задержка delayMicroseconds, выключить) можно посмотреть диапазон работы сервы без использования библиотеки. А подключив потенциометр можно задавать длительность задержки.

Нафига я это написал не знаю. Не уверен, что поможет.
 

Упоротый Енот

✩✩✩✩✩✩✩
13 Окт 2022
1
2
Для сервопривода SG90S мне помогло использование параметров min и max (длительности импульсов для крайних положений сервы) метода attach. Так же думаю не помешает изменение разрядности ШИМ до 16 бит.

C++:
#include <Servo.h> // подключение библиотеки
Servo test_servo; // создание объекта для сервопривода

void setup() {
  analogWriteResolution(16);  //увеличиваем разрядность ШИМ до 16 бит
  test_servo.attach(D2, 544, 2444); // указываем управляющий пин, параметр min и max
}
Значения min и max смотрите в документации к вашему сервоприводу.
 
Изменено:
  • Лойс +1
Реакции: dimon453 и Pan Doktor