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

Нужна помощь связать 2 ESP8266-01 для управления серво.

AndreyFly

New member
Задача.
Беспроводной пульт, для управления всего 1 сервомашинкой.

Имеется 2 модуля ESP8266-01. На одном модуле подключен переменный резистор, которым измеряется угол нажатия кнопки пульта. На второй модуль подключена сервомашинка. Никаких роутеров, интернетов и браузеров нет и не нужно! Использоваться в том числе будет вдали от цивилизации и всех видов связи и интернета.
Все, что нужно - это непрерывно отправлять число от 1100 до 2200 (это число миллисекунд для сервомашинки) с пульта. И непрерывно получать значение, чтобы отправить команду на сервомашинку.

Вроде не сильно сложная задача, но с ESP модулем бьюсь уже вторую неделю. На передатчике переменный резистор опрашивается, на приемнике в сервомашинку установить знаю как. А вот данные не передаются, или передаются, но как их принять не понимаю.

Этот код в передатчике

Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

WiFiServer server(80);
WiFiClient client[1];

const int numReadings = 10;

int readings[numReadings];      // the readings from the analog input
int readIndex = 0;              // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average

int inputPin = A0;
int val;

void startAP()
{
  delay(100);
  WiFi.mode(WIFI_STA);
  WiFi.softAP("Throttle","Paraplan");
  delay(500);
  server.begin();
}

void setup() {
  // initialize serial communication with computer:
  Serial.begin(9600);
  // initialize all the readings to 0:
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
  startAP();
}

void loop() {

  if (!client[1] || !client[1].connected()){
  if(client[1]) client[1].stop();
  client[1] = server.available();
  }

  if (client[1] && client[1].connected()){
      if(client[1].available()){
        while(client[1].available()){
           total = total - readings[readIndex];
           readings[readIndex] = analogRead(inputPin);
           total = total + readings[readIndex];
           readIndex = readIndex + 1;
           if (readIndex >= numReadings) {
           readIndex = 0;
  }
  average = total / numReadings;

  if (average <= 550) { average = 550;}
  if (average >= 990)  {average = 990;}
  val = map(average, 550, 990, 0, 255);
  delay(50);       
          client[1].write(val);
        }
      }
    }
  // send it to the computer as ASCII digits
  //Serial.print(average);
  //Serial.print(" ");
  //Serial.println(val);
  //delay(1);        // delay in between reads for stability
}

Этот код в приемнике

Код:
#include <ESP8266WiFi.h>
#include <Servo.h>
Servo myservo;

WiFiClient client;
int stat=0;
int val=0;
const char* ssid     = "Throttle";
const char* password = "Paraplan";
const char* host = "192.168.4.1";
const int port = 80;
void setup() {
  myservo.attach(2,1100,2200);
 
  Serial.begin(115200);
  delay(10);
  WiFi.begin(ssid, password);
  delay(500);
 
  }
void loop() {
 
  Serial.println(stat);
  while (stat==0){
  client.connect(host, port);
  delay(500);

if (!client.connect(host, port)) {
    Serial.print("connection failed");Serial.print("  ");Serial.println(client.connected());
    delay(500);
    return;
   }
  while(client.connected())
  {
   while(client.available())
   {
    char RX = client.read();
    val = map(RX, 0, 255, 1100, 2200);
    myservo.writeMicroseconds(val);
    Serial.print(val);
    delay(5);
   }
  //Serial.println(client.available());
   while(Serial.available()>0)
   {
//    char TX=Serial.read();
    client.print(val);
    }
  }
  }
  }

Все, что касается WiFi обмена данными - подсмотрел на этом форуме, но ничего в этом не понимаю. Подскажите, или ссылку дайте на рабочие примеры аналогичные моей задаче.
 

nikolz

Well-known member
Задача.
Беспроводной пульт, для управления всего 1 сервомашинкой.

Имеется 2 модуля ESP8266-01. На одном модуле подключен переменный резистор, которым измеряется угол нажатия кнопки пульта. На второй модуль подключена сервомашинка. Никаких роутеров, интернетов и браузеров нет и не нужно! Использоваться в том числе будет вдали от цивилизации и всех видов связи и интернета.
Все, что нужно - это непрерывно отправлять число от 1100 до 2200 (это число миллисекунд для сервомашинки) с пульта. И непрерывно получать значение, чтобы отправить команду на сервомашинку.

Вроде не сильно сложная задача, но с ESP модулем бьюсь уже вторую неделю. На передатчике переменный резистор опрашивается, на приемнике в сервомашинку установить знаю как. А вот данные не передаются, или передаются, но как их принять не понимаю.

Этот код в передатчике

Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

WiFiServer server(80);
WiFiClient client[1];

const int numReadings = 10;

int readings[numReadings];      // the readings from the analog input
int readIndex = 0;              // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average

int inputPin = A0;
int val;

void startAP()
{
  delay(100);
  WiFi.mode(WIFI_STA);
  WiFi.softAP("Throttle","Paraplan");
  delay(500);
  server.begin();
}

void setup() {
  // initialize serial communication with computer:
  Serial.begin(9600);
  // initialize all the readings to 0:
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
  startAP();
}

void loop() {

  if (!client[1] || !client[1].connected()){
  if(client[1]) client[1].stop();
  client[1] = server.available();
  }

  if (client[1] && client[1].connected()){
      if(client[1].available()){
        while(client[1].available()){
           total = total - readings[readIndex];
           readings[readIndex] = analogRead(inputPin);
           total = total + readings[readIndex];
           readIndex = readIndex + 1;
           if (readIndex >= numReadings) {
           readIndex = 0;
  }
  average = total / numReadings;

  if (average <= 550) { average = 550;}
  if (average >= 990)  {average = 990;}
  val = map(average, 550, 990, 0, 255);
  delay(50);      
          client[1].write(val);
        }
      }
    }
  // send it to the computer as ASCII digits
  //Serial.print(average);
  //Serial.print(" ");
  //Serial.println(val);
  //delay(1);        // delay in between reads for stability
}

Этот код в приемнике

Код:
#include <ESP8266WiFi.h>
#include <Servo.h>
Servo myservo;

WiFiClient client;
int stat=0;
int val=0;
const char* ssid     = "Throttle";
const char* password = "Paraplan";
const char* host = "192.168.4.1";
const int port = 80;
void setup() {
  myservo.attach(2,1100,2200);
 
  Serial.begin(115200);
  delay(10);
  WiFi.begin(ssid, password);
  delay(500);
 
  }
void loop() {
 
  Serial.println(stat);
  while (stat==0){
  client.connect(host, port);
  delay(500);

if (!client.connect(host, port)) {
    Serial.print("connection failed");Serial.print("  ");Serial.println(client.connected());
    delay(500);
    return;
   }
  while(client.connected())
  {
   while(client.available())
   {
    char RX = client.read();
    val = map(RX, 0, 255, 1100, 2200);
    myservo.writeMicroseconds(val);
    Serial.print(val);
    delay(5);
   }
  //Serial.println(client.available());
   while(Serial.available()>0)
   {
//    char TX=Serial.read();
    client.print(val);
    }
  }
  }
  }

Все, что касается WiFi обмена данными - подсмотрел на этом форуме, но ничего в этом не понимаю. Подскажите, или ссылку дайте на рабочие примеры аналогичные моей задаче.
эту задачу надо решать на ESP-NOW (есть такой протокол)
--------------------------
дилетанту все задачи кажутся простыми,
потому что он не знает как их решить .
 

svs2007m

Active member
ESP-NOW безусловно отлично решение!!! Но если речь идет о десятках метров или сотнях возможно будет лучше радиомодуль. Ну а если километрами то LоRa
 

nikolz

Well-known member
ESP-NOW безусловно отлично решение!!! Но если речь идет о десятках метров или сотнях может лучше радиомодуль. Ну а если километрами то LоRa
все верно если вместо двух модулей по 100 рублей взять два модуля по 1000 рублей
то железо будет круче
а вот расстояние зависит от диапазона работы полосы и мощности передатчика
у ESP8266 100 мвт.
Вы что возьмете мощнее?
-----------------------
Если не заниматься ля-ля
то ESP-NOW именно для таких задач
не надо никакой сети и роутеров
не надо создавать соединение
время передачи 250 байт - 2 мс
если модуль спит то потребляет 10 мка
если надо передать то достаточно 120 мс для просыпания и передачи.
-------------------
попробуйте найти лучшее решение
 

svs2007m

Active member
Да и по Прайсу цен LoRa за 1000р ??? Это Вы МОЩНО переплатили !!!
Небольшой обзор LoRa
 

nikolz

Well-known member
Я же сказал ESP-NOW безусловно отлично решение!!!
если не секрет какого ??? на ESP-01 ? Никак WIFI модуль бъет на 100 метров ?
на открытой местности бьет на 1000 метров.
С хорошей антенной до 10 км - прямая видимость.
-----------------
Вы боритесь с ветряными мельницами.
и сравниваете кислое с зеленым
за 300 руб вы купили приемо-передатчик.
К нему надо довесить MCU 32 бита на 160 Мгц + 4Mбайта флеш для программ и 60 Кбайт Ram для данных
все это разместить на плате 1.5x2 см и еще антенну.
плюс свое время чтобы это все спаять.
вот это все вместе и посчитайте.
кроме того диапазон 433Мгц это не тоже самое что 2.4 Ггц
Скорость передачи данных LORA: 0,3 кбит/с
скорость передачи 300 кбит но если связь хорошая а так LoRA пробивает далеко если очень медленно передавать.
---------------------
когда сделаете на лора, то сравним
у меня ESP-NOW работает
энергозатраты на один сеанс 14 ma*s.
время передачи 2 мс. время сеанса с deep-sleep 125 мс
------------------------
 
