• Система автоматизации с открытым исходным кодом на базе 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 проводами или инфракрасным портом?
 
Сверху Снизу