Итоговая работа уровня «Старт»: тяговый стенд, версия 1 … ↩
mod. Четверг, 15 октября 2026 22:55 . См. 2
BeeFC · Урок S10 из 33 · Уровень «Старт»
Итоговая работа объединяет всё, что сделано на уровне «Старт»: планировщик, консоль, выход на двигатель, измерение напряжения и тока. К ним добавляется драйвер тензодатчика, и BeeFC сам снимает характеристику двигателя с воздушным винтом.
Результат итоговой работы — BeeFC версии 0.9 и отчёт о характеристиках двигателя: тяга, потребляемая мощность и удельная тяга при разных значениях газа. Эти данные понадобятся в уроке P7 для модели винтомоторной группы.
Содержание
- 1. Цели урока
- 2. Термины и сокращения
- 3. Конструкция стенда
- 4. Драйвер HX711
- 5. Тарирование и калибровка
- 6. Развёртка газа
- 7. Обработка на компьютере
- 8. Итоговая проверка уровня
- 9. Практика
- 10. Как это сделано в больших прошивках
- 11. Проверьте себя
- 12. Чек-лист самопроверки
- 13. Источники
- 14. Что дальше
1. Цели урока
Продолжительность итоговой работы — шесть часов: один час теории и пять часов практики. После урока слушатель:
- собирает тяговый стенд и подключает тензодатчик к учебной плате;
- пишет драйвер микросхемы HX711 и проверяет его тестом с имитацией микросхемы;
- выполняет тарирование и калибровку стенда эталонным грузом;
- реализует автоматическую развёртку газа с защитами по току, тяге и напряжению;
- получает характеристику двигателя и рассчитывает удельную тягу.
2. Термины и сокращения
| Термин | Определение |
|---|---|
| тензодатчик | упругий элемент с наклеенными тензорезисторами, сопротивление которых меняется при деформации |
| мостовая схема | соединение четырёх тензорезисторов, на выходе которого появляется напряжение, пропорциональное силе |
| HX711 | 24-битный аналого-цифровой преобразователь с усилителем для мостовых датчиков |
| тарирование | запоминание показания датчика без нагрузки |
| калибровка эталонным грузом | определение цены одного кода датчика по грузу известной массы |
| удельная тяга | отношение тяги к потребляемой мощности, г/Вт |
| развёртка газа | автоматическое ступенчатое изменение длительности импульса с записью показаний |
| формат CSV | текстовая таблица, столбцы которой разделены запятыми |
3. Конструкция стенда
Балочный тензодатчик закрепляется одним концом в массивном основании вертикально. На свободном конце установлена площадка с двигателем, ось двигателя горизонтальна. Тяга воздушного винта изгибает балку, и тензодатчик измеряет силу напрямую, без рычага.

| Элемент | Рекомендация | Примечание |
|---|---|---|
| тензодатчик | предел измерения не меньше удвоенной ожидаемой тяги | для трёхдюймового винта — 1 кг, для пятидюймового — 3 кг |
| HX711 | модуль с выводом RATE, переключённым на 80 Гц | на многих модулях по умолчанию 10 Гц |
| питание | лабораторный источник с ограничением тока или батарея через предохранитель | ток ограничивается по техническим данным двигателя |
| датчик тока | датчик регулятора, полётного контроллера или отдельный модуль | урок S9 |
Указанные значения — учебный ориентир. Предел измерения и ограничение тока выбираются по техническим данным своего двигателя.
↑ К оглавлению4. Драйвер HX711
Протокол обмена
HX711 соединяется с микроконтроллером двумя линиями: DOUT и SCK. Протокол реализуется программно, без аппаратного интерфейса.
- Низкий уровень на
DOUTозначает, что преобразование завершено. - Микроконтроллер подаёт на
SCK24 импульса и после каждого переднего фронта читает один бит, начиная со старшего. - Дополнительные импульсы выбирают канал и усиление для следующего преобразования: один импульс — канал A с усилением 128, два — канал B с усилением 32, три — канал A с усилением 64.
- Результат передаётся в 24-битном дополнительном коде и расширяется до 32 бит с сохранением знака.
Файл drivers/hx711.h
Файл drivers/hx711.c
SCK держится дольше 60 мкс, HX711 переходит в режим пониженного энергопотребления, и чтение срывается. Обработчик прерывания, выполненный в середине импульса, может растянуть его. Поэтому каждый импульс выполняется в короткой критической секции. Защищать всё чтение целиком нельзя: оно длится около 50 мкс, и за это время последовательный порт на скорости 420 000 бод потеряет принятые байты.Тест с имитацией микросхемы
Тест подключает к поддельной реализации портов два перехватчика. Перехватчик записи считает передние фронты на SCK, перехватчик чтения выдаёт на DOUT очередной бит заданного 24-битного числа. Так проверяются порядок битов, расширение знака, число импульсов усиления и закрытие всех критических секций.
Файл tests/unit/test_level1.c
5. Тарирование и калибровка
- Без нагрузки усредняются шестнадцать показаний, результат записывается в поле
offset. - На площадку двигателя подвешивается эталонный груз известной массы, например 200 г, через нить и блок так, чтобы сила действовала по оси двигателя.
- Цена кода
grams_per_countравна массе груза, делённой на разность усреднённого показания иoffset. - Линейность проверяется вторым грузом: расхождение показания с массой груза не должно превышать 1 %.
Команды консоли tare и cal 200 выполняют первые три шага, а результат сохраняется в ОЗУ до перезагрузки. Сохранение параметров во флеш-памяти появится в уроке P12.
6. Развёртка газа
Задача развёртки — конечный автомат, который выполняется планировщиком с частотой 100 Гц.
| Состояние | Действие | Переход |
|---|---|---|
| ожидание | импульсов на двигатель нет | команда sweep при разблокированных двигателях |
| ступень | установить газ ступени, ждать две секунды | следующая ступень или спуск |
| спуск | плавно уменьшить газ до 1000 мкс за одну секунду | остановка |
| остановка | блокировка двигателей, вывод итогов | ожидание |
| авария | немедленная блокировка двигателей | ожидание |
Ступени идут от 1100 мкс с шагом 50 мкс до верхнего предела, заданного командой. Переход в состояние «авария» выполняется из любого состояния по одной из причин:
- ток превысил заданный предел;
- тяга превысила 90 % предела измерения тензодатчика;
- напряжение элемента батареи опустилось до критического порога из урока S9;
- от тензодатчика нет данных дольше 100 мс;
- в консоль поступил любой символ.
Синхронный журнал
Строка журнала записывается при каждом новом показании HX711, то есть 80 раз в секунду. В строку попадают последние значения газа, тока и напряжения. Строка занимает около 40 байт, поток составляет около 3200 байт в секунду, что меньше трети пропускной способности порта на скорости 115 200 бод.
↑ К оглавлению7. Обработка на компьютере
Сценарий на языке Python делит журнал на ступени, отбрасывает первые 0,5 секунды каждой ступени, пока двигатель разгоняется, и усредняет остальное. Удельная тяга вычисляется как отношение тяги к электрической мощности \( P = U \cdot I \).
Файл tools/thrust_report.py
Значения в примере получены на модельных данных. Удельная тяга обычно наибольшая на малом газе и снижается с ростом мощности: это закономерность, которую слушатель проверяет на своём двигателе.
↑ К оглавлению8. Итоговая проверка уровня
Уровень «Старт» считается пройденным, когда в репозитории слушателя выполнены все условия.
- Все модульные тесты уровня, включая скрытые, пройдены.
- Проверка правил архитектуры
make arch-checkпройдена. - Прошивка собирается без предупреждений, изменения отмечены меткой
v0.9. - Журнал развёртки и отчёт
docs/s10_report.mdс таблицей и графиками добавлены в репозиторий. - Анализатор журнала на сервере подтверждает, что тяга растёт с газом, ступени не короче двух секунд, а аварийных остановок по причине отсутствия данных нет.
9. Практика
Задание S10.1. Драйвер HX711
Продолжительность — 60 минут, выполняется на компьютере.
Реализовать драйвер drivers/hx711 с функциями чтения, расширения знака и пересчёта в граммы.
Критерий автоматической проверки: тесты test_hx711_* пройдены; скрытые тесты проверяют наибольшее и наименьшее значения, все три варианта усиления и отсутствие вложенных критических секций.
Задание S10.2. Сборка и калибровка стенда
Продолжительность — 90 минут.
Собрать стенд, подключить HX711 к двум свободным выводам платы, реализовать команды tare и cal. Проверить линейность вторым грузом и записать результаты в отчёт.
Задание S10.3. Развёртка газа с защитами
Продолжительность — 90 минут, частично на компьютере.
Реализовать модуль core/thrust_sweep как конечный автомат по таблице из раздела «Развёртка газа» и журнал в формате CSV.
Критерий автоматической проверки: скрытые тесты на модельном времени проверяют каждую причину аварийной остановки, продолжительность ступеней и то, что после остановки на выходе нет импульсов.
Задание S10.4. Характеристика двигателя
Продолжительность — 60 минут, выполняется под наблюдением преподавателя или по видеосвязи.
Выполнить развёртку до газа, при котором ток достигает 80 % предела по техническим данным двигателя. Построить графики сценарием thrust_report.py и описать в отчёте, при каком газе удельная тяга наибольшая.
Критерий автоматической проверки: анализатор журнала подтверждает условия пятого пункта итоговой проверки.
10. Как это сделано в больших прошивках
| Прошивка | Версия | Файл в исходном коде |
|---|---|---|
| Betaflight | 2026.6.2 | src/main/msp/msp.c |
| INAV | 9.1.0 | src/main/flight/mixer.c |
| ArduPilot | Copter-4.7.2 | ArduCopter/motor_test.cpp |
| PX4 | v1.17.0 | src/systemcmds/actuator_test |
- В Betaflight вкладка двигателей конфигуратора отправляет сообщение
MSP_SET_MOTOR. Обработчик в файлеmsp.cзаписывает значения в массивmotor_disarmed[], то есть они действуют только при заблокированных двигателях: проверка двигателей и полёт не могут выполняться одновременно. - В INAV обработчик
MSP_SET_MOTORв файлеfc_msp.cтакже записывает значения в массивmotor_disarmed[], а модульmixer.cподаёт их на двигатели только в заблокированном состоянии. - В ArduCopter перед проверкой двигателей функция
mavlink_motor_control_checkв файлеmotor_test.cppвыполняет до шести проверок: плата инициализирована, проверки двигателей пройдены, аппаратура управления откалибрована (если это требуется), аппарат на земле, защитный выключатель нажат, аварийная остановка не активна. Длительность проверки ограничена 600 секундами. - В PX4 команда
actuator_test setзадаёт значение выхода на время, указанное параметром-t. Без этого параметра команда работает в интерактивном режиме и снимает значение после нажатия клавиши Enter — тот же принцип, что и остановка развёртки BeeFC любым символом.
11. Проверьте себя
- Как HX711 сообщает о готовности данных и как выбирается усиление?
- Почему в драйвере HX711 от прерываний защищается каждый импульс, а не всё чтение?
- Как рассчитывается цена кода тензодатчика?
- Почему первые 0,5 секунды каждой ступени не учитываются при обработке?
- Почему в Betaflight значения из вкладки двигателей действуют только при заблокированных двигателях?
12. Чек-лист самопроверки
13. Источники
- Техническое описание HX711.
- Проверка двигателей в ArduCopter.
- Обработчик сообщений MSP в Betaflight.
- Документация ArduPilot: подключение регуляторов и двигателей.
- Открытый тяговый стенд на Arduino с тензодатчиком и HX711 (Printables).
- Промышленные тяговые стенды Tyto Robotics.
14. Что дальше
- Следующий уровень: «Полётный контроллер», урок P1. Интерфейс SPI и драйвер инерциального датчика ICM-42688-P.
- Полный перечень уроков приведён в статье «Курс BeeFC: содержание уровня „Старт“».
Проверено: 13.10.2026
↑ К оглавлению- мод. : Четверг, 15 октября 2026