Для прототипа используется nanoESP32-S3.
- Управление движением робота - 
PUT-/move 
{"id": "3036393632076C54", "direction": "forward", "len": 100, "speed": 30}
{"id": "3036393632076C54", "direction": "right", "len": 100, "speed": 30}Робот переместится в указанном направлениии на заданный угол или на расстояние в mm. "direction" может името следущие значения:
forward- движение вперед,lenбудет длинной вmm.backward- движение назад,lenбудет длинной вmm.left- движение влево,lenбудет углом в градусах.right- движение вправо,lenбудет углом в градусах.
Для линейного движения len может быть больше 0 mm и меньше или ровно 10000 mm. Значения передаются с точность 1 mm.
Для поворота len может быть больше 0 градусов и меньше или ровно 360 градусам. Значения передаются с точность 1 градуса.
speed задает скорость в mm/s. Для поворототов скорость задается тоже с помощью mm/s.
Данные комманды не являются блокирующими. После запроса робот сразу вернет 200 если комманда валидна. Для того чтобы узнать что происходит на моторах в данный момент нужно отправить запрос в сенсор который вернет текущий pwm.
- Запрос значений сенсоров - 
POST-/sensor 
{"id": "3036393632076C54", "type": "all"} // Запрос всех сенсоров
{"id": "3036393632076C54", "type": "laser"} // Запрос показаний лазерных сенсоров
{"id": "3036393632076C54", "type": "imu"} // Запрос данных с гироскопа
{"id": "3036393632076C54", "type": "motor"} // Запрос текущего PWM с каждого из моторов
{"id": "3036393632076C54", "type": "encoders"} // Запрос сумм дельт энкодеров с момента последнего запросаОтвет будет иметь следующий формат:
{  // Запрос all.
    "laser": {
      "left": 12, 
      "left45": 12,
      "forward": 12,
      "right45": 100, 
      "right": 100, 
      "backward": 100,
      "left_timestamp": 12323423567,
      "left45_timestamp": 12323423213,
      "forward_timestamp": 12323423976,
      "right45_timestamp": 12323423777,
      "right_timestamp": 12323423324,
      "backward_timestamp": 12323423253
    }, 
    "imu": {
      "roll": 20,
      "pitch": 30,
      "yaw": 40
    },
    "motor": {
      "left_pwm": 20, 
      "right_pwm": -30
    },
    "encoders": {
      "left_encoder_delta_sum": 2134,
      "right_encoder_delta_sum": 2100
    }
}{ // Запрос laser. mm(расстояние) и ms(момент обновления).
  "laser": {
    "left": 12,
    "left45": 12,
    "forward": 12,
    "right45": 100,
    "right": 100,
    "backward": 100,
    "left_timestamp": 12323423567,
    "left45_timestamp": 12323423213,
    "forward_timestamp": 12323423976,
    "right45_timestamp": 12323423777,
    "right_timestamp": 12323423324,
    "backward_timestamp": 12323423253
  }
}{ // Запрос imu. Поворот в пространстве относительно конкретной оси в градусах.
  "imu": {
    "roll": 20,
    "pitch": 30, 
    "yaw": 40
  }
}{ // Запрос motor. PWM который физически выставлен на моторе в данный момент
  "motor": {
    "left_pwm": 20,
    "right_pwm": -30
  }
} { // Запрос encoders. Cумма дельт энкодеров с момента последнего запроса. 
  // P.S. Для конвертации в обороты колеса нужно разделить на MOTOR_RATIO(280)
  "encoders": {
    "left_encoder_delta_sum": 2134,
    "right_encoder_delta_sum": 2100
  }
} Все числа в запросах и ответах это целые значения (int).
pitch и yaw имею значения от -180 .. 180 то угол смещения от положения во время включения сенсора. roll имеет значения от 0 ... 360 это поворот по оси Z. Все измеряется в градусах.
В случае если значение за пределом видимости дальномера он вернет 65535.
- Запрос настройки сенсоров - 
POST-/sensor_config 
{
    "id": "F535AF9628574A53",
    "interval": 33,
    "enabled_sensors": ["left", "right", "forward"]
}interval - интервал в мс от 20 до 200
- Установить 
IDF: 
mkdir esp32 && cd esp32
sudo apt install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
git clone -b v5.3 --recursive https://github.com/espressif/esp-idf.git
cd esp-idf && ./install.sh
cd ..- Распаковать (скачать) данный проект собрать его:
 
. esp-idf/export.sh
idf.py build
idf.py flash
idf.py monitor Последняя команда чтобы посмотреть логи работы.
Для работы с API необходимо указать в main/inc/config.hpp название сети и пароль для WiFi. Потом в логах необходимо будет узнать IP адрес и уникальный ID. Они будут в следующих строках:
...
I (425) server.cpp:  <--- Chip ID: 3036393632076C54 ---> 
...
I (1495) server.cpp:  <--- IP Address: 192.168.1.179 ---> 
...
REST API можно протестировать с помощью curl, примеры комманд:
curl -X PUT -H "Content-Type: application/json" -d '{"id": "3036393632076C54", "l": 100, "r": -100, "l_time": 2000, "r_time": 4000}' http://192.168.1.179/motor
curl -X POST -H "Content-Type: application/json" -d '{"id": "3036393632076C54", "type": "all"}' http://192.168.1.179/sensor
curl -X POST -H "Content-Type: application/json" -d '{"id": "3036393632076C54", "type": "laser"}' http://192.168.1.179/sensor
curl -X POST -H "Content-Type: application/json" -d '{"id": "3036393632076C54", "type": "imu"}' http://192.168.1.179/sensor
curl -X POST -H "Content-Type: application/json" -d '{"id": "F535AF9628574A53", "interval": 20, "enabled_sensors": ["left", "right", "forward"]}' http://192.168.69.144/sensor_configДанный код тестировался на ветке v5.3 и в данном релизе есть проблемы с I2C. Более подробно можно посмотреть тут. Без данных исправлений IMU не заработает.
Для того чтобы быстро все исправить нужно открыть файл esp-idf/components/esp_driver_i2c/i2c_master.c внутри IDF и закомментировать строку:
    // Эту строку закомментировать (примерно 555)
    // i2c_hal_master_set_scl_timeout_val(hal, i2c_dev->scl_wait_us i2c_master->base->clk_src_freq_hz);
    // .........
    I2C_CLOCK_SRC_ATOMIC() {
        i2c_hal_set_bus_timing(hal, i2c_dev->scl_speed_hz, i2c_master->base->clk_src, i2c_master->base->clk_src_freq_hz);
    }
    // Сюда строку добавляем (примерно 573)
    i2c_hal_master_set_scl_timeout_val(hal, i2c_dev->scl_wait_us, i2c_master->base->clk_src_freq_hz); // эту строку добавить
    i2c_ll_master_set_fractional_divider(hal->dev, 0, 0);
    i2c_ll_update(hal->dev);Данную строку необходимо переместить чтобы Драйвер не затирал значение таймаута которое он сам-же и выставил.
Если у вашего пользователя нет доступа к сериал порту, можно сделать это:
sudo usermod -aG dialout $USER
sudo newgrp dialout Чтобы выйти из режима просмотра логов - Ctrl + ].
Изменения в config файде делаются через idf.py menuconfig (их не нужно делать, это уже выставленно в проекте):
(Top) → Serial flasher config → Flash size- 4Mb(Top) → Component config → ESP System Settings → CPU frequency- 240Mhz