E-Learning. Часть 14. Тестирование ESP32
Доброго всем времени суток, продолжаю серию постов про образовательную робототехнику. Здесь я описываю результаты и просто ход выполнения своей научной работы.
Кратко: разрабатываю специальную робо-накидку на одежду, которая сможет оцифровывать часть двигательных навыков мастеров своего дела и передавать это тем, кто только учится.
О чем этот пост: о переходе со схемы ESP8266 на ESP32 и небольшом анализе минимальной\максимальной частоты приема на конечном сервере.
За время с прошлого поста я переосмыслил схему в очередной раз. Решил попробовать завести ESP32, так как чисто теоретически она должна была дать лучшую производительность (которую и будем замерять далее конкретно под мою задачу).
Задачи:
1. Замерить частоту передачи данных по проводу (по COM-порту). В зависимости от величины БОД и формата пакета.
2. Замерить частоту передачи при беспроводной доставке UDP пакетов.
3. Оценить нижнюю и верхнюю границу частоты передачи данных на разных аппаратных точках доступа Wi-Fi.
4. Оценить на сколько плавает частота передачи данных.
Что я использовал:
1. Замер питания. USB тестер (замерял 3 часа работы - итог 300 ма ест ESP32):
2. Роутер tp-link tl-wr841n-300mbit.
3. Sony Experia ZL.
4. Программатор для ESP32.
5. Ноутбук Lenovo Z580 в качестве сервера приема данных.
Поехали.
Часть 1. Проводные тесты
Для начала надо прошить нашу плату. Вот так
Тест 1: Передача строки
Serial.println("-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83");
Тест 2: Таже самая строка, но без минусов.
Тест 3: Serial.println("-0.83,-0.83,-0.83,-0.83,-0.83,-0.83");
Тест 4: Тоже самое, но без минусов.
Тест 1 передает по одному значению с каждого датчика на руке. 6 осей. 18 сенсоров максимум. Итого 108 значений. Значения с минусом передаются медленнее. Ибо знак минус это тоже информация, которую нужно передать.
Конечно очевидно, что чем больше БОД, тем быстрее улетают данные. Для значения более 2000000 время исполнения одного цикла смотрел уже через Python (библиотека pySerial, код короткий, смотрите на скрине).
Плюс питоновкой реализации в том, что мы не ограничены фиксированными значениями, которые предлагает arduino ide.
При значении более 2500000 БОД на первом и втором тесте вылазят ошибки. При более 3000000 уже и короткая строка не успевает.
Такие тесты нужны узнать что экономнее - передавать на сервер по одному значению или все сразу. Если сравнивать значения на одну ось, то получается что все данные сразу передавать выгоднее примерно на 3% +-. Окей, хорошо.
Стабильные результаты при 2000000 БОД хуже 3070000 БОД в среднем на чуть более 60%.
При этом верхняя граница для частоты данных (1 Герц считаю как все сенсоры за 1 секунду передали каждый по 6 значений данных на каждую свою ось, итого 108 цифр).
Вывод по части 1:
300 Гц у нас в кармане. (хотя и 60 хватает так-то)
Часть 2. Беспроводные тесты.
От POST запросов я отказался. Получилось переслать UDP пакеты.
Прошивка для ESP32
Сервер приема и сохранения данных на Python 2.7 (Сам код я разбирать не буду, главное что он считает реальное число Гц принятых на ноутбуке).
Для работы схемы нужно организовать локальную сеть между ESP32 и сервером. Например, через роутер домашний или точку доступа с телефона. Для этого и ESP32 и ноутбук подключаем к одному роутеру. В данных тестах я буду использовать два:
1) tp-link tl-wr841n
2) Sony Experia старенькую уже.
Так же стоит учитывать, что больше ничем другим эти точки доступа не занимались. Даже к интернету не подключены. И симки не было в телефоне. Пробовал еще на своем рабочем D-Link DIR-815/AC, но результаты в конце (да и данные были некорректно собраны для него).
Сами собранные данные (21 599) последовательных данных на каждую выборку):
1) Данные tp-link tl-wr841n
2) Данные Sony Experia
Код для анализа данных в Jupyter Notebok (Язык Python 2.7)
1) Строим гистограмму и функцию плотности вероятности. (tp-link tl-wr841n)
Общая:
Отдельно выделил центральный пик, который составляет 97.87% (21 139) от всех данных.
Это значит, что большинство значений более 1290 Гц!
Левый промежуток 0.04 % (8).
Правый 2.09 % (452)
Среднее значение 1348.184777
Разброс 191.242387
Минимальное 310.000000
Максимальное 3966.000000
Что ж, воодушевляет. Посмотрим чем удивит мобилка.
2) Общая
Центральная (считал как средняя плюс-минус половину разброса). 94.67 % (20448)
Левая 2.65 % (573)
Правая 2.68 % (578)
Можно заметить, что иногда частота время от времени удваивается от среднего значения в 2-3% случаев. С чем связано не знаю.
0 mean 1155.241446
1 std 165.123428
2 min 223.000000
3 max 3437.000000
1100 Гц выдает. Очень хорошо.
Мой D-Link DIR-815/AC при интернет серфинге и просмотре фильма с подцепленного на роутер жесткого диска (по FTP протоколу) среднее значение было 300 Гц (когда мало серфили, то 900 Гц).
Далее можно еще выявить зависимость от расстояния между передатчиком-роутером-приемником. Влияние препятствий...
В следующих постах:
1) О том как жить с плавающей частотой передачи данных.
2) Об автоматической корректировке взаимозависимых гироскопов+акселерометров.
3) О сборке макета углов Эйлера для тестирования гироскопов и акселерометрах.
Возможно проще отправлять не строку, а число по байтам? Так все числа будут занимать одинаковое время на передачу. Если эти числа float, то будут занимать 4 байта, а "-0.83," занимает 6
Идея хорошая, ещё в 60-е годы в СССР кибкрнетиики и психологи мечтали реализовать когда-нибудь передачу готовых моторных навыков от профессионалов ученикам, вроде даже были методологические разработки в этой области... А как реализуются поправки на индивидуальные анатомические особенности обучаемого?