Меню Закрыть

WiFi_ru

Wifi 

Wi-Fi  это одна из ключевых технологий современного беспроводного взаимодействия, которая позволяет устройствам обмениваться данными без проводов по радиоволнам. От смартфонов и ноутбуков до микроконтроллеров и устройств Интернета вещей, Wi-Fi обеспечивает удобное подключение к сети, быстрый обмен информацией и дистанционное управление. В этой статье мы разберём основные принципы работы Wi-Fi, его режимы, IP-адресацию и транспортные протоколы TCP и UDP, чтобы понять, как эта технология используется в практике, в том числе на микроконтроллерах STM32.

Сигнал Wi-Fi излучается точкой доступа во все стороны, напоминая по принципу работы свет от лампы. Но в отличие от света, радиоволны способны проходить через стены и различные преграды, хотя при этом их уровень постепенно снижается. При прохождении через материалы сигнал ослабляется по-разному: дерево и гипсокартон почти не мешают распространению волн, а бетон, металл и даже вода сильно ухудшают приём.

Wi-Fi работает в радиочастотном спектре без лицензии, который делится на несколько диапазонов:

2,4 ГГц

Самый распространённый диапазон.
Дальность сигнала большая (лучше проходит через стены).
Скорость ниже, чем в 5 ГГц.
Часто перегружен, потому что используют и Bluetooth, и микроволновки, и другие устройства.
Каналы: 1–14 (в разных странах разрешены разные каналы).

5 ГГц

Более скоростной, меньше помех.
Дальность меньше, сигнал хуже проходит через стены.
Каналы: около 20–25, в зависимости от страны (U-NII диапазоны).
Часто используется для потокового видео, игр и Wi-Fi в офисах.

6 ГГц 

Новая частота для Wi-Fi 6/6E.
Очень высокая скорость, почти нет помех.
Дальность ограничена, плохо проходит сквозь стены.
Пару слов о каналах. Канал wifi это часть радиочастотного диапазона, на котором передаются данные. Например каналы для 2.4ГГц это 2412 2417 2422 и т.д. С шагом 5 МГц. Каналы не перекрывают друг друга, что обеспечивает стабильность работы.

Стандарты Wi-Fi

Стандарт WIfi это набор технических правил, которые определяют, как именно устройства обмениваются данными по беспроводной сети: на каких частотах работать, с какой скоростью передавать информацию, каким способом кодировать сигнал и как обеспечивать совместимость разных устройств.

Основные стандарты Wi-Fi:

802.11b
Частота: 2,4 ГГц
Скорость: до 11 Мбит/с
Сейчас почти не используется.

802.11g

Частота: 2,4 ГГц
Скорость: до 54 Мбит/с
Долгое время был основным стандартом.

802.11n (Wi-Fi 4)

Частоты: 2,4 и 5 ГГц
Скорость: до 600 Мбит/с
Поддержка MIMO (несколько антенн).
До сих пор широко используется.

802.11ac (Wi-Fi 5)

Частота: 5 ГГц
Скорость: до нескольких Гбит/с
Более широкие каналы (80–160 МГц).
Отлично подходит для высоких скоростей.

802.11ax (Wi-Fi 6 / 6E)
Частоты: 2,4 / 5 / 6 ГГц
Лучшая работа при большом числе устройств
Меньше задержки, выше эффективность.

В микроконтроллерных и IoT-устройствах обычно используются стандарты Wi-Fi 802.11b/g/n, работающие в диапазоне 2,4 ГГц. Эти стандарты обеспечивают достаточную скорость, хорошую дальность и низкое энергопотребление, что гораздо важнее для встроенных систем, чем гигабитные скорости современных Wi-Fi 5 и Wi-Fi 6.

Роутер

Разберемся с таким понятием как роутер. Роутер это центральный узел сети, который соединяет устройства между собой и с интернетом. Важно понимать что роутер создает сеть работая как точка доступа к которой подключаются устройства. Он же раздаёт адреса чтобы эти устройства могли общаться. Решает куда отправить пакеты а также служит защитой вашей сети.

Практическая реализация

