Управление "Смарт РОБО" через Wi-Fi

Описание

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

Дополнительные модули

Предполагается что у Вас уже есть набор СмартРОБО, и вы собрали его по инструкции в руководстве пользователя. Тогда дополнительно понадобится:

Библиотеки

Перед началом работы с WiFi-модулем настройте его на скорость обмена в 9600 бод. О том как это сделать, рассказано на этой странице.

Порядок действий

Шаг 1. Пересоберите робота

  1. С помощью отвёртки, входящей в комплект набора, и нейлоновых креплений (одна гайка, один винт и одна стойка) прикрепите в свободное крайнее отверстие (справа от ИК-приёмника) - Wi-Fi модуль
  2. Присоедините Wi-Fi модуль с помощью проводов мама-мама к выводам мотор шилда по следующей схеме:
Вывод модуля Вывод шилда
+ +
- -
TX 8
RX 9

Шаг 2. Установите библиотеки

Установите в Arduino IDE библиотеки, которые представлены по ссылкам выше (в подпункте «Библиотеки»). О том как устанавливаются библиотеки описано в руководстве пользователя, входящем в комплект, либо посетите соответствующий раздел Базы Знаний.

Шаг 3. Загрузите скетч на контроллер

Измените в скетче значения переменных char ssid[] = «SmartElements»; и char pass[] = «12345678»; на свои (имя вашей сети и пароль к ней).

#include "WiFiEsp.h" //подключение библиотеки WiFiEsp
#include <robotSE.h> //подключение библиотеки для работы с платформой.
#include <AltSoftSerial.h> //подключение библиотеки для эмуляции сериал соединения
 
AltSoftSerial wifiSerial; //создание виртуального сериал соединения (на 8 и 9 выводах)
 
char ssid[] = "SmartElements"; //имя сети wifi
char pass[] = "12345678"; //пароль от сети wifi
int status = WL_IDLE_STATUS; //статус сети wifi
 
robotSE robot; //создание объекта робота
 
WiFiEspServer server(80); //переменная для создания объекта сервера
 
//использование кольцевого буфера для увеличения скорости
RingBuffer buf(8);
 
/* Отправка и формирование страницы - ответа
 *  на сервер 
 */
void sendHttpResponse(WiFiEspClient& client)
{
  //формирование интернет-страницы
  client.print(
      "HTTP/1.1 200 OK\r\n"
      "Content-Type: text/html\r\n"
      "Connection: close\r\n" 
      "\r\n");
  client.print("<!DOCTYPE HTML>\r\n");
  client.print("<html>\r\n");
  client.print("<head>\r\n");
  client.print("<meta charset=\"utf-8\">\r\n");
  client.print("<title>Робопульт</title>\r\n");
  client.print("<style>\r\n");
  client.print(
      ".c {\r\n"
      "border: 1px solid #333;\r\n"
      "display: inline-block;\r\n" 
      "padding: 5px 15px;\r\n"       
      "text-decoration: none;\r\n"
      "color: #000;\r\n"
      "}\r\n");
  client.print("</style>\r\n");
  client.print("</head>\r\n");
  client.print("<div style=\"text-align:center;\">\r\n");
  client.print("<a href=\"/F\" class=\"c\">Вперёд</a>\r\n");
  client.print("<br><br>\r\n");
  client.print("<a href=\"/L\" class=\"c\">Влево</a>\r\n");
  client.print("<a href=\"/S\" class=\"c\">Стоп</a>\r\n");
  client.print("<a href=\"/R\" class=\"c\">Вправо</a>\r\n");
  client.print("<br><br>\r\n");
  client.print("<a href=\"/B\" class=\"c\">Назад</a>\r\n");
  client.print("</head>\r\n");
  client.print("</html>\r\n");
}
 
/* Вывод состояния сети и адреса для подключения к моджулю  
 */
void printWifiStatus()
{
  //вывод названия сети
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
 
  //вывод полученного модулем IP-адреса
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
 
  //вывод информации о адресе в браузере
  Serial.println();
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);
  Serial.println();
}
 
