viktand

viktand

На Пикабу
Дата рождения: 30 июня
32К рейтинг 46 подписчиков 7 подписок 29 постов 9 в горячем
Награды:
5 лет на Пикабу
13

Самодельный калькулятор

Привет всем.

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

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

Сегодня мы будем делать микрокалькулятор.

Мозги калькулятора на микроконтроллере STC8H8K64U в устаревшем корпусе DIP на 40 контактов. Такие уже не выпускают, но они еще продаются на Али меньше чем по 100 рублей за штуку. В принципе, можно использовать версию в любом корпусе, но с таким работать приятнее.

Семисегментный индикатор на 8 разрядов на MAX7219 продается там же готовый с управлением по SPI. 108 рублей.

Кнопки тоже есть у китайцев. Я использовал готовые сборки из четырех кнопок. 5 штук по 4 кнопки каждый. 60 рублей за одну сборку. Если честно, то кнопки мне не понравились сами по себе.

И еще бокс для трех батареек ААА за 104 рубля уже на Озоне.

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

Итак, схема конструкции

Схема

Схема

Все очень примитивно. Это просто подключение кнопок и индикатора к микроконтроллеру. Есть еще компорт для прошивки. Здесь же хотел сначала добавить два светодиода, на которые я хотел вывести знак минус для отрицательных чисел и индикатор записи в регистр памяти. Но в итоге я их не стал делать, а вывел сигналы в старший разряд индикатора. Просто потому что два светодиода вживую смотрелись довольно плохо и не наглядно. Соответственно максимальное число на индикаторе будет +- 9999999. Меньше чем обычно, но достаточно. Минус – это будет привычная средняя палочка в восьмом разряде, а память – это точка там же. И буква «Е» в случае переполнения или ошибки.

Когда я написал здесь предыдущее предложение, то вспомнил, что никак не обыграл деление на ноль. Вернулся, доделал.

Получилось вот так:

Вид спереди

Вид спереди

Кнопочка сверху – сброс микроконтроллера. Используется для заливки прошивки. Ну или просто как сброс, если хочется. Остальные кнопки имеют стандартный смысл.

С обратной стороны как обычно паутинка. На этот раз небольшая.

Вид с обратной стороны

Вид с обратной стороны

Бокс с батарейками приклеен на суперклей.

Прошивка и схема в хорошем качестве, если кому интересно, здесь: https://github.com/viktand/calculator

Хотя логика калькулятора кажется довольно примитивной, но на практике это оказалось неожиданно трудно. Пришлось повозиться с тем, чтобы правильно выводить на индикатор числа в процессе их ввода и после вычислений. Особенно разочаровало преобразование между long и double, приводящее к тому, что вместо, например, «4.5» калькулятор показывал «4.499999».

На этом все.

Показать полностью 3
14

Сквош по пятому каналу

В некотором роде продолжение моего поста про самодельный ZX-Spectrum. Еще одна реализованная мечта детства.

В 10 номере журнала «Юный техник» за 1989 год была опубликована статья «Сквош по пятому каналу»:

По нынешним (да уже и по тем) временам очень примитивная приставка к телевизору на базе микросхемы К145ИК17. Подробности про нее и про тв-игры, которые в ней реализованы можно прочитать в Википедии. Там очень хорошо написано.

В свое время эта статья в журнале меня просто заворожила. Компьютер тогда был вообще недостижим для меня, а тут все так просто казалось сделать. Но купить «процессор» было вообще не реально в нашем маленьком северном городе. Потом я поступил в институт и уехал в большой город Комсомольск-на-Амуре, но и там я ее не нашел, а потом появился Spectrum и я просто забыл про это на много лет. Но недавно вспомнил и решил сделать.

Как оказалось, у этой конструкции есть даже свой микро-фан-клуб, но, пожалуй, он тоже уже уходит в историю. Статья в журнале – это пример самой примитивной реализации, да еще и с ошибками в схеме.

Я решил сделать нормальную цветную версию, но без ВЧ-модулятора. 5 канал уже не актуален.

Итоговой схемы я не рисовал. Собирал по частям из разных схем, и наверно нет смысла подробности здесь описывать. Кому это сейчас может быть интересно? Единственное, что внес от себя в небольшой зоопарк вариантов – это два генератора на одной микросхеме К155ЛН1. Основной для «ЦПУ» на 2МГц и второй для кодера PAL на 4.43МГц. Обычно их делают отдельно.

Кодер PAL самый обычный на CXA1645P.

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

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

Остальные детали купить совсем не сложно.

Конструкцию собрал на макетной плате проводом МГТФ.

С другой стороны как обычно маленький хаос:

У приставки есть два джойстика для управления ракетками. Просто два переменных резистора. Я их сделал вот так из подручных материалов:

Несколько игр предполагают наличие светового пистолета, но все пишут, что пистолет работает только с ЭЛТ-телевизорами. На ЖК не работает. Поэтому я не стал делать вход для пистолета и сам пистолет. Там не сложно, но зачем, если не будет работать?

В итоге получилась вот такая штука:

Вот эта белая черточка – это «мячик» Вживую он более квадратный.

Интересно, что сначала я тестировал на другом телевизоре, который не совсем телевизор, а смарт-тв на Андроиде. И цвета там не было. Я долго и безуспешно искал причину, но потом мне попался нормальный телевизор, который без проблем распознал цвет. Такие дела.

Игры конечно для наших лет очень примитивные, но я и не планировал играть. Гештальд закрыт.

Показать полностью 4
14

Летучая мышка

Текста будет немного. Утром обнаружил дома такое:

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

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

Вечером пойдем выпускать на свободу.

Показать полностью 2 1
13

Как (почему) я не стал великим физиком

Чтобы было понятно, мне уже слегка за 50.

Мне всегда были интересны физика-математика, но на уровне книжек типа «занимательная физика». Я и сейчас с интересом смотрю ролики такой тематики на Ютубе.

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

Но т.к. я вовсе не был таким уж глупым, то я сразу понял, что тут все не так просто. Сложнее чем, например макет паровой турбины из жестяной банки от кофе (я такое делал). Придется много специально учиться, потратить кучу времени и вообще не факт, что получится. Т.е. как бы есть риск прожить жизнь зря в некотором смысле. Риск не такой уж иллюзорный.

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

Я подождал пару дней и на этом завершил разработку машины времени. Как вы понимаете, никакого сообщения из будущего я не получил. Великим физиком я не стал.

33

Самоделка на микроконтроллере

Дисклеймер.

Хотя далее в легкой форме описывается процесс создания самоделки в духе Ардуино, этот текст следует воспринимать как простую инструкцию по работе с микроконтроллерами серии STC8H.

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

Искать я пошел как обычно к китайцам на известный сайт, где в итоге остановился на STC8H1K17

Вот такой красавчик:

Вот скрин заказа:

Видно, что по цене вышло в среднем 47,49  руб. за штуку.

Вообще были варианты всего по 24 рубля, но там доставка повышала стоимость выше 47 рублей.

Итак, чем примечателен этот МК? Это восьмибитный микроконтроллер со всеми атрибутами старших братьев. Для минимальной работы ему не требуется никакой обвязки, только напряжение питания, буквально какое будет под рукой. От 2 до 5 вольт. Рабочая частота от внутреннего генератора выбирается при прошивке от 4 до 36 МГц.

Практически все выводы кроме питания можно использовать как программируемые пины.

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

Для прошивки используется программа, которую специально написал производитель stc-isp:

Вот последняя версия на сегодня: https://drive.google.com/file/d/1hqZQVEt19RfgwgccXYQ92r2wXv5...

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

Вообще производитель сделал очень подробное описание всего семейства МК почти на 1200 страниц. Вот версия на английском языке: https://drive.google.com/file/d/1bA5yNccgZPAAW7daTwV3jnXuPJ5aMUwk/view?usp=drive_link, если с китайским у вас не очень.

Для написания кода можно использовать бесплатные инструменты, но есть удобная IDE «Keil uVision5». В демо-версии она ограничивает размер прошивки, но для опытов достаточно. Чтобы писать код для STC, надо сначала из программы-прошивальщика добавить в Keil свою библиотеку.

Вводную часть на этом закончим. Ссылок не даю, все легко гуглится. На русском языке почти ничего нет, к сожалению.

Чтобы протестировать МК, я решил сделать простейшую игру крестики-нолики.

В электрическом смысле ничего интересного. Поле двхцветных светодиодов 3х3. Зеленые и красные.

Поле кнопок 3х3 для хода игрока и две дополнительные кнопки «Сброс» и «Пропустить ход». Вторая нужна просто для того, чтобы дать возможность МК сделать первый ход.

Как видно, тут получается заметное превышение по количеству доступных пинов. Поэтому используется динамическая индикация по строкам и столбцам.

Схема получилась такая:

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

Ну и вот что получись в итоге:

Здесь еще видно разъем для ком-порта и конденсаторы на кнопках, которые я добавил, чтобы уменьшить дребезг. Но совсем от дребезга не избавился. Изредка кнопки могут глюкануть.

Программа управления всем этим, если кому-то вдруг интересно, вот здесь: https://github.com/viktand/cross. МК после инициализации циклически выставляет единицу на одной из трех строк и зажигает зеленые, потом красные светодиоды, потом сканирует кнопки в этой строке. Потом, если его ход, прикидывает, где лучше зажечь красный светодиод.

Интересно, что в красном режиме яркость светодиодов оказалась значительно выше, чем в зеленом. Поэтому пришлось включать их не в каждом цикле, а только в каждом шестом проходе.

Логику самой игры наверно реализовали уже столько раз за историю программирования, что описывать ее смысла нет.

Еще одна фотография. МК (красные) почти выиграл, но я не сдаюсь и что-нибудь придумаю.

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

И да, когда все было сделано, чуть позже, я наткнулся на младшего брата использованного микроконтроллера. Вот он:

Этот малыш почти такой же способный. STC8G1R08. У него только пинов совсем мало. Цена всего 17 рублей. Вот думаю теперь что из него смастерить.

Показать полностью 9
400

ZX-Spectrum. Еще один

Здравствуйте.

Долго думал, будет ли кому-то это интересно.

С детства (80-е) хотел иметь свой ПК. Думаю понятно, какие в те годы были компьютеры. Жили мы тогда маленьком дальневосточном городе и возможности купить или сделать компьютер самостоятельно не было. Позже, в 90-х годах, у меня появился первый «Спектрум», а потом и другое, но до тех пор я мог только изучать описание разных компьютеров из журналов. Я тогда очень здорово прокачался в теории простых восьмибитных ПК и был уверен, что смог бы сделать его сам. Только делать было не из чего.

Я вырос. Мечта спаять свой компьютер осталась. Какое-то время назад я решил, что откладывать больше нельзя.

Можно было заказать комплект и собрать какой-нибудь «Ленинград», но так мне было уже не интересно. Хотелось привести в мир очередной клон Спектрума с учетом современных возможностей.

Итак, план был такой:

  • Настоящий процессор Z-80. Никаких эмуляторов.

  • Статическое ОЗУ

  • Загрузчик ПЗУ при старте из какой-то другой памяти в ОЗУ, в младшие 16кБ.

  • Выход VGA 640x480 на обычный монитор.

Печатной платы не будет. Все собрать на макетной плате поводами  МГТФ

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

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

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

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

Теперь немного подробностей. Для многих наверно это будет скучно.

В качестве загрузчика и частично видеоконтроллера используется микроконтроллер STM32F401. Прошивка ПЗУ находится в нем в его прошивке просто как статический массив байтов. При включении STM32 блокирует Z80 и загружает в ОЗУ код ПЗУ, после чего разблокирует процессор и тот начинает работать как обычно. Для доступа STM32 к ОЗУ используются расширители цифровых входов PCF8574 (3 штуки). Чтобы записать или прочитать один байт, надо записать сначала  два байта адреса, а потом записать или прочитать байт данных.

Сначала я хотел сделать так, чтобы STM32 прозрачно забирала из ОЗУ данные для построения картинки и выводила их на монитор, полагая, что ее 84 МГц  легко позволят это. У процессора всего-то 3.5 МГц. Хотел такую видеокарту сделать.

Реальность оказалась слишком суровой. Никаких шансов все успеть у микроконтроллера не оказалось. Потому что поток пикселей для VGA идет с частотой 25МГц. Т.е. всего около 3 тактов STM на пиксель. Пришлось оставить у STM только функцию формирования строчных и кадровых импульсов, частоту процессора и переключение режима бордюра по ходу кадра -  вкл/выкл. Ну и что-то еще по мелочи.

Чтобы не было конфликта доступа к ОЗУ, в периоды, когда требуется читать видеоданные, процессор просто останавливается и видеоконтроллер, похожий на обычный спектрумовский, читает строку данных. Здесь я исходил из того, что мне ничего не мешает просто использовать более быструю версию Z80. По расчетам, если запустить его на частоте около 5МГц, то в среднем скорость будет как обычно. Это показалось проще, чем делать прозрачный доступ к ОЗУ как, например, в «Ленинграде».

Т.к. я ориентировался на формат кадра VGA, то в одном кадре получается 480 видимых строк. А у Спектрума их всего 192. Ну и вертикальное разрешение 640 против 256 – тоже значительно выше. Если тупо выводить картинку как есть, то получится махонький квадратик в центре кадра.

Поэтому я решил «умножить» пиксели на 4. Т.е. выводить по две одинаковых строки, в каждой из которых идут пары одинаковых пикселей. Тогда полезная область получается размером 512 на 384, что очень красиво вписывается в стандартный кадр, оставляя место для бордюра.

Следующей оптимизацией я подумал, что рисовать две одинаковых строки подряд будет накладно – процессор будет бесполезно простаивать слишком долго. Я решил применить черезстрочную развёртку. В одном кадре рисуются только четные строки, а нечетные заливаются черным, в следующем наоборот. И вот в таком виде я все это запустил первый раз. Радости моей не было предела. Компьютер стартанул и поприветствовал меня стандартной строкой.  Т.е. в этот момент я свою детскую мечту осуществил. Дальше надо было доводить ее до ума.  

Заливка второй строки черным привела к тому, что картинка получилась очень темная. Теперь я понимаю, что это логично, т.к. картинка складывается с черным кадром. Я поменял заливку на белый цвет – стало значительно приятнее для глаз. Но количество артефактов на изображении сильно напрягало.

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

В итоге сейчас нет чересстрочной завертки. Вместо этого из ОЗУ рисуются всегда нечетные строки и параллельно эти пиксели пишутся в буфер. В следующей строке вместо заливки белым выводится строка из буфера. Для буфера нашлась замечательная микросхема D41464C, словно специально для этого придуманная – динамическое 4-х битное ОЗУ.

Очень долго не получалось сделать две градации яркости. Я так и не понял почему. Классический резистивный ЦАП по типу «Ленинграда» нормально не завелся, как я только не пытался согласовать его с монитором.

Потом мне это надоело, и я разыскал у китайцев интересную микросхемку для вывода картинки: SDA7123, которая решает эту задачу. Решает даже слишком хорошо, потому что получилось два черных цвета, а не один, как оригинале – совсем черный и почти черный.

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

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

Я думал разные варианты. Одно время даже сделал SD-карту и кнопки снятия и загрузки дампа ОЗУ на карту, но этот путь в итоге мне не понравился.

Тогда я сделал кнопку, которая просто запрещает (или разрешает) захват шины видеоконтроллером и выставляет синхронизацию ровно 3,5 МГц. Это сработало программы стали загружаться (со смартфона), но на весь экран была только картинка бордюра. Без заставки.

Такое костыльное решение. Через несколько месяцев я пошел дальше и сделал динамическую частоту синхронизации процессора.

Пока картинка на экране рисуется выше или ниже полезной области кадра, процессор синхронизируется на 3,5 МГц.

Далее, когда идет вывод строки, процессор простаивает, а при выводе из буфера, процессор работает на примерно удвоенной частоте. Поэтому в среднем получается как бы стандартно.

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

Из других мелочей: нет записи на магнитофон – просто не стал делать, не вижу большого смысла для себя (хотя иногда думал, что не помешало бы). Корпуса нет и не планируется. Джойстик есть – перепаял из какого-то универсального USB-геймпада. Получилось как на Денди. Думаю, что это удобнее родного формата.

Из другого интересного. Разгонял свой Спектрум до 16 МГц. Работает, но смысла это не имеет без специальных программ, потому что все родное ориентировано на стандартную скорость. Однако, было интересно увидеть как заметно ускоряется рисование стандартных окружностей командами Бэйсика.

Немножко фотографий. Общий вид:

Поближе с двух сторон, прошу не падать в обморок любителей печатных плат:

Просто картинки:

Boulder Dash – моя любимая игра в те годы. Я потом даже написал свою версию для «взрослого» компьютера на, страшно сказать, FoxPro.

Batty – тоже убито много часов.

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

Клавиатура, ее тоже нет на схеме, сделана по мотивам «Ленинграда» с небольшой доработкой. У меня более строгое декодирование внешних портов. Впрочем, все равно некоторые программы, заточенные на оригинальный Спектрум, не работают. Под конец уже стало лень документировать изменения в схеме. Но в общем она примерно такая.

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

Справедливости ради, после того, как мой проект уже неплохо работал, я полез в Интернет и естественно узнал, что я не первый придумал соединить Z80 и STM32, чтобы получился Спектрум. Даже на Пикабу есть про это пост, но сейчас я не смог его найти.

Спасибо тем, кто дочитал.

Показать полностью 8
Отличная работа, все прочитано!