В рамках этого примера мы реализуем простой веб-интерфейс для управления выводами микроконтроллера по Wi-Fi.Подключим плату ESP32 WROOM к существующей беспроводной сети в режиме клиента (STA), получим IP-адрес от роутера и поднимем HTTP-сервер на стандартном порту 80. После этого к устройству можно подключиться из браузера по его IP-адресу и открыть веб-страницу, сформированную самим микроконтроллером. На странице размещены элементы управления, которые отправляют HTTP-запросы на ESP32 WROOM. В зависимости от полученного запроса устройство включает или выключает светодиод, тем самым демонстрируя, как с помощью Wi-Fi можно удалённо управлять аппаратной частью микроконтроллера через обычный браузер.

Плата выглядит так

Будем использовать Arduino IDE. Настроим его для работы с нашей платой.Для этого в  Arduino IDE необходимо установить поддержку плат Espressif через Boards Manager. 

Выбираем FIle — Preferences И в строку Additional Board Manager URLs добавляем 

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json 

Затем заходим в Tools — Board — Boards Manager и устанавливаем esp32 by Espressif Systems.

После чего выбираем наш модуль.

Tools — Board — ESP32 Arduino — ESP32 Dev Module

Код прошивки следующий

#include <WiFi.h>
#include <WebServer.h>

const char* ssid = "";        // Login Wi-Fi сети
const char* password = "";  // пароль

WebServer server(80); // Веб-сервер на порту 80
const int ledPin = 2; // GPIO встроенного светодиода

// Главная страница
void handleRoot() {
    String html = "<h1>ESP32 Web LED Control</h1>";
    html += "<p><a href=\"/on\">EN LED</a></p>";
    html += "<p><a href=\"/off\">DES LED</a></p>";
    server.send(200, "text/html", html);
}

// Включение светодиода
void handleOn() {
    digitalWrite(ledPin, HIGH);
    server.sendHeader("Location", "/");
    server.send(303); // Перенаправление на главную страницу
}

// Выключение светодиода
void handleOff() {
    digitalWrite(ledPin, LOW);
    server.sendHeader("Location", "/");
    server.send(303);
}

void setup() {
    pinMode(ledPin, OUTPUT);
    digitalWrite(ledPin, LOW);

    Serial.begin(115200);
    WiFi.begin(ssid, password);

    Serial.print("Подключение к Wi-Fi");
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("\nПодключено!");
    Serial.print("IP-адрес ESP32: ");
    Serial.println(WiFi.localIP());

    server.on("/", handleRoot);
    server.on("/on", handleOn);
    server.on("/off", handleOff);
    server.begin();
}

void loop() {
    server.handleClient(); // Обработка входящих запросов
}

После чего будет доступен веб интерфейс по адресу которому ваш роутер дал плате ESP32 WROOM. Например http://192.168.100.3

Приведенный пример является максимально простым и надёжным, поскольку в среде Arduino для ESP32 уже есть готовый стек Wi-Fi и библиотека веб-сервера — вся работа с сетью, TCP/IP и HTTP скрыта внутри библиотек, а от разработчика требуется лишь описать логику обработки запросов. Кроме того, сама плата ESP32 WROOM представляет собой законченное решение с уже встроенным Wi-Fi. Однако в реальных встраиваемых проектах часто используется отдельный Wi-Fi модуль, подключенный к внешнему микроконтроллеру. Рассмотрим один из таких на примере модуля ESP-12F.

ESP-12F

Собственно имеется модуль ESP-12F. Выглядит он так

Это Wi-Fi модуль на базе микроконтроллера ESP8266EX, в котором уже интегрированы процессор, память, радиочасть и полноценный TCP/IP стек. В отличие от обычных радиомодулей, ESP-12F способен самостоятельно работать с сетевыми протоколами: подключаться к точкам доступа, получать IP-адрес через DHCP, устанавливать TCP-соединения и обмениваться данными по HTTP. Благодаря этому модуль часто используется как сетевой сопроцессор для микроконтроллеров STM32, добавляя им поддержку Wi-Fi без необходимости реализовывать сложную сетевую логику на стороне основного микроконтроллера.

