OpenSource блок управления поездом

Недавно в порыве той же ностальгии заказал себе с Алишки несколько поездов а-ля лего. Товарный поезд, мини-крокодил и всякое-разное типа рельсов или инфракрасных блоков управления. Но пока ехало, решил сделать свой блок управления через 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

Leave a Reply

Your email address will not be published. Required fields are marked *