Перейти к содержанию

Сетевой функционал контроллера КПМИС

В состав контроллера входят модули, обеспечивающие возможность организации как беспроводного (Wi-Fi и Bluetooth), так и проводного (Ethernet) сетевого соединения. Данные модули могут быть использованы как для расширения функционала созданной системы, так и для изучения основ концепции «Интернета вещей» (Internet of Things - IoT).

Модуль беспроводной передачи данных

В качестве модуля для организации беспроводной передачи данных в контроллере используется широко распространенный модуль ESP-WROOM-32, настройка которого может быть осуществлена через Arduino IDE.

Отличительные особенности модуля ESP-WROOM-32:

  • Поддержка двух режимов Bluetooth: «classic» и BLE
  • Скорость Wi-Fi: 802.11 b/g/n до 150 Мбит/с
  • поддержка режимов Wi-Fi: клиент, точка доступа, Sniffer, Wi-Fi

Direct.

  • Минимальная чувствительность -98 dBm
  • Широкий диапазон рабочих температур: -40°C…+125°C
  • Энергопотребление до 20мкА (deep sleep mode).
  • Возможность подключения 4 х 16MB внешней QSPI Flash и SRAM.

Для настройки данного модуля необходимо установить соответствующий инструментарий в среду Arduino IDE. Для этого необходимо выполнить следующие шаги:

  1. Добавить в дополнительные ссылки для Менеджера плат (Настройки – Дополнительные ссылки для менеджера плат) ссылку на следующий инструментарий - https://dl.espressif.com/dl/package_esp32_index.json
  2. В менеджере плат (Инструменты – Платы – Менеджер плат) выполнить поиск поддержки семейства плат ESP32 и установить последнюю версию пакета.
  3. После завершения установки пакета в списке поддерживаемых плат появится ESP Dev Module, который и будет в дальнейшем использоваться для загрузки прошивки в модуль.

Добавление ссылки для Менеджера плат

Установка пакета для ESP32

Добавленные платы после установки пакета ESP32

Использование модуля в качестве BT-устройства

Модуль ESP-WROOM-32 может работать как в режиме Wi-Fi, так и в режиме Bluetooth 4 (он же Bluetooth LE). Для активации требуемого режима работы необходимо загрузить определенный программный код в модуль с помощью среды разработки Arduino IDE. Для этого необходимо выполнить подготовку модуля к работе по ранее рассмотренной схеме.

В качестве основного примера для настройки работы модуля в качестве Bluetooth устройства будет использоваться стандартный пример BLE_uart, находящийся по умолчанию после установки программной поддержки модуля в среде Arduino IDE в меню «Файл – Примеры – ESP32 BLE Arduino – BLE_uart». Данный пример полноценно демонстрирует процесс создания BLE устройства и организацию процесса обмена данными через UART – соединение между модулем и внешним устройством, в роли которого выступает основной микроконтроллер – atmega2560.

Наименование устройства задается через строку: BLEDevice::init(“UART Service”);

где вместо UART Service необходимо указать требуемое наименование, например, «My Robot»:

BLEDevice::init(“My Robot”);

Для загрузки данного примера в модуль, необходимо подключить его к компьютеру через указанный USB порт, переместить переключатель в положение USB, подать питание на контроллер и нажать в среде Arduino IDE кнопку загрузки скетча. А по окончанию компиляции, когда в терминал будет выведена строка Connecting…., зажать на 2-3 секунды обе кнопки бутлоадера, затем отпустить Reset и потом отпустить Boot.

Начало загрузки прошивки в ESP32

После окончания загрузки в терминал будет выведена информация о том, что загрузка завершена, и появится сообщение о необходимости аппаратной перезагрузки.

Окончание загрузки прошивки в модуль

Для выполнения такой перезагрузки необходимо выключить и включить заново питание контроллера. После этого в окружении появится Bluetooth – устройство My Robot.

Появившееся устройство в окружении

Открыв монитор порта на компьютере и выполнив подключение к данному устройству, можно увидеть передаваемые данные, например, с телефона или планшета. Важно: для передачи данных программа должна поддерживать связь именно с устройством BLE - например, BLU для iOs, позволяющей отправлять какие-либо значения в ASCII нотификации.

Пример отправки данных на BLE устройство

Если перевести переключатель в положение MCU, то все передаваемые данные пойдут в микроконтроллер, где их можно считать стандартными средствами с интерфейса Serial2, используя, например, такой код:

void setup() { Serial.begin(9600); Serial2.begin(115200);

}

void loop() {

if (Serial2.available()) { Serial.write(Serial2.read());

}

}

Использование модуля в качестве Wi-Fi устройства

Для активации режима работы в качестве Wi-Fi устройства в модуль также необходимо загрузить определенный программный код, по аналогии с активацией режима работы в качестве Bluetooth устройства. Данный модуль может работать как в качестве WiFi клиента, так и в режиме WiFi точки доступа. В связи с этим, существует большое количество способов применения данного модуля в различных проектах – для рассмотрения данных примеров можно обратится в меню «Файл – Примеры – Примеры для ESP32 Dev Module – WiFi», а также можно обратиться в Интернет – большое количество разработчиков используют в своих проектах модули на основе чипов ESP-32S (ESP-WROOM) и размещают примеры кода в открытом доступе.

Работа в качестве Wi-Fi клиента

В данном режиме работы модулю требуется наличие внешней точки доступа и развернутой Wi-Fi сети для подключения к ней. Рассмотрим пример, в котором будет произведено подключение к существующей сети Wi-Fi и организован обмен данными между модулем и каким-либо еще устройством, подключенным к этой же Wi-Fi сети. В качестве базового примера, на основе которого будет создаваться код, будет использоваться стандартный пример, по умолчанию входящий в библиотеку для работы с модулем и содержащийся в «Файл – Примеры – Примеры для ESP32 Dev Module – WiFi – SimpleWiFiServer».

В первую очередь, необходимо подключить библиотеку WiFi.h #include <WiFi.h>

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

const char* ssid = «Wifi_for_Robots»; const char* password = «00000721»;

затем выполняется инициализация сервера на 80 порту:WiFiServer server(80);

В основной функции setup () проинициализируем соединение по последовательному порту на скорости 57600 бод

Serial.begin(57600);делаем небольшую паузу: delay(10);

и инициализируем выполнение подключения к Wi-Fi сети с ранее заданными параметрами:

WiFi.begin(ssid, password);

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

while (WiFi.status() != WL_CONNECTED) { delay(500);`

Serial.print(«.»);

}

при успешном соединении в последовательный интерфейс выводится информация об успешном соединении и выводится присвоенный модулю IP адрес:

Serial.println(«»); Serial.println(«WiFi connected.»); Serial.println(«IP address: «); Serial.println(WiFi.localIP());

после инициализируем сервер:

server.begin();

Теперь модуль готов к обмену данными. В функции void loop() добавим ожидание подключения клиента, и в случае подключившегося клиента выполняем чтение данных, поступающих от него. В случае, если клиент отключается, выводится соответствующее сообщение:

WiFiClient client = server.available(); if (client) {

Serial.println(«New Client.»); String currentLine = «»; while (client.connected()) {

if (client.available()) { char c = client.read(); Serial.write(c);

}

}

client.stop();

Serial.println(«Client Disconnected.»);

}

В данном примере модуль будет принимать и передавать данные по 1 символу, поэтому добавим возможность принимать сразу строку данных. Для этого после строчки Serial.println(«New Client.»); добавим переменную типа String, в которую будут записываться данные:

String currentLine = «»;

а после строки Serial.write(c), собственно, конструкцию для формирования этой строки:

if (c != ‘\r) {

currentLine += c;

}

В случае, если строка не пустая, ее можно преобразовать в числовое значение и передать с помощью цифрового пакета в контроллер:

if (currentLine.length()>0){

uint16_t number = currentLine.toInt(); Serial.println();

Serial.println(number);

}
Таким образом, код для работы модуля в режиме Wi-Fi готов, и его можно загрузить стандартным способом, рассмотренным ранее.

Перед обменом данными с модулем необходимо узнать, какой ему присваивается IP адрес в сети. Данный адрес может быть не постоянным, поэтому необходимо периодически его проверять. Для этого необходимо, загрузив программный код в модуль, открыть терминал и дождаться подключения его к сети – в случае успешного подключения будет выведен присвоенный модулю IP адрес:

Таким образом, используя выданный IP адрес, можно выполнять обмен данными между модулем и удаленным устройством. Для этого можно воспользоваться приложением TCP Client, где произвести настройку сервера (на рисунке это testsq) и подключиться к модулю:

Пример отправки данных с TCP клиента

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

Работа модуля в качестве Wi-Fi точки доступа

При необходимости, модуль может сам стать источником Wi-Fi сети. Для этого необходимо внести следующие изменения в функцию setup() написанной ранее программы, и она должна принять следующий вид:

Serial.begin(57600); 
WiFi.softAP(ssid, password); 
Serial.println(); 
Serial.print(«IP address: «); 
Serial.println(WiFi.softAPIP());

Загрузив измененный код в программу можно убедиться в создании сети, проверив полученный IP адрес:

Загрузка модуля в режиме точки доступа

Используя такой метод, была создана Wi-Fi сеть - WiFi from BT-AR-01 (изменено было название вместо WiFi_for_Robots), к которой можно подключиться и выполнить все те же задачи, которые были рассмотрены ранее.

Таким образом, модуль ESP-WROOM-32 может быть использован и как клиент Wi-Fi сети, и как ее источник, что дает широкие возможности при организации обмена данными между контроллером и удаленным устройством.

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

Модуль проводной передачи данных

В качестве модуля проводной передачи данных в контроллер встроен популярный Arduino - совместимый чип от WizNet – W5100. Примеры работы с ним встроены в стандартную базу среды разработки Arduino IDE и полностью совместимы с данным контроллером. В качестве демонстрационного примера можно рассмотреть пример передачи данных в браузер ПК.

В случае подключения контроллера напрямую к компьютеру через Ethernet, либо же при включении его в сеть, где все устройства имеют статический IP, необходимо указать контроллеру такой IP, чтобы он попадал в подсеть сети или компьютера. Также, для работы с чипом необходимо инициализировать следующие требующиеся библиотеки:

#include <SPI.h> // Подключаем библиотеку SPI

#include <Ethernet.h> // Подключаем библиотеку Ethernet

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // Вводим MAC адрес IPAddress ip(169, 254, 21, 70); // Указываем статический IP

EthernetServer server(80); // Инициализация библиотеки Ethernet «server» на порту 80
Затем задаем скорость передачи данных и ждем пока не откроется монитор порта и запускаем сервер:

void setup()

{

Serial.begin(115200); // Задаем скорость передачи данных while (!Serial) {;}

Ethernet.begin(mac, ip); // Запускаем сервер server.begin();

Serial.print(«server is at «); Serial.println(Ethernet.localIP());

}

а затем в функции loop() ожидаем подключение клиента (открытие вкладки браузера с указанием в адресной строки IP:port), и начинается передача данных, которые в данном примере представлены значениями с аналоговых портов:

void loop()

{

EthernetClient client = server.available(); // Принимаем данные,

// посылаемые клиентом 
if (client) {

Serial.println(«new client»); 
boolean currentLineIsBlank = true; 
while (client.connected()) {

if (client.available()) { 
char c = client.read(); 
Serial.write(c);

if (c == ‘\n && currentLineIsBlank) { 
client.println(«HTTP/1.1 200 OK»); 
client.println(«Content-Type: text/html»); 
client.println(«Connection: close»);

client.println(«Refresh: 5»); // обновление страницы каждые 5 секунд 
client.println();

client.println(«<!DOCTYPE HTML>»); 
client.println(«<html>»);

for (int analogChannel = 10; analogChannel < 16; analogChannel++) { 
int sensorReading = analogRead(analogChannel); 
client.print(«analog input «);

client.print(analogChannel); 
client.print(« is «); 
client.print(sensorReading); 
client.println(«<br />»);

}

client.println(«</html>»); break;

}

if (c == ‘\n) { 
currentLineIsBlank = true;

} else if (c != ‘\r) { 
currentLineIsBlank = false;

}


}

}

delay(1); client.stop();

Serial.println(«client disconnected»);

}

}

Таким образом, в окне браузера появятся данные, отправляемые контроллером.


Center-nav

← Назад | Оглавление