Как стать автором
Обновить

MIRO — открытая платформа indoor-робота. Часть 3 — Программная составляющая: ESP8266

Время на прочтение4 мин
Количество просмотров6.9K
image

Начинаем разбирать программную составляющую платформы MIRO. Посмотрим, как правильно «готовить» ARDUINO UNO с помощью ESP8266 для прошивки и взаимодействия без проводов.

Оглавление: Часть 1, Часть 2, Часть 3, Часть 4, Часть 5.

Я вообще не хотел, чтобы мы что-то разрабатывали для ESP8266. Был уверен, что давно существует готовое решение с нужным мне функционалом. А для MIRO этот функционал был достаточно простым:

  1. ПО должно иметь веб-интерфейс для настройки сети;
  2. ПО должно реализовывать беспроводную прошивку ATMEGA328;
  3. ПО должно иметь функционал моста WiFi-UART для беспроводной отладки и управления.

image Наверное, по большинству этих функций существует всем известный ESP-LINK. И он действительно мощный. Мы его применяли еще в нескольких проектах в качестве моста между различными интерфейсами – очень удобно. Но вот несколько месяцев назад, когда мы сели плотно заниматься этим вопросом, оказалось, что не прошивает он ARDUINO UNO. Везде пишут, что прошивает, а он не прошивал. И в тот момент я даже глубоко не разбирался почему и какова типовая процедура. Мы с товарищами просто настраивали на хосте виртуальный COM-порт по определенному IP-адресу ESP, в самом ESP-LINK указывали линию сброса и пробовали прошить. Сброс ATMEGA328 успешно проходил, а прошивка так и не заливалась. Причем, в сети куча уроков по организации такой прошивки именно с ESP-LINK. Но если почитать их issue, то у них там постоянно что-то у кого-то не прошивается.

Разочаровавшись, стал искать альтернативы. И нашел ее в виде форка оригинального Arduino WiFi на GitHub у разработчика с ником jandrassy.
Еще в феврале того года там в README была монструозная инструкция по настройке всего, начиная от прошивки до среды разработки, но сейчас она значительно упростилась. Но тем не менее, для настройки среды все еще требуются небольшие усилия. Однако, прошивка ARDUINO происходит идеально. Проверено и из Windows и из Linux (на MacOS мы кажется вообще ничего никогда не проверяли – нет его ни у кого в ближайшем окружении проекта).

Порядок подготовки среды там такой:

  1. Скачать и установить библиотеку dfu отсюда;
  2. По умолчанию в этой библиотеке (в файле esp8266-serial-arduinouno-hacked.cpp) объявлено, что линия Reset чипа ATMEGA328 подключена к линии GPIO5 ESP8266. Для MIRO здесь нужно внести изменения – поменять на GPIO2.

Что именно поменять
Было:

esp8266_serial_arduinouno_hacked_target_reset(struct dfu_interface *iface)
{
	pinMode(5, OUTPUT);
	digitalWrite(5, 0);
	delay(1);
	digitalWrite(5, 1);
	delay(200);
	return 0;
}

Стало:

esp8266_serial_arduinouno_hacked_target_reset(struct dfu_interface *iface)
{
	pinMode(2, OUTPUT);
	digitalWrite(2, 0);
	delay(1);
	digitalWrite(2, 1);
	delay(200);
	return 0;
}


Автор jandrassy, указывает, что его реализация работает только с такой конфигурацией целевого чипа и загрузчика (ATMEGA328P с Optiboot).

Уверен, что есть еще решения и возможно даже более лучшие. Если кто-то точно знает работающие варианты – сообщайте. Потому что, несмотря на большое количество готового кода, мы проверяли помимо ESP-LINK еще 2 или 3 проекта – они не работали. В каких-то случаях прошивка проходила через раз, в каких-то случаях вообще не работала.

Пожалуй, один из главных плюсов найденного решения – относительно небольшая кодовая база проекта и то, что разработана прошивка под Arduino Core.

