
То, что ИИ заменил кодеров, уже ясно. А электронщиков ещё нет. Или уже?
Я решил проверить, какова ситуация сейчас, и применил ИИ везде, где смог, при разработке универсального сенсора присутствия.
Я сделал плату с радаром на 60 ГГц и прошивку к ней, и почти на каждом шаге использовал Claude, чаще всего Fable 5. Он подбирал мне микроконтроллер, планировал функции выводов, анализировал комплектацию, писал скрипты для Altium, драйверы и прикладной код. И знаете, практически получилось с первой итерации!
Исходники платы и прошивки опубликованы в отдельном репозитории.
Что делает эта плата
Это универсальный контроллер доступа и безопасности. На борту дисплей, джойстик, CAN, USB, 1-Wire (он же Dallas) для контактных и бесконтактных ключей, шина расширителей ввода-вывода и аудиоусилитель. И главная фишка: радарный чип BGT60TR13CE6327XUMA1.
Детекция присутствия человека критически важна во многих промышленных системах, а плата разработана именно для промышленного применения. Но и в умном доме такая плата очень полезна, вплоть до того, что она может детектировать дыхание ребёнка и его движения либо жизнеспособность пациентов в больницах. А может у качка в спортклубе после тяжёлого подхода измерить дыхание, пульс и тремор.
Выбор микроконтроллера
Обслуживание радара типа BGT60TR13 и всей намеченной периферии требует значительных вычислительных ресурсов. Тут не обойтись чем-то вроде ESP32 или RP2350. Надо было искать более тщательно. С самого начала я решил, что отдам плату на сборку в JLCPCB, поэтому поиск дополнительно ограничивался стоком LCSC. Раньше такая задача выбора микроконтроллера заняла бы неделю, не меньше. Это составление сравнительных таблиц, сравнение параметров, сравнение экосистем средств разработки, сравнение цен и складских запасов, изучение мануалов и поиск подводных камней. Сильнейшим аргументом был бы и предыдущий опыт работы с семействами микроконтроллеров. Я даже уверен, что на складе LCSC я бы либо не нашёл ничего для себя подходящего, либо взял что-то из безумно дорогого.
Claude ничего этого про меня не знал и практически сразу вывел на Artery AT32F435. Чип содержит Cortex-M4F на 288 МГц, имеет 1 МБ флеша, 384 КБ ОЗУ и корпус LQFP64. Совершенно непонятное для меня семейство, как будто клон STM32, но непонятно, насколько полный клон. Сам бы такое не выбрал. Экосистема гораздо беднее STM32, конфигуратора типа CubeMX не имеет, таких нишевых чипов вообще стараюсь избегать. Но доверился Claude.
Первое, с чего надо начать, когда выбрал новый микроконтроллер, — это создать его схемное изображение с полным перечислением функций пинов. Я так всегда делаю. Claude Fable 5 мне быстро по PDF создал полную таблицу пинов и всех их альтернативных функций в файле uC_Pin_functions_table.xlsm. На это ушло полдня.

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

Затем я в схемной библиотеке Altium с помощью функции Symbol Wizard скопировал из специально созданной в Excel таблицы распиновку и сгенерил схемный компонент.
Создание схемы
Сначала была мысль сделать интерфейс расширения ввода-вывода на простейших сдвиговых регистрах. Claude мне за пять минут создал такую схему. Нет, не нарисовал, а написал словами, какие микросхемы и детали нужны и какие цепи к каким пинам подключить, что-то типа текстового описания схемы, применяющегося в симуляторах SPICE. Потом выяснил, что расширители ввода-вывода с I2C стоят почти так же. И бросил идею со сдвиговыми регистрами. На этот экзорцизм (изгнание беса экономии на спичках) ушёл день. Дальше дело пошло быстрее. Вся остальная обвязка в принципе стандартная. Копипастилась из предыдущих схем.
Подбор комплектации
Схему создал поначалу на деталях из своих библиотек, довольно архаичных, созданных на предыдущих проектах. Тут ожидается неприятная рутина, и её всё время хочется отложить или пропустить. Начинается, когда надо всем мелким резисторам и конденсаторам точно расставить уникальные идентификаторы производителей. Это прямо бич начинающих электронщиков: поставить номинал на резистор и забыть о нём. Ни его точность, ни его механические свойства, ни его паразитные свойства, ни мощность: ничего не известно. Есть сборщики, которые сами поймут, что там должно быть, но JLCPCB не такие. Малейшая неточность — и молчаливый отказ портала, либо запаяют абсолютно не то.
Удалось неплохо автоматизировать этот процесс с помощью ИИ.
Сначала Claude написал мне программу на скриптовом языке Altium. Она обходит все компоненты схемы и выгружает в CSV десигнатор и все пользовательские параметры каждого. AltiumParamExport.pas, 6 килобайт.
Потом расширение Claude прямо в Excel подобрало замены по стоку LCSC. По каждой позиции: найти то же самое, проверить, что оно есть на складе прямо сейчас, и если нет, подобрать замену с тем же корпусом, номиналом, вольтажом, допуском и диэлектриком.
А потом второй скрипт залил новые партномера обратно в схему. AltiumParamImport.pas, 10 килобайт. Altium отдал схему в Excel и получил её обратно уже пересобранной под склад.
Не всё, честно сказать, Fable 5 мне нашёл в LCSC. Некоторые вещи нашёл, но они реально отсутствовали на складе. Это можно объяснить тем, что я не использовал API LCSC. И как искал Fable, остаётся лишь догадываться.