void setup()
{
  //инициализация Serial-соединения для отладки
  Serial.begin(9600);
  //инициализация Serial-соединения для ESP-модуля
  wifiSerial.begin(9600);
  //инициализация ESP модуля
  WiFi.init(&wifiSerial);
 
  //проверка существования модуля
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi module not present");
    //если модуля нет, то не продолжать работу далее
    while (true);
  }
 
  //попытка подключения к wifi сети
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: "); //вывод надписи о попытке подключения
    Serial.println(ssid); //вывод названия сети
    //подключение к сети, используя имя и пароль
    status = WiFi.begin(ssid, pass);
  }
 
  Serial.println("You're connected to the network"); //вывод сообщения о подключении
  printWifiStatus(); //вывод статуса подключения
 
  //инициализация веб-сервера на порту № 80
  server.begin();
}
 
 
void loop()
{
  WiFiEspClient client = server.available();  //ожидание входящих клиентов
 
  if (client) {                               //если получен клиент,
    Serial.println("New client");             //вывести сообщение в Serial-порт
    buf.init();                               //инициализация буфера
    while (client.connected()) {              //цикл, пока клиент подключен
      if (client.available()) {               //если от клиента есть байты для чтения,
        char c = client.read();               //прочитать байт, а затем
        buf.push(c);                          //добавить его в буфер
 
        //если в строке получены два символа завершения строки
        //значит - это конец HTTP запроса, так что нужно отправить ответ
        if (buf.endsWith("\r\n\r\n")) {
          sendHttpResponse(client);
          break;
        }
 
        //проверить если запрос был одним из: "GET /R", "GET /G" или "GET /B":
        if (buf.endsWith("GET /F")) { //запрос изменения состояния красного цвета
          Serial.println("Forward"); //вывод отладочной информации
          robot.move_forward(); //движение робота вперед
          delay(5000); //задержка на 5 секунд
          robot.move_stop(); //остановка робота
        } else if (buf.endsWith("GET /L")) { //запрос изменения состояния зелёного цвета
          Serial.println("Left"); //вывод отладочной информации
          robot.move_left(); //движение робота влево
          delay(5000); //задержка на 5 секунд
          robot.move_stop(); //остановка робота
        } else if (buf.endsWith("GET /R")) { //запрос изменения состояния синего цвета
          Serial.println("Right"); //вывод отладочной информации
          robot.move_right(); //движение робота вправо
          delay(5000); //задержка на 5 секунд
          robot.move_stop(); //остановка робота
        } else if (buf.endsWith("GET /B")) { //запрос изменения состояния синего цвета
          Serial.println("Back"); //вывод отладочной информации
          robot.move_back(); //движение робота назад
          delay(5000); //задержка на 5 секунд
          robot.move_stop(); //остановка робота
        } else if (buf.endsWith("GET /S")) { //запрос изменения состояния синего цвета
          Serial.println("Stop"); //вывод отладочной информации
          robot.move_stop(); //остановка робота
        }
      }
    }
 
    //закрытие соединения
    client.stop();
    Serial.println("Client disconnected"); //вывод информации об отключении
  }
}

Шаг 4. Тестирование

После загрузки скетча, оставьте робота подключенным к компьютеру и откройте в Arduino IDE монитор порта. Для этого воспользуйтесь меню Инструменты - Монитор порта. В скетче мы выводим отладочную информацию в монитор сериал порта. В том числе туда выводится информация о том, какой IP-адрес получил робот в вашей домашней сети.

При старте работы информация в мониторе порта будут примерно такого вида:

[WiFiEsp] Initilization successful - 1.5.4
Attempting to connect to WPA SSID: SmartElements
[WiFiEsp] Connected to SmartElements
You're connected to the network
SSID: SmartElements
IP Address: 192.168.1.182

To see this page in action, open a browser to http://192.168.1.182

[WiFiEsp] Server started on port 80

Таким образом мы видим адрес, где мы должен появиться сайт нашего робота.

Шаг 5. Сайт

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

Нажмите на кнопку и убедитесь что робот выполняет команды.

Особенности при нажатии на кнопки

Шаг 6. Результат

Теперь отключите робота от компьютера, поставьте на ровную поверхность где для его движения будет достаточно места. Включите переключатель на Power-модуле. После включения, подождите какое-то время (примерно 20 секунд) и откройте страницу с адресом, полученным в предыдущем шаге. Управляйте роботом с помощью сайта. В зависимости от полученной команды робот будет двигаться в определённом направлении.