Еще одно разработанное устройство

Aug 24, 2017 15:38

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



Для начала - сразу видео работы, а уж потом - как все это создавалось.


image Click to view



На этапе предварительных согласований с заказчиком с его стороны был представлен вот такой референс из какой-то компьютерной игры.



Требовалось сделать нечто подобное, но в реальности. Элементы пазла предполагалось заменить на вращающиеся диски, поворачивая которые игрокам нужно было бы составить правильный маршрут - в общем простенькая головоломка. В процессе продумывания реального устройства было рассмотрено много разных вариантов, в том числе такие, в которых через один вращающийся элемент могло проходить две линии разных цветов. Это в последствии не понадобилось, хотя и сказалось на конструкции. Пока окончательный маршрут еще не был придуман, мы с delphin1305 уже приступили к разработке базового элемента всего устройства - "крутилки", из которых можно было собрать в общем-то любой вариант головоломки. Соответственно я занялся разработкой электронной части, а коллега - механической.

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



Плата была разработана довольно быстро. На ней располагалось четыре пары адресуемых светодиодов WS2812B, соединенных так, что каждую пару можно зажечь своим цветом. Кроме того на плате были предусмотрены 4 датчика холла, которые позволяли определить в каком положении находится крутилка, на которой в свою очередь стоял магнит. Также на плате установлены 4 маленьких белых светодиодика, подключенных напрямую к датчикам, для контроля их состояния при отладке.

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

Тем временем, delphin1305 параллельно разрабатывал механику. Он со своей стороны также разработал стандартный элемент крутилки с местом для моей платы.



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

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



После этого коллега разработал окончательный вариант всей конструкции в сборе.







А я отправил в производство платы и, когда они были готовы сделал первый прототип.



Когда мой прототип был готов - механика устройства также уже была готова в сборе. Настал волнительный момент примерки платы к устройству - ведь до этого мы никак физически не сверяли размеры, только по чертежам. Ошибки были недопустимы, так как крепление платы было весьма хитрым - с отверстиями под датчики, разъемы, конденсатор на плате. Плата встала на место идеально - слава 3D моделированию! Именно для таких случаев нужна функция создания 3D модели печатных плат в редакторе печатных плат.

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



Затем последовал этап установки плат в само устройство.



Надо сказать, когда постоянно сталкиваешься с совершенно разными задачами - порой это начинает доставать и думаешь - вот было бы здорово делать одно и тоже устройство в больших количествах. Но когда начинаешь делать одно и тоже в больших количествах - это тоже быстро надоедает и хочется разнообразия. Так и тут - установить 49 плат на место - довольно скучное занятие, учитывая, что для этого нужно открутить полторы сотни винтов, а потом закрутить обратно :)



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

Первое включение подтвердило работоспособность всей системы. Но, как и всегда в новой разработке сразу же нашелся один момент, который я не предусмотрел. Дело в том, что светодиоды потребляют довольно большой ток - суммарно в данном устройстве - до 10 ампер. В то же время шлейфы соединяющие платы содержат довольно тонкие жилы и при весьма большой общей протяженности они имеют довольно большое сопротивление, так что напряжение в каждом следующем элементе цепочки падает и до конца мало что доходит. Но попался я не на этом - светодиоды заработали без проблем и сразу, ведь обо всем этом я знал и предусмотрительно заложил на питание светодиодов множество параллельных линий в шлейфе. А вот на питание логики и датчиков холла я выделил отдельную линию и всего одну пару проводников, что и стало ошибкой. Один датчик холла потребляет немного - всего 4-5 мА и в подавляющем большинстве случаев я это потребление даже не учитываю. Но в данном устройстве оказалось 196 датчиков, которые в сумме потребляют около 1А, что уже весьма существенно и слишком много для одной пары тонких проводов в шлейфе.

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



Между тем пришло время писать управляющую программу. Для себя же составил несколько таблиц:



Левая верхняя таблица - это нумерация плат в цепочке. Эта таблица является таблицей преобразующей координаты X Y на поле в номер модуля. Ведь работать с задачей в координатах X Y гораздо проще и удобнее.

Правая верхняя таблица показывает направление цепочки - она проложена змейкой туда-сюда через все устройство.

Для удобства программирования было принято, что верхний датчик на каждой крутилке, является нулевым, правый - первым, нижний вторым, левый - третьим. Так как часть плат расположена под одним углом, а часть под углом 180 градусов относительно первых - была сделана таблица (правая средняя) смещений датчиков по кругу. Прибавив число из этой таблицы к реальному физическому номеру датчика на плате и поделив по модулю 4 мы получаем нумерацию датчиков не зависящую от ориентации плат.

Нижняя правая таблица описывает 5 различных типов элементов на поле: есть элементы крестики - имеющие "подключение" во все четыре стороны, есть прямые, угловые(Г-образные), Т-образные и круговые(с единственным подключением наружу) элементы. Каждый элемент кодируется четырьмя битами, каждый бит отвечает за одно из направлений(вверх, вниз, влево, вправо), согласно самой правой и нижней картиночке.

Левая нижняя таблица - это соответственно представление всего поля, с указанием, в какой ячейке какой элемент находится. Коды для удобства представлены в шестнадцатеричном виде. А вот почему там в каждой ячейке по два одинаковых символа, а не по одному - предлагаю подумать вам :)

Затем все таблицы были вбиты в программу:

const uint8_t gen_code[7][7] =
{
{ 0x44, 0x55, 0x66, 0x44, 0xEE, 0x44, 0x44},
{ 0x44, 0x55, 0xFF, 0x66, 0x66, 0x55, 0xEE},
{ 0x66, 0x66, 0x55, 0xEE, 0x55, 0x55, 0x66},
{ 0x44, 0x66, 0x66, 0xFF, 0x55, 0x66, 0x44},
{ 0x44, 0x66, 0x66, 0x66, 0x66, 0xFF, 0x66},
{ 0x66, 0xEE, 0xFF, 0x66, 0x55, 0x66, 0x66},
{ 0x44, 0x44, 0x66, 0x44, 0x66, 0x44, 0x44}
};

Ну и была написана собственно программа. Программа писалась "в слепую", вдали от устройства(так удобнее), потом уже проверялась на месте около него. Заработала почти сразу, нужно было лишь несколько мелких технических ошибок исправить и лишь одну небольшую логическую.

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



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



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

Как-то так. А результат вы уже видели :)

Программирование, Электроника, Разработанные устройства, Работа, Печатные платы

Previous post Next post
Up