Структурная схема
Сначала вся плата одной картинкой:

В центре AT32F435, вокруг него периферия. Шину SPI1 делят радар и EEPROM, причём радар живёт на 1,8 В и общается через трансляторы уровней. Дисплей — на отдельной SPI3, и работает она только на запись. Джойстик — это пять обычных GPIO. USB-C служит сервисным портом, CAN связывает плату с остальным оборудованием, USART2 работает мастером 1-Wire, ЦАП через усилитель выводит звук на динамик, и наружу уходит шина расширителей ввода-вывода.
Дерево питания

На входе — 24 вольта от внешнего питания. Дальше по цепочке:
-
защита входа: диод Шоттки
PDS760-13от переполюсовки и супрессорSMBJ28Aот выбросов; -
импульсный
XL1509-5.0E1с дросселем 47 мкГн даёт 5 В; -
линейный
AMS1117-3.3даёт 3,3 В; -
линейный
RT9013-18GBдаёт 1,8 В радару.

Сигнал DCDC_OFF позволяет микроконтроллеру через вывод PA1 отключить 24-вольтовый преобразователь. Это нужно при питании платы от USB через сервисный разъём, а также для перезапуска периферии при сбоях, которые нельзя устранить программным сбросом, например при защёлкивании портов. Высокий уровень на PA1 отключает питание платы, что отмечено в таблице пинов.
Монтажные отверстия H1–H4 соединены с землёй схемы через перемычку R19 номиналом 0 Ом. При необходимости её можно выпаять и отключить корпус от земли схемы, например при возникновении контура заземления.
Узел радара
Радар работает от 1,8 В, а микроконтроллер — от 3,3 В. Поэтому нужны:
-
стабилизатор
RT9013-18GBдля шины 1,8 В; -
два транслятора уровней
SN74AVC4T245RSVRмежду SPI микроконтроллера и радара; -
опорный генератор на 80 МГц.

Радар имеет шесть отдельных выводов питания: VDD_D, VDD_A, VDD_RF, VDD_PLL, VDD_VCO и VDD_LF. Каждый подключён к шине 1,8 В через отдельную ферритовую бусину. Седьмая бусина фильтрует питание опорного генератора.
Пять бусин имеют импеданс 600 Ом на 100 МГц. Для VDD_RF и VDD_VCO применены бусины на 120 Ом, поскольку эти цепи потребляют больший ток и требуют меньшего падения напряжения.
Шум в цепях питания VCO и PLL вызывает фазовый шум зондирующего сигнала. Он снижает точность измерения малых перемещений, поэтому эти цепи требуют отдельной фильтрации.
В качестве опорного генератора выбран KC2016Z80 от Kyocera AVX с точностью ±20 ppm. Генераторы на 80 МГц в корпусе 2016 отсутствовали среди доступных недорогих компонентов.
Дисплей и джойстик
Пользовательский интерфейс состоит из дисплея и пятипозиционного джойстика.

