• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь "Помехи" в работе.

soksokolov

New member
Добрый вечер. Нужна ваша помощь. При работе с ESP8266 (01) и ардуино уно возникают помехи, иногда запрос доходит, а иногда нет. Мне нужно настроить удаленный доступ к сервоприводам. Так как опыта работы в данной области почти нет, воспользовался вот этим туториалом:

Wi-Servo: Wi-Fi Browser Controlled Servomotors - Arduino Project Hub

Все получилось, нашел рабочую скорость (как я думаю) но работает все это добро не стабильно. Вот что вижу в терминале: https://b.radikal.ru/b16/1801/26/ad0188df0762.png.
Используемый код (не мой):

// Wi-Servo v1.0 By Igor Fonseca Albuquerque

//include libraries
#include <SoftwareSerial.h>
#include <Servo.h>

SoftwareSerial esp8266(5, 4); //set ESP8266 RX pin = 5, and TX pin = 4

//define variables
#define DEBUG true //display ESP8266 messages on Serial Monitor
#define SERV1 9 //servo 1 on digital port 9
#define SERV2 10 //servo 2 on digital port 10

Servo s1; //servo 1
Servo s2; //servo 2
int pos1 = 170; //servo 1 current position
int pos2 = 170; //servo 2 current position
int vel = 10; //servos' speed (100 -> 90º in 1 s)(1 -> 90º in 9 s)
int pos1min = 20; //servo 1 minimum position
int pos2min = 20; //servo 2 minimum position
int pos1max = 160; //servo 1 maximum position
int pos2max = 160; //servo 2 maximum position


//**************
// Arduino Setup
//**************
void setup()
{

//attach and set servos' angles
s1.attach(SERV1);
s2.attach(SERV2);
s1.write(pos1max);
s2.write(pos2max);
//detach servos
s1.detach();
s2.detach();

//start serial communication
Serial.begin(9600);
esp8266.begin(115200);

sendData("AT+RST\r\n", 2000, DEBUG); //reset module
sendData("AT+CWMODE=1\r\n", 1000, DEBUG); //set station mode
sendData("AT+CWJAP=\"wi-fi\",\"19101994\"\r\n", 2000, DEBUG); //connect wifi network
while(!esp8266.find("OK")) { //wait for connection
}
sendData("AT+CIFSR\r\n", 1000, DEBUG); //show IP address
sendData("AT+CIPMUX=1\r\n", 1000, DEBUG); //allow multiple connections
sendData("AT+CIPSERVER=1,80\r\n", 1000, DEBUG); // start web server on port 80
}

//**********
// Main Loop
//**********
void loop()
{
if (esp8266.available()) //check if there is data available on ESP8266
{
if (esp8266.find("+IPD,")) //if there is a new command
{
String msg;
esp8266.find("?"); //run cursor until command is found
msg = esp8266.readStringUntil(' '); //read the message
String command = msg.substring(0, 3); //command is informed in the first 3 characters. "sr1" = command to servo #1 and "sr2" = command to servo #2
String valueStr = msg.substring(4); //next 3 characters inform the desired angle
int value = valueStr.toInt(); //convert to integer
if (DEBUG) {
Serial.println(command);
Serial.println(value);
}
delay(100);

//************
// move servos
//************

//move servo1 to desired angle
if(command == "sr1") {
//limit input angle
if (value >= pos1max) {
value = pos1max;
}
if (value <= pos1min) {
value = pos1min;
}
s1.attach(SERV1); //attach servo
while(pos1 != value) {
if (pos1 > value) {
pos1 -= 1;
s1.write(pos1);
delay(100/vel);
}
if (pos1 < value) {
pos1 += 1;
s1.write(pos1);
delay(100/vel);
}
}
s1.detach(); //dettach
}

//move servo2 to desired angle
if(command == "sr2") {
//limit input angle
if (value >= pos2max) {
value = pos2max;
}
if (value <= pos2min) {
value = pos2min;
}
s2.attach(SERV2);
while(pos2 != value) {
if (pos2 > value) {
pos2 -= 1;
s2.write(pos2);
delay(100/vel);
}
if (pos2 < value) {
pos2 += 1;
s2.write(pos2);
delay(100/vel);
}
}
s2.detach();
}
}
}
}


//********************
// Auxiliary functions
//********************

//send data to ESP8266
String sendData(String command, const int timeout, boolean debug)
{
String response = "";
esp8266.print(command);
long int time = millis();
while ( (time + timeout) > millis())
{
while (esp8266.available())
{
char c = esp8266.read();
response += c;
}
}
if (debug)
{
Serial.print(response);
}
return response;
}
 

=AK=

New member
Вы выбрали худший из возможных вариантов - связка двух процессоров, да еще и с АТ командами. Не советую тратить время на АТ команды, это тупиковая ветвь. ESP8266 сам по себе мощный процессор. Ему внешняя Ардуина не нужна, он сам все может сделать - и по WiFi общаться, и моторами управлять.

Вот, например, проект управления сервомотором в среде NodeMCU: ESP8266 servo

Но лучше поставьте поддержку ESP8266 в среду Ардуино, GitHub - esp8266/Arduino: ESP8266 core for Arduino После этого вы сможете писать скетчи и грузить их прямо в свой модуль. Серво библиотека там есть.

А еще лучше если при этом вы для начала будете использовать модуль NodeMCU. Он годится для работы в среде Ардуино. С ним работать проще - и пинов больше выведено, и блок питания есть, и переходник USB-UART встроен.
 

soksokolov

New member
Спасибо большое за помощь. Учту Ваши советы и сегодня попробую NodeMCU. Надеюсь это реально упростит задачу :)
 

soksokolov

New member
Вы выбрали худший из возможных вариантов - связка двух процессоров, да еще и с АТ командами. Не советую тратить время на АТ команды, это тупиковая ветвь. ESP8266 сам по себе мощный процессор. Ему внешняя Ардуина не нужна, он сам все может сделать - и по WiFi общаться, и моторами управлять.

Вот, например, проект управления сервомотором в среде NodeMCU: ESP8266 servo

Но лучше поставьте поддержку ESP8266 в среду Ардуино, GitHub - esp8266/Arduino: ESP8266 core for Arduino После этого вы сможете писать скетчи и грузить их прямо в свой модуль. Серво библиотека там есть.

А еще лучше если при этом вы для начала будете использовать модуль NodeMCU. Он годится для работы в среде Ардуино. С ним работать проще - и пинов больше выведено, и блок питания есть, и переходник USB-UART встроен.
Пошастал по форуму и понял, что все советуют использовать esp8266 без ардуино. Подскажите, теоретически, есть ли какое-то преимущество использовать ардуино + esp8266?
 

CodeNameHawk

Moderator
Команда форума
есть ли какое-то преимущество использовать ардуино + esp8266
Повышенная надежность системы.
н.п. У меня похоже сделано управление котлом, стоит Атмега16 и есп.
Отсутствие связи или подвисание есп не влияют на работу котла.
 
Сверху Снизу