После этого выполняются расчеты для обнаружения пересечения луча и полигонов — вместо миллиардов операций при обычном подходе здесь их требуется всего шесть.
ГП с трассировкой — устройство и принцип работы
Несмотря на все ухищрения, для быстрых расчетов трассировки все также требуется мощное вычислительное оборудование. Поэтому видеокарты, поддерживающие ее, оснащаются тысячами шейдерных процессоров и специализированными вычислительными блоками — RT-ядрами.
Шейдерные процессоры выполняют арифметические операции, в то время как RT-ядра разработаны и оптимизированы именно для операций трассировки лучей.
Внутри RT-ядер находится два вычислительных движка. Первым начинает работу движок, занимающийся поиском пересечений лучей с объемами-коробками BVH.
Когда находится самая маленькая коробочка, пересекающая луч, в дело вступает второй движок. Он ищет пересечения лучей с полигонами.
Как и шейдерные процессоры, RT-ядра работают параллельно друг с другом. На современных видеокартах это позволяет обрабатывать несколько миллиардов лучей в секунду, а общий счет выполненных операций при этом достигает триллионов. Например, NVIDIA GeForce RTX 3090 родом из 2022 года выполняет за одну секунду до 36 триллионов операций. Тогда как самый мощный суперкомпьютер 2000 года, полагающийся на грубую вычислительную мощность центральных процессоров, за то же время осуществлял лишь 12,3 триллиона.
Чем отличается трассировка лучей
Трассировка пути — наиболее продвинутый способ получения компьютерных изображений. Но из-за ее высоких требований в играх пока более распространена обычная трассировка лучей. Оба способа имеют схожую основу, но трассировка лучей обеспечивает меньшую реалистичность освещения взамен на гораздо более скромные требования к оборудованию.
Для реализации трассировки лучей существует несколько техник. Рассмотрим две самые распространенные. Первый вариант схож с трассировкой пути, но имеет некоторые упрощения. Сначала для моделей сцены создаются дубликаты низкого разрешения с малым количеством полигонов.
Кадр с этими моделями просчитывается вне экрана, чтобы получить карту освещенности поверхностей. А затем полученная карта накладывается на кадр высокого разрешения, выводимый на экран.
Это позволяет хорошо интерполировать непрямое освещение, не прибегая к огромному количеству вычислений. Данный способ является одним из методов трассировки, который используется системой освещения Lumen в графическом движке Unreal Engine 5. Второй вариант техники называется трассировкой лучей в экранном пространстве. Тут используется совершенно другой подход на основе трех составляющих: изображения, полученного с помощью традиционного рендеринга, карты глубины кадра и карты нормалей. Из отрендеренного изображения берется информация о цвете объектов. Карта глубины показывает, насколько далеко они находятся от камеры.
В свою очередь, карта нормалей сообщает, в какую сторону полигоны отражают свет.
Когда в процессе трассировки луч попадает на отражающую поверхность, его дальнейшее распространение продолжается в соответствии с этой информацией. Например, попав в озеро, лучи отразились в сторону деревьев — значит на поверхности озера появится искаженное изображение последних.
Главная проблема подобного подхода в том, что он может использовать только отрендеренные кадры с экрана. То есть, когда деревья исчезнут из поля зрения игрока, пропадет и их отражение в озере. Такую технику трассировки лучей используют многие игры прошлых лет, в том числе — Cyberpunk 2077.
Трассировка пути — продвинутая технология построения изображений в компьютерной графике. Она широко применяется для создания реалистичных сцен в фильмах, и все больше становится популярной в новых играх для ПК и консолей. Как работает эта технология, и в чем ее отличия от более распространенной трассировки лучей?
Что такое трассировка пути
Компьютерная графика, используемая в современном кинематографе, основана на одной из техник трассировки лучей — трассировке пути (Path Tracing). Этот алгоритм появился в далеком 1986 году, но из-за своей сложности лишь спустя 30 лет начал массово использоваться для создания графики в фильмах.
Чтобы понять, почему все это время трассировка пути оставалась неосуществимой, ознакомимся с основами построения подобной картинки. Сначала 3D-художники вручную моделируют форму объектов в сцене, а программное обеспечение для рендера разбивает их на мелкие треугольники — полигоны.
Затем на модели накладываются текстуры, которые симулируют материалы определенного цвета и типа — например, шероховатые, гладкие или стеклянные.
Готовые объекты и источники света: солнце, небо, фонари, размещаются в нужных положениях на 3D-сцене. После этого добавляется виртуальная камера и запускается процесс рендеринга — благодаря ему картинка в кадре визуализируется в виде привычного 2D-изображения.
С помощью трассировки пути имитируются отражения света от различных материалов. К примеру, попав на матовую красную черепицу крыши, часть света ей будет поглощена, а другая часть — отразится красным. Отраженный свет от каждого объекта попадает в виртуальную камеру, внося свой вклад в создание изображения.
Для образования каждой точки конечной картинки осуществляется несколько тысяч подобных расчетов. А для формирования одного кадра изображения с разрешением 4К их потребуется несколько миллиардов.
Именно из-за этого долгое время создание изображений с использованием трассировки пути было очень медленным процессом. Например, в 2016 году рендерингом фильмов «Зверополис» и «Моана» занималась ферма из тысяч серверов, которые производили вычисления в течении нескольких месяцев — и это всего для двух часов анимации.
Формирование изображения
Для начала ознакомимся с принципом создания изображения при трассировке пути. Этот алгоритм относится к виду вычислений, которые очень хорошо распараллеливаются: точки картинки независимы друг от друга, поэтому тысячи лучей для каждой из них можно рассчитывать одновременно.
Если показать на картинке траектории всех лучей, которые просчитываются для этой сцены, то она заполнится огромным количеством линий. Поэтому рассмотрим данный процесс на примере одной точки. Первый луч испускается из ее центра и попадает на полигон какого-либо объекта в кадре.
Базовый цвет точки формируется с помощью нескольких лучей, которые попадают рядом с центральным — для этого все их цвета усредняются. Подобные лучи называются первичными.
В результате такого подхода формируется изображение с правильной перспективой.
Глобальное освещение
Мы рассмотрели, как цвет полигонов передается точкам виртуального кадра. Но для получения реалистичной сцены нужно просчитать глобальное освещение объектов — ведь яркость и оттенок цвета каждой точки зависит именно от него.
Для этой цели комбинируются два вида расчетов: прямого (Direct) и непрямого (Indirect) освещения. При первом виде вычислений просчитываются лучи непосредственно от источников освещения — солнца, неба и ламп. Они называются теневыми.
Теневые лучи отражаются от всех объектов сцены, попутно приобретая характер и окраску от их материалов. Таким образом все поверхности, на которые попадает прямое освещение, становятся источниками непрямого. Отраженный свет проникает во все области кадра. В том числе в те, которые закрыты преградами от лучей прямого освещения. На примере ниже можно увидеть, как освещенная зеленая точка на стене отражает свой свет на синюю точку столба, находящуюся в тени.
Этот луч, проходящий между двумя точками, называют вторичным. Если при первом отражении он снова попадет в тень, то от него будут просчитаны дополнительные лучи. Так будет продолжаться либо до попадания на освещенную прямым светом точку, либо до достижения лимита отскоков, при котором дальнейший поиск траектории луча прекращается.
Вместе с траекториями лучей от источников прямого освещения это создает большое количество вычислений. Например, в кадре ниже для получения 20 первичных лучей необходимо рассчитать почти сотню вторичных и теневых.
Благодаря непрямому освещению реалистично просчитывается не только изменение яркости точек, но и их взаимное влияние на цвет друг друга. К примеру, если расположить рядом со столбом красный воздушный шар, то за счет непрямого освещения в его оттенок окрасится и тень от столба.
Не менее важно и то, что направление распространения вторичных лучей зависит от свойств материала объекта. Если он идеально гладкий, то угол падения луча будет равен углу его отражения — благодаря этому поверхность будет выглядеть зеркальной. А от шероховатого материала того же цвета лучи будут отражаться в случайные стороны — из-за этого он, как и положено, будет отображаться матовым.
В случае, если материалом выступает стекло, то будет просчитываться не только отражение света, но еще и его преломление при прохождении насквозь.
Сложность трассировки пути зависит от количества источников света, количества лучей на точку и предельно допустимого числа их дополнительных отскоков. У сцены из первого примера с замком используется четыре источника света, тысяча лучей на точку и 12 отскоков. Чтобы визуализировать один ее кадр в 4К, нужно просчитать примерно 400 миллиардов лучей.
А для создания всего одной секунды такого видео их понадобится просчитать уже около триллиона. Именно поэтому в течение нескольких десятилетий трассировка пути для фильмов считалась невозможной.
Чтобы достичь приемлемой производительности, в современных играх трассировка пути реализована намного проще — один-два луча на точку и от одного до четырех отскоков. Но даже при таких параметрах и базовом разрешении Full HD для комфортной игры каждую секунду видеокарте понадобится просчитывать около полумиллиарда лучей.
Иерархия ограничивающих объемов
Еще одна ключевая трудность при трассировке пути — узнать, на какой именно полигон луч из точки попадает первым, чтобы определить ее основной цвет. В случае, если полигонов десятки или сотни, можно воспользоваться вычислением траектории луча с помощью математических уравнений. Но в современных сценах их миллионы, поэтому этот способ потребует огромных вычислительных ресурсов. Чтобы упростить данный процесс, используется иерархия ограничивающих объемов (Bounding Volume Hierarchy, BVH). При таком подходе сцена разделяется на виртуальные объемы-коробки, в каждой из которых оказывается одинаковое количество полигонов.
Коробки делятся надвое до тех пор, пока в каждой из них не останется всего несколько полигонов (обычно от 4 до 32). В нашем примере сцена состоит из трех миллионов полигонов, которые «раскладываются» в полмиллиона небольших коробочек.
Положение каждой коробки в пространстве выровнено строго по осям координат. Когда луч начинает свое путешествие из точки, его направление сравнивается с координатами первой пары больших коробок. Коробка, которую он не пересекает, исключается из расчетов — как и все более мелкие, на которые она поделена.
Затем направление луча сравнивается с координатами двух меньших коробок, на которые разделена исходная. И так до тех пор, пока луч не достигнет самой маленькой коробки.
👨💻 В 1972 году в Bell Labs Деннис Ритчи создал язык C — фундамент всего современного IT.
Деннис Ритчи
У этого события нет точной даты в календаре, поэтому 10 декабря часто используют как символический день рождения, связывая его с днём рождения первой программистки в истории, Ады Лавлейс.
👨💻 Язык, задуманный для UNIX, стал «латынью» для разработчиков: на нём написаны Windows и Linux, а его синтаксис лёг в основу C++, Java и Python.
===================================================== 👇👇Наш канал на других площадках👇👇 YouTube | VkVideo | Telegram (Ежедневные новости тут) | Pikabu =====================================================
Уроки языка программирования «Питон» с нуля для детей не всегда обязательно строить вокруг сухой теории и выполнения скучных проектов. Дело в том, что данный инструмент можно использовать в связке с Minecraft для разработки и кодинга модов, что на практике улучшает восприятие Python и делает учебный процесс куда более увлекательным. Это обусловлено популярностью Майнкрафта среди детей и подростков.
Содержание
Онлайн-курсы Python – языка программирования в Майнкрафте
Курс «Основы математической логики в среде Minecraft» для детей 8–12 лет
Уроки программирования и 3Д-моделирования для детей 8–10 лет
Онлайн-занятия по кодингу в Майнкрафте для школьников 9–12 лет
Online-курс по программированию в Майнкрафте для детей 7–12 лет
Уроки создания модификаций в Minecraft для школьников 10 лет и старше
Трехмерное моделирование и кодинг в игровой вселенной для ребят 8–10 лет
Уроки кодинга на языке программирования Python в Minecraft для ребят 9–14 лет
Дистанционный курс написания кода в Майнкрафте для ребят 9 лет и старше
FAQ
Можно ли записаться на курсы языка программирования «Питон» для подростков без Майнкрафта?
Есть ли онлайн-занятия по языку «Питон» для 8-х классов?
Какой язык программирования используется в Minecraft для кодинга модов?
На каком языке программирования написан сам Майнкрафт?
Онлайн-курсы Python – языка программирования в Майнкрафте
Собрали десятку тематических онлайн-курсов, которые помогут разобраться в написании кода на «Питоне» на примере программирования модов для популярной игровой вселенной Minecraft. По традиции представили некоторые аналитические сведения вроде цен, форматов и тем.
Python-разработчик: образовательная траектория для младших школьников и подростков 10–13 лет
Особенности: траектория объединяет два курса и характеризуется повышенным образовательным потенциалом с точки зрения освоения языка программирования «Питон» с нуля на уроках для детей.
Форматы: освоить представленное направление можно в группе или индивидуально с учителем.
Цена: от 600 рублей за один час онлайн-уроков.
Скидки: 10 %. Для получения выгоды нужно выполнить условие в виде оплаты 12 занятий минимум в день обращения.
Выгоды: вычет 13 % после учебы, оплата маткапиталом, рассрочка.
Содержательная сторона: отметили, что траектория объединяет два курса. Первый можно считать вводным: он основан на программировании модов для Майнкрафта на «Питоне». Второй же поможет углубиться в основы кодинга на данном языке и приблизиться к пониманию принципов продвинутого написания текстового кода.
Комплексность траектории выражается в том, что благодаря ее освоению каждый ребенок сможет разобраться в:
Основах кодинга на Python и продвинутом программировании на данном языке;
Принципах гейм-дизайна, создания игр и модов на примере разработки функциональных дополнений для Minecraft.
В блоки теории и практики заложены как базовые моменты вроде основных конструкций, так и углубленные темы. Это, скажем, программирование чат-ботов, создание 2Д-игр с нуля с помощью Python.
Так, курсы языка программирования «Питон» для детей и подростков, объединенные в траекторию, помогут овладеть данным инструментом и начать использовать его на продвинутом уровне даже вне рамок Майнкрафта.
Онлайн-уроки Python в Minecraft для ребят 10+ лет
Форматы: видео в записи.
Цена: доступ к видеокурсу на месяц стоит 7 990 рублей. Если хочется увеличить срок до 160 суток, потребуется заплатить 20 000+.
Темы: циклы, ввод текста, случайные числа, типы данных, создание модов для Майнкрафта и т. д.
Курс «Основы математической логики в среде Minecraft» для детей 8–12 лет
Форматы: один на один с учителем и в группе.
Цена: от 4 900 рублей за месяц.
Темы: операторы, компараторы, логические схемы, строительство в игровой вселенной и т. д.
Уроки программирования и 3Д-моделирования для детей 8–10 лет
Форматы: групповые занятия.
Цена: от 1 650 рублей за урок.
Темы: написание кода, создание 3D-моделей, скриптинг различных модов и т. д.
Онлайн-занятия по кодингу в Майнкрафте для школьников 9–12 лет
Форматы: мини-группы.
Цена: базовая стоимость занятия составляет 1 200 рублей.
Темы: структура Minecraft-модов, пиксельная графика, типы данных, координаты, условия и т. д.
Online-курс по программированию в Майнкрафте для детей 7–12 лет
Форматы: индивидуальное и групповое онлайн-обучение.
Цена: от 1 125 рублей за урок.
Темы: основы кодинга в игровой вселенной, создание игровых объектов, командная разработка и т. д.
Уроки создания модификаций в Minecraft для школьников 10 лет и старше
Форматы: группы.
Цена: от 5 200 рублей за месяц.
Темы: разработка Minecraft-модификаций, проектирование внутриигровых объектов, 3Д-моделирование и т. д.
Трехмерное моделирование и кодинг в игровой вселенной для ребят 8–10 лет
Форматы: групповое дистанционное обучение.
Цена: от 3 000 рублей за онлайн-урок.
Темы: моды для Minecraft, их создание и программирование, трехмерное моделирование и т. д.
Уроки кодинга на языке программирования Python в Minecraft для ребят 9–14 лет
Форматы: индивидуальное обучение.
Цена: нет информации.
Темы: методы и атрибуты, работа с координатами, условные операторы, сравнение, синтаксис «Питона», его потенциал с точки зрения создания модов и т. д.
Дистанционный курс написания кода в Майнкрафте для ребят 9 лет и старше
Форматы: индивидуальный и индивидуально-групповой.
Цена: от 790 рублей / урок.
Темы: основы программирования, азы 3Д-моделирования, создание мини-игр в виде модификаций и т. д.
FAQ
Можно ли записаться на курсы языка программирования «Питон» для подростков без Майнкрафта?
Да, такие курсы есть. Они предлагаются различными онлайн- и офлайн-школами программирования для детей.
Отличительная особенность – упор на использование языка для выполнения проектов, альтернативных модам для Minecraft. Вместе с тем не стоит полагать, что увлекательная практика исключается или опускается до минимума: проектная деятельность – основа множества современных детских курсов «Питона». Почти в любой вероятной ситуации ребятам предстоит осваивать теорию и закреплять получаемые представления посредством практики. Речь, скажем, о программировании чат-ботов, создании 2Д-игр на Python и не только.
Есть ли онлайн-занятия по языку «Питон» для 8-х классов?
Да, тематические курсы, соответствующие обозначенному классу, есть. Тематические направления дополнительного обучения предлагают многие онлайн- и офлайн-школы.
Чтобы выбрать достойный курс, стоит предварительно проанализировать его по ряду критериев. Это форматы, цены, плотность занятий, их количество, содержательность образовательной программы и т. д.
Дополнительно советуем уточнить сведения о лицензировании организатора: наличие разрешительной документации будет плюсом. В других статьях в блоге отмечали, что это гарантия качества образовательных программ. Дополнительно лицензия открывает клиентам доступ к ряду условных бонусов вроде возможности оплаты занятий ребенка средствами маткапитала или оформления налогового вычета в размере 13 %.
Какой язык программирования используется в Minecraft для кодинга модов?
В преобладающем количестве случаев речь о «Питоне», о чем позволяет утверждать подготовленная нами подборка. Но здесь же подчеркнем, что есть альтернативные направления, скажем, основанные на теории и практике использования функции Code Builder. В случае с ней предполагается вводное обучение младших школьников путем погружения в блочное программирование.
При этом важно учитывать, что в Code Builder необходимо использовать блоки с текстовыми командами, написанными на Python и JavaScript. То есть в случае с кодингом модов в неоднократно упомянутой игровой вселенной вероятны два варианта языков, а именно «Питон» и ДжаваСкрипт.
На каком языке программирования написан сам Майнкрафт?
Minecraft существует в двух основных версиях, которые написаны на разных языках программирования. Оригинальный вариант игры прописан посредством использования Java. Данная и стартовая версия создана Маркусом Перссоном.
Выбор представленного языка был обусловлен его кроссплатформенностью: игра может работать на различных операционных системах без необходимости переписывания кода. Кроме того, открытая архитектура как важное свойство Java позволила сформировать обширное сообщество моддеров. Речь о том, что пользователи получили возможность разрабатывать и устанавливать модификации, существенно расширяющие функционал игры.
Вторая версия под названием Minecraft: Bedrock Edition была переписана на языке C++. Здесь выбор, как кажется, связан с необходимостью обеспечить высокую производительность и эффективное управление ресурсами на разнообразных устройствах, включая консоли и мобильные телефоны. Потребность в этом стала вытекать из роста популярности Майнкрафта.
Благодаря C++ версия Bedrock способна похвастаться лучшей оптимизацией и стабильной работой даже на сравнительно слабых устройствах. Дополнительно вариант поддерживает кроссплатформенную игру, то есть пользователи могут играть вместе независимо от того, используют они ПК, консоль или смартфон.
Между версиями есть существенные различия. Java Edition доступна исключительно на ПК, предлагает широкие возможности для моддинга, но может характеризоваться проблемами производительности при установке большого количества модификаций.
Bedrock Edition отличается кроссплатформенностью и абсолютной стабильностью функционирования на разных устройствах, однако, что важно отметить, имеют место ограниченные возможности для создания модификаций. Некоторые условные моды доступны юзерам преимущественно в официальном магазине.
Это мой первый пост, так что прошу не кидаться помидорами. Мне 23. Я учусь в институте на цифрового инженера горного дела и дополнительно в другом институте прохожу переквалификацию по аналитике данных. Специальность в институте не очень похожа на что-то связанное с программированием, да и базу не дают. Проходили курс по программированию в прошлом году и наелись говна, пытаясь изучить С++ без какой либо базы и понимания что это вообще такое. В начала обучения говорили, что профессия связана с АСУТП, фотограмметрией у маркшейдеров, внедрением ии в производство. Но проучившись 2 года я поняла, что кроме геологии, горного дела и обогащения ничего нам не дадут. Вот теперь с глазами полными ужаса и психотравмой от с++ я хочу попробовать двинуться в сторону самостоятельного изучения программирования. Я себе представляю что программирование это очень доходная штука, но в сфере добычи золота мы очень далеко от внедрения каких-то технологий. Подскажите пожалуйста, насколько актуальна аналитика данных и работа с sql, python, power bi и big data? Возможно ли начать переходить в сферу программирования с таким набором знаний или надо изучать еще кучу всего? Я очень боюсь обосраться с выбором направления, боюсь что пропаду в жизни, так как выбрала неверный путь и буду всю жизнь пилить ноготочки в задроченом салоне красоты.
Апдейт: Сегодня в институт поступил запрос на аналитика от одного из местных ГОКов. Хотят пробовать цифровизироваться. Всем спасибо за комменты!
Будучи творческим человеком и техногиком, я обожаю при первой возможности апгрейдить своё оборудование. Время от времени я мониторю маркетплейсы в поисках чего-то новенького и в этот раз я наткнулся на настоящий мультитул для Embedded-разработчика — контроллер I2C/SPI/UART/JTAG в одной коробочке и всё это всего за 1.000 рублей... Конечно я не смог пройти мимо этой штучки и в рамках сегодняшней статьи хочу рассказать что оно из себя представляет и как с ним работать. Жду вас под катом!
❯ Что за устройство?
На самом деле такой формат статей для меня «в новинку», до этого я ни разу не делал обзоров на оборудование. Да и мой инструментарий слишком зауряден, чтобы делать ещё одну статью уровня «почему Quciko T12 лучше любой 900M станции» или «почему Вам не стоит покупать компрессорный люкей в 2025 году». Однако обзоров на сегодняшний гаджет я не нашёл, несмотря на его огромную пользу как для Embedded-разработчиков и инженеров, так и мастеров по ремонту смартфонов, планшетов и ноутбуков.
Во время подготовки статьи о том, как я написал BIOS для игровой консоли от Waveshare, в рекомендациях мне попадались другие товары от этого производителя — в том числе и сегодняшний гаджет. Меня сразу привлекла возможность переключения 3v3->5v логики и обширный набор поддерживаемых шин. В официальной вики были описаны следующие характеристики:
Шины: 1x SPI с двумя чип-селектами (можно подключить до двух устройств на одну шину), 1x I2C, 1x JTAG (полноценный, с ресетом!) и 2x UART с дополнительными линиями CTS/RTS для совместимости с классическими COM-портами.
Используемый контроллер: WCH CH347. Некоторым читателям чип может показаться знакомым по аналогии с классическим CH341A.
Питание: 5В, 3.3В, потребление ~65мА на VBus. Есть самовосстанавливающийся предохранитель на «входе».
Waveshare — достаточно известный бренд, под которым реализуются одноплатные компьютеры, «бутербродная» периферия для них и инструменты.
Я сразу смекнул, что смогу использовать гаджет как для восстановления программно-убитых устройств по типу КПК, так и для отладки своих собственных самоделок, благо набор шин к этому располагает. Устройство приехало ко мне примерно через месяц, в небольшом пакетике и брендовой коробочке, в которую входило само устройство, кабель USB Type-B (ну почему не Type-C?), Dupont-провода в IDC-коннекторе для всех шин, а также небольшой мануал. Нареканий к доставке кроме скорости не возникло.
Сам гаджет представляет из себя компактную металлическую коробочку с «ушками» для удобного крепления на столе или стене. Сверху расположена шпаргалка по распиновке и режимам работы CH347, а также светодиодные индикаторы для UART.
Разбирается гаджет очень просто: достаточно лишь открутить несколько винтов с обеих боковых пластин устройства и перед нами открывается вид на плату. Схемотехника здесь простейшая: самовосстанавливающийся предохранитель, линейный регулятор AMS1117, который питает контроллер и нагрузку на VCC (до ~600мА), сам CH347, а также набор ключей для согласования режимов работы. CH347 — это не просто ASIC, а вполне себе полноценный микроконтроллер, прошивку которого можно обновить, правда SDK для использования CH347 как МК производитель не предоставляет.
После подключения гаджет радостно зажег индикатор PWR, подтвердив свою работоспособность, а значит пришло время протестировать возможные варианты использования!
❯ UART
С UART всё просто и понятно: нам достаточно лишь выбрать желаемый режим работы (M0 — двухканальный UART, остальные режимы — UART + I2C/SPI или UART + JTAG) с помощью тумблера и подключить/припаять Dupont'ы к соответствующим пинам на плате. UART здесь достаточно быстрый: при двухканальном режиме работы, на UART0 можно добиться до 9Мб/с (мегабод), а на UART1 — до 7.5Мб/с.
Провода в разъёмы установлены не бездумно — у них есть цветовая маркировка и логика помимо «красный — VCC, чёрный — GND».
В качестве теста я решил снять лог загрузки со своего проекта самодельной игровой консоли. Для работы с UART я привык использовать Putty: сначала я припаял RX/TX и массу, затем запустил Putty и выбрал COM-порт, соответствующий первому каналу, установил бодрейт в 115200 и включил консоль:
Всё работает! В целом, гаджет можно использовать и для прошивки более сложных устройств: например многие смартфоны и кнопочные телефоны всё ещё имеют альтернативный режим прошивки через UART, а ретро-телефоны Samsung и LG так вообще не имеют альтернатив — если нет специального JIG, то остаётся лишь вызванивать RX/TX с разъёма и подпаиваться напрямую к UART процессора!
❯ SPI/I2C
С SPI и I2C уже всё чуточку интереснее. Дело в том, что как вы уже могли понять — чип использует свой собственный проприетарный протокол для организации моста между программой на ПК и шиной данных. Для работы с этим протоколом производитель предоставляет уже готовую библиотеку для Windows начиная с 2000, так что возможно у чипа есть перспективы для оживления легаси пром. оборудования. Для Linux же есть альтернативные драйвера, которые пробрасывают CH347 как обычные spidev и i2c-dev устройства.
Драйвер можно скачать здесь
Для проверки коммуникации можно использовать специальную тестовую программу из SDK, которая позволяет отправлять произвольные данные и даже прошивать флэшки 25 'ой и EEPROM'ки 24'ой серии.
Давайте же попробуем написать что-нибудь полезное! Например, подключим к гаджету 1.8-дюймовый дисплей и что-нибудь на него выведем.
С разводкой дисплея проблем не возникает: SDO к MOSI, SCK к CLK, VCC к VCC и BL (питание подсветки), однако для управления DBI-дисплеями необходимы ещё две дополнительные линии: D/C (линия, определяющая как интерпретировать байт на входе), а также RESET для аппаратного сброса контроллера. И с этим проблем тоже не возникает: у контроллера есть как минимум четыре свободных GPIO, два из которых мы с вами и будем использовать для управления линиями дисплея — GPIO6 (CTS на UART1) и GPIO7 (RTS на UART).
Далее я начал изучать PDF-ку с документацией сомнительного качества и писать код инициализации. Начинается всё с получения контекста устройства с помощью функции CH347OpenDevice, которая принимает в себя индекс нужного контроллера в системе и возвращает непонятный идентификатор (вероятно WinUSB?). Интересно то, что в остальном API используется не идентификатор, а как раз тот самый индекс, который в большинстве случаев будет 0. Далее мы получаем информацию об устройстве и сверяем режим работы, если он отличается от нужного — выбрасываем исключение:
/* Initialize CH347 */ deviceHandle = CH347OpenDevice(deviceIndex); if (!deviceHandle) thrownew std::runtime_error("Failed to open CH347 device");
Далее настраиваем SPI-контроллер. На выбор есть все три существующих режима, настройки полярности и возможность вручную дергать один из двух доступных ChipSelect'ов, а также тайминги. Частота работы определяется предустановленным набором делителей — 60МГц, 30МГц, 15МГц и т.п. Не забываем настроить таймаут каждой USB-транзакции:
if (!CH347SPI_Init(deviceIndex, &cfg)) thrownew std::runtime_error("Failed to initialize SPI");
И инициализируем дисплей. Здесь есть важный момент: функция CH347GPIO_Set устанавливает состояние всего GPIO-контроллера в чипе и поэтому принимает в себя три битовые маски с конфигурацией каждого пина. Функции GPIO стандартные — вход/выход, плюс обработка прерываний с помощью специального callback'а:
Теперь можно запустить программу и посмотреть на результат. Если вы увидели шум (или мусор) на экране — значит вы всё делаете правильно и контроллер успешно проинициализирован.
На фото можно заметить перемычку между CS и массой, однако не все контроллеры дисплеев толерантны к постоянному низкому уровню на CS. На моей практике контроллеры ILI отказывались проходить инициализацию, если не разграничивать каждую транзакцию с помощью CS.
Теперь можно что-нибудь вывести. Подготавливаем изображение, преобразовав в 16-битный массив пикселей, переводим контроллер в режим записи в VRAM, отправляем изображение:
Потенциальных применений у такого гаджета много: можно сделать красивые анимированные часы, мониторинг датчиков, показ уведомлений или дублировать окно с основного ПК. А ведь когда-то ради такого покупали LPT-провода, дисплеи от Сименсов и вручную превращали параллельную шину в последовательную...
❯ Заключение
Вот такой интересный гаджет выпустила компания Waveshare — и, что радует, по очень приятной цене! Ссылку по понятным причинам прилагать не буду, но при желании вы сможете его найти на всех трёх крупных маркетплейсах. Кроме того, можно купить Breakout-плату с тем же самым чипом за ~500 рублей, но там не будет таких удобных переключателей и Dupont'ов.
К сожалению, теста JTAG в статье не будет. У меня пока нет готовых к работе необычных гаджетов, где можно было бы протестировать OpenOCD... однако мой HTC Dream всё ещё ждёт свою прошивку модема!
А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статьи) можно найти на моём YouTube канале.
Если вам понравилась статья...
И у вас появилось желание что-то мне задонатить (например прикольный гаджет) - пишите мне в телегу или в комментариях :) Без вашей помощи статьи бы не выходили! А ещё у меня есть Boosty.
Что думаете о таком преобразователе?
Что думаете об обзорах на оборудование? Есть смысл рассказывать о всяких ништяках, что я иногда покупаю для работы?
В данной статье я хочу Вам рассказать про датчик HEDR(от компании avago technologies) - это двухканальный инкрементальный оптический датчик, предназначен для измерения пройденного пути, линейной скорости, угловой скорости и направлении вращения вала. С помощью данного датчика будет реализован энкодер на базе микроконтроллера STM32, который будет производить вычисление пройденного пути.
В данной статье будет рассмотрено:
Принцип работы датчика HEDR-5420-ES214;
Схема подключения к микроконтроллеру STM32;
Программная реализация (расчет пройденного пути и вывод информации на дисплей).
Источник света (светодиод, формирующий поток света);
Оптическая система (линза, обеспечивает фокусировку и отражение света);
Фотодетектор.
Линза фокусирует излучаемый свет на кодовое колесо (диск с чередующимися отражающими и неотражающими участками), при вращении диска, отраженный свет проходит обратно через оптическую систему и попадает на фотодиоды, таким образом на их поверхности формируется чередующийся рисунок света и тени, соответствующий узору кодового диска.
Эти изменения интенсивности света преобразуются в внутренние сигналы А и В, которые проходят через компараторы в составе обработки сигналов, на выходе формируются два цифровых прямоугольных сигнала - канал А и В, находящиеся в квадратурной фазе на 90°, что позволяет микроконтроллеру определять направление вращения вала, к примеру:
если канал А опережает канал B - вращение происходит в одну сторону;
если канал B опережает канал А - вращение происходит в противоположную сторону.
Для своей задачи применяется следующая последовательность, если канал А опережает канал B - движение энкодера считается положительным, если на оборот, то движение будет отрицательным.
Осциллограмма данных полученных с датчика HEDR-5420-ES214
Схема подключения к микроконтроллеру STM32
Схема подключения HEDR и дисплея к микроконтроллеру STM32F030CCT6
Макет STM32F030CCTx и HEDR
В данной схеме используются преобразователь напряжения DA1 (+12V +5V) и стабилизатор напряжения DA2, дисплей подключается к выводам МК 21_SCL_I2C2 и 22_SDA_I2C2, датчик HEDR подключается к выводам МК 29_CH.A и 30_CH.B, данные сигналы сначала проходят через делители, R17-R18-[CH.A] и R15-R16-[CH.B], так как датчик работает от +5V, сигналы соответственно тоже у него +5V, я всегда стараюсь дополнительно защитить МК, после делителя амплитуда сигналов снизится до +3.3V, копипастить информацию по описанию узлов преобразователя, стабилизатора, узла обвязки напряжения питания и резонатора для МК не особо хочется, поэтому кому интересно можно почитать статью [Модуль обработки и коммутации данных, с внешними управляющими устройствами по RS-485 на STM32] Настройка микроконтроллера STM32F030CCTx в CubeIDE
Настройка RCC и SYS (в RCC выбираю Crystal/Ceramic Resonator, так как у меня внешний кварц на 8 МГц)
Настройка дисплея
Взаимодействие дисплея с МК будет через I2C2
Настройка выводов узла подключения датчика HEDR
TIM1_CH1 (к данному выводу будет подключаться сигнал CH.A);
TIM1_CH2 (к данному выводу будет подключаться сигнал CH.B).
Таймер используется в режиме Encoder mode - это специальный аппаратный режим, который позволяет микроконтроллеру автоматически подсчитывать импульсы от инкрементального датчика и определять направление вращения, данная конфигурация освобождает МК от необходимости программно обрабатывать прерывания по каждому импульсу.
Encoder Mode TI1 and TI2 данный параметр указывает, что используется оба канала датчика (A и B), это дает разрешение X4 - т.е. счетчик будет увеличиваться на 4 шага за один полный оборот.
Описание режимов
TI1 - подсчет ведется по фронту одного канала А, направление определяется по уровню В, разрешение 1.8 градусов;
TI2 - аналогично логике TI1, но базируется на канале В;
TI1 and TI2 - подсчет ведется на каждом фронте обоих каналов (А+, А-, В+, В-), направление определяется автоматически, т.е. количеством импульсов на оборот 200, я получаю 800 шагов на оборот, разрешение будет 0.45 градусов.
Input Filter - включает цифровую фильтрацию входного сигнала, помогает убрать дребезг и шум, значения от 0 до 15, чем выше значение, тем надежнее фильтрация, но будет повышаться задержка.
Polarity (Rising Edge) - счетчик реагирует на восходящие фронты сигнала.
Настройка Clock
Программная реализация ведомого устройства
Ссылка на скачивание исходного кода [ https://t.me/ChipCraft В закрепленном сообщении [ #исскуствомк_исходный_код — Исходный код для Encoder_HEDR_5420_STM32F030CCTx].
Модуль process_Encoder
Данный модуль реализует считывание сигналов с инкрементального датчика HEDR и вычисляет:
Количество импульсов на оборот;
Пройденную дистанцию;
Отображение данных на дисплее.
#define ENCODER_MODE_X4 4
Данный параметр отражает режим подсчета импульсов, привожу формулу
Этот режим обеспечивает максимальную точность - 0.45 на один шаг.
Если статья показалась Вам интересной, буду рад выпустить для Вас еще множество статей исследований по всевозможным видам устройств, так что, если не хотите их пропустить — буду благодарен за подписку на мой ТГ-канал.
Сама по себе идея подавать в помпт структурированный алгоритм неплоха.
Но во-первых есть уже UML, sequence diagram, bpmn и другие популярные нотации.
А во-вторых вы взяли простую задачу, и у вас получилось чудовищное по размеру описание, хотя задачу можно в одно предложение сформулировать очень однозначно. А что будет с более комплексной задачей? Затраты что по времени подготовки, что по расходу токенов будут расти экспотенциально. Да и, кажется, это противоречит основному принципу - ставить задачу простым человеческим языком, без оверхеда на формализвцию ТЗ.
Да и как мы видим это нас не особо защищает от ошибок - по вашему алгоритму при возрасте от 0 до 150 мы попадаем в бесконечный цикл, а у алгоритм идём если возраст не корректный, и непонятный результат получаем на выходе. И стоило оно усилий тогда?