Skip to the content
PCBKitNew board
2 layers180 × 140 mmTelega KiCad, the printed circuit board in 3D

Telega KiCad

r3m4k/Telega

Реализация аппаратной и программной частей путеизмерительной телеги

Size
180 × 140 mm
Copper layers
2
Thickness
1.6 mm
Parts
70
Nets
144
Pads
312
Tracks, vias
641, 32
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
9 Mar 2026
Updated
21 Oct 2026

Overview

Telega KiCad is an open-source printed circuit board by r3m4k, from the r3m4k/Telega repository on GitHub. It is a 2-layer board of 180 × 140 mm with 70 parts on 144 nets, routed with 641 tracks and 32 vias.

It is built around the MAX3232ID and L7812. Its parts include 16 capacitors, 14 resistors, 8 connectors, 6 diodes and 4 ICs. It belongs with the STM32 boards of this library.

Main components

2

README

README.md

Telega

Структура проекта

Проект состоит из нескольких самостоятельных частей:

  • Embedded - прошивка для STM32F3Discovery, протокол обмена, драйверы датчиков и прикладная логика МК.
  • Python - GUI-приложение для ПК, слой связи с МК, сохранение данных и вспомогательные модули анализа.
  • KiCad - файлы печатной платы. В рамках этого README описывается только наличие раздела, без разбора содержимого.
  • Kompas3d - механические модели и сборки. Файлы CAD не анализируются подробно.
  • Список комплектующих.csv - перечень компонентов проекта.

GUI-приложение для ПК

GUI находится в каталоге Python и запускается из Python/main.py. Приложение написано на PyQt5 и предназначено для работы с путеизмерительной тележкой через COM-порт: настройка подключения, запуск служебных стадий МК, отображение текущих показаний и сохранение результатов измерений.

Запуск

Рекомендуемый запуск из корня репозитория:

bash
python -m venv Python/.venv
Python/.venv/Scripts/pip install -r Python/requirements.txt
Python/.venv/Scripts/python Python/main.py

На Linux путь к интерпретатору виртуального окружения будет Python/.venv/bin/python.

Возможности приложения

  • выбор директории сохранения и шаблона имени файлов;
  • выбор и обновление списка COM-портов;
  • запуск рукопожатия с МК после применения настроек;
  • запуск набора статического буфера перед проездом;
  • запуск и завершение измерительного проезда;
  • отображение текущих значений Acc_X, Acc_Y, Acc_Z, Gyro_X, Gyro_Y, Gyro_Z и кода ДПП;
  • сохранение данных статического буфера и проезда в CSV;
  • вывод пользовательских сообщений, предупреждений и ошибок в журнале окна.

Типовой рабочий сценарий описан подробнее в Python/docs/USER_GUIDE.md.

Основные модули

  • Python/main.py - точка входа, создание QApplication и главного окна.
  • Python/gui/main_window.py - главное окно, координирующее интерфейс, сессию связи и переключение пользовательских стадий.
  • Python/gui/program_stages - реализации стадий настройки, статического буфера и измерений, а также контракт главного окна, необходимый этим стадиям.
  • Python/gui/ui/main_window.ui - Qt Designer-разметка интерфейса; рядом лежат графические ресурсы telega.png и update.png.
  • Python/gui/com_port_settings.py и Python/gui/saving_params.py - работа с настройками COM-порта и параметрами сохранения.
  • Python/gui/com_port_reader.py - мост между GUI и низкоуровневой сессией МК. Запускает отдельный процесс для обмена с устройством и прокидывает данные/события в GUI через Qt-сигналы.
  • Python/telega_session/data_storage.py - потоковая запись пакетов TelegaData в CSV в дочерней сессии МК.
  • Python/gui/data_visualization.py - обновление LCD-индикаторов текущими значениями телеметрии.
  • Python/telega_session - проектный слой общения с тележкой: COM-порт, декодер протокола, контроллер команд и функция запуска сессии.
  • Python/async_mc_controller - более общий асинхронный слой для источников байтов, декодирования, контроллера, шины сигналов, логирования и конфигурации.
  • Python/app_config и Python/logger - конфигурация приложения на Pydantic и настройка логирования.
  • Python/data_analys и Python/plotting - вспомогательные модули для постобработки, фильтрации, расчета траектории и построения графиков.

Поток данных

После применения настроек главное окно создаёт конфигурацию COM-порта и запускает ComPortReader. Низкоуровневая сессия работает в отдельном процессе через multiprocessing, читает байтовый поток с устройства, декодирует пакеты протокола и потоково сохраняет их в CSV. В GUI передаётся только последний пакет не чаще одного раза в 500 мс для обновления индикаторов; служебные события и ошибки передаются отдельной очередью. Главное окно задаёт путь CSV-файла и переключает доступные действия пользователя согласно текущей стадии работы.

