Uno D1 8266 не работает управление сервоприводом SG90

al072
Offline
Зарегистрирован: 20.04.2017

Добрый день! Столкнулся с проблемой, не могу заставить работать сервопривод SG90 c платой ESP8266 D1 Wifi(вот такая: https://aliexpi.com/B1EH)., при загрузке скетча серво стоит на месте и никак не реагирует., другие пины для управления тоже пробовал - без результатно.

Вот скетч:

#include <Servo.h>
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0;    // variable to store the servo position
void setup() {
  myservo.attach(0);  //  attaches the servo on GPIO 0 to the servo object
}
void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);    // tell servo to go to position in variable 'pos'
    delay(15);       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);       // tell servo to go to position in variable 'pos'
    delay(15);     // waits 15ms for the servo to reach the position
  }
}

 

Вот схема:

SG90  ESP8266

Gnd  -  Gnd

Vcc  -   5v

Signal - GPIO 0 (это пин D8)

Этот же самый скетч загружаю на ардуино нано и подключаю туже самую серву SG90 - все работает отлично!!! Питание подается через USB компьютера., пробовал и внешнее питание подключать (LIPO 3s) резульататов не дало...

Подскажите пожалуйста в чем может быть проблема?

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

Проверьте пины с помощью светодиода - я думаю вы путаете номер.

попробуйте к этому же пину подключить светодиод и просто дать digitalWrite(0, HIGH)

al072
Offline
Зарегистрирован: 20.04.2017

b707 пишет:

Проверьте пины с помощью светодиода - я думаю вы путаете номер.

попробуйте к этому же пину подключить светодиод и просто дать digitalWrite(0, HIGH)

Благодарю за комментарии., диода под руками к сожалению не оказалось., вместо диода использовал мультиметр и вот что заметил., в момент когда digitalWrite дает HIGH, показания мультиметра не превышают 3.3v, очевидно что этого вольтажа не хватает чтобы сдвинуть с места серву., запустил тот же самый тестовый код на ардуино нано., получается что мультиметром снимаю с пина почти 5 v.

С пином не напутал., все правильно GPIO 0 сидит на D8

Что это может означать? Что плата работает только с управляющей логикой 3.3v?

Вот код для теста который я использовал:

#define testPin 0
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(testPin, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(testPin, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(testPin, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
Для NODEMCU
// D0 - GPIO6
// D1 - GPIO5  // SDA I2C
// D2 - GPIO4  // SCL I2C
// D3 - GPIO0
// D4 - GPIO2

Для WEMOS D1 надо посмотреть

 

al072
Offline
Зарегистрирован: 20.04.2017

эта распиновка не подходит к моей плате., у меня пины соответствуют как на фото по ссылке на алиэкспресс которую я привел в начале поста., относительно ваших получается:

ua6em пишет:

// D0 - GPIO3
// D1 - GPIO1
// D2 - GPIO16
// D3 - GPIO5
// D4 - GPIO4

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

А если прямо обозначить цифровой пин:
 

#include <Servo.h>
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0;    // variable to store the servo position
void setup() {
  myservo.attach(D8);  //  attaches the servo on GPIO 0 to the servo object
}
void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);    // tell servo to go to position in variable 'pos'
    delay(15);       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);       // tell servo to go to position in variable 'pos'
    delay(15);     // waits 15ms for the servo to reach the position
  }
}

плату эту выбираете?

al072
Offline
Зарегистрирован: 20.04.2017

ua6em пишет:

А если прямо обозначить цифровой пин:
 

#include <Servo.h>
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0;    // variable to store the servo position
void setup() {
  myservo.attach(D8);  //  attaches the servo on GPIO 0 to the servo object
}
void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);    // tell servo to go to position in variable 'pos'
    delay(15);       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);       // tell servo to go to position in variable 'pos'
    delay(15);     // waits 15ms for the servo to reach the position
  }
}

плату эту выбираете?

Прямо обозначать цифровой пин тоже пробовал., результатов не дало

 

плату вот эту выбираю при загрузке скетча (выбрать LOLIN Wemos d1 r1 попробовал не помогло):

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

для Nodemcu GPIO0 это D3

al072
Offline
Зарегистрирован: 20.04.2017

ua6em пишет:

для Nodemcu GPIO0 это D3

у меня не NodeMCU, а ESP8266 - вот такая https://ali.onl/1Z9Q

при загруке выбираю NodeMCU потомучто у китайцев в туториале по сборке робота именно так прописано., вообще делал все по туториалу., моторы работают, SR-04 работает., а вот сервопривод SG90 никак не хочет работать

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

не поленился, загрузил твой скетч в NODEMCU - всё работает, пин D3
 