Характеристики ESP-12F

  • Микроконтроллер ESP8266EX частотой до 80МГц
  • Флэш-память: 4 МБ.
  • RAM: 80 Кб (SRAM).
  • Рабочее напряжение: 3.3 В (DC).
  • Потребляемый ток: до 215–240 мА (при передаче), до 10 мкА (глубокий сон).
  • GPIO: 11–13 портов общего назначения, включая ШИМ (PWM), I2C, SPI, UART.
  • АЦП (ADC): 1 вход (10-битный, 0-1В).
  • Размеры: 24 x 16 x 3 мм.
  • Антенна: Встроенная (PCB). 

Распиновка

Распиновка ESP-12F определяет, как именно модуль подключается к питанию и к внешнему микроконтроллеру. Помимо линий питания 3.3 В и GND, важную роль играют управляющие выводы EN и RST, которые отвечают за включение и сброс модуля. Для обмена данными с основным контроллером используется интерфейс UART  выводы TXD0 и RXD0. Также на модуле доступны универсальные GPIO, которые можно применять для управления периферией, чтения сигналов или задания режима загрузки. Особое значение имеют пины GPIO0, GPIO2 и GPIO15: их состояние при старте определяет, будет ли ESP-12F загружаться в обычном режиме или переходить в режим прошивки. Поэтому правильное понимание распиновки является ключом к стабильной работе Wi-Fi модуля в составе устройства.

Прошивка и основная идея работы модуля

ESP-12F можно использовать двумя способами. В первом случае модуль работает как самостоятельный микроконтроллер: в него загружается программа, и он сам управляет выводами и сетевым соединением. Во втором варианте ESP-12F применяется как Wi-Fi сопроцессор для STM32. Тогда основной код выполняется на STM32, а ESP по UART принимает AT-команды и берёт на себя всю работу с Wi-Fi и TCP/IP стеком. Такой подход позволяет добавить беспроводную связь в проекты на  микроконтроллерах без необходимости реализовывать сетевые протоколы вручную. Прошьем наш  ESP-12F, чтобы мы могли использовать его как самостоятельный модуль. Для этого будем использовать arduinoUNO  и среду разработки arduinoIDE. 

Схема подключение ESP-12F

Модуль может работать в двух режимах. В режиме прошивки и в режиме выполнения кода. Для режима прошивки схема следующая.

Режим прошивки.

ESP12f

VCC — 3.3V
GND — GND
TX — UART TX ArduinoUNO
RX — UART RX ArduinoUNO
EN — резистор 10КОм -3.3V
GPIO0 — резистор 10КОм — GND
GPIO2 — резистор 10КОм — 3.3V
GPIO15 — резистор 10КОм — GND
RST — резистор 10КОм — 3.3V
RST — кнопка — GND
VCC — 100 µF — GND

Давайте разберёмся по порядку. Питание модуля лучше обеспечить от отдельного блока питания т.к. сам модуль потребляет довольно значительные токи до 500мА. Контакты UART в случае с ардуино подключаем напрямую TX-TX RX-RX но RX через делитель напряжения. Схема следующая :
RX(Arduino) — 1КОМ — RX(ESP12f) — 2КОМ — GND
Этот блок думаю понятен и не меняется в ходе прошивки, главное не забудьте резисторы
EN — резистор 10КОм -3.3V
GPIO0 — резистор 10КОм — GND
GPIO2 — резистор 10КОм — 3.3V
GPIO15 — резистор 10КОм — GND

Очень важным выводом является RST. RST это вход аппаратного сброса микроконтроллера. В нормальном режиме на нём должен быть уровень 3.3 В, поэтому его подтягивают к питанию резистором, чтобы пин не висел в воздухе и не вызывал ложных перезапусков. Когда мы кратковременно замыкаем RST на GND кнопкой, на входе появляется логический ноль, и чип полностью перезапускается: останавливает выполнение, сбрасывает регистры, заново считывает бут-пины (GPIO0, GPIO2, GPIO15) и стартует программу с начала. Соответственно мы подключаем его через резистор в нормальном состоянии и параллельно через кнопку выворачиваем на GND. Нажали — микроконтроллер перезапустился.

Ещё необходим конденсатор, для стабильной работы модуля. Я поставил электролитический на 100 µF и схема отлично работает.

Режим работы. 

Для переключения в режим работы необходимо подтянуть вывод GPIO0 через резистор на 3.3В. И нажать кнопку RST. Это приведёт микроконтроллер в рабочий режим. 

Настройки IDE для прошивки.

Как я уже говорил используем ардуино IDE для прошивки нашего модуля ESP12F. Arduino IDE уже содержит готовое ядро для ESP, которое автоматически настраивает компиляцию, работу с памятью и загрузчик, поэтому не нужно вручную разбираться с toolchain и параметрами flash. Делаем по шагам.
Открываем File — Preferences и в строку Additional Boards Manager URL добавляем
https://arduino.esp8266.com/stable/package_esp8266com_index.json
Тем самым мы говорим IDE, где взять описание платформы ESP8266: компилятор, загрузчик, библиотеки, настройки памяти, частоты и инструменты прошивки
Открываем Tools — Board — Boards Manager, находим пакет ESP8266 by ESP8266 Community и устанавливаем его.
Далее выбираем плату Generic ESP8266 Module и устанавливаем следующие настройки.

Обратите внимание на строку Flash Mode. У меня заработало только когда выбрал DOUT.

Код прошивки.
Зальём тестовую прошивку в наш ESP12f.

void setup() {
  Serial.begin(115200);
  Serial.println("SETUP OK");
  pinMode(2, OUTPUT);
}

void loop() {
  Serial.println("LOOP");
  digitalWrite(2, LOW);
  delay(500);
  digitalWrite(2, HIGH);
  delay(500);
}

Всё что она делает это отправляет в наш монитор сообщение SETUP OK а затем мигает светодиодом на плате. Светодиод подключен к выводу GPIO2 и он будет мигать через каждые полсекунды.

Далее рассмотрим еще один популярный вариант для работы с WiFI и это WEMOS модуль.

WEMOS модуль. Характеристики.

Поставим себе более практическую задачу. Т.к. мы уже умеем работать с ESP32-WROOM то мы можем использовать его в качестве AP — точки доступа. Здесь же сделаем небольшой веб интерфейс, в котором будет отображаться значение переменной. И второй модуль Wemos на базе ESP8266 мы будем использовать в качестве STA — режима клиента. Он подключиться к нашему модулю и будет периодически передавать ему значение переменной, которую мы будем видеть в веб интерфейсе.

Коротко про сам модуль Wemos. Это популярная линейка плат на базе ESP8266 / ESP32
Wi-Fi: 2.4 GHz (802.11 b/g/n)
Частота: 80 / 160 MHz
Flash-память: обычно 4 MB
Логические уровни: 3.3V
Питание: 5V по USB или 3.3V напрямую
GPIO: примерно 11 пинов
Интерфейсы: UART, SPI, I2C, PWM, ADC
Прошивка через USB, что очень удобно.Важно не забыть, что нельзя подавать 5В на пины, а только 3.3В. Можно шить прямо из ArduinoIDE.

Фото модуля. 

Начнём с ESP32-WROOM. Код прошивки целиком.

#include <WiFi.h>
#include <WebServer.h>
const char* ssid = "ESP32_AP";
const char* password = "12345678";
WebServer server(80);
WiFiServer tcpServer(5000); // TCP сервер для WeMOS
const int ledPin = 4;
unsigned long lastPrint = 0;
volatile int counter = 0; // переменная, которую будет обновлять WeMOS


// Веб-страница
void handleRoot(){
String html = "<h1>ESP32 Web LED Control (AP Mode)</h1>";
html += "<p><a href='/on'>Turn ON LED</a></p>";
html += "<p><a href='/off'>Turn OFF LED</a></p>";
html += "<p>Counter value: " + String(counter) + "</p>"; // вывод переменной
server.send(200,"text/html",html);
}