Дисплей ZJY имеет диагональ 1,54 дюйма, разрешение 240 × 240 точек, матрицу IPS и контроллер класса ST7789. Модуль устанавливается в разъём X5 с шагом 2,54 мм. Интерфейс SPI3 работает только на запись, поскольку линия MISO отсутствует. Изображение можно программно поворачивать на 0°, 90°, 180° и 270°, поэтому плату можно устанавливать в разных ориентациях.
Дополнительные сигналы управляют сбросом, выбором между командами и данными, а также подсветкой. При запуске дисплей удерживается в состоянии сброса до инициализации драйвером. Подсветка подключена к каналу таймера, но в текущей прошивке используется только включение и выключение.
Джойстик ALPS SKRHABE010 поддерживает четыре направления и нажатие по центру. Общий вывод подключён к земле, а внутренние подтяжки микроконтроллера позволяют обойтись без внешних резисторов. Дребезг контактов обрабатывается в прошивке. Имена цепей NAV_SW1…NAV_SW5 не соответствуют физическим направлениям, поэтому их назначение задано таблицей в прошивке по результатам проверки платы.
Сама плата
Плата спроектирована в строгом соответствии с технологическими требованиями стандартной услуги Standard PCB/PCBA компании JLCPCB для плат из FR-4. Её изготовление и монтаж не требуют специальных технологических процессов или расширенных производственных опций.
Изготовление пяти печатных плат обошлось в 63 евро.
Итого: 80 на 70 мм, четыре слоя, толщина 1,645 мм, 142 компонента, 380 связей, разведено на 100%. Дорожки в основном 0,15 мм, переходных отверстий 309 штук по 0,3 мм, всего отверстий 393.
Расстановка и трассировка в Altium
Расстановка компонентов и трассировка платы пока выполняются вручную. Для этих этапов я не нашёл подходящего применения ИИ. Однако Altium упрощает работу с помощью интерактивной трассировки, автоматического раздвигания проводников, выравнивания дорожек и проверки правил в процессе работы.

Дисплей установлен на контактной колодке, поэтому при необходимости его можно снять. Он расположен над центральной частью платы и не перекрывает поле обзора радара. В рендере стекло дисплея сделано полупрозрачным, чтобы показать процессор и трансляторы под ним.

Снизу пусто. Все 130 с лишним SMD-компонентов сидят на верхней стороне, а на нижней — только пять сквозных разъёмов: питание, CAN, 1-Wire, динамик и шина расширителей ввода-вывода. Это осознанно: одна сторона рефлоу вместо двух — дешевле и быстрее в сборке.

И она же целиком, со всех сторон:

Внутренние два слоя — это сплошные полигоны, наружные тоже залиты землёй. Для платы с радаром на 60 ГГц это не роскошь.
Роковая ошибка
Я передал Claude на проверку распиновку микроконтроллера и подключение его сигналов, но не всю законченную схему. Поэтому ошибка в трансляторах уровней U3 и U4 осталась незамеченной.
Для SN74AVC4T245 я использовал посадочное место и нумерацию выводов корпуса RGY, а в спецификацию добавил SN74AVC4T245RSVR в корпусе RSV. Эти корпуса имеют разную распиновку:
|
Сигнал |
Корпус RGY |
Корпус RSV |
|---|---|---|
|
VCCA |
1 |
3 |
|
1DIR |
2 |
4 |
|
1A1 |
4 |
6 |
|
1B1 |
13 |
15 |
|
1OE |
15 |
1 |
|
VCCB |
16 |
2 |
В корпусе RSV назначение сигналов смещено на два вывода относительно RGY. В результате контакты питания и данных на плате не совпали с выводами установленных микросхем.
После обнаружения ошибки Claude предложил, как повернуть U3 и U4, чтобы сократить длину проводников и упростить пайку. Для этого он также скорректировал схему подключения сигналов. Микросхемы установлены выводами вверх и вручную соединены с платой тонкими проводниками. Соединения закреплены термоклеем.

Причиной ошибки стали спешка и отсутствие установленной процедуры проверки всей схемы с помощью ИИ перед заказом платы. А я почему-то не дал ИИ проверить всю схему, хотя спокойно отдал ему на проверку схему подключения микроконтроллера, и он успешно находил там неточности. Тут меня подвело недоверие.
Первый день разработки прошивки
Исходный код прошивки находится в том же публичном репозитории, что и проект платы.
9 июля, в день получения платы, я сделал 23 коммита:
11:46...12:24 структура проекта, таблица пинов, карта памяти и пакет поддержки AT32F43512:42 ThreadX 6.5.112:49 SEGGER RTT13:25 USB CDC-ACM и телеметрия14:49 дисплей15:12 EEPROM и параметры17:48 клиент телеметрии в браузере23:55 джойстик и оконный менеджер
Сначала я проверил назначение выводов, настроил отладчик, ThreadX, журнал и телеметрию. После этого начал добавлять функции устройства.
Управляющий блок SEGGER RTT закреплён линкером по адресу 0x20000000. RTT Viewer подключается по известному адресу без сканирования RAM.
Лучше полдня потерять, но начать пилить фичи уже на платформе, полностью вооружённой отладочными каналами.
Распределение оперативной памяти
Внешней RAM на плате нет, а микроконтроллер имеет 384 Кбайт внутренней SRAM. Из неё 115 200 байт занимает кадровый буфер дисплея, около 46 Кбайт требуется библиотеке определения присутствия. Остальная память нужна для данных радара, USB, стеков ThreadX и других задач. Поэтому от распределения RAM зависит, какие функции могут работать одновременно.