Чего не было в проекте jandrassy, так это беспроводного моста WiFi-UART. Уже в исходном Arduino.org WiFi Link firmware была вырезана страничка с терминальным окошком, позволяющая через браузер работать с UART чипа ATMEGA328. Точно так же как это можно делать в ESP-LINK. И если обратиться к первым публикациям про Arduino UNO WiFi (например вот и вот), то видно, что в первых версиях прошивки и окно и соответствующий пункт меню («WiFi Console») есть. И даже в релизе 1.0.0 в архиве файл console.js (он как раз и реализовывал эту страничку) лежит, но фактически в сервере не задействован никак (мы проверяли). Зачем и почему выпилили – не понятно.

Пришлось кое-что дописать. Теперь в прошивке есть еще один сервер – TELNET на очевидном порту 23, с которым без проблем работает множество терминальных программ.

Правда, в данный момент, чтобы все работало, мне пришлось удалить из кода jandrassy часть, отвечающую за беспроводную прошивку самой ESP. В исходных требованиях у меня этого функционала не было, поэтому и ладно. Однако, если читатели в комментариях смогут мне утвердительно сказать можно ли в одной прошивке реализовать возможность беспроводной прошивки как самого ESP8266, так и «внешнего» MCU (в данном случае – ATMEGA328), то я задумаюсь о возвращении в прошивку ESP этой возможности. Уже при подготовке статьи, косвенно, увидел подтверждение этому вот в этом проекте канадцев. Но не проверял.

А пока – ESP прошивается исключительно по проводу, но ARDUINO имеет возможность как беспроводной прошивки, так и связи по TELNET мостом WiFi-UART. И это очень удобно! Моя цель достигнута.

Ну и в проекте, как и в исходном, есть WEB-интерфейс для настройки (картинки кликабельны).





Мы изменили файлы CSS стилей WEB-интерфейса под наш проект и ввели небольшой «костыль» – теперь ESP всегда находится в режиме AP+STA. Этот костыль сделан для того, чтобы исключить возможность переключения ESP в режим «только STA», при котором при переносе робота в другую подсеть, у пользователя теряется возможность сконфигурировать робота в новую сеть – к новой сети робот подключиться не может, а доступа извне тоже нет – приходится перепрошивать ESP. В режиме AP+STA пользователь всегда может подключиться к точке доступа робота и сконфигурировать подключение к новой сети WiFi.

О том, как прошить ESP8266 этим «монстриком». В общем случае для произвольного модуля на чипе ESP8266 порядок такой:

  1. Включить плату (подключить к usb);
  2. Установить параметры платы как на рисунке;

    image

    Очень важно выбрать «v1.4 Higher Bandwidth» – если выбрать «v2», то к плате после прошивки не удается подключиться по WiFi (точка доступа видна, но процедура подключения не проходит — кто знает с чем это связано — напишите в комментариях).
  3. Выбрать порт (в примере на скриншоте – COM3).
  4. Запустить прошивку. Во время процедуры загрузки платы, вначале производится стирание памяти микроконтроллера, а затем прошивка.
  5. После завершения процедуры прошивки, нужно сбросить плату, с помощью кнопки сброса.
  6. Выбрать в меню Arduino IDE ESP8266 Sketch Data Upload и загрузить SPIFFS.
  7. Сбросить плату.

Для конфигурации же с нашей «модифицированной платой» UNO+WiFi (см. первую часть) все чуточку сложнее из-за аппаратных особенностей платы, которую затруднительно комфортно исследовать по причине большого количества ошибок в документе с принципиальной схемой. Мы написали более подробную инструкцию в файле «MIRO ESP Firmware upload manual» репозитория – если действовать строго по ней, прошивка проходит 100 из 100.

Мы подходим к очень интересной части — программной составляющей MIRO, возложенной на ATMEGA328. Там работы побольше и пространства для обсуждения тех или иных решений тоже.

Всем спасибо!
Теги:
Хабы:
Всего голосов 11: ↑10 и ↓1+9
Комментарии6

Публикации

Истории

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань