Недавно в порыве той же ностальгии заказал себе с Алишки несколько поездов а-ля лего. Товарный поезд, мини-крокодил и всякое-разное типа рельсов или инфракрасных блоков управления. Но пока ехало, решил сделать свой блок управления через BLE, да что бы поделиться потом с общественностью — не нашёл ничего подходящего из готовых проектов. Так же, впервые в своей практике познакомился с заказом плат на заводе. Потыкал ещё всякие модно-молодежные средства разработки и заказа, остался доволен (хотя есть нюансы).
Итак, представляю блок управления лего-поездом: питание от стандартного лего блока с AAA или AA аккумами, два канала управления двигателями (на каждом: реверс или бесступенчатое управление тягой), два канала с открытым коллектором для управления светом или чем захотите, пищалка-гудок. Так же имеется датчик напряжения батареи для отображения уровня заряда. Управление по Bluetooth-LE. Плата рассчитана что бы влезать в размеры 4х8 студов.
Разработка устройства
Разработал схему и печатную плату в веб-редакторе EasyEDA. Во времена, когда последний раз этим занимался, было только десктопное приложение, но сейчас они заметно продвинулись, можно прямо в браузере накидать что тебе нужно, трассировать и в два клика заказать.
Немного по схемотехнике: основной контроллер ESP-32 (выбран из-за нативной поддержки BLE и возможности расширить на WiFi, если вам надо). Контроллер питается стабилизатором на базе AMS1117, напряжение батареи снимается с резистивного делителя.
Питание двигателей идёт через пару ШИМ-контроллеров L9110S, с длительным током до 800 мА, кратковременным до 1.5 А, что перекрывает линейку двигателей для поездов лего. Реализовано два независимых канала с реверсом. Для обычного поезда можно установить только M1 (кристалл U4).
Для управления LED имеется два выхода с открытым коллектором, на разъём разведено питание от батареи напрямую. Ток базы ограничен 1.15 кОм (изначально было 1К, но пришлось поменять, т.к. на заводе не было нужного номинала), и можно поставить поменьше, светодиоды светятся в полнакала.
Остальное — очевидно и вроде не требует пояснений, кнопка сброса да пищалка. Пищалка подключена напрямую, ток менее 20 мА, и довольно тихая (в той версии что заказал был ограничивающий резистор, который перепаял на перемычку по факту, в вашей версии он уже удалён). Разъёмы установлены больше для примера, на деле лучше припаять провода напрямую для экономии места.
В редакторе EasyEDA можно всё покрутить и посмотреть, есть даже 3D просмотр.
Заказ устройства
Итак, схему составили, теперь прямо из редактора оформляем заказ устройства. Я заказал собственно печатные платы и установку SMD компонентов на заводе. Модули ESP32 и пищалки установлю сам.
Попадаем в интерактивный редактор расположения компонент, BOM и прочего. Тут нас ждёт сюрприз, некоторых номиналов на заводе нет и надо подбирать замену. Я заказ отменил и внёс правки сразу в схему, что бы заказ проходил без ошибок.
Итого: PCB + сборка с одной стороны + купон за первый заказ + доставка в Германию — 43.29 € за пять штук. Заказываем и ждём.
Прошивка и управление
Пока ждал девайс, встал вопрос прошивки и приложения для управления. Нагуглил готовое универсальное решение — RemoteXY. Комплект из библиотеки для Arduino и приложения под iOS и Android, не надо пилить ничего — конфиг для UI части содержится в прошивке и загружается при подключении. До 5 элементов лицензия не нужна.
В онлайн редакторе накидываем наш интерфейс, получаем конфигурацию:
// RemoteXY configurate
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] = // 101 bytes
{ 255,4,0,1,0,94,0,16,8,1,4,0,48,4,10,89,2,16,10,121,
6,60,14,14,4,26,31,76,0,31,1,9,28,60,15,14,2,31,72,0,
2,0,12,82,22,11,2,26,31,31,70,87,0,82,0,71,56,6,12,37,
37,9,2,30,135,0,0,0,0,0,0,200,66,0,0,160,65,0,0,32,
65,0,0,0,64,31,66,65,84,32,37,0,49,0,0,0,0,0,0,160,
65 };
// this structure defines all the variables and events of your control interface
struct {
// input variables
int8_t speed; // =0..100 slider position
uint8_t light; // =1 if state is ON, else =0
uint8_t horn; // =1 if button pressed, else =0
uint8_t direction; // =1 if switch ON and =0 if OFF
// output variables
int8_t bat; // from 0 to 100
// other variable
uint8_t connect_flag; // =1 if wire connected, else =0
} RemoteXY;
Где получаем структуру для управления и конфигурацию контролов для интерфейса. Полный код прошивки, как обычно, есть на моём github : petrows/train-controller-esp32.
Прошивку проверил на другом модуле ESP32, всё работает как ожидается с минимальными правками. Только нюанс — ESP32 имеет своё управление ШИМ, и надо назначать каналы и соединять оные с выводами руками. Простые analogWrite()
работать не будут.
Для сенсора батареи используется библиотека BatterySense. Обратите внимание, из коробки она работать не будет, из-за того что она ожидает 10 битный ADC, а в ESP32 он по-умолчанию 12-битный:
// Battery reading expects 10bit (0-1024) ADC
// We have to change from default value (12bit)
analogReadResolution(10);
analogSetWidth(10);
В общем-то это всё, делаем управление устройствами, делаем имя устройства по мак-адресу, что бы различать поезда между собой:
// Bluetooth name (generated from MAC)
#define REMOTEXY_BLUETOOTH_NAME ble_device()
static char ble_device_name[16];
// Return device name as "Train-XX:YY", where XX:YY is last digits of MAC
const char *ble_device()
{
snprintf(ble_device_name, 16, "Train-%s", WiFi.macAddress().c_str() + 12);
return ble_device_name;
}
Для прошивки я предусмотрел только UART разъём, но не предусмотрел никаких кнопок и выводов для входа в режим прошивки. Для перехода в режим bootloader необходимо закоротить GPIO0 (вывод 25), который удобно расположен прямо рядом с «земля» UART при подаче питания:
После чего девайс прошивается обычной esp_tool или напрямую через PlatformIO.
Готовое устройство
Готовое прошитое устройство собираем в поезд, в дизельный локомотив всё отлично помещается.
Подключаемся к поезду и видим наш интерфейс.
Всё работает 🙂
Проект в EasyEDA: https://oshwlab.com/petrows/train-controller-esp32
Исходники на Github: https://github.com/petrows/train-controller-esp32