Секция FREE_MEM размещена последней в RAM, а символ __ram_end__ указывает на конец памяти. Область между занятыми секциями и концом RAM передаётся пулу ThreadX. При изменении размера .bss границу пула пересчитывает линкер.
Стеки семи потоков выделяются из пула при запуске и затем не освобождаются. Единственный статический стек используется GUIX и занимает 2 Кбайт. Если памяти для задачи недостаточно, она не создаётся, причина записывается в журнал, а остальные задачи продолжают работать.
Пул занимает область от 0x2003A2A0 до 0x20060000: 154 976 байт, или 39% RAM. Стеки семи потоков используют менее 8 Кбайт. Кадровый буфер дисплея размером 115 200 байт выделяется до создания пула.
Мелкое, но неприятное упущение
Это упущение возникло на этапе составления схемы, когда Claude анализировал и распределял функции выводов микроконтроллера. При выборе интерфейса для радара не были учтены доступные делители частоты и задержка транслятора уровней. В результате SPI1 оказался не самым удачным выбором, а после изготовления платы проблему пришлось решать программным снижением частоты APB2.
При запуске радара обмен по SPI на расчётных частотах оказался нестабильным. Радар работает с уровнями 1,8 В, микроконтроллер — с 3,3 В, поэтому сигнал MISO проходит через транслятор уровней. Его задержка ограничила максимальную частоту интерфейса.

SPI на 48 МГц не работает, а на 36 МГц получено 10 ошибок в 10 циклах. На 24 МГц обмен стабилен.
Частота SPI1 формируется делением частоты APB2. При частоте микроконтроллера 288 МГц стандартная настройка APB2 даёт 144 МГц. Делители SPI у AT32: 2, 3, 4, 8, 16 и далее. Получить 24 МГц от 144 МГц нельзя, поэтому для APB2 установлено 72 МГц. Деление на 3 даёт требуемые 24 МГц. Других потребителей APB2 на плате нет, а АЦП тактируется от другой шины.
Определение и настройка радара выполняются на 9 МГц. Рабочая частота составляет 24 МГц, при ошибках драйвер BGT60TR13C снижает её до 18, затем до 9 МГц.
К драйверу шины SPI1 также подключена EEPROM. Радар работает на 24 МГц, а EEPROM — на 9 МГц при допустимом максимуме 16 МГц. Доступ к шине защищён мьютексом с наследованием приоритета. Перед каждой транзакцией драйвер при необходимости изменяет делитель.
Как работает FMCW-радар
FMCW (Frequency-Modulated Continuous Wave) — это радар с непрерывным излучением и частотной модуляцией. Он формирует чирп от 61,02 до 61,48 ГГц с полосой 460 МГц. Задержка отражённого сигнала преобразуется в разностную частоту. После фильтрации и БПФ получается профиль дальности. При такой полосе шаг профиля составляет 32,6 см.
Кадр содержит 128 отсчётов на чирп, 16 чирпов и данные трёх приёмных антенн: всего 6 144 отсчёта. Частота кадров составляет 50 Гц, период равен 20 мс. После команды запуска радар формирует кадры по своему таймеру, выдаёт прерывание, а задача радара забирает данные по DMA.
Радар работает непрерывно. Повторный запуск требует стабилизации PLL и добавляет джиттер в данные.
Детектор присутствия
Основной детектор использует библиотеку Infineon и занимает около 46 Кбайт памяти из пула. Библиотека анализирует изменение профилей дальности во времени и отдельно определяет крупные и малые движения.
Если память для библиотеки выделить не удаётся, модуль обработки радара записывает ошибку в журнал и переключается на резервный детектор. Он хранит отдельную базу для каждого бина дальности. Вверх база изменяется с коэффициентом 0.005 и постоянной времени около 11 секунд, вниз с коэффициентом 0.05 и постоянной около 1 секунды. Активный алгоритм указывается в телеметрии.
При полосе 460 МГц физическое разрешение по дальности составляет 32,6 см. Параболическая интерполяция по максимальному бину и двум соседним позволяет оценить положение одиночной цели с шагом около 3…5 см, но не позволяет разделить близкие цели в одном бине.
Дисплей и телеметрия в браузере
Дисплей 240 × 240 точек подключён по SPI со скоростью 36 Мбит/с. Второй буфер потребовал бы ещё 115 200 байт RAM, поэтому двойная буферизация не используется. DMA не применялся: при частичном обновлении экрана программная передача поддерживает полную скорость SPI, а асинхронная передача потребовала бы дополнительной синхронизации единственного кадрового буфера.
Графическая библиотека GUIX обновляет только изменившуюся область экрана. Драйвер дисплея ожидает освобождения передающего регистра SPI перед записью следующего байта, а полного завершения обмена — один раз в конце блока. По сравнению с ожиданием завершения каждого байта это увеличило скорость заливки примерно в три раза.
Поток графики имеет приоритет 20, а задача радара имеет приоритет 13. Поэтому радар может прервать отрисовку.
Адрес буфера кадра добавлен в таблицу телеметрии. Браузер считывает через USB 115 200 байт частями и формирует снимок экрана. Отдельная команда не требуется: протокол поддерживает чтение областей памяти.
WebDevLink
WebDevLink — браузерное приложение для настройки и диагностики контроллера. Оно открывается непосредственно из файла index.html в Chrome или Edge и подключается к виртуальному COM-порту платы через Web Serial API, поэтому устанавливать отдельную программу не требуется. При первом подключении пользователь выбирает порт, а при следующих запусках приложение может восстановить соединение автоматически.
Интерфейс состоит из перемещаемых и изменяемых по размеру панелей; их расположение сохраняется в браузере. В них можно читать и записывать параметры энергонезависимой памяти, наблюдать профиль дальности, положение цели, частоту дыхания и другие диагностические данные, а также получать снимок дисплея платы. Границы зоны присутствия изменяются мышкой, новые значения передаются в плату и применяются примерно за 0,3 секунды. На дисплее платы выводится текст, а подробные графики отображаются в браузере.

