Дорожная карта обученияНачальный

Основы электроники роботов: дорожная карта обучения

Обеспечьте стабильную работу робота под нагрузкой, подключите несколько датчиков к одной шине I²C и напишите цикл, который считывает их все, ни разу не блокируясь.

Большинство проблем роботов, похожих на программные, такими не являются. Плата перезагружается — и винят код; датчик возвращает бессмыслицу — и винят библиотеку; робот игнорирует бампер — и винят логику. В каждом случае неисправность находится на более низком уровне, в той части системы, для которой никто не написал учебное руководство, посчитав её слишком простой.

Этот путь посвящён именно такому уровню. Он рассматривает питание — почему напряжение батареи падает при запуске двигателей и что с этим делать; шину I²C — что на самом деле делают два провода, общие для всех датчиков; и синхронизацию — почему цикл, останавливающийся в ожидании, не позволяет роботу реагировать.

Всё это несложно. Но всё это предполагается каждым другим путём на сайте.

Прежде чем начать

Вам нужен микроконтроллер, который уже можно прошивать, и готовность подключить мультиметр к аккумулятору. Теория управления и математика здесь не нужны; достаточно сложения и одного деления. Если вы создавали что-либо — даже мигающий светодиод (LED), — вы готовы.

Чему вы сможете научиться

  • За минуту отличить перезагрузку от аварийного завершения и понять, с чем столкнулись, ещё до открытия кода.
  • Сложить потребляемый роботом ток и по полученному числу выбрать аккумуляторный блок, а не полагаться на комплектацию набора.
  • Объяснить, почему батарейный блок 9 V с самым высоким напряжением на полке хуже всех работает под нагрузкой, и предсказать просадку любого блока.
  • Подключить несколько датчиков к одной шине I²C, найти их сканером и разрешить конфликт адресов тремя способами.
  • Написать цикл, который считывает датчики, управляет двигателями и сообщает состояние на трёх разных частотах, ни разу не блокируясь, и правильно обработать переполнение.
  • Измерить наихудшее время своего цикла вместо предположения.

Где обычно возникают трудности

Считать сообщение «он не перезагрузился» доказательством исправности питания. Детектор просадки Arduino настроен на 2.7 V, но ATmega328P для работы на номинальной частоте 16 MHz требует около 3.8 V. В этом диапазоне микросхема работает за пределами допустимых параметров, и ничто не вмешивается; именно там возникают самые странные неисправности робота: повреждённые переменные, скачок сервопривода, датчик, возвращающий правдоподобную бессмыслицу.

Добавить конденсатор и ожидать, что он устранит перезагрузку. Расчёты говорят об обратном: конденсатор 1000 µF, нагруженный на всплеск 2 A в течение 10 ms, потерял бы 20 V. Он сглаживает пульсации переключения и выбросы при коммутации, что стоит делать, но только более жёсткая батарея выдержит сам скачок.

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

Считывать 8-битный адрес из паспортных данных. В паспорных данных MPU-6050 указано 0xD0; библиотека Arduino ожидает 0x68 — те же биты, сдвинутые вправо на один. Это самая частая ошибка I²C, и она выглядит точно как неисправная плата.

Писать now >= last + interval. Такая запись читается естественнее вычитания, но ломается при переполнении счётчика через 49.7 дня и постоянно срабатывает вместо ожидания. Всегда вычитайте.

Считать зависание цикла ошибкой его логики. Во время delay() прерывания продолжают выполняться, поэтому счётчик энкодера остаётся верным, пока робот перестаёт реагировать; из-за этого симптом выглядит как ошибка принятия решений, а не синхронизации.

Что понадобится

Что Зачем это нужно пути Примерная стоимость
Микроконтроллер, который можно прошивать Все измерения здесь выполняются на работающей плате, а не на бумаге Arduino Uno, клон ~$8
Мультиметр Единственный прибор, без которого не обойтись: каждое утверждение пути вы проверяете сами ~$15
Аккумуляторный блок под нагрузкой Блок без нагрузки ничего не сообщает; он должен питать устройство Держатель 4×AA или 2S Li-ion
Две отладочные платы I²C Одна плата не показывает проблему с подтягивающими резисторами, две — показывают MPU-6050 + что угодно, ~$5
Один или два двигателя Нагрузка, вызывающая просадку шины, — неисправность, ради объяснения которой существует этот путь Любой редукторный двигатель постоянного тока (DC)

Осциллограф не нужен. Все измерения этого пути — постоянные (DC), доступные недорогому мультиметру.

Почему путь устроен именно так

Порядок не произволен: каждый узел устраняет возможность следующего обмануть вас.

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

Питание идёт перед аналоговой частью. analogRead на Arduino является ратиометрическим: он сообщает вход как долю опорного значения, а опорное значение по умолчанию совпадает с той же шиной 5 V, которую просаживают двигатели. При измерении батареи через делитель на просаженной шине показание растёт по мере падения батареи. Корректно измерить напряжение невозможно, пока неизвестно, что происходит с шиной, поэтому узел питания должен идти первым.

I²C идёт после питания, но независим от аналоговой части. Шина — отдельная подсистема со своим способом отказа, через расчёт подтягивающих резисторов и конфликты адресов, а не через просадку питания. Она напрямую зависит от узла платы, поэтому дерево разветвляется там.

Лабораторная работа идёт последней. Симулятор датчиков позволяет намеренно добавлять к чистому сигналу шум, смещение и провалы. Это становится поучительным только после того, как вы увидели те же эффекты на своём оборудовании и узнали причину каждого.

Контрольные точки: как проверить усвоение этапа

Каждая проверка проводится на стенде, а не в опросе. Если нельзя получить число, этап не завершён.

Этап Проверка Признак успешного прохождения
Неблокирующая синхронизация Выведите максимальную длительность цикла за 10 секунд Получено измеренное число в микросекундах, а не предположение, и оно не растёт при отключённом датчике
Батарея под нагрузкой Измерьте напряжение блока при выключенных и заблокированных двигателях Можете назвать просадку в вольтах и разделить её на ток, получив внутреннее сопротивление блока
Бюджет питания Сложите на бумаге потребляемый ток всех устройств, затем измерьте суммарный ток Расчёт и прибор совпадают примерно на 20%; иначе найдено устройство, потребляющее больше паспортного значения
Аналоговый вход Измеряйте одну и ту же батарею через делитель при выключенных и работающих двигателях Показание не меняется при запуске двигателей; иначе смещается опорное значение
Шина I²C Запускайте сканер шины, каждый раз добавляя по одной плате Видны все адреса, и можно назвать суммарное сопротивление подтягивающих резисторов на шине
Конфликт адресов Подайте высокий уровень на вывод AD0 микросхемы MPU-6050 Сканер сообщает 0x69 вместо 0x68, и можно объяснить, почему в паспортных данных указано 0xD0

Где заканчивается этот путь

Эта дорожная карта намеренно заканчивается там, где электроника перестаёт вводить вас в заблуждение. Она не рассматривает драйверы двигателей, контуры управления или что-либо, определяющее, куда должен ехать робот: это темы управления двигателями и ПИД-регулятора (PID), и обе предполагают всё изложенное выше.

Она также не охватывает три темы, о которых стоит знать. Здесь не рассматриваются импульсные регуляторы, с помощью которых получают 5 V от блока 12 V, не сжигая разницу в тепло на линейном регуляторе. Не рассматривается сдвиг уровней между устройствами 5 V и 3.3 V, который понадобится при первом подключении ESP32 и датчика 5 V к одной шине. Также не рассматриваются разводка печатной платы (PCB) или пайка: всё здесь выполняется на макетной плате, что подходит для обучения, но при движении робота само по себе становится источником периодических неисправностей.

Дорожная карта обучения

Путь

Проходите узлы по порядку — каждый открывает следующий, когда вы его выполните. Ваш прогресс сохраняется на этом устройстве.

0 / 9 выполнено

100%
Симулятор

Посмотрите, как выглядит реальный поток данных датчика

Интерактивно

Открыть симулятор
Цель

Постройте основу надёжной системы

Навык открыт

Частые вопросы

Часто задаваемые вопросы

Какие основы электроники нужны перед созданием робота?

Три основы, и ни одна не требует сложной теории. Нужно выбрать источник питания по току, который робот действительно потребляет, чтобы он не перезагружался при запуске двигателей. Нужно достаточно хорошо понимать шину I²C, чтобы подключить несколько датчиков к двум общим проводам без конфликтов. И нужно написать контур управления, который никогда не останавливается в ожидании, чтобы робот мог реагировать во время других действий. Всё остальное — теория управления, навигация, кинематика — строится поверх этих трёх основ.

Почему мой Arduino перезагружается при запуске двигателей?

Внутреннее сопротивление батареи превращает пусковой ток двигателей в просадку напряжения, и вся шина питания опускается вместе с ним. Двигатель, потребляющий всплеск 2 A через блок с внутренним сопротивлением 0.5 Ω, снижает напряжение на шине на целый вольт до того, как оно достигнет регулятора. Если эта просадка опускает плату ниже порога сброса, она перезагружается. Исправление — более жёсткая батарея и отдельное питание двигателей, а не конденсатор большей ёмкости: конденсатор 1000 µF, нагруженный на 2 A в течение 10 ms, потерял бы 20 V и не смог выдержать такой скачок.

Сколько датчиков I²C можно подключить к одному Arduino?

Пространство адресов допускает 112 устройств, но электрический предел наступает значительно раньше. Почти каждая отладочная плата имеет собственные подтягивающие резисторы, обычно 4.7 kΩ, и при соединении плат они оказываются параллельно. Четыре платы дают примерно 1.2 kΩ, что при 5 V требует более 4 mA стокового тока, тогда как устройство I²C обязано выдерживать 3 mA. Обычно работают три платы, а четвёртая выводит из строя всю шину. Удалите подтягивающие резисторы со всех плат, кроме одной, и подключите значительно больше устройств.

Настолько ли плох delay() в коде робота?

Для робота — да. Пока процессор находится в delay(), он не считывает датчики и не принимает решений: робот в delay(500) полсекунды ничего не видит, а при 0.3 m/s это перемещение на 15 cm. Диагностировать это трудно, поскольку прерывания продолжают выполняться и показания энкодера всё время остаются верными. Симптом выглядит как ошибка логики поведения, а не как ошибка синхронизации. Замените delay() шаблоном millis() и при сравнении вычитайте, а не прибавляйте, иначе сравнение сломается при переполнении счётчика через 49.7 дня.

Нужен ли осциллограф для прохождения этого пути?

Нет. Для всего здесь достаточно мультиметра: измерить напряжение батареи под нагрузкой, проверить выход делителя, подтвердить отсутствие просадки шины. Осциллограф позволяет гораздо проще увидеть просадки питания и проблемы I²C, и если он есть, им стоит пользоваться, но все измерения этого пути — постоянные (DC), доступные мультиметру за £10.

Сколько времени занимает эта дорожная карта?

Около двух часов чтения четырёх учебных руководств и реалистично одного-двух вечеров за измерениями. Именно измерения — смысл этого пути: числа, которым он учит доверять, — это просадка вашей батареи, суммарное сопротивление подтягивающих резисторов вашей шины и наихудшее время вашего цикла, и ни одно из них нельзя найти в справочнике.