// Управление LED
void handleOn(){
digitalWrite(ledPin,HIGH);
server.sendHeader("Location","/");
server.send(303);
}


void handleOff(){
digitalWrite(ledPin,LOW);
server.sendHeader("Location","/");
server.send(303);
}


void setup(){
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
Serial.begin(115200);


// Точка доступа
WiFi.softAP(ssid,password);
Serial.println("Access Point started");
Serial.print("IP address: ");
Serial.println(WiFi.softAPIP());


// Веб-сервер
server.on("/", handleRoot);
server.on("/on", handleOn);
server.on("/off", handleOff);
server.begin();


// TCP сервер для приёма данных
tcpServer.begin();
tcpServer.setNoDelay(true); // отключаем буферизацию
Serial.println("TCP server started on port 5000");
}


void loop(){
server.handleClient();


// TCP приём данных
WiFiClient client = tcpServer.available();
if(client){
Serial.println("New client connected");
String msg = "";
while(client.connected() && client.available()){
char c = client.read();
if(c == '\n') break; // конец строки
msg += c;
}
if(msg.length() > 0){
counter = msg.toInt(); // обновляем переменную
Serial.print("Received counter: ");
Serial.println(counter);
}
client.stop();
Serial.println("Client disconnected");
}
// Печать количества клиентов каждые 3 сек
if(millis()-lastPrint > 3000){
lastPrint = millis();
int n = WiFi.softAPgetStationNum();
Serial.print("Connected clients: ");
Serial.println(n);
}


delay(10);
}

Он делает 4 вещи. 

  1. Поднимает сервер
  2. Создаёт веб интерфейс
  3. Создаёт точку доступа
  4. Выводит нашу переменную и количество подключений

Далее код работы Wemos модуля.

#include &lt;ESP8266WiFi.h&gt;
#include &lt;WiFiClient.h&gt;
const char* ssid = "ESP32_AP"; // Wi-Fi ESP32
const char* password = "12345678";
const char* host = "192.168.4.1"; // IP ESP32
const uint16_t port = 5000; // TCP порт ESP32
unsigned long lastSend = 0;
int counter = 0;
WiFiClient client;
void setup(){
Serial.begin(115200);
delay(500);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid,password);
Serial.print("Connecting");
while(WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("Connected to ESP32 AP");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}

void loop(){
// каждые 3 секунды увеличиваем и отправляем counter
if(millis() - lastSend &gt;= 3000){
lastSend = millis();
counter++;
if(!client.connected()){
Serial.println("Connecting to server...");
if(!client.connect(host, port)){
Serial.println("Connection failed");
return;
}
Serial.println("Connected!");
}

// отправка counter
String msg = String(counter);
client.println(msg);
Serial.print("Sent: ");
Serial.println(msg);
}
}

Собственно он подключается по адресу 192.168.4.1 а затем каждые 3 секунды увеличивает переменную и отправляет эти данные по Wifi. Чтобы увидеть результат мы можете подключиться к Wifi с вашего устройства, например телефона по адресу http://192.168.4.1 и открыть веб интерфейс.

В этой теме мы разобрали, что такое Wi-Fi в контексте встраиваемых систем: как микроконтроллер может быть не просто «мозгом» устройства, а полноценным участником сети. Мы посмотрели, как устроена работа по Wi-Fi, какие бывают режимы (STA, AP, AP+STA), и чем отличается подключение к роутеру от создания собственной точки доступа.

Также мы рассмотрели популярные модули и платы — ESP8266, Wemos, ESP32-WROOM  и увидели, что сегодня Wi-Fi уже встроен прямо в микроконтроллер. Это позволяет управлять устройствами через браузер, телефон, сервер или облако без дополнительного оборудования.

Главная идея такая, Wi-Fi превращает обычную электронику в сетевое устройство. Реле, робот, датчик или светодиод с Wi-Fi становятся частью системы и их можно настраивать, контролировать и автоматизировать удаленно. Понимание того, как работает Wi-Fi и какие модули для этого существуют, дает основу для создания современных IoT-проектов — от простых Web-панелей до сложных сетевых роботов и умного дома.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *