В этой статье, если можно так сказать, я хочу рассказать о своем первом проекте в области электротехники.
Должен отметить, что моя профессия далека от схемотехники и радиоэлектроники, но интерес к этой теме преследовал меня с ранних лет. Людям с опытом информация ниже может показаться слишком очевидной, а многое из того, что я сделал, может показаться «изобретением велосипеда».
Но возможно какой-нибудь нуб, вроде меня, сможет открыть для себя что-то новое и интересное.
Кому интересно, смотрите кат. Все началось с идеи сделать развивающую доску для моей маленькой дочки.
Прежде всего, мне хотелось размять руки и сделать что-нибудь самому.
Во-вторых, мне захотелось напрячь мозги и придумать что-то такое, чего нет на обычных досках такого типа.
Понаблюдав за тем, что ребенок больше всего любит делать в повседневной жизни, было решено, что помимо стандартных цепочек, ручек и защелок необходимо добавить кнопки для нажатия и какое-то устройство, отображающее реакцию на нажатие.
Поскольку нужно было отобразить что-то простое, но яркое, выбор пал на красную светодиодную матрицу 8х8. До момента создания игрушки у меня на полке уже некоторое время пылилась Arduino Uno - ждала, пока мне удастся придумать что-нибудь полезное, кроме системы автоматического полива цветов, что к тому же само по себе полнейшая скука , было для меня чуть менее чем совершенно ненужным.
Я подумал, что пришло время Ардуино, потому что нужно с чего-то начинать.
Прочитав мануалы к матрице, я узнал, что помимо того, что ее нельзя просто так подключить к Ардуино (она одна требует 16 контактов, которых нет у моей Ардуино), нельзя управлять всеми светодиодами на в то же время.
Можно одновременно зажигать определенные диоды как в одном ряду, так и в одном столбце (управляя общим катодом или общим анодом).
И если делать это последовательно и достаточно быстро, человек перестает воспринимать моргание и видит устойчивую картинку.
Еще я узнал, что существуют готовые драйвера и библиотеки для Arduino, которые берут на себя управление этим процессом.
И то, что такого драйвера на тот момент не было, предопределило исход всего проекта.
Пока я медлил и откладывал выбор лучшего места для покупки драйвера, мне на глаза попалась статья о работе триггерных систем.
Для моего гуманитарного мозга это стало настоящим открытием, давшим понимание того, как работает память на примитивном уровне.
Именно тогда я задумался, смогу ли я обойтись без Arduino и сделать свой проект на основе триггеров и логических схем.
Итак, сначала нам нужно было решить, что и как показывать.
Было понятно, что необходимо поочередно подавать сигнал на восемь строк матрицы и на каждой итерации посылать параллельный сигнал на определенные столбцы.
Хорошо, это дало мне понимание трёх основных компонентов — генератора импульсов, преобразователя тактовой частоты в восемь последовательных сигналов и преобразователя, который для каждого из восьми сигналов будет выводить определённую комбинацию параллельных сигналов.
Это не так уж и сложно.
После некоторых размышлений я придумал в голове схему, в которой тактовый сигнал преобразуется в двоичный код с помощью трех триггеров JK, соединенных последовательно, а затем в восьмеричный код с помощью логических схем.
Подробно об этом типе триггеров можно прочитать как минимум на Википедия .
Короче говоря, он имеет два входа (J и K) и два выхода (Q и Q), а также тактовый вход (CLK).
При подаче логической единицы на один из входов при очередном синхроимпульсе, единица будет отображена на соответствующем выходе и останется на нем независимо от того, будет ли снова подан синхроимпульс и изменится ли значение на выбранном входе, при условии, что второй вход остается нулевым.
Если подать на второй вход единицу, а на первый ноль, то при следующем импульсе синхронизации значение первого выхода изменится на ноль, а второго на единицу.
А вот если на оба входа триггера подать единицу, то при каждом импульсе синхронизации единица будет попеременно появляться на одном из выходов.
А если взять два триггера, подать тактовый импульс на синхронизирующий вход первого, а сигнал с выхода Q̄ первого на синхронизирующий вход второго, то в результате выход Q1 будет выдавать по одному каждый раз.
два такта, а Q2 — каждые четыре.
Это создаст двухбитный двоичный счетчик.
А если таким же образом добавить третий триггер, то за счет третьей цифры можно будет считать в двоичном коде до восьми – это то, что нужно.
Далее необходимо было создать таблицу истинности и подобрать набор логических ключей, чтобы двоичный код преобразулся в восемь последовательных сигналов.
Если для кого-то таблица истинности и булевы операции — что-то новое и неизведанное, то о них можно прочитать еще раз в Википедии.
Казалось бы, полдела есть, но на самом деле все оказалось не так просто.
Когда я собрал на макете первую часть схемы для теста и представил, как аналогичным образом реализовать вторую часть, моему воображению представились многие месяцы (а может быть, и годы - у меня есть всего чуть больше часа, чтобы предаться мое хобби после работы) — рисовать схемы и составлять таблицы истинности.
Ведь для восьми строк каждой картинки нужно сгенерировать уникальную комбинацию столбцов.
И чем больше будет картинок, тем чудовищнее будет схема.
Я понял, что сделать задуманное, используя только логические ключи, не получится.
Необходимо было искать что-то, что могло бы упростить этот процесс.
Решением стал чип памяти.
Для моей задачи хорошо подошла память EEPROM (Electrically Erasable Programmable Read-Only Memory) — электрически стираемая программируемая память с параллельным вводом/выводом.
Память имеет ряд адресных входов, которые, по сути, представляют собой биты двоичного адреса ячеек памяти.
То есть, если память имеет n адресных входов, можно запрограммировать 2^n ячеек.
Количество выводов памяти — это так называемая «длина слова» или фактическая длина двоичной строки, которую можно записать в каждую ячейку.
Произведение количества ячеек и длины слов определяет емкость памяти в битах.
У меня был входной сигнал в виде двоичного кода, доступный на выходе триггеров JK. Остаётся только дополнить его кусочками от кнопок, которые должны отвечать за отображение разных картинок, и готово.
И опять же отсутствие опыта не позволило мне адекватно оценить сложность процесса.
Ведь память нужно программировать, а для этого нужен программатор – устройство, которое стоит заметно дорого, чтобы приобрести его для одноразовой игрушечной поделки.
Гугление показало, что теоретически это можно сделать с помощью Arduino. Но для программирования нужно одновременно подать сигналы на адресные входы микросхемы памяти и на выводы, которые впоследствии должны воспроизвести сигнал.
И нам также нужны сигналы управления записью чипа.
То есть пинов опять больше, чем имеется.
Дополнительное гугление выявило мне сдвиговый регистр — микросхему, которая запоминает заданную последовательность нулей и единиц и отображает их на параллельных выходах.
Часто такие микросхемы также работают как буфер и имеют выход, способный последовательно воспроизводить входные сигналы.
То есть если к нему подключить следующий аналогичный регистр, то можно одновременно отображать последовательность в два раза большую, чем за один.
При вводе строки первая ее часть пройдет через первый регистр как через буфер во второй, а остальная часть останется в первом регистре.
Добавив третий регистр, можно утроить длину строки и т. д. Для реализации этого мне пришлось написать скетч на незнакомом мне языке программирования.
Но имея некоторый опыт работы на Python и множество примеров в Интернете, после ряда проб и ошибок эта задача оказалась вполне выполнимой.
Эскиз можно взять на github .
И вот скетч написан, микросхема подключена, запускается и.
ничего - память не запрограммирована.
Несколько тестов, изменение параметров записи, а результатов нет. Микросхема у меня была W27C512-45Z. Внимательное чтение мануалов выявило неприятный момент. Для записи на конкретный контакт микросхемы необходимо подать ток силой 0,03А напряжением 12В.
Я думал, что купил не тот чип.
Но обыскав полки местных магазинов электрокомпонентов, я убедился, что 12В нужно всем.
У меня не было лабораторного блока питания.
Блоков на 12В в доме предостаточно, но все они импульсные, а ток около 1А.
Да простят меня опытные инженеры за такое кощунство, но в отчаянии я решил попробовать, произойдет ли чудо с блоками, оказавшимися под рукой.
Не произошло.
Первые два прохода записи ничего не дали, а после третьего микросхема перестала подавать признаки жизни.
В Интернете я нашел ссылки на некую микросхему ST662AB - преобразователь 5В-12В - которая в сочетании с необходимым набором конденсаторов должна обеспечивать необходимый ток и напряжение.
На самом деле найти микросхему оказалось непросто.
В итоге заказал из Китая, тоже SMD. А как насчет четырех-шести недель доставки? Правильно, учиться.
Просматривая статьи по программированию памяти, я наткнулся на упоминание о микросхеме, которую можно программировать при напряжении 5В.
Мы говорили о AT28C256. И действительно, в даташитах на него не было упоминания о 12В.
Надо брать! Правда, для моих нужд чип был немного избыточен, так как позволял экономить 256Кб: 8-битный вывод по 32К адресов, что с учетом занятых трех адресных выводов для сигналов синхронизации линии оставляло возможность закодировать столько же как 4096 изображений (мне хватило бы 10).
Кроме того, доставку нужно было осуществить аж из Великобритании.
Но других вариантов я не нашел, да и в конце концов память можно перепрограммировать заново, и когда игрушка потеряет свою актуальность, чип можно будет использовать где-нибудь еще.
Итак, через четыре дня у меня появилась память.
Тестовый запуск скетча и счастье - все работает. Осталось решить, сколько будет кнопок, нарисовать картинки 8х8 и реализовать добавление сигналов от кнопок в схему.
Прикинув место на плате, я остановился на пяти кнопках.
Учитывая мизерную требовательность по сравнению с ресурсом памяти, проще всего было подать сигнал с каждой кнопки напрямую на отдельный вход, не используя никакого кодирования.
Правда, нам также пришлось решить проблему переключения между картинками.
Можно было использовать кнопки с фиксацией нажатия.
Но такая реализация не подходила для использования годовалым ребенком, так как тогда перед нажатием следующей кнопки нужно было отпустить рабочую, а она сама по себе была довольно примитивной.
Мне хотелось придумать схему нефиксирующихся кнопок, при которой нажатие каждой кнопки сохранялось бы и даже отменяло нажатие предыдущей.
Читал об особенностях использования разных типов триггеров, надеясь, что один из них сможет решить эту проблему самостоятельно, но увы.
Посидев немного с листом бумаги и карандашом, я придумал следующую схему (пример для трех пуговиц).
Сначала необходимо подключить все кнопки к определенному коллектору, который будет выводить один сигнал при нажатии любой из кнопок.
Для этого подойдет ключ ИЛИ.
Поскольку чаще всего микросхемы-ключи имеют всего два входа, необходимо подключить первые две кнопки к одной клавише, затем подключить ее выход к первому входу второй клавиши, а третью кнопку подключить ко второму ее входу.
Таким способом вы сможете и дальше подключать больше кнопок, добавляя новую клавишу для каждой последующей.
Кроме того, каждая кнопка должна быть подключена к отдельной клавише XOR и к входу J отдельного триггера JK. Подключите выход буфера ИЛИ ко второму входу ключей XOR, а выход каждого ключа XOR соедините с входом K соответствующего триггера JK. Таким образом, нажав, например, кнопку 1, единица будет подана на J1, но XOR1 не сработает, так как он получит единицу как из кнопки, так и из буфера ИЛИ.
Единица также появится на выходе Q1 и будет сохранена.
В то же время будут работать XOR2 и XOR3, отправляя один сигнал на K2 и K3. И если раньше на Q2 или Q3 была единица, она изменится на ноль.
Отдельной задачей было придумать картинки размером 8х8. Точек слишком мало, чтобы воспроизвести узнаваемое изображение.
Но используя воображение, мне все же удалось нарисовать несколько, например, этого андроида.
Я создал таблицы истинности для изображений.
Но поскольку в матрицу нужно ввести единицу для строк и ноль для столбцов, таблицу пришлось инвертировать.
Полученный двоичный код я записал в шестнадцатеричной кодировке для удобства использования в скетче Arduino. Для сборки всей схемы я хотел заказать готовую плату.
Но из списка доступных компаний, предлагающих услуги по изготовлению макетной платы, мне был предложен самый дешевый вариант двухсторонней платы почти за 25 долларов.
Не знаю, может это нормальная цена, но мне показалось многовато.
Кроме того, у меня вообще нет опыта разработки макетов.
Я также нахожу процесс пайки очень приятным и расслабляющим.
Поэтому я купил универсальную плату, моток разноцветной проволоки, необходимые комплектующие и за несколько вечеров сел ее собирать.
Так как все компоненты работают от напряжения от 5В до 12В.
Для удобства я запитал его от батарейки 9В.
В результате вы можете увидеть, как все работает. здесь , полная схема доступна по адресу github .
В качестве «сердца» всей схемы я использовал генератор импульсов.
Я не был уверен, какая именно тактовая частота нужна, поэтому использовал готовую регулируемую схему.
К сожалению, осциллографа у меня нет, но судя по сравнению регулировок и даташита схемы используется около 1 КГц.
Здесь на видео показывает, как меняется частота от низкой к высокой, видно, как рисуются строки матрицы.
Спасибо за внимание.
Теги: #DIY или Сделай сам #diy #arduino #binary #toys
-
Сравнение Iphone 3G И 3Gs
19 Oct, 24 -
Google Радует Инвесторов
19 Oct, 24 -
Избавимся От Старой Электроники Выгодно
19 Oct, 24