Образовательная галактика Intel®

Блог Участника

Запись блога

Iskra Neo + ESP8266 = Интернет вещей. Часть 5. Как загрузить скетч в модуль ESP8266

Предыдущие посты:
Iskra Neo + ESP8266 = Интернет вещей. Часть 1
Iskra Neo + ESP8266 = Интернет вещей. Часть 2 (Модуль с чипом ESP8266 ESP-01 V090 с поддержкой WiFi)
Iskra Neo + ESP8266 = Интернет вещей. Часть 3. Как проверить модуль ESP8266
Iskra Neo + ESP8266 = Интернет вещей. Часть 4. Настройка Arduino IDE для ESP8266

Как загрузить скетч в модуль ESP8266

Теперь мы можем приступить к загрузке программ в модуль ESP8266. Должен признаться, мне не сразу удалось "прошить" в ESP8266 свою программу. Пришлось "гуглить" несколько различных схем подключения USB-TTL конвертера для программирования ESP8266 и статей, посвященных этой теме, прежде, чем экспериментально подобрал удачную схему и прошивки стали проходить "без сучка, без задоринки".

Чтобы прошить скетч в ESP8266, нужно перевести его в режим программирования, для этого GPIO_0 подсоединим к GND, а к GPIO_2 подключим светодиод через токоограничивающий резистор 220 Ом. Для прошивки скетча из Arduino IDE воспользуемся USB-TTL конвертером на 3,3 Вольт. Существуют модели с возможностью переключения на 5 вольт и 3,3 вольт, например, я использую USB-Serial Light адаптер от DFRobot с таким переключателем, который когда-то приобрел для прошивки LilyPad (см.предыдущий пост).
Обратите внимание, что USB-TTL конвертеры на 5 вольт не подходят, т.к. могут повредить модуль ESP8266!

Подробнее о соединении контактов модуля ESP8266, USB-TTL конвертера и контроллера Iskra Neo указано в таблице "Подключение контактов ESP8266 для режима программирования":
Контакты
ESP8266 ESP-01
____________________
Контакты
USB-TTL конвертера
____________________
Контакты
Iskra Neo
____________________
VCC-3.3V
GNDGNDGND
TXRXD-
RXTXD-
GPIO_0GNDGND
GPIO_2 ч/з
резистор 220 Ом
и светодиод
GNDGND

*Пояснение: в каждой строке таблицы указано какие контакты этих трех плат нужно соединить между собой. Если стоит "-", то соединения нет.

Прежде чем загружать скетч в модуль ESP8266 вам потребуется:
- Плата Iskra Neo
- USB-Serial адаптер (USB-TTL конвертер) 3,3 Вольт на базе FTDI, PL2303 или аналогичном чипе.
- Макетная плата
- Резистор 220 Ом
- Светодиод
- Соединительные провода

Соберите с помощью макетной платы следующую схему:



Питание для ESP8266 будем брать от контакта 3.3V платы Iskra Neo. Несмотря на то, что USB-TTL конвертер также имеет вывод 3,3 Вольта, он не подходит, т.к. максимальный ток нагрузки USB-TTL конвертера ниже, чем требуется для ESP8266.

Когда соберете, проверите схему и подключите питание к Iskra Net, то горящий на макетной плате светодиод будет показывать готовность модуля ESP8266 к прошивке. После окончания прошивки этот светодиод погаснет.

ESP8266 в роли Telnet-сервера для WiFi-сети

Для реализации концепции «Интернета вещей» в качестве точки для обмена информацией часто используется сервер.

Сервер (от англ. server, обслуживающий) — программное обеспечение, принимающее запросы от клиентов.

Мы будем использовать возможности модуля ESP8266 подключаться к имеющейся WiFi сети и создавать telnet-сервер.

TELNET (сокр. от англ. terminal network) — сетевой протокол для реализации текстового интерфейса по сети (при помощи транспорта TCP). Стандарт протокола описан в RFC 854.

С помощью telnet-сервера можно передавать подключившемуся к нему через WiFi telnet-клиенту, данные, полученные через Serial соединение (UART) от платы Iskra Neo.