Подключение к Infineon Radar Fusion GUI
Infineon Radar Fusion GUI работает с отладочными платами через протокол Strata. Для подключения моей платы в прошивку добавлен мост этого протокола через USB. Он позволяет программе управлять радаром и записывать необработанные данные.

Мост занимает 3 720 строк кода. Его буфер рассчитан на кадр размером 128 × 32 × 3, то есть 12 288 отсчётов.
Мост и библиотека определения присутствия не могут одновременно использовать доступный пул памяти. При переходе в режим моста библиотека освобождает около 46 Кбайт. Эти режимы работают поочерёдно.
Мост записывает кадры с временными метками. Затем одни и те же данные можно многократно обрабатывать офлайн и проверять изменения алгоритма без повторения измерений.
Занятость Flash и RAM
После сборки прошивка занимает 335 686 байт Flash: 181 487 байт кода и 154 199 байт константных данных. Это 32,0% доступного объёма в 1 Мбайт. Статические данные занимают 238 249 байт, или 60,6% от 384 Кбайт RAM. Оставшаяся RAM используется динамическим пулом ThreadX.
В обычном режиме, когда на дисплее открыто основное окно приложения, свободными остаются около 98 Кбайт RAM. При работе моста Strata с Infineon Radar Fusion GUI дополнительная память расходуется на буферы необработанных радарных кадров и USB-обмена, поэтому свободный объём сокращается примерно до 45 Кбайт.

Таймлайн проекта

Разработка платы заняла восемь дней. Разработка прошивки заняла пять дней. Между отправкой платы на производство и началом работы с прошивкой прошло двадцать дней.
Итог
Итог, надо сказать, вдохновляющий. Скорость разработки точно выросла в несколько раз. За всё время разработки софта ни разу не пришлось прибегнуть к ручной отладке. Через канал USB агент Claude в VS Code сам мог получать логи и делать исправления. Да, алгоритм ещё сыроват для продукции. Не хватает проверки на краевые условия, помехи, климатику, электромагнитную совместимость. До сертификации здесь как до Луны. Но это уже другая тема.
ссылка на оригинал статьи https://habr.com/ru/articles/1059562/