Сохраняемые данные

Во время набора статического буфера создается файл вида:

text
{шаблонное_название}_static_init_{номер_проезда}.csv

Во время измерительного проезда создается файл вида:

text
{шаблонное_название}_measuring_{номер_проезда}.csv

CSV пишется в UTF-8 с полями:

text
PackageNum DppCode AccX AccY AccZ GyroX GyroY GyroZ Temp

Настройки приложения сохраняются в Python/app_config/settings.json; файл относится к локальным runtime-данным и не обязан храниться в репозитории.

Прошивка для STM32F3Discovery

Пользовательская часть прошивки расположена в Embedded/user и написана как C++-слой поверх STM32F30x Standard Peripheral Library, USB VCP и библиотек датчиков платы STM32F3Discovery. Проект устроен почти как header-only фреймворк: прикладной сценарий находится в src/main.cpp, а драйверы, контейнеры, фильтры, протоколы и обвязка периферии вынесены в заголовочные модули inc.

Общая структура

  • src/main.cpp - точка входа, инициализация оборудования, главный цикл, стадии программы, обработчики команд и системные функции.
  • inc/main.h - C/C++ мост к STM32 SPL, USB VCP, CMSIS и функциям пользовательского слоя.
  • inc/Common - общие типы, константы, TriaxialData и базовый механизм регистрации обработчиков прерываний.
  • inc/Periph - GPIO, EXTI и светодиоды платы.
  • inc/Timers - обертки над аппаратными таймерами STM32, конфигурации и descriptor-классы.
  • inc/Sensors - драйверы L3GD20, LSM303DLHC и масштабирование датчиков.
  • inc/Filters - статистика, N-sigma фильтр и фильтр Калмана.
  • inc/DataContainers - очереди фиксированного размера, включая SPSC-очередь для обмена между IRQ и main.
  • inc/Communication - сообщения, пакеты, декодеры, USB VCP и USART.
  • inc/aaa_Project_Files - доменная логика проекта: команды, пакет телеметрии, декодер входящих команд и датчик пройденного пути.

Инициализация и прерывания

При старте main() копирует таблицу векторов прерываний из flash в пользовательскую таблицу _user_vector_table в RAM, переключает SCB->VTOR на эту таблицу и затем инициализирует оборудование через InitAll(). Такой подход позволяет C++-объектам регистрировать собственные обработчики IRQ во время инициализации.

Механизм регистрации прерываний реализован через CRTP-класс BaseIRQDevice. Конкретные устройства, например таймеры или EXTI-пины, наследуются от него, сохраняют указатель на активный экземпляр и записывают статический обработчик в пользовательскую таблицу векторов. При срабатывании IRQ статический обработчик перенаправляет вызов в метод irq_handler() нужного объекта.

Основной цикл и стадии программы

Главный цикл прошивки работает как простой диспетчер событий. Сначала он выполняет накопленные отложенные команды из command_manager.command_queue, затем при необходимости переключает текущую стадию из program_stage_queue, после чего вызывает init() новой стадии один раз и execute() на каждом проходе цикла.

Поддерживаемые стадии:

  • FooStage - состояние ожидания: таймеры остановлены, датчики периодически читаются для поддержания их рабочего состояния.
  • StaticStage - статический сбор начальных данных: формируется InitFrameNum телеметрических пакетов, после чего отправляется END_OF_STATIC_INIT.
  • MeasuringStage - рабочее измерение: по тику TIM3 читаются датчики, данные фильтруются, упаковываются и отправляются на ПК.

Таймеры

В прошивке используются два таймера общего назначения:

  • TIM3 - основной таймер измерений. Его IRQ переключает светодиод LED9, выставляет флаг нового периода измерений и увеличивает счетчик времени tick_counter.
  • TIM4 - таймер индикации состояния. Его IRQ переключает LED6 и LED7.

Таймеры описаны шаблонными классами Timer2, Timer3, Timer4, которые принимают пользовательский обработчик прерывания как compile-time параметр. Это позволяет вызывать обработчик без виртуальных функций и без runtime-диспетчеризации.

Датчики и фильтрация

Прошивка работает с датчиками платы STM32F3Discovery:

  • L3GD20 - гироскоп, данные угловой скорости.
  • LSM303DLHC - акселерометр и температурный датчик; магнитометр в текущей конфигурации отключен.
  • DppSensor - датчик пройденного пути: импульсы приходят на EXTI-вход PC1, направление считывается с PC3.

Перед отправкой телеметрии данные акселерометра, гироскопа и температуры проходят через NSigmaFilter. Для ускорения и угловой скорости используется фильтр NSigmaFilter<TriaxialData, 4, 16>, для температуры - NSigmaFilter<float, 1, 16>. Фильтр отбрасывает выбросы по правилу N-sigma и накапливает итоговое среднее.

Связь с ПК и протокол

Основной канал связи с ПК - USB Virtual COM Port. Входящие данные принимаются в UserEP3_OUT_Callback(), преобразуются в Messages::SizedMessage<VCP_BUFFER_SIZE> и передаются в UsbPort, где поток байтов разбирается DecoderTelega.

Входящий командный протокол:

  • header: 0xE7 0x7E;
  • format: 0xAB;
  • length: длина поля данных;
  • data: код команды;
  • checksum: младший байт суммы предыдущих байтов пакета.

DecoderTelega отвечает только за входящий поток команд. Он находит команду в списках urgent_commands и deferred_commands менеджера команд. Срочные команды выполняются сразу в контексте обработчика приема, отложенные команды помещаются в SPSC-очередь и выполняются позже в основном цикле.

Поддерживаемые команды:

  • 0xff 0xff - перезагрузка МК.
  • 0xaa 0x00 - переход в FooStage.
  • 0xaa 0x02 - переход в MeasuringStage.
  • 0xaa 0x03 - переход в StaticStage.
  • HANDSHAKE_ACK, HEARTBEAT_ACK - текстовые служебные команды, на которые МК отвечает собственными ACK-сообщениями.

Исходящие пакеты

Телеметрия отправляется через TelegaPackage. Пакет содержит:

  • счетчик времени tick_counter;
  • ускорение acc_value;
  • угловую скорость gyro_value;
  • температуру temp_value;
  • код датчика пройденного пути dpp_code;
  • контрольную сумму.

Текстовые служебные ответы формируются через MessagePackage: подтверждение команды, handshake ACK, heartbeat ACK, сообщение об ошибке и окончание статической инициализации.

Соглашения проекта

Прошивка рассчитана на доверенный ПК-клиент, который отправляет небольшие корректные команды и не перегружает очередь команд. Переполнение очередей и чрезмерная длина входящих пакетов считаются нарушением протокольного соглашения, а не штатным режимом работы. Частота таймера измерений должна быть согласована со временем чтения датчиков, фильтрации и отправки пакета так, чтобы обработка успевала завершиться до следующего периода измерений.

Parts

70
QtyValueFootprintReferences
60.33uFCapacitor_Tantalum_SMD:CP_EIA-2012-12_Kemet-R_HandSolderC303, C304, C305, C403, C404, C405
6R_SmallResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P15.24mm_HorizontalR201, R202, R203, R204, R205, R206
31N5400Diode_THT:D_DO-201AD_P15.24mm_HorizontalD501, D502, D506
3Conn_01x05Connector_Wire:SolderWire-1sqmm_1x05_P5.4mm_D1.4mm_OD2.7mmGPS_RS232_Repeater601, Reserved_RS232_601, Reserved_RS232_602
20.047uFCapacitor_Tantalum_SMD:CP_EIA-2012-12_Kemet-R_HandSolderC302, C402
20.5Resistor_THT:R_Axial_Power_L38.0mm_W6.4mm_P40.64mmR510, R511
2100uHInductor_THT:L_Radial_D9.5mm_P5.00mm_Fastron_07HVPL501, L502
2150Resistor_THT:R_Axial_DIN0516_L15.5mm_D5.0mm_P25.40mm_HorizontalR504, R505
21uFCapacitor_Tantalum_SMD:CP_EIA-2012-12_Kemet-R_HandSolderC301, C401
222Resistor_SMD:R_1206_3216MetricR601, R602
222uF/25VCapacitor_THT:CP_Radial_D8.0mm_P5.00mmC502, C504
2C_SmallCapacitor_THT:CP_Radial_D8.0mm_P5.00mmC201, C202
2DE9_Pins_MountingHolesConnector_Dsub:DSUB-9_Pins_Horizontal_P2.77x2.84mm_EdgePinOffset7.70mm_Housed_MountingHolesOffset9.12mmDPP_TW_601, GPS_RS601
2MAX3232Package_SO:SOIC-16W_7.5x10.3mm_P1.27mmU301, U401
1100kResistor_THT:R_Axial_DIN0516_L15.5mm_D5.0mm_P25.40mm_HorizontalR501
110uF/50VCapacitor_THT:CP_Radial_D8.0mm_P5.00mmC503
122uF/50VCapacitor_THT:CP_Radial_D8.0mm_P5.00mmC501
1680Resistor_THT:R_Axial_DIN0516_L15.5mm_D5.0mm_P25.40mm_HorizontalR503
178xx-1000R3(L)Converter_DCDC:Converter_DCDC_RECOM_R-78B-2.0_THTConverter_DCDC-12V/5V501
1Conn_12VConnector_Molex:Molex_KK-254_AE-6410-02A_1x02_P2.54mm_VerticalJ502
1Conn_24VConnector_Molex:Molex_KK-254_AE-6410-02A_1x02_P2.54mm_VerticalJ501
1Conn_Extra_15VConnector_Wire:SolderWire-1sqmm_1x05_P5.4mm_D1.4mm_OD2.7mmJ504
1Conn_Extra_5VConnector_Wire:SolderWire-1sqmm_1x05_P5.4mm_D1.4mm_OD2.7mmJ503
1Conn_Extra_Gnd1Connector_Wire:SolderWire-1sqmm_1x05_P5.4mm_D1.4mm_OD2.7mmJ505
1Conn_Extra_Gnd2Connector_Wire:SolderWire-1sqmm_1x05_P5.4mm_D1.4mm_OD2.7mmJ506
1Control_connectorConnector_Molex:Molex_KK-254_AE-6410-08A_1x08_P2.54mm_VerticalJ602
1K78xx-2000R3Converter_DCDC:Converter_DCDC_RECOM_R-78B-2.0_THTConverter_DCDC-24V/15V501
1L7812Package_TO_SOT_THT:TO-220-3_VerticalU601
1Led_GreenConnector_Wire:SolderWire-1sqmm_1x02_P5.4mm_D1.4mm_OD2.7mmD504
1Led_OrangeConnector_Wire:SolderWire-1sqmm_1x02_P5.4mm_D1.4mm_OD2.7mmD505
1Led_RedConnector_Wire:SolderWire-1sqmm_1x02_P5.4mm_D1.4mm_OD2.7mmD503
1MF-R135, 1.35АFuse:Fuse_Bourns_MF-RG300F501
1STM32f3discovery_STM32f3discovery:STM32f3discoveryU201
1SW_12VConnector_Wire:SolderWire-1.5sqmm_1x02_P7.8mm_D1.7mm_OD3.9mmSW502
1SW_24VConnector_Wire:SolderWire-1.5sqmm_1x02_P7.8mm_D1.7mm_OD3.9mmSW501
1USB_BConnector_USB:USB_B_Lumberg_2411_02_HorizontalJ601

