Детская игрушка на логических элементах

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


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


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


До времени создания игрушки у меня уже некоторое время пылилась на полке Arduino Uno — ожидала, пока я смогу придумать что-то полезное кроме системы автополива цветов, которая, кроме скуки кромешной сама по себе, была чуть менее чем совсем мне не нужна. Я подумал, что вот и наступил ее (Arduino) час, ведь нужно с чего-то начинать. Почитав мануалы для матрицы, я узнал, что кроме того, что просто так к Arduino ее не подключить (только для нее одной нужно 16 выводов, которых в моей Arduino нет), управлять всеми светодиодами одновременно нельзя. Можно одновременно светить определенными диодами либо в одной строке, либо в одном столбце (управление общим катодом, либо общим анодом). И если делать это последовательно и достаточно быстро, человек перестает воспринимать мигание и видит стабильную картинку. Также я узнал, что для Arduino существуют готовые драйверы и библиотеки, которые берут на себя боль управления этим процессом. И вот факт отсутствия такого драйвера на тот момент предрешил исход всего проекта.


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


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


После некоторых раздумий в голове образовалась схема, в которой тактовый сигнал с помощью трех последовательно подключенных JK-триггеров преобразовывается в двоичный код, а затем с помощью логических схем — в восьмеричный. Детально о данном виде триггеров можно почитать хотя бы на Википедии. Если коротко, то у него есть два входа (J и K) и два выхода (Q и Q̄ ), а также вход синхронизации (CLK). При подаче логической единицы на один из входов при следующим импульсе синхронизации единица отобразится на соответствующем выходе и сохранится на нем независимо от того, будет ли снова подаваться синхронизирующий импульс и будет ли меняться значение на выбранном вводе при условии, что на втором вводе будет оставаться ноль. Если подать единицу на второй ввод, а на первый ноль, то при следующем импульсе синхронизации значение первого выхода поменяется на ноль, а второго на единицу. А вот если на оба входа триггера подать единицу, то при каждом импульсе синхронизации единица будет попеременно появляться на одном из выходов. И если взять два триггера, на синхронизирующий вход первого подать тактовый импульс, а на синхронизирующий вход второго сигнал с выхода Q̄ первого, то в результате выход Q1 будет выводить единицу каждые два такта, а Q2 — каждые четыре. Таким образом получится двухразрядный двоичный счетчик. И если добавить таким же образом третий триггер, то за счет третьего разряда можно досчитать бинарным кодом до восьми — то, что надо.


image


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


Казалось бы, половина дела есть, но на самом деле, все было не так просто. Когда я собрал на макетке первую часть схемы для теста и представил, как аналогичным образом реализовать вторую часть, моя фантазия нарисовала долгие месяцы (а может и годы — время заниматься хобби есть чуть больше часа после работы) рисования схем и составления таблиц истинности. Ведь для восьми строк каждой картинки нужно сгенерировать уникальную комбинацию столбцов. И чем больше будет картинок, тем монструознее получится схема. Я понял, что сделать задуманное на одних лишь логических ключах не получится. Нужно было искать нечто, что могло упростить данный процесс.


Решением стала микросхема памяти. Для моей задачи хорошо подходила память EEPROM (Electrically Erasable Programmable Read-Only Memory) — программируемая память с возможностю электрического стирания с параллельным вводом/выводом. У памяти есть насколько адресных входов, которые, по сути, являются разрядами бинарного адреса ячеек памяти. То есть, если у памяти n адресных входов, можно запрограммировать 2^n ячеек. Количество выводов памяти — это так называемая "длина слова", или же фактическая длина бинарной строки, которую можно записать в каждую ячейку. Произведение количества ячеек на длину слов определяет объем памяти в битах.


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


И опять отсутствие опыта не дало мне адекватно оценить сложность процесса. Ведь память нужно запрограммировать, а для этого нужен программатор — прибор ощутимо дорогой для того, чтоб приобрести его для разовой игрушечной поделки. Гугление показало, что теоретически можно было сделать это с помощью Arduino. Но для программирования нужно одновременно подавать сигналы и на адресные входы чипа памяти и на выводы, которые в последствии должны воспроизводить сигнал. А еще нужны сигналы управления записью чипа. То есть, опять больше, чем доступно пинов. Дополнительное гугление открыло для меня сдвиговый регистр — чип, который запоминает задаваемую последовательность нулей и единиц и отображает их на параллельных выходах. Зачастую такие чипы работаю еще и как буфер и имеют выход, который может последовательно воспроизвести сигналы на входе. То есть, если подключить к нему следующий такой же регистр, то можно параллельно отобразить в два раза большую последовательность, чем для одного. По мере ввода строки, первая ее часть пройдет через первый регистр как через буфер на второй, а остальная часть останется на первом регистре. Добавив третий регистр, можно утроить длину строки и т.д. Для реализации этого нужно было написать скетч на незнакомом мне языке программирования. Но имея некий опыт в Python и множество примеров в интернете, после череды проб и ошибок эта задача оказалась вполне выполнима. Скетч можно взять на гитхабе.