#include <Servo.h>
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0;    // variable to store the servo position
void setup() {
  myservo.attach(D3);  //  attaches the servo on GPIO 0 to the servo object
}
void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);    // tell servo to go to position in variable 'pos'
    delay(15);       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);       // tell servo to go to position in variable 'pos'
    delay(15);     // waits 15ms for the servo to reach the position
  }
}

 

al072
Offline
Зарегистрирован: 20.04.2017

ua6em пишет:

не поленился, загрузил твой скетч в NODEMCU - всё работает, пин D3
 

#включить <Servo.h>
Servo myservo; // создать объект servo для управления сервоприводом
// двенадцать сервообъектов могут быть созданы на большинстве плат
int pos = 0; // переменная для хранения положения сервопривода
void setup() {
myservo.attach(D3); // прикрепляет сервопривод на GPIO 0 к сервообъекту
}
void loop() {
for (pos = 0; pos
 // с шагом 1 градус
myservo.write(pos); // скажите сервоприводу перейти в положение с переменной
задержкой pos(15); // ждет 15 мс, пока сервопривод достигнет позиции
}
 for (pos = 180; pos >= 0; pos -= 1) { // переходит от 180 градусов к 0 градусам
myservo.write(pos); // сообщает сервоприводу перейти в положение с переменной
задержкой pos(15); // ждет 15 мс, пока сервопривод достигнет позиции
}
}

