Продолжение серии публикаций, посвящённых проекту "умные пайетки". Предыдущие части: 1, 2, 3, 4. В данной статье расскажу о том как мы переводили пайетки на китайские микроконтроллеры Padauk и применяли Миландр в устройстве управления матрицей электромеханических цветовоспроизводящих устройств.
Новая схемотехника пайеток
Основная статься расхода при производстве пайеток – электроника. Наибольшей стоимостью обладают микросхемы (микроконтроллер и драйвер двигателя). Было решено заменить интегральный драйвер на пару Н-мостов на полевых транзисторах, а ATtiny13 на 5 рублёвые микроконтроллеры, которые мы изучали в этой статье.
Поиск решения и тупиковая ветвь разработки
Поскольку габариты и масса устройства являются одним из важных параметров в этом проекте, я хотел уменьшить размеры платы настолько, насколько это возможно. На первых порах было принято решение использовать микроконтроллер PFC161 в корпусе SOT23-6. Однако получалось, что тогда на управление шаговым двигателем отводилось всего 2 свободных пина (2 пина – питание, 2 пина – вход и выход данных).
И этими двумя пинами необходимо было управлять двумя Н-мостами. Задачка непростая. Вспомнив, что каждый пин микроконтроллера может находиться в трёх состояниях (подтянут к +, подтянут к GND и HZ), была предложена схема следующая схема управления Н-мостом:
Вход key1_input подключается к пину микроконтроллера. Выходы key1_out и key2_out подключаются к Н-мосту. В состоянии по умолчанию key1_input «висит в воздухе», в это время выходы подтянуты к питанию через резисторы R12 и R9 соответственно. Потенциал баз транзисторов VT1 и VT2 одинаков и равен половине напряжения питания за счёт делителя R5 – R6. Номиналы этих резисторов выбраны большими, чтобы ток утечки был минимален. Транзистор VT1 и VT2 закрыты.
Когда на key1_input подаётся сигнал положительной полярности (подтягивается к +), потенциал эмиттера VT1 становится выше потенциала базы, что не позволят ему открытья. В то же время, потенциал эмиттера VT2 становится выше потенциала базы и так как это PNP транзистор, он открывается. Ток течёт по пути: key1_input – R3-эмиттер VT2 – коллектор VT2 – база транзистора VT3. В результате VT3 открывается и на выходе key1_out2 появляется низкий логический уровень.
Когда key1_input подтянут к GND, открывается транзистор VT1, а VT2 закрывается, в результате чего key1_output оказывается прижат к земле.
Таким образом, используя
три состояния пина микроконтроллера удаётся создать два сигнала для управления
Н-мостом. Принципиальная схема моста выглядит следующим образом:
В качестве микроконтроллера в отладочной плате использовался ATtiny13A-MMU:
Далее была разработана топология отладочной платы:
И изготовлен прототип, на котором можно отлаживать алгоритм управления шаговым двигателем:
При нажатии на одну кнопку шаговый двигатель должен поворачиваться на заданное количество шагов влево. При нажатии на другую кнопку – то же количество шагов вправо. Как ни странно такое решение работает и весьма стабильно.
Идея мне настолько понравилась, что я решил произвести дальнейшее усовершенствование схемы, сократив количество транзисторов. При использовании полевых транзисторов можно увеличить номиналы резисторов делителя напряжения, что ещё больше должно сократить ток утечки при работе устройства. Предложена обновлённая схема коммутатора и Н-моста:
Моделирование в пакете Multisim показало, что схема работает. Но до практической реализации не дошло. В конце концов мне показалось, что получается не очень эффективно... много транзисторов, много резисторов, много возни... Лучше уж использовать микроконтроллер с 8 пинами. Такая вот тупиковая ветвь разработки. Мне хотелось поделиться этими результатами и схемотехническими решениями, поскольку понимаю, что более не удастся их применить на практике…
Эксперименты с отладочной платой на базе PFC161-U08B
Микроконтроллер PFC161 в корпусе SOIC8 позволяет использовать по 2 пина для управления каждым Н-мостом. Для отладки прошивки и проверки схемотехнических решений была разработана отладочная плата на базе микроконтроллера PFC161. Подробнее про эту плату я рассказывал в публикации о микроконтроллерах Padauk. Поскольку в документации на данную микросхему был указан режим внутрисхемного программирования, я решил использовать именно его.
Под тем постом товарищ @N-Cube справедливо указал мне на недочёты в схемотехнике: отсутствие защитных диодов транзисторов, а также конденсаторов по питанию моста. Я решил не верить на слово, а посмотреть, что там твориться в линии питания при работе схемы.
Эксперимент: управление шаговым двигателем в полношаговом режиме. Сопротивление обмотки двигателя 30Ом. Сопротивление последовательно включенного резистора 10Ом. Напряжение питания моста 5В.
На отладочной плате в двух местах были сняты осциллограммы напряжений. Точка 1 – непосредственно на пине 3 микроконтроллера (VCC). Точка 2 – питание нижнего по плате Н-моста:
Как видно, напряжение питание МК колеблется с амплитудой 168 мВ. Среднее значение тока, потребляемого двигателем, составляет 230мА. Обратим внимание, на то, что количество пиков в два раза меньше, чем количество шагов, которое совершает двигатель.
Во второй серии экспериментов рядом с пинами питания микроконтроллера был установлен электролитический конденсатор 10 мкФ х 50 В.
Амплитуда броска напряжения на пинах микроконтроллера снизилась до 100 мВ, что уже неплохо.
Далее пробуем установить диоды (диоды Шоттки BAT42), гасящие броски ЭДС при переключении направления тока в обмотках двигателя.
Всё те же 100 мВ. Похоже внутренние диоды самих транзисторов самостоятельно справлялись с возложенными на них задачами. Хотя, возможно, что нужны более быстродействующие диоды.
Новая печатная плата
Прислушавшись к советам опытных товарищей, подкрепив их экспериментальными данными, было принято решение дополнить схему защитными диодами и парой танталовых конденсаторов ёмкостью 10мкФ. Была разработана новая схемотехника пайетки.
Предполагалось, что микроконтроллер будет программироваться перед монтажом, поэтому никаких разъёмов для подключения к программатору не предусматривалось. К тому же, как я успел заметить, программатор Padauk довольно капризный, в общем случае он не может «увидеть» микросхему, если к её выводам подключена хоть какая-то нагрузка. Печатную плату удалось уместить в габариты защитного купола пайетки, сохранив стек слоёв (два слоя, толщина платы 0,5мм):
Крупные полигоны по краям платы – линии питания. Они передают питание на следующие пайетки, поэтому минимальная ширина полигона составляет 2мм. Печатная плата заказывалась в «Резоните» по цене 3300 рублей за 12 плат с панелизацией (цена на август 2022). После сборки получаем вот такую красоту:
Печатная плата разрабатывалась под микроконтроллер PFC161 с перезаписываемой памятью. После отладки прошивки, он будет заменён на PMS152.
Технико-экономический расчёт
Произведено сравнения себестоимости комплектующих необходимых для изготовления одной пайетки. Все цены указаны для магазина LCSC (в долларах).
Первая таблица – текущая версия на базе микроконтроллера ATtiny13A и драйвера шагового двигателя STSPIN220.
Компоненты |
Количество |
Цена (от 1 шт.) |
Стоимость (от 1 шт.) |
Цена (от 100шт.) |
Стоимость (от 100шт.) |
ATtiny13-MMU |
1 |
1,77 |
1,77 |
1,33 |
1,33 |
STSPIN220 |
1 |
2,08 |
2,08 |
1,54 |
1,54 |
Шаговый двигатель |
1 |
0,27 |
0,27 |
0,27 |
0,27 |
Резистор 47кОм SMD0402 |
3 |
0,0037 |
0,0111 |
0,0037 |
0,0111 |
Резистор 220Ом SMD0402 |
2 |
0,0006 |
0,0012 |
0,0006 |
0,0012 |
Резистор 1кОм SMD0402 |
2 |
0,0007 |
0,0014 |
0,0007 |
0,0014 |
Резистор 100кОм SMD0402 |
1 |
0,0006 |
0,0006 |
0,0006 |
0,0006 |
Резистор 0,33Ом SMD0805 |
2 |
0,21 |
0,42 |
0,08 |
0,16 |
Конденсатор керамический 0,1мкФ 25В SMD0402 |
2 |
0,0012 |
0,0024 |
0,0012 |
0,0024 |
Конденсатор керамический 10мкФ 10В SMD0402 |
1 |
0,03 |
0,03 |
0,03 |
0,03 |
Конденсатор керамический 22нФ 25В SMD0402 |
1 |
0,0038 |
0,0038 |
0,0038 |
0,0038 |
Курс доллара (05.08.2022) |
60,26 |
Итого ($): |
4,53 |
Итого ($): |
3,29 |
|
|
Итого (Руб): |
273,45 |
Итого (Руб): |
198,73 |
Вторая таблица – новая версия электронного бока управления на базе микроконтроллера PMS152 с драйвером шагового двигателя на базе транзисторных Н-мостов.
Компоненты |
Количество |
Цена (от 1 шт.) |
Стоимость (от 1 шт.) |
Цена (от 100шт.) |
Стоимость (от 100шт.) |
PMS152-SO8 |
1 |
0,08 |
0,08 |
0,06 |
0,06 |
Шаговый двигатель |
1 |
0,27 |
0,27 |
0,27 |
0,27 |
Транзистор N-MOSFET 2N7002 |
8 |
0,017 |
0,136 |
0,017 |
0,136 |
Транзистор P-MOSFET BSS84 |
4 |
0,018 |
0,072 |
0,018 |
0,072 |
Диод Шоттки |
8 |
0,04 |
0,32 |
0,04 |
0,32 |
Резистор 47кОм SMD0402 |
8 |
0,0037 |
0,0296 |
0,0037 |
0,0296 |
Резистор 220Ом SMD0402 |
2 |
0,0006 |
0,0012 |
0,0006 |
0,0012 |
Конденсатор керамический 0,1мкФ 25В SMD0402 |
2 |
0,0012 |
0,0024 |
0,0012 |
0,0024 |
Конденсатор керамический 10мкФ 10В SMD0402 |
2 |
0,03 |
0,06 |
0,03 |
0,06 |
Курс доллара (05.08.2022) |
60,26 |
Итого ($): |
0,91 |
Итого ($): |
0,89 |
|
|
Итого (Руб): |
55,35 |
Итого (Руб): |
54,14 |
Как видно из таблиц, удалось добиться снижения себестоимости комплектующих почти в 4 раза! Хороший результат, уже годится для серии.
Конструкция пайетки
В целом, конструкция не претерпела никаких серьёзных изменений. Но рама теперь также печатается из PLA пластика. Это значительно быстрее, чем фрезеровка, вес детали получается меньше, чем при использовании стеклотекстолита или POM пластика. Жёсткость конструкции обеспечивается за счёт склеивания рамы и печатной платы.
А вот так это выглядит в собранном виде:
Решено было отказаться от использования разъёмных винтовых соединений при креплении заднего защитного купола. Теперь он приклеивается к раме. Это нисколько не портит эстетику, зато экономит время на закручивание этих винтов, снижает массу пайетки и её себестоимость. Из особенностей можно отметить, что теперь пайетка собирается отдельно и затем устанавливается в отверстие в креплении на ткани. Это упрощает сборку и настройку механики пайетки.
Прошивка для пайеток (PFC161-S08B)
Опыт эксплуатации показал, что идея внутрисхемного программирования микроконтроллера с малым количеством ножек не очень хорошая. Было решено сделать по другому: установить микросхему на переходник SOIC-DIP, подключать его в разъём на отладочной плате, а при необходимости извлекать и подключать в разъём на программаторе. Удобно, когда единственный способ отладки - перепрошивка контроллера... А когда нужно прошивать серию контроллеров, то их легко менять и проверять исправность работы.
Предполагалось управлять мотором в полношаговом режиме. То есть под напряжением различной полярности находятся одновременно две обмотки. Необходимо было добавить в алгоритм управления deadtime задержки, чтобы транзисторы в полумостах успевали закрываться и только потом открываться. В табличном виде последовательность логических состояний на выходах микроконтроллера выглядит следующим образом:
Я подумал, что хорошей идеей будет упаковать всё это в массив и поочерёдно выставлять в регистр данных порта микроконтроллера. Задержки между переходами от одного состояния пинов к другому будут чередоваться между DEADTIME_DELAY и PHASE_DELAY. Указатель постоянно хранит текущий шаг цикла, на котором остановился контроллер, поэтому никаких «запинок» быть не должно. Такой алгоритм управления позволяет более точно производить позиционирование положения ротора двигателя. В предыдущем варианте можно было задавать дискретность поворота равную одному циклу (одной таблице), то есть последовательности из 8 шагов (включая deadtime комбинации).
Массив перебирается в прерывании по таймеру. Использовался 8 битный таймер. Предел счёта задаётся в регистре TM2B. В прерывании текущая фаза выставляется в регистр данных порта A, происходит инкремент указателей, установка флагов и обновление регистра TM2B новым значением. Таким образом, управление двигателем становится независимым от обработки интерфейсных команд, которая производится в основном цикле и реализована в виде конечного автомата. В случае, когда не происходит обмен данными и не производится смена цвета, контроллер переводится в режим пониженного энергопотребления power-down. В этом режиме электронный блок управления пайеткой потребляет 1мкА.
Для определения временных интервалов при приёме команды используется 16 битный таймер. В микроконтроллерах PADAUK он сделан максимально простым. И не может выполнять никаких операций, кроме прямого счёта и вызова прерываний. Для того чтобы произвести сброс таймера при помощи команды STT15 value в его счётный регистр загружается значение 0. Чтобы проверить сколько насчитал таймер, из того же регистра извлекается значение командой LDT16 value.
Наличие 8 битного и 16 битного таймера предусмотрена и в контроллере PMS152 с OTP памятью, так что этот код может быть в дальнейшем партирован на него без необходимости вносить модификации.
Особенности спящего режима микроконтроллеров Padauk
Для перехода в режим пониженного энергопотребления есть специальная процессорная команда stopsys. После выполнения этой команды происходит остановка всех генераторов микроконтроллера, отключается память программ и немногочисленная периферия. Выйти из этого режима можно только при смене логического уровня на одном из пинов. И вот тут есть особенность.
Один и тот же микроконтроллер может выпускаться в различных корпусах с различным количеством выводов. Это не означает что как-то изменяется топология самого кристалла, просто при размещении этого кристалла в корпусе часть выводов не разваривается.
Для выхода из спящего режима (power-down) используются только внешние выводы микроконтроллера. Какие именно: определяется регистрами PADIER и PBDIER. Если в соответствующем бите стоит «1», то вывод используется для выхода их спящего режима. Причём, по умолчанию (после сброса контроллера) все биты устанавливаются в «1», то есть микроконтроллер просыпается от каждого шороха на пинах. Причём буквально!
У микроконтроллера PFC161 в корпусе SOIC-8 нет вывода PB7, но в регистре PBDIER есть соответствующий бит, разрешающий использовать его как источник события для пробуждения. Если PADIER = 0x00, а PBDIER = 0x80, то контроллер будет ловить наводки этим пином, в результате чего будет постоянно выходить из спящего режима.
Я долго не мог понять в чём дело. Контроллер вроде проваливался в power-down после команды stopsys, но амперметр показывал ток в районе 70мкА, что никак не соответствовало заявленным в даташите 1мкА. Оказалось, что я не верно настроил эти самые PxDIER регистры портов.
И ещё небольшая особенность: если сброшен бит в PxDIER, то даже если соответствующий пин настроен на вход, то с него не получается прочитать значение (в регистре данных постоянно 0). Не знаю в чём тут дело… просто есть такое наблюдение.
Ещё одно замечание по поводу режима пониженного энергопотребления. Чтобы выйти из этого режима, микроконтроллеру требуется некоторое время. При этом, пятый бит регистра MISC устанавливает время пробуждения микроконтроллера. По умолчанию оно равно около 3000 тактов внутреннего низкочастотного генератора (ILRC). Но есть возможность выбрать и режим, в котором пробуждение занимает всего 45 тактов. Чем отличаются два режима в даташите не сказано. Возможно, это как-то связано с временем выхода генератора на стабильную частоту при различных напряжениях питания. В целом, никакой нестабильности при быстром выходе из power-down режима не наблюдалось.
Частота ILRC равна 64кГц. 45 тактов – это около 700мкС. Не так уж много, но и не так уж мало. Был протестирован выход из спящего режима по восходящему фронту на линии данных (синий график). При выходе из спящего режима на пине PA6 устанавливается высокий уровень (жёлтый график). Как только на линии данных низкий логический уровень микроконтроллер снова переходит в спящий режим. Результаты экспериментов показали 640мкС. Что вполне соответствует расчётным значениям.
Центральный контроллер на базе K1986BE92QI
Центральный контроллер выполняет функции обмена данными между программным обеспечением определяющим поведение матрицы (софт верхнего уровня) и самой матрицей.
Функции центрального контроллера:
- принять от софта верхнего уровня требуемое состояния матрицы пайеток и подтвердить успешное выполнение команды;
- перевести матрицу в указанное состояние как можно быстрее;
- не допускать потребления матрицей чрезмерного тока путём контроля количества одновременно переключаемых пайеток.
Последний пункт реализуется с помощью алгоритма, который будет рассмотрен ниже.
Поскольку имелось желание и самое главное – возможность, в качестве вычислительного центра использовался микроконтроллер фирмы МИЛАНДР K1986BE92QI. Прошивка писалась в среде Keil uVision5. Отладка через китайский STlink v2.
Была разработана плата центрального контроллера, обеспечивающая перечисленный функционал. На плате размещается микроконтроллер, его обвязка, преобразователь USB-UART на CH340, датчик тока ACS712, EEPROM AT25320B, индикаторные светодиоды, кнопка управления, OLED дисплей на базе контроллера SD1306, разъём USB-C, разъём IDC6 для подключения матрицы. Для программирования микроконтроллера выведен разъём PLS4 под SWD программатор.
После подключения к USB, контроллер в течение 5 секунд ожидает подключение к софту верхнего уровня (экран загрузки на фото). Если этого не происходит, то включается демо-режим в котором контроллер передаёт команды на поочерёдное переключение пайеток в матрице с задержкой 200мС. Количество пайеток в матрице в этом случае берётся из памяти, как максимальный номер пайетки переключенной в предыдущей сессии.
Датчик тока ACS712 так и не заработал… что я только с ним не делал. Его я выпаивал из старенького китайского модуля с неизвестной историей. Ценник на новые микросхемы меня не порадовал, поэтому подумал, что обойдусь пока без него.
Также вариант контроллера был разработан на базе микроконтроллера ATmega328P. Это на случай, если использовать "Миландры" в дальнейшей работе не получится. Все схемы, платы и прошивки находятся в репозитории (ссылка в конце статьи).
Алгоритм переключения пайеток в матрице
Был оптимизирован протокол передачи команды пайеткам. Осциллограмма сигнала переключения первой пайетки в матрице на выходе центрального контроллера:
Для того чтобы не допустить потребление матрицей пайеток чрезмерного тока реализован алгоритм последовательного переключения пайеток. При этом, смена цвета матрицы происходит «волной». Для этого вводится задержка между переключениями. Фактически одновременно отдаётся команда на переключение только одной пайетки.
Предположительно это должно работать так:
А вот что получилось при испытаниях реальной матрицы пайеток (в ходе эксперимента использовалась матрица пайеток из предыдущей статьи, поэтому время переключения и передачи сигнала отличаются от представленных выше).
Зелёный график – информационный сигнал на входе матрицы пайеток. Жёлтый – напряжение на шунте (сопротивление шунта 0,8Ом 2%). Розовый – усреднение напряжения шунта по 20 точкам. Величина задержки между переключениями пайеток установлена равной 20мс.
Для начала посмотрим как переключается одна пайетка в матрице. Видно, что пиковый ток потребления равен 456мА. Время переключения 110мС.
Теперь попробуем смоделировать переключение нескольких пайеток.
Форма графика величины напряжения на шунте (тока потребления матрицы) очень напоминает теоретический. Даже характерные ступеньки проявляются. Итоговое время переключение матрицы составляет 244мс.
Можно заметить, что задержка между переключениями пайеток далека от 20мС, которые были заявлены в условиях эксперимента. Однако, если посмотреть на информационный сигнал, то промежутки между кадрами строго одинаковы и составляют 20мС. Дело в том, что на передачу одного кадра тратится время, сравнимое с временем установленной задержки. Это недостаток данного протокола, связанный тем, что микроконтроллер пайеток не может мгновенно выйти из спящего режима. Требуется время, равное почти 1мС. И это необходимо учитывать.
Теперь установим время задержки 100мС и посмотрим, как переключается матрица.
Матрица из 5 пайеток переключается за 614мс, при этом, пиковый ток потребления не превышает пикового тока потребления при переключении одной пайетки.
Программное обеспечение верхнего уровня (Processing)
В принципе программное обеспечение не претерпело серьёзных изменений, кроме того, что стало немного удобнее и теперь можно создавать матрицы бОльших размеров.
Также программа позволяет оценить пиковый ток потребления матрицы при различных характеристиках пайеток и времени задержки между переключениями. В исходных параметрах для расчётов можно указать ток спящего режима пайеток (sleep mode), ток, потребляемый микроконтроллером при трансляции информационного сигнала (work mode), пиковый тока потребления пайетки при смене цвета (color change mode) и время переключения пайетки (change color time). Эксперименты показали, что расчётные значения близки к действительности. Это функция позволяет подобрать режимы переключения для больших матриц. При подключении к контроллеру матрицы из его памяти читается время задержки (delay).
Собираем всё вместе
Слева предыдущий образец матрицы с контроллером на базе ATmega328P, справа новая матрица с контроллером K1986BE92QI.
Было решено поэкспериментировать с зазором между пайетками. Он был увеличен с 1 до 3мм. Как и ожидалось, это положительно сказалось на гибкости матрицы.
Планы разработки
На данном этапе у нас уже имеется:
-
пайетки с адекватной себестоимостью из доступных комплектующих
-
отработанная технология сборки отдельных пайеток
-
технология изготовления матрицы путём FDM печати на сетчатой ткани
-
прототип платья из напечатанных пайеток
Над чем предстоит поработать:
-
контроллер для управления матрицей с автономным питанием
-
доработка программного обеспечения для управления матрицей
В целом, можно закупаться комплектующими и переходить к изготовлению платья!
Ссылка на репозиторий с исходниками прошивок и схемами: https://github.com/ArtemMechanik/SmartSequins/tree/main/Mk.9
Автор:
MechanikArtem