Используя библиотеку ESP8266 из стандартных примеров, мы запрограммируем передачу данных между Iskra Neo и telnet-клиентом по схеме:


Из данной схемы видно, что модуль ESP8266 выполняет роль информационного шлюза между Iskra Neo и telnet-клиентом. В качестве telnet-клиента можно использовать ноутбук или персональный компьютер, смартфон или планшет, подключенные к WiFi сети, с установленной программой telnet. Пользователь telnet-клиента, сможет получать данные от Iskra Neo и передавать ей свои команды, находясь в любой точке зоны покрытия WiFi сети, а при соответствующей настройке WiFi-роутера (что требует знаний системного администратора) - из любой точки земного шара, где имеется доступ к Интернет.

Для настройки модуля ESP8266 на подключение к нужной сети WiFi необходимо в следующем скетче перед прошивкой заменить значения переменных ssid и password, заменив звездочки правильными значениями.

Загрузите в плату ESP8266 следующий скетч:
Код
/*
        Данный скетч загружается в ESP8266 ESP-01
        1. ESP8266 подключается к указанной WiFi сети.
        2. На ESP8266 создается telnet-сервер.
        3. ESP8266 передает сообщения, полученные с
        UART-интерфейса на WiFi-интерфейс подключившемся
        telnet-клиентам и наоборот.
      */
      #include <ESP8266WiFi.h>
      
      //количество клиентов для доступа к серверу
      #define MAX_SRV_CLIENTS 1
      
      //точка доступа WiFi
      const char* ssid = "****";
      //пароль для подключения к точке доступа WiFi
      const char* password = "******";
      
      WiFiServer server(23);
      WiFiClient serverClients[MAX_SRV_CLIENTS];
      
      void setup() {
        //Инициализация UART
        Serial.begin(115200);
        delay(500);
        
        //Подключение к точке доступа WiFi
        WiFi.begin(ssid, password);
        
        //Сообщения по UART о подключении к WiFi
        Serial.print("\nConnecting to ");
        Serial.println(ssid);
        
        //Проверка подключения к WiFi
        uint8_t i = 0;
        while (WiFi.status() != WL_CONNECTED && i++ < 20)
          delay(500);
        if(i == 21){
          //Сообщение об ошибке подключения к WiFi
          Serial.print("Could not connect to");
          Serial.println(ssid);
          //Бесконечный цикл
          while(1) delay(500);
        }
      
        //старт сервера
        server.begin();
        server.setNoDelay(true);
      
        //Сообщение по UART ip-адрес и порт ESP8266
        Serial.print("Ready! Use 'telnet ");
        Serial.print(WiFi.localIP());
        Serial.println(" 23' to connect");
      }
      
      void loop() {
        uint8_t i;
        //Проверка подключения нового клиента
        if (server.hasClient()){
          for(i = 0; i < MAX_SRV_CLIENTS; i++){
            //Поиск свободных/отключенных спотов
            if (!serverClients[i] ||
            !serverClients[i].connected()){
              if(serverClients[i])
                  serverClients[i].stop();
              serverClients[i] = server.available();
              
              //Сообщение на UART о подключении клиента
              Serial.print("New client: ");
              Serial.println(i);
              
              //Сообщение по WiFi новому telnet-клиенту
              if (serverClients[i] &&
              serverClients[i].connected()){
                String Msg = "ESP8266: Hello! \
      I'm smart thermometer\nhlp - help\n";
                serverClients[i].print(Msg);
                delay(1);
              }
              continue;
            }
          }
          //Нет доступного спота - отвергаем подключение
          WiFiClient serverClient = server.available();
          serverClient.stop();
        }
        //Проверить есть ли данные по WiFi от telnet-клиента
        for(i = 0; i < MAX_SRV_CLIENTS; i++){
          if (serverClients[i] &&
          serverClients[i].connected()){
            if(serverClients[i].available()){
              //Считать данные от telnet-клиента по WiFi
              //и передать их на Iskra Neo по UART
              while(serverClients[i].available())
                Serial.write(serverClients[i].read());
            }
          }
        }
        //Проверить есть ли данные по UART от Iskra Neo
        if(Serial.available()){
          size_t len = Serial.available();
          uint8_t sbuf[len];
          
          //Считать данные от UART в буфер sbuf
          Serial.readBytes(sbuf, len);
          
          //Передать данные из буфера sbuf по WiFi
          //всем telnet-клиентам
          for(i = 0; i < MAX_SRV_CLIENTS; i++){
            if (serverClients[i] &&
            serverClients[i].connected()){
              serverClients[i].write(sbuf, len);
              delay(1);
            }
          }
        }
      }