Последнее редактирование:

nikolz

Well-known member
Lora на 868 Mггц
мощность 30 дБ
стоит 700 руб
-------------
расстояние 6000 м
Состояние теста: прозрачная и открытая площадь и 30 дБм, усиление антенны: 5dBi, высота: 2 м, скорость передачи данных воздуха: 1,2 кбит/с
ток 680mA @ 30dBm ≥1. 5A
-----------------
если устроит, то флаг вам в руки
 

svs2007m

Active member
Дружище ! не собираюсь с Вами с порить ! Вы правы ! Вы строите свой "Титаник", а я уже построил свой "ковчег". Что такое Дашит на железку... и как она в поле ...А по цене на LoRa 200-300 р ( 700-1000 это для Вас спец. предложение !)
283.41 руб. 45% СКИДКА|LoRa SX1278 433 МГц Беспроводной rf модуль iot трансивер CDSENET E32 433T20DT UART длинный диапазон 433 МГц rf передатчик приемник-in Фиксированные беспроводные терминалы from Мобильные телефоны и телекоммуникации on Aliexpress.com | Alibaba Group
 

nikolz

Well-known member
Дружище ! не собираюсь с Вами с порить ! Вы правы ! Вы строите свой "Титаник", а я уже построил свой "ковчег". Что такое Дашит на железку... и как она в поле ...А по цене на LoRa 200-300 р ( 700-1000 это для Вас спец. предложение !)
283.41 руб. 45% СКИДКА|LoRa SX1278 433 МГц Беспроводной rf модуль iot трансивер CDSENET E32 433T20DT UART длинный диапазон 433 МГц rf передатчик приемник-in Фиксированные беспроводные терминалы from Мобильные телефоны и телекоммуникации on Aliexpress.com | Alibaba Group
не внимательно читаете
это 433 мггц - выше написал и это только модем а не SOC
но согласен, делайте на чем хотите.
 

AndreyFly

New member
Извините за долгое молчание. Переустанавливал виндовс. Расстояние передачи от 0,5 до 2 метров. Потребление играет важную роль, но не критическую. Время работы электроустановки около 30 минут, так что 1 часа работы приемника и передатчика вполне приемлемы. На передатчике и приемнике стоят аккумуляторы 850 мА. Пульт передающий будет находиться на руке пилота параплана. Приемник на раме с электромоторами в районе пояса пилота. Вечером после работы внимательно перечитаю ветку и буду пробовать свои силы заново.
На другие модули переходить не планирую, так как уже все закуплено и спаяно, ближайший магазин от меня в 800 км в Новосибирске, а сам я с Казахстана, ждать 30 дней с Алиэкспресса не вариант. Думаю эти модули справятся с моей задачей.
 

nikolz

Well-known member
Извините за долгое молчание. Переустанавливал виндовс. Расстояние передачи от 0,5 до 2 метров. Потребление играет важную роль, но не критическую. Время работы электроустановки около 30 минут, так что 1 часа работы приемника и передатчика вполне приемлемы. На передатчике и приемнике стоят аккумуляторы 850 мА. Пульт передающий будет находиться на руке пилота параплана. Приемник на раме с электромоторами в районе пояса пилота. Вечером после работы внимательно перечитаю ветку и буду пробовать свои силы заново.
На другие модули переходить не планирую, так как уже все закуплено и спаяно, ближайший магазин от меня в 800 км в Новосибирске, а сам я с Казахстана, ждать 30 дней с Алиэкспресса не вариант. Думаю эти модули справятся с моей задачей.
ESP-NOW решает проблему
возможно надо уменьшить мощность передатчика так как расстояние мало
можно использовать отключение трансивера на короткие интервалы
кратные 2 mc
потребление при этом снижается до 6 ма вместо 70 ма
либо посылать в сон при этом просыпаться будет за 100 мс
потребление в режиме сна 20 мка
------------------
чтобы увеличить ресурс аккумулятора надо использовать суперкондеры для уменьшения импульса тока при включении передатчика
===================
а почему бы не соединить ESP проводами или инфракрасным портом?
 
Сверху Снизу