Инструкция
Робот 11
В данном разделе представлены все внутренности робота
Подключение
Шаги для подклчюения устройства с WiFi к роботу
  1. Включите робота
  2. В WiFi сетях выполните подключение к (SSID) WiFi сети: Robot11_XXX
  3. В мобильном телефоне отключите передачу мобильных данных
  4. Откройте браузер: Chrome, Opera, Mozilla.
  5. В адресную строку введите IP адрес 192.168.4.1 и перейдите на страницу
Электронная схема
Перечень и себестоимость компонентов
Программный код
Код представляет собой прошивку для микроконтроллера ESP32, которая реализует управление роботом через веб-интерфейс. Давайте разберем его по частям:
1. Подключение библиотек
#include <esp_wifi.h>
#include <esp_event.h>
#include <esp_log.h>
#include <esp_system.h>
#include <nvs_flash.h>
#include <esp_http_server.h>
#include <driver/gpio.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <esp_netif.h>

Здесь подключаются необходимые библиотеки для работы с Wi-Fi, GPIO, HTTP-сервером, логированием и другими функциями ESP32.

2. Определение констант и переменных
static const char *TAG = "robot_control";

#define GPIO_OUTPUT_IO_12 GPIO_NUM_12
#define GPIO_OUTPUT_IO_13 GPIO_NUM_13
#define GPIO_OUTPUT_IO_4 GPIO_NUM_4
#define GPIO_OUTPUT_IO_5 GPIO_NUM_5
#define GPIO_OUTPUT_IO_14 GPIO_NUM_14

static bool pinEsp13 = false;
static bool pinEsp12 = false;
static bool pinEsp5 = false;
static bool pinEsp4 = false;
static bool pinEsp14 = false;

static httpd_handle_t server = NULL;

  • TAG используется для логирования.
  • Определены пины GPIO, которые будут использоваться для управления роботом.
  • Переменные pinEspXX хранят текущее состояние каждого пина (включен/выключен).
  • server будет хранить указатель на HTTP-сервер.

3. HTML-страница для управления роботом

const char webpage[] = R"=====(
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
<title>Робот</title>
<style type="text/css">
.button {
background-color: #4CAF50; /* Green */
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 30px;
}
</style>
</head>
<body style="background-color: #f9e79f; ">
<center>
<div>
<h1>Робот</h1>
<button class="button" onclick="send(1)">&uarr;</button><br><br>
<button class="button" onclick="send(2)">&larr;</button>
<button class="button" onclick="send(0)">¤</button>
<button class="button" onclick="send(3)">&rarr;</button><br><br>
<button class="button" onclick="send(4)">&darr;</button><br>
<br><br>
<button class="button" onclick="send(5)">Led on</button>
<button class="button" onclick="send(6)">Led of</button><br>

</div>
<br>

<script>
function send(led) {
fetch(`GPIO?led=${led}`)
.then(response => response.text())
.then(text => {
document.getElementById("led").innerHTML = text;
})
.catch(error => console.error('Ошибка:', error));
}
</script>
</center>
</body>
</html>
)=====";

Это HTML-страница, которая отображается в браузере. Она содержит кнопки для управления роботом (вперед, назад, влево, вправо, остановка) и кнопки для включения/выключения светодиода. При нажатии на кнопку вызывается функция send(led), которая отправляет GET-запрос на сервер с параметром led.

4. Обработчики HTTP-запросов

static esp_err_t root_get_handler(httpd_req_t *req)
{
httpd_resp_set_type(req, "text/html");
httpd_resp_send(req, webpage, HTTPD_RESP_USE_STRLEN);
return ESP_OK;
}

static esp_err_t gpio_get_handler(httpd_req_t *req)
{
char* buf;
size_t buf_len;
buf_len = httpd_req_get_url_query_len(req) + 1;
if (buf_len > 1) {
buf = malloc(buf_len);
if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) {
char param[32];
if (httpd_query_key_value(buf, "led", param, sizeof(param)) == ESP_OK) {
int led = atoi(param);
if (led == 1) {
pinEsp13 = false;
pinEsp12 = true;
pinEsp5 = false;
pinEsp4 = true;
ESP_LOGI(TAG, "Робот едет вперед");
} else if (led == 2) {
pinEsp13 = false;
pinEsp12 = true;
pinEsp5 = true;
pinEsp4 = false;
ESP_LOGI(TAG, "Робот поворачивает влево");
} else if (led == 0) {
pinEsp13 = false;
pinEsp12 = false;
pinEsp5 = false;
pinEsp4 = false;
ESP_LOGI(TAG, "Робот останавливается");
} else if (led == 4) {
pinEsp13 = true;
pinEsp12 = false;
pinEsp5 = true;
pinEsp4 = false;
ESP_LOGI(TAG, "Робот едет назад");
} else if (led == 3) {
pinEsp13 = true;
pinEsp12 = false;
pinEsp5 = false;
pinEsp4 = true;
ESP_LOGI(TAG, "Робот поворачивает вправо");
} else if (led == 5) {
pinEsp14 = true;
} else if (led == 6) {
pinEsp14 = false;
}
}
}
free(buf);
}
httpd_resp_send(req, "GPIO", HTTPD_RESP_USE_STRLEN);
return ESP_OK;
}

  • root_get_handler обрабатывает запрос к корневому URL (/) и возвращает HTML-страницу.
  • gpio_get_handler обрабатывает запросы к /GPIO?led=X, где X — это номер команды. В зависимости от значения led изменяются состояния пинов GPIO, что управляет движением робота и светодиодом.

5. Настройка Wi-Fi в режиме точки доступа (AP)

static void wifi_init_softap(void)
{
esp_netif_init();
ESP_ERROR_CHECK(esp_event_loop_create_default());

esp_netif_create_default_wifi_ap();

wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));

wifi_config_t wifi_config = {
.ap = {
.ssid = "Robot11_v03_espidf_freertos",
.ssid_len = strlen("Robot11_v03_espidf_freertos"),
.password = "",
.max_connection = 4,
.authmode = WIFI_AUTH_OPEN
},
};

ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());

ESP_LOGI(TAG, "wifi_init_softap finished. SSID: %s", wifi_config.ap.ssid);
}

Эта функция настраивает Wi-Fi в режиме точки доступа (AP) с именем сети Robot11_v03_espidf_freertos и без пароля.

6. Запуск веб-сервера

static void start_webserver(void)
{
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
if (httpd_start(&server, &config) == ESP_OK) {
httpd_register_uri_handler(server, &root);
httpd_register_uri_handler(server, &gpio);
}
}

Здесь создается и запускается HTTP-сервер, который будет обрабатывать запросы к корневому URL и /GPIO.

7. Основная функция app_main

void app_main(void)
{
// Initialize NVS
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);

// Initialize GPIO
gpio_config_t io_conf;
io_conf.intr_type = GPIO_INTR_DISABLE;
io_conf.mode = GPIO_MODE_OUTPUT;
io_conf.pin_bit_mask = (1ULL << GPIO_OUTPUT_IO_12) | (1ULL << GPIO_OUTPUT_IO_13) | (1ULL << GPIO_OUTPUT_IO_4) | (1ULL << GPIO_OUTPUT_IO_5) | (1ULL << GPIO_OUTPUT_IO_14);
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
gpio_config(&io_conf);

// Initialize Wi-Fi
wifi_init_softap();

// Start the web server
start_webserver();

// Main loop
while (1) {
gpio_set_level(GPIO_OUTPUT_IO_13, pinEsp13);
gpio_set_level(GPIO_OUTPUT_IO_12, pinEsp12);
gpio_set_level(GPIO_OUTPUT_IO_5, pinEsp5);
gpio_set_level(GPIO_OUTPUT_IO_4, pinEsp4);
gpio_set_level(GPIO_OUTPUT_IO_14, pinEsp14);
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}

  • Инициализируется NVS (Non-Volatile Storage) для хранения данных.
  • Настраиваются GPIO-пины как выходы.
  • Запускается Wi-Fi в режиме точки доступа.
  • Запускается веб-сервер.
  • В основном цикле постоянно обновляются состояния GPIO-пинов в соответствии с переменными pinEspXX.
Итог
Этот код позволяет управлять роботом через веб-интерфейс, который доступен по Wi-Fi. Пользователь может отправлять команды с помощью кнопок на веб-странице, а ESP32 будет изменять состояние GPIO-пинов, управляя движением робота и светодиодом.
This site was made on Tilda — a website builder that helps to create a website without any code
Create a website