The 60 most common of 70 parts.

Questions

How big is the Telega KiCad PCB?

It measures 180 × 140 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Telega KiCad use?

70 parts, built around the MAX3232ID and L7812. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Telega KiCad KiCad files?

From the r3m4k/Telega repository on GitHub, at the commit this page was made from: the board is KiCad/Telega_KiCad.kicad_pcb and its schematic KiCad/Connectors.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Telega KiCad design in my own project?

Its repository states no licence, so its author keeps all rights: ask r3m4k before reusing the design.

Similar boards

  • 2 layers99.5 × 99.5 mmESP32 master, the printed circuit board in 3D

    ESP32 master

    kwiecinski/BMS-and-offgrid-photovoltaic-management-system

    Project contains BMS for lead-acid batteries and ESP-based board used to pull information from EASUN offgrid inverter, energy meters and sensors.

    155 parts3MIT
  • 2 layers100 × 75 mmRTSS Power Supply V2-5C, the printed circuit board in 3D

    RTSS Power Supply V2-5C

    RadioThermal/RadioThermal_Soldering_OSHW

    Open Source Hardware 470KHz Induction Soldering Iron

    69 parts84CERN-OHL-P-2.0
  • 2 layers59.8 × 62 mmTinyFan, the printed circuit board in 3D

    TinyFan

    Gi7mo/TinyFan

    76 parts66GPL-3.0
  • 2 layers96.8 × 97 mmPsoc5power, the printed circuit board in 3D

    Psoc5power

    profdc9/DRSSTC-PCB-Pack

    A pack of PCBs for a dual resonant solid state tesla coil setup. Pretty much everything you need.

    133 parts59
  • 2 layers140 × 75 mmAWG, the printed circuit board in 3D

    AWG

    F6ITU/AWG

    poor man's function generator

    81 parts14
  • 2 layers82.8 × 73.2 mmYAPSCO, the printed circuit board in 3D

    YAPSCO

    simonjoh/YAPSCO-10V

    Modification of the YAPSC:10V with onboard -12V supply

    80 parts7GPL-3.0
  • 2 layers90 × 99.9 mmHF PA v10, the printed circuit board in 3D

    HF PA v10

    kholia/Global-Communications-Transceiver

    Open-source files for Global Communications Transceiver

    102 parts6GPL-3.0
  • 2 layers40.3 × 44.2 mmMiniWhip, the printed circuit board in 3D

    MiniWhip

    oe2lsp/miniWhip

    miniWhip Antenna, E-Field Antenna, capacitive antenna, DXLwhip, DXL-miniWhip, DXLminiWhip

    41 parts6GPL-2.0