Во время прошивки на плате ESP8266 будет мигать синий светодиод.

Данный скетч использует библиотеку для ESP8266:
Код
#include <ESP8266WiFi.h>


В начале скетча, что сервер должен работать на 23 TCP-порту, и определяется сколько клиентов он должен обслуживать одновременно:
Код
WiFiServer server(23);
      WiFiClient serverClients[MAX_SRV_CLIENTS];


В процедуре setup() инициализируется интерфейс UART на рабочую скорость 115200 бод, и осуществляется подключение модуля ESP8266 к WiFi сети:
Код
  //Инициализация UART
        Serial.begin(115200);
        delay(500);
        
        //Подключение к точке доступа WiFi
        WiFi.begin(ssid, password);


При успешном подключении к WiFi сети производится старт telnet-сервера на 23 порту и через интерфейс UART передается сообщение о том, как можно будет подключиться к серверу, в частности, ip-адрес сервера.
Код
//старт сервера
        server.begin();
        server.setNoDelay(true);
      
        //Сообщение по UART ip-адрес и порт ESP8266
        Serial.print("Ready! Use 'telnet ");
        Serial.print(WiFi.localIP());
        Serial.println(" 23' to connect");


В процедуре loop() проверяются подключения клиентов (споты) и, если произошло подключение нового клиента, то ему передается текстовое приветствие:
Код
//Сообщение по WiFi новому telnet-клиенту
      if (serverClients[i] && serverClients[i].connected()){
        String Msg = "ESP8266: Hello! \
      I'm smart thermometer\nhlp - help\n";
        serverClients[i].print(Msg);
        delay(1);
      }


Далее проверяется, поступали ли данные по WiFi от telnet-клиентов, и если поступали, то они передаются на интерфейс UART, т.е. на плату Iskra Neo:
Код
  //Проверить есть ли данные по WiFi от telnet-клиента
        for(i = 0; i < MAX_SRV_CLIENTS; i++){
          if (serverClients[i] &&
          serverClients[i].connected()){
            if(serverClients[i].available()){
              //Считать данные от telnet-клиента по WiFi
              //и передать их на Iskra Neo по UART
              while(serverClients[i].available())
                Serial.write(serverClients[i].read());
            }
          }
        }


В заключение проверяется, поступали ли данные по UART, чтобы передать их по WiFi всем telnet-клиентам:
Код
  //Проверить есть ли данные по UART от Iskra Neo
        if(Serial.available()){
          size_t len = Serial.available();
          uint8_t sbuf[len];
          
          //Считать данные от UART в буфер sbuf
          Serial.readBytes(sbuf, len);
          
          //Передать данные из буфера sbuf по WiFi
          //всем telnet-клиентам
          for(i = 0; i < MAX_SRV_CLIENTS; i++){
            if (serverClients[i] &&
            serverClients[i].connected()){
              serverClients[i].write(sbuf, len);
              delay(1);
            }
          }
        }


После успешного окончании прошивки модуля ESP8266, мы можем приступить к сборке схемы «умного датчика температуры».
Продолжение следует...
Статьи по этой теме

« Июнь 2017 »
ВПВСЧПС
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

Последние записи

Мои ссылки в блоге

Последние комментарии

Мое изображение

0 пользователей просматривает
0 гостей
0 участников
0 анонимных участников

Категории

Поиск в блоге


Наверх