И вот скетч написан, микросхема подсоединена, запуск и… ничего — память не программируется. Несколько проб, изменение параметров записи, и никаких результатов. Микросхема у меня была W27C512-45Z. Внимательное чтение мануалов показало неприятный момент. Для записи на определенный контакт микросхемы необходимо подать ток 0.03А напряжением 12В. Я подумал, что просто купил не совсем подходящий чип. Но прошерстив прилавки местных магазинов электро компонентов, я убедился, что 12В нужно всем. Лабораторного блока питания у меня не было. Блоков на 12В в доме полно, но все они импульсные, к тому же ток порядка 1А. Да простят меня опытные инженеры за такое кощунство, но отчаявшись, я решил попробовать, не случится ли чуда с теми блоками, что были под рукой. Не случилось. Первые два прохода записи не дали ничего, а после третьего микросхема перестала подавать признаки жизни.


В интернете я нашел упоминания о некой микросхеме ST662AB — преобразователе 5В-12В — который в сборе с нужным набором конденсаторов должен давать необходимые ток и напряжение. По факту найти микросхему оказалось непросто. В результате заказал ее из Китая, еще и SMD. А что же делать от четырех до шести недель доставки? Правильно, учиться. Пролистывая статьи по программированию памяти, я натолкнулся на упоминание о микросхеме, которую можно программировать при 5В. Речь шла о AT28C256. И действительно, в даташитах к ней никакого упоминания о 12В не было. Нужно брать! Правда микросхема для моих нужд была немного избыточна, так как позволяла сохранить 256Кб: 8-битный выход для 32К адресов, что с учетом занятых трех адресных пинов для сигналов синхронизации строк, оставляло возможность закодировать аж 4096 изображений (мне бы хватило и 10). Кроме того, доставку пришлось сделать аж из Великобритании. Но других вариантов я не нашел, и в конце концов, память можно повторно перепрограммировать, и когда игрушка утратит актуальность, чип можно будет использовать где-то еще. Так через четыре дня память была у меня. Тестовый прогон скетча, и счастье — все работает.


Осталось последнее — решить, сколько будет кнопок, нарисовать картинки 8х8 и реализовать добавление сигналов от кнопок в схему. Прикинув место на доске, я остановился на пяти кнопках. Учитывая никчёмный спрос в сравнении с ресурсом памяти, самым простым способом было подавать сигнал от каждой кнопки напрямую на отдельный вход, не применяя никакого кодирования. Правда, пришлось решать еще задачу переключения между картинками. Можно было использовать кнопки с фиксацией нажима. Но такая реализация не подходила для использования годовалым ребенком, ведь тогда перед нажатием на следующую кнопку надо было отжать работающую, да и была достаточно примитивна сама по себе. Хотелось придумать схему для кнопок без фиксации, при которой нажатие каждой кнопки бы сохранялось, да еще и отменяя нажатие предыдущей. Я читал про особенности применения разных видов триггеров, надеясь что какой-то из них может решить эту задачу самостоятельно, но увы. Посидев немного с листком и карандашом, я придумал следующую схему (пример для трех кнопок).


Вначале необходимо все кнопки подключить на некий коллектор, который на выходе будет давать единицу при нажатии на любую из кнопок. Для этого подойдет OR ключ. Так как чаще всего микросхемы ключей имеют только два входа, необходимо подключить первые две кнопки на один ключ, далее его выход подключить на первый вход второго ключа, а на его второй вход — третью кнопку. Таким способом можно продолжить подключать больше кнопок, добавляя новый ключ для каждой последующей. Кроме того, каждую кнопку нужно подключить на отдельный XOR ключ и на J вход отдельного JK-триггера. На второй вход XOR ключей подключить выход OR буфера, а выход каждого XOR ключа — на K вход соответствующего JK-триггера. Таким образом, нажимая, например, на кнопку 1, на J1 будет подаваться единица, а XOR1 срабатывать не будет, так как на него подается единица и от кнопки, и от OR буфера. На выходе Q1 также появится и будет сохраняться единица. В то же время сработают XOR2 и XOR3, подавая единицу на K2 и K3. И если на Q2 или Q3 до этого была единица, она сменится нулем.


image


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


image


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