спасибо за тест., у меня так ничего и не получается (( больше склоняюсь к проблеме с самой платой., на нанке работает, на уно запускал работает., а на ESP8266 D1 WI-FI плате не хочет работать!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

нечему там не получаться, запитываешь серву надеюсь от +5 вольт

al072
Offline
Зарегистрирован: 20.04.2017

ua6em пишет:

нечему там не получаться, запитываешь серву надеюсь от +5 вольт

Согласен полностью., скетч простой как дважды два... да конечно серву от +5 вольт запитываю!!!

Но увы имею то что имею., не работает гадость такая (((

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

прозвони, кроме неправильных ног подключения нечему там не работать

al072
Offline
Зарегистрирован: 20.04.2017

ua6em пишет:

прозвони, кроме неправильных ног подключения нечему там не работать

Как именно прозвонить? Я вроде убедился с помощью мультиметра что названия пинов соответствуют., + в качестве имени использовал прямое обозначение D7 (GPIO 0), пробовал посадить сигнальный провод от сервы и на другие пины., но увы безрезультатно

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

al072 пишет:

ua6em пишет:

прозвони, кроме неправильных ног подключения нечему там не работать

Как именно прозвонить? Я вроде убедился с помощью мультиметра что названия пинов соответствуют., + в качестве имени использовал прямое обозначение D7 (GPIO 0), пробовал посадить сигнальный провод от сервы и на другие пины., но увы безрезультатно

GPIO0 это в коде выбранной тобой платы - D3, а физически подключать видимо на D8

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

На плате Wemos D1 Wi-Fi UNO (ESP-12E), которая указана в заголовочном посте данной темы, GPIO0 - это D8:

https://radioprog.ru/shop/merch/57 (очень рекомендую ознакомиться ТС).

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ТС выбирает не WEMOS,  а NODEMCU при компиляции, со всеми вытекающими, говорит, что с WEMOS тоже не взлетело

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Поставил я себе поддержку ESP8266 и у меня тоже для ESP-12E только такое подходит: NodeMCU 1.0 (ESP-12E Module).

А если на другую "лапу" назначить? Может сама "лапа" не рабочая?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

наиболее подходит всё же такая (WEMOS D1/R1):

al072
Offline
Зарегистрирован: 20.04.2017

ua6em пишет:

GPIO0 это в коде выбранной тобой платы - D3, а физически подключать видимо на D8

В коде поставил  myservo.attach(D3);  //  attaches the servo on GPIO 0 to the servo object

физически посадил на пин D8 - результат нулевой ((

al072
Offline
Зарегистрирован: 20.04.2017

BOOM пишет:

Поставил я себе поддержку ESP8266 и у меня тоже для ESP-12E только такое подходит: NodeMCU 1.0 (ESP-12E Module).

А если на другую "лапу" назначить? Может сама "лапа" не рабочая?

Перебрал все лапы с PWM, тишина... серво стоит на месте

al072
Offline
Зарегистрирован: 20.04.2017

ua6em пишет:

наиболее подходит всё же такая (WEMOS D1/R1):

 

Спасибо за распиновку., именно такая у меня судя по буквенным обозначениям на плате., но результата не дает(( Заказал себе еще одну плату такуюже на OZON, c нетерпением жду., надеюсь что запуститься с первого пинка., у меня больше нет объяснений кроме как возможно не работает PWM модуляция или еще какие-то аппаратные косяки., скетч простой как дважды два., работает на остальных моих платах с тойже сервой., а на этой плате как в анекдоте - это не руки кривые , а место заколдованное (хотя может и кривые)

al072
Offline
Зарегистрирован: 20.04.2017

BOOM пишет:

На плате Wemos D1 Wi-Fi UNO (ESP-12E), которая указана в заголовочном посте данной темы, GPIO0 - это D8:

Вы правы так и есть!!! Благодарю за ссылки., обязательно ознакомлюсь

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

al072 пишет:

BOOM пишет:

На плате Wemos D1 Wi-Fi UNO (ESP-12E), которая указана в заголовочном посте данной темы, GPIO0 - это D8:

Вы правы так и есть!!! Благодарю за ссылки., обязательно ознакомлюсь

да, но если выбираешь nodemcu указывать надо как D3 )))
ЗЫ вообще-то wemos весьма своеобразная плата, после загрузки некоторых скетчей для восстановления работоспособности надо залить скетч восстановления, где-то тут на сайте писал на эту тему, но, что, где и как уже не вспомню

al072
Offline
Зарегистрирован: 20.04.2017

Друзья., вынужден вернуться с проблемой! Вопрос не закрыт., сегодня мне приехала новая плата esp8266 D1 (заказал специально в надежде что проблема была именно в плате)., но надежды не оправдались... Делаю все тоже самое., пробую запустить скетч и тишина., серво как вкопанный стоит мертвый... может еще какие-то советы будут? Может кто-нибудь попробовать запустить скетч на такойже плате с таким же сервоприводом? я уже не знаю что делать...

Проблему с платой вроде отсек (путем покупки новой., вероятность надеюсь небольшая что две платы из разных мет и обе не рабочие)., не работоспособность сервопривода тоже отсекаю (один и тот же серво на Ардуино Нано работает., а на этих платах отказывается)., проблему с нехваткой питания тоже исключаю (подключал и через плату и также отдельное питание давал на серво)... ну что еще может быть???

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

На указанном в программе выводе что-то появляется? Проверял?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

al072 пишет:

Друзья., вынужден вернуться с проблемой! Вопрос не закрыт., сегодня мне приехала новая плата esp8266 D1 (заказал специально в надежде что проблема была именно в плате)., но надежды не оправдались... Делаю все тоже самое., пробую запустить скетч и тишина., серво как вкопанный стоит мертвый... может еще какие-то советы будут? Может кто-нибудь попробовать запустить скетч на такойже плате с таким же сервоприводом? я уже не знаю что делать...

Проблему с платой вроде отсек (путем покупки новой., вероятность надеюсь небольшая что две платы из разных мет и обе не рабочие)., не работоспособность сервопривода тоже отсекаю (один и тот же серво на Ардуино Нано работает., а на этих платах отказывается)., проблему с нехваткой питания тоже исключаю (подключал и через плату и также отдельное питание давал на серво)... ну что еще может быть???

приведи скетч и выбор платы в IDE

al072
Offline
Зарегистрирован: 20.04.2017

BOOM пишет:

На указанном в программе выводе что-то появляется? Проверял?

не совсем понял вопрос., можете объяснить о каком выводе идет речь?

al072
Offline
Зарегистрирован: 20.04.2017

ua6em пишет:

приведи скетч и выбор платы в IDE

Скетч:

#include <Servo.h>
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0;    // variable to store the servo position
void setup() {
  myservo.attach(D8);  //  attaches the servo on GPIO 0 to the servo object
}
void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);    // tell servo to go to position in variable 'pos'
    delay(15);       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);       // tell servo to go to position in variable 'pos'
    delay(15);     // waits 15ms for the servo to reach the position
  }

}

Выбор платы в IDE:

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

чего ты дурака из себя строишь? вывод надо указывать как D3 подключая к D8

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

al072 пишет:

BOOM пишет:

На указанном в программе выводе что-то появляется? Проверял?

не совсем понял вопрос., можете объяснить о каком выводе идет речь?

О том выводе, с которого пытаешься управлять сервой.

al072
Offline
Зарегистрирован: 20.04.2017

ua6em пишет:

чего ты дурака из себя строишь? вывод надо указывать как D3 подключая к D8

слушай давай полегче с выражениями... я уже пробовал в скетче выставлять D3, а физически пин подключать на D8 - ЭТО НЕ РАБОТАЕТ

al072
Offline
Зарегистрирован: 20.04.2017

BOOM пишет:

На указанном в программе выводе что-то появляется? Проверял?

Появляется максимум 3.3v нарастающим итогом (мультиметром садился на пин и мерял)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

al072 пишет:

 я уже пробовал в скетче выставлять D3, а физически пин подключать на D8 - ЭТО НЕ РАБОТАЕТ

значит проблема в серве, такая плата у меня в работе попробовать не могу, на нодемсу всё работает, проверено, подключение там может быть только одно в скетче выставить D3 физически подключить D8, попробуй сделать analogWrite(D3, от 0 до 255) подключив на D8 светодиод, работает?

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

al072 пишет:

Появляется максимум 3.3v нарастающим итогом (мультиметром садился на пин и мерял)

а что ты там ждал на плате с напряжением 3.3в? пять вольт? а почему не 500?

Вот такой код залей в плату

#include <Servo.h>
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 90;    // variable to store the servo position
int servo_pin = D8;
void setup() {
  myservo.attach( servo_pin);  //  attaches the servo on GPIO 0 to the servo object
  myservo.write(pos);
}
void loop() {

}

и подбирай servo_pin, пока не начнет поворачиваться на 90 градусов

И пока это не заработает - больше не приходи и не пудри никому мозг

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

al072

добавлю

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

С написанием скетча блин сам справишься, надеюсь?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
/*
  pins_arduino.h - Pin definition functions for Arduino
  Part of Arduino - http://www.arduino.cc/

  Copyright (c) 2007 David A. Mellis
  Modified for ESP8266 platform by Ivan Grokhotkov, 2014-2015.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General
  Public License along with this library; if not, write to the
  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  Boston, MA  02111-1307  USA

  $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $
*/

#ifndef Pins_Arduino_h
#define Pins_Arduino_h

#define PIN_WIRE_SDA (4)
#define PIN_WIRE_SCL (5)

static const uint8_t SDA = PIN_WIRE_SDA;
static const uint8_t SCL = PIN_WIRE_SCL;

#ifndef LED_BUILTIN
#define LED_BUILTIN 2
#endif
#define LED_BUILTIN_AUX 16

static const uint8_t D0   = 16;
static const uint8_t D1   = 5;
static const uint8_t D2   = 4;
static const uint8_t D3   = 0;
static const uint8_t D4   = 2;
static const uint8_t D5   = 14;
static const uint8_t D6   = 12;
static const uint8_t D7   = 13;
static const uint8_t D8   = 15;
static const uint8_t D9   = 3;
static const uint8_t D10  = 1;

#include "../generic/common.h"

#endif /* Pins_Arduino_h */

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

и твоя WEMOS D1 если правильно указать:
 

/*
  pins_arduino.h - Pin definition functions for Arduino
  Part of Arduino - http://www.arduino.cc/

  Copyright (c) 2007 David A. Mellis
  Modified for ESP8266 platform by Ivan Grokhotkov, 2014-2015.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General
  Public License along with this library; if not, write to the
  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  Boston, MA  02111-1307  USA

  $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $
*/

#ifndef Pins_Arduino_h
#define Pins_Arduino_h

#define PIN_WIRE_SDA (4)
#define PIN_WIRE_SCL (5)

static const uint8_t SDA = PIN_WIRE_SDA;
static const uint8_t SCL = PIN_WIRE_SCL;

//new ESP-12E GPIO2
#define LED_BUILTIN 2

static const uint8_t D0   = 3;
static const uint8_t D1   = 1;
static const uint8_t D2   = 16;
static const uint8_t D3   = 5;
static const uint8_t D4   = 4;
static const uint8_t D5   = 14;
static const uint8_t D6   = 12;
static const uint8_t D7   = 13;
static const uint8_t D8   = 0;
static const uint8_t D9   = 2;
static const uint8_t D10  = 15;
static const uint8_t D11  = 13;
static const uint8_t D12  = 12;
static const uint8_t D13  = 14;
static const uint8_t D14  = 4;
static const uint8_t D15  = 5;

#include "../generic/common.h"

#endif /* Pins_Arduino_h */

 

al072
Offline
Зарегистрирован: 20.04.2017

ua6em пишет:

al072 пишет:

 я уже пробовал в скетче выставлять D3, а физически пин подключать на D8 - ЭТО НЕ РАБОТАЕТ

значит проблема в серве, такая плата у меня в работе попробовать не могу, на нодемсу всё работает, проверено, подключение там может быть только одно в скетче выставить D3 физически подключить D8, попробуй сделать analogWrite(D3, от 0 до 255) подключив на D8 светодиод, работает?

Вы оказались правы!!! Проблема была в серве., я не думал что проблема может быть в ней так как ранее писал что на ардуино Нано серва работает., вот такой странный парадокс))) купил сегодня новую SG90 завелась с первого раза!!! Вообщем для NodeMCU esp8266 12-e распиновка соответствует (D8 - GPIO0).

Всем спасибо за советы и потраченное время!!!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

al072 пишет:

Вы оказались правы!!! Проблема была в серве.

слава всевышнему!