Для сборки всей схемы я хотел заказать готовую плату. Но из списка доступных фирм, предлагавших услуги по изготовлению плат по макету, самый дешевый вариант двусторонней платы мне предложили почти за $25. Не знаю, может это и нормальная стоимость, но мне показалась многовато. Кроме того, у меня совсем нет опыта проектирования макетов. И еще я нахожу процесс пайки очень приятным и успокаивающим. Поэтому я купил универсальную плату, рулон разноцветной проволоки, необходимые компоненты и на несколько вечеров засел за сборкой. Так как все компоненты работают от напряжения от 5В до 12В. Для удобства, я сделал питание от батарейки 9В.


Как все в результате работает можно посмотреть тут, полная схема доступна на гитхабе.
В качестве "сердца" всей схемы я использовал генератор импульсов. Я не был уверен, какая точно нужна частота тактового импульса, поэтому воспользовался готовой схемой с регулировкой. Осциллографа у меня, к сожалению, нет, но по сопоставлению регулировок и даташита схемы, используется где-то 1КГц. Здесь на видео показано как меняется частота с низкой до более высокой, можно рассмотреть, как прорисовываются строки матрицы.


Спасибо за внимание.

Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 25

    0
    Почитав мануалы для матрицы, я узнал, что кроме того, что просто так к Arduino ее не подключить (только для нее одной нужно 16 выводов, которых в моей Arduino нет), управлять всеми светодиодами одновременно нельзя.

    Ну вот, из-за одного ошибочного предположения столько лишней работы! В Arduino 20 выводов, которые можно использовать как цифровые. Это я теперь знаю, а два года назад думал, как автор статьи.
      0
      Можно было и сдвиговый регистр задействовать.
        +1
        Из-за одного ошибочного предположения автор разобрался в логических элементах, видах триггеров, научился строить из этого работающие схемы, да еще и работать с EEPROM. Видно что знания об электронике все равно очень поверхностные, но это хорошая база. Гораздо более лучшая база чем просто сборка хреновины на ардуино из готовых модулей, пользуясь кусками кода из гугла. Если так продолжать, можно случайно прийти к FPGA: «У меня не хватало ножек на ардуино, поэтому я взял ПЛИС».
          +1

          Не хватает ног? Можно взять две ардуины, заодно будет игра в многопроцессорность. :)

        –1
        А в чём, собственно, игра с «игрушкой» заключается? Хотелось бы увидеть законченную «развивающую доску». Из короткого видео понятно лишь то, что вы научились управлять матрицей.
        например такого андроида
        «Андроид» скорее «жучок», но тут уж автору виднее.
        dyi
        DIY.
          +2

          'А в чём, собственно, игра с «игрушкой» заключается? '


          Создание игрушки само по себе игра :)

            +2
            Я не показал доску не случайно, она собрана сейчас процентов на 60. А игра с игрушкой и заключается в нажимании кнопок и проявлении огромной радости от того, что это действие приводит к смене ярких картинок. И даже сейчас на полупустой доске это занимает ребенка минут на 20-30.
              0
              Я не показал доску не случайно
              Заголовок, однако, обещает именно игрушку («Детская игрушка на логических элементах») а не рассказ о подключении матрицы из светодиодов.
              это занимает ребенка минут на 20-30
              А развитие при этом в чём заключается?
                0
                не рассказ о подключении матрицы из светодиодов

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

                Я никоим образом не говорил о том, что моя игрушка должна развивать детей. Слово «развивающая» употреблено мною один раз в словосочетании «развивающая доска». И это не моя оценка некой созданной мной доски, а устоявшееся название игровой системы (англ. Busy Board), которая строится зачастую на деревянном основании и призвана развивать моторику у маленьких детей. Досконально этот вопрос я не изучал, посему не стану возражать, если вы впредь будете утверждать, что никакого развития данная игрушка детям не дает.
                  0
                  Busy Board
                  Ну, вот с этого и стоило начинать. Возраст «маленькой дочери» указан не был, так что вполне могло быть и что-нибудь за пределами развития моторики. А строите вы на самом деле что-то вроде этого:

                  Теперь понятно.
            +4
            Тогда-то я и задался вопросом, смогу ли я обойтись без Arduino и сделать свой проект на основе триггеров и логических схем.

            На aliexpress есть очень дешевые платы с CPLD — есть меньше 10$. К такой плате обычно еще нужен программатор — есть меньше 5$. Несколько картинок, возможно, можно было бы поместить прямо в память CPLD.
            Платы с FPGA подороже, но у них и функционал значительно больше. Так что советую изучить тему CPLD и FPGA.

            Для записи на определенный контакт микросхемы необходимо подать ток 0.03А напряжением 12В. Я подумал, что просто купил не совсем подходящий чип. Но прошерстив прилавки местных магазинов электро компонентов, я убедился, что 12В нужно всем. Лабораторного блока питания у меня не было. Блоков на 12В в доме полно, но все они импульсные, к тому же ток порядка 1А.

            Микросхеме не важно, какой максимальный ток способен выдать блок питания — она возьмет от него столько, сколько сможет — в данном случае 30 мА. Так что подошел бы любой блок на 12В.
            • UFO just landed and posted this here
                0

                Использовать для этого ПЛИС — это оверкилл. Микроконтроллер можно, но отдать 16 ног под индикатор — тоже жалковато. Для таких матриц лучше всего использовать драйвер MAX7219 — минимум компонентов + управление яркостью, и не надо мучаться с динамической индикацией. На Алиэкспрессе продаются готовые платки с этой микросхемой и установленным индикатором как у автора. Есть блоки на 4 индикатора. Управляеся по SPI, каскадируется последовательно + в сети полно либ, втч и под ардуину.

                  0
                  Автор статьи прямо сказал, что хотел сделать устройство:
                  на основе триггеров и логических схем.
                    0
                    отдать 16 ног под индикатор — тоже жалковато

                    То есть если занято 6 ног, а остальные 14 бездельничают, то не жалко?
                    MAX7219 плюс Attiny13a стоят минимум в полтора раза дороже, чем ATmega8, так что оптимальный вариант по цене и простоте подключения- это ATmega8 и 8 резисторов (больше совсем ничего, кроме самого индикатора 8х8 и 3 кнопок).
                  –2

                  Уже было в Симпсонах. Гуглится по названию Blocum.

                    0
                    Подозреваю, что Blocum ориентируется на детей постарше, да и стоит заметно дороже $25:
                    Цена образовательного набора Blocum education, ориентированного на использование в образовании — 12 000р.
                    SparkFun LogicBlocks дешевле, но опять же не для дошкольников.
                    0
                    Для записи на определенный контакт микросхемы необходимо подать ток 0.03А напряжением 12В. Я подумал, что просто купил не совсем подходящий чип. Но прошерстив прилавки местных магазинов электро компонентов, я убедился, что 12В нужно всем. Лабораторного блока питания у меня не было. Блоков на 12В в доме полно, но все они импульсные, к тому же ток порядка 1А.

                    Вы путаете максимальный ток, который БП может выдать (а может и не выдавать, зависит от нагрузки), и ток, который требуется. Если «требуется» <= «максимально может», то все нормально. Если «требуется» > «максимально может», то плохо становится блоку питания, а не нагрузке.
                      0
                      1. Непонятно, где взять схему для просмотра и охаивания. Несомненно можно было-бы как-то извернуться и обойтись без снятых с производства и дорогих(?) 27C512 или просто дорогих от природы 28С256.
                      2. А в общем, наверное, — хорошо. Хотя общение с наставником позволило-бы сгладить некоторые углы.
                        0
                        Схему добавил на гитхаб. Буду признателен, если подскажете, что можно было сделать проще.
                          0
                          Не-э-э… я имел в виду принципиальную схему.

                          Дешифратор кнопок. Будет-ли корректный сброс предыдущего состояния при нажатии кнопок «снизу вверх» (и более того — при нажатии в любом порядке)?

                          Не совсем понятно, как раскладывается 8-битный выход памяти на 64-битный «битмап». А если вычитываются подряд 8 адресов ПЗУ, то немного усложнив схему (условно говоря — в 2..5 раз по стоимости компонентов) можно было попробовать запользовать SPI-память (в 10..30 раз более дешёвую). Да и обойтись bare metal'ом вместо б-гмерзкого скетча.
                        0
                        Подождите-подождите! Микросхема из Великобритании за 4 дня?
                        Где этот чудесный ресурс?
                          0
                          Ресурс я вряд ли вспомню, не сохранил никаких данных о доставке. Но еще я забыл обновить свой профиль после переезда в Польшу. Здесь доставка по Евросоюзу за 4 дня вполне привычное дело.
                          0
                          И еще я нахожу процесс пайки очень приятным и успокаивающим. Поэтому я купил универсальную плату, рулон разноцветной проволоки, необходимые компоненты и на несколько вечеров засел за сборкой.


                          Альтернатива печатным платам — www.youtube.com/watch?v=ytKO6Xbovns

                          Рукодельцы догадались прокладывать трассы из узкого медного скотча и напечатали буклетик со схемами. Паять тоже можно, кстати.
                            0
                            Насчёт блока питания. Есть такая приблуда — DSN-MINI-360 (AliExpress & Москва

                            Это понижающий DC-DC преобразователь. Ардуины и вообще им запитывать удобно, так как и мощность большая, и регулятор на любое напряжение. Проблема конечно где взять аккумулятор с отдачей напряжения >> потребления. Но и это решаемо.

                            КОНВЕРТЕР DC-DC ПОВЫШАЮЩИЙ — это MT3608. Я им осушил АА элемент до 0.5 вольта, питая двумя батарейками нагрузку 15 вольт.

                            Only users with full accounts can